Автор: Денис Муася

Този урок ще ви научи да създавате интерфейс и бекенд на училищен уебсайт, като използвате Strapi API, HTML, CSS и Vanilla Javascript. В него няма да има рамка. Като се има предвид целевата популация, дизайнът ще бъде ясен и непретрупан. В тази публикация в блога ще говоря за училищен уебсайт, който създадох с помощта на бекенд услуги. Преди съм работил с локални JSON данни и е предизвикателство да актуализирам и изтривам материала.

Strapi е безплатна и с отворен код Headless CMS, която позволява бърз и лесен API дизайн и управление на съдържанието. Ще научите как да използвате ванилен JavaScript и Strapi CMS, за да създадете училищен уебсайт.

Предпоставки

Уверете се, че вашият компютър има инсталирано следното, преди да започнем.

  • Node.js: Поради факта, че NPM и Strapi са изградени върху Nodejs, това е първият инструмент, който ще ви е необходим. Изтеглете го от тази страница. Необходимата версия на NodeJS варира от 14.19.1 до 16.x.x.
  • NPM: Това е мениджър на пакети за Node. Двоичният файл на Nodejs е включен в него. NPM ›= 6.x е необходимата версия.
  • IDE: Интегрирана среда за разработка като Microsoft Visual Studio Code, Android Studio и Sublime Text.
  • Основно разбиране на асинхронния JavaScript.

Какво е REST API?

REST API, често известен като RESTful API, разделя една транзакция на няколко малки компонента. Всеки модул се занимава с основен аспект на сделката. Въпреки че тази модулност предлага на разработчиците голяма свобода, може да им е трудно да създадат REST API от нулата. Няколко фирми вече предоставят модели, които разработчиците да използват; най-харесваните модели са предлаганите от Strapi. Командите се използват от RESTful API за достъп до ресурси. Представянето на ресурс е състоянието на ресурс във всеки конкретен времеви печат.

REST API в Strapi позволява достъп до различните типове съдържание чрез крайни точки на API. Когато се създава тип съдържание с помощта на Strapi, крайните точки на API се създават автоматично. Когато правите заявка към крайна точка на API, параметрите на API могат да се използват за филтриране на резултатите. Няма релации, медийни полета, компоненти или динамични зони по подразбиране при използване на REST API. Попълнете определени полета, като използвате аргумента за попълване.

Как да четем DOCS

Когато сте запознати с инструмента, който искате да използвате, официалната документация е най-доброто място да започнете. Когато работите с нещо ново, потиснете желанието да влезете веднага и да прочетете ръководството вместо това. Освен това ще спестите време и усилия, тъй като уменията ви като програмист напредват. Можете да научите за много различни теми, като четете. Ще можете по-добре да разберете следващата тема, като знаете повече за една област на разработка на софтуер.

Опитайте се да преминете през всеки пример в урока Първи стъпки. Преди да продължите, уверете се, че разбирате основните идеи на нов език или система.

И накрая, запознайте се с кода. Самото четене на документацията вероятно няма да е достатъчно, за да разберете какво прави програмата. Малък поглед върху изходния код може да има значително въздействие. Използвайте всяко парче код, като го копирате, прочетете и определите какво прави. Изпробвайте сами кода, за да видите как работи. Започнете отначало. Счупи го. след това изберете резолюция.

Как да работите със Strapi CMS

Използвайте тази връзка към GitHub, за да клонирате уебсайта на училището. Последната стъпка е да добавите общите JavaScript файлове за достъп до данните от Strapi. За да запазите уебсайта на училището, решете къде да го поставите на вашия компютър.

  1. Във вашия терминал въведете следната команда:
git clone https://github.com/Dmuasya/SchoolWebsiteStrapi.git
  1. Променете директориите към училищния уебсайт, след като клонирането приключи.
cd SchoolWebsiteStrapi
  1. Въведете следния код в терминала, за да създадете ново приложение Strapi в папка на бекенда.
npx create-strapi-app backend --quickstart

Това води до създаването на ново приложение Strapi в задната папка. Флагът —quickstart инструктира Strapi да използва SQLite като предпочитана база данни. Когато имате възможност да използвате различна база данни, пропуснете флага и вместо това изберете тази база данни.

Продължителността на времето, необходимо за завършване на инсталацията, ще зависи от това колко бърза е вашата мрежа.

  1. След като приключите с това, стартирайте следващия фрагмент, за да стартирате Strapi в режим на разработка.
strapi develop

Трябва да видите стартирането на браузъра си на адрес http://localhost:1337/admin/auth/register. Ако не, стартирайте ръчно предпочитания от вас браузър. Той ще покаже формуляр за регистрация, подобен на този по-долу.

  1. Сега въведете данните си във формуляра. Тази стъпка е важна за последващи влизания в администраторското табло. Вашето табло за управление вече трябва да изглежда така:

На тази страница вашите API са изброени в горния ляв ъгъл. За момента трябва да съдържа само Users API.

  1. За да изградите крайната точка на оценка, изберете „Content-Type Builder“ от страничната лента.
  2. След като бъдете пренасочени, изберете „Създаване на нов тип колекция“ и му дайте екранното име „Степен“. Въпреки факта, че терминът е единствено число, Strapi го използва в множествено число по подразбиране. Модалният екран трябва да изглежда така:

Добавете нов клас

Полетата за тази колекция могат да бъдат избрани на нов екран, който трябва да се появи след щракване върху „Продължи“. От списъка изберете полето „Текст“, след което му дайте име.

Когато създавате нова оценка, уверете се, че тази информация е задължителна, като изберете „Разширени опции“ и поставите отметка в квадратчето „Задължително поле“.

Приключихте със създаването на крайната точка на оценките.

HTML структура със смислени класове

HTML е мощен инструмент, който дава на вашия код суперсили, ако искате да го използвате. Вградените поведения в HTML ви позволяват да намалите количеството изричен код, който трябва да използвате. Като организирате документите си така, че да работят добре и да изглеждат добре, можете да направите съдържанието си достъпно за повече хора и софтуер.

Проектът демистифицира основните HTML тагове и свойства, докато ви инструктира как да пишете семантичен, смислен HTML. Той ви помага да гарантирате, че вашите страници (включително елементи като навигация) са правилно подредени и разделени, като същевременно ви показва как да използвате уникалните функции на езика за представяне на цитати, цифри, дати и времена.

По замисъл HTML е толерантен език, който позволява изпълнението дори на подчинен код. Училищният ни уебсайт няма да се визуализира без компоненти като , , и . Някои браузъри няма да показват правилно страници без тези спомагателни елементи.

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>School Website - Strapi CMS</title>
   <link rel="stylesheet" href="/bgcss/minified/style.min.css">
   <script
   src="https://kit.fontawesome.com/fc31dedf63.js"
   crossorigin="anonymous"
 ></script>
</head>
<body>

 <!-- Modal on page load -->
 <div class="modal" id="modal-one" aria-hidden="true">
   <div class="modal-dialog">
       <div class="modal-header">
            <h2>Namaste !</h2>
<a href="/bg#modal-one" class="btn-close" aria-hidden="true">×</a>

       </div>
       <div class="modal-body">
           <p>This is the Moi Forces Academy  Website but it's <br />

By following the few straightforward guidelines below, we can maintain our code well-organized.

  • The indentation of nested elements is required.
  • For elements, attributes, and values, lowercase is preferred.
  • Use either single or double quote marks, but be sure you use them both consistently.
  • It is recommended to ignore the Boolean attribute values for complete organization.

When we decide on a technique that we like. It must be adhered to strictly, applied everywhere, and kept separate.

<!-- acheivements section -->

    <section class="achieve">

      <!-- achieve container -->
      <div class="achieve__container">
        <h1 class="achieve__h1"></h1>
        <div class="achieve__section">
          <div class="achieve__sectionList">
            <img class="achieve__imgIcon" src="./img/ach1.png" alt="achieveIcon" />
            <h3 class="achieve__h3"></h3>
            <p class="achieve__p"></p>
          </div>

          <div class="achieve__sectionList">
            <img class="achieve__imgIcon1" src="./img/ach2.png" alt="achieveIcon" />
            <h3 class="achieve__h31"></h3>
            <p class="achieve__p1"></p>
          </div>

          <div class="achieve__sectionList">
            <img class="achieve__imgIcon" src="./img/ach3.png" alt="achieveIcon" />
            <h3 class="achieve__h32"></h3>
            <p class="achieve__p2"></p>
          </div>

          <div class="achieve__sectionList">
            <img class="achieve__imgIcon" src="./img/ach4.png" alt="achieveIcon" />
            <h3 class="achieve__h33"></h3>
            <p class="achieve__p3"></p>
          </div>

        </div>
      </div>
      <!-- End achieve container -->

    </section>

    <!-- End acheivements section -->

Не на последно място, въпреки че първоначалното вградено оформяне изглежда по-лесно, то всъщност изисква повече поддръжка и добавя към реда код. Ако използваме външен лист със стилове, можем да изберем да използваме повторно нашия код. Един външен лист със стилове може да се използва и за стилизиране на всички наши страници.

DOM в JS, ES6 синтаксис и ES6 модули

Обектният модел на документ (DOM) представлява обектите, които изграждат структурата и съдържанието на уеб документ (DOM) като данни. Той илюстрира как да използвате API за създаване на уебсайтове и уеб приложения, както и как HTML документ се представя в паметта.

Добрата новина е, че съвременните браузъри са започнали да предоставят възможност за модул в собствени реализации. Това може да бъде само нещо добро, тъй като позволява на браузърите да зареждат модули по-бързо и по-ефективно, отколкото биха могли, ако трябва да използват библиотека и да извършват цялата допълнителна обработка от страна на клиента и двупосочни пътувания.

import { localhost } from "./../../adminUrl.js";

export const Blog = async () => {

  try {

      const url = `${localhost}/eventsblogs?_sort=id:DESC`;
      const ftch = await fetch(url);
      const data = await ftch.json();
      const result = data;
      //console.log(result[0].content);

  
      for (let i in result) {

          const container = document.querySelector(".blog__container");

          const dv = document.createElement("div");
          dv.classList = "blog__single";

          const img = document.createElement("img");
          img.classList = "blog__img"
          img.src= `${result[i].thumbnailimg.url}`;

         
          const heading = document.createElement("h1");
          heading.classList = "blog__heading";
          heading.textContent = `${result[i].title}`;

          const desc = document.createElement("p");
          desc.classList =" description";
          desc.textContent = `${result[i].description}`;

          const date = document.createElement("p");
          date.classList ="date";
          date.textContent = `${result[i].date}`;

         const hrf = document.createElement("a");
         hrf.classList = "below";
         hrf.textContent = "Read More Below:";
       

          const readmore = document.createElement("div");
          readmore.classList = "readmore";
          readmore.textContent = `${result[i].content}`;


          const hr = document.createElement("hr");
         
          dv.appendChild(img);
          dv.appendChild(heading);
          dv.appendChild(desc);
          dv.appendChild(date);
          dv.appendChild(hrf);
          dv.appendChild(readmore);
          dv.appendChild(hr);
        

          container.appendChild(dv);     
     
      }

  }
 
  catch(error) {
      console.log("failed", error);
  }
  }

Декларациите за импортиране и експортиране са необходими за използването на собствени модули на JavaScript. Представете си себе си в обстоятелство, при което трябва да използвате повторно някакъв JavaScript код. Концепцията на ES6 за модули идва на помощ.

Всеки модул съответства на набор от JavaScript код. Модулите съдържат както функции, така и променливи. Модулът не е нищо повече от сегмент от JavaScript код, който е записан във файл. Вътрешните променливи и функции на модула не са достъпни по подразбиране. Като ги експортирате от модул, променливите и функциите могат да бъдат достъпни от други файлове. В ES6 модулите могат да функционират само в строг режим. Това означава, че всички променливи или функции, дефинирани в модул, няма да бъдат глобално достъпни.

Модули за SASS (SCSS) и BEM конвенция

Sass е най-модерният, надежден и ефективен CSS език за разширения в света. Благодарение на интегрирането на вътрешните възможности на Sass в модулната система, сега имаме пълен контрол върху глобалното пространство на имената. Преди да използвате, вградените модули математика, цвят, текст, списък, карта, селектор и мета трябва да бъдат импортирани ръчно във файл.

.blog {
    margin-top: 7rem;
    margin-left: 7rem;
    margin-right: 7rem;
    margin-bottom: 3rem;
}

.blog__h1 {
    // text-align: center;
    font-size: 2.3rem;
    margin-bottom: 5rem;
}

.blog__img {
    object-fit: cover;
    width: 40%;
    height: 230px;
    border-radius: 21px;
    margin-bottom: 2.5rem;
}

.blog__heading {
    margin-bottom: 1rem;
}

.description {
    max-width: 85ch;
    margin-bottom: 0.5rem;
}

.date {
    margin-bottom: 0.4rem;
    font-size: 1.3rem;
    color: blueviolet;
}
.below {
    // margin-bottom: 0.6rem;
    background-color: burlywood;
    color: #fff;
    padding: 0.2rem;
    font-size: 1rem;
    margin-top: 2rem;
}

.readmore {
    margin-top: 2rem;
    max-width: 97ch;
    color: #3a3838;
    word-spacing: 0.2rem;
    letter-spacing: 0.1rem;
    line-height: 1.7;
}

.blog__single {
    margin-top: 4rem;
}

@media all and (max-width: 768px) {
    .blog {
       
        margin-left: 1rem;
        margin-right: 1rem;
        margin-bottom: 3rem;
    }

    .blog__img {
        
        width: 100%;
        
    }
    
}

В компютърните науки има само два трудни проблема: обезсилване на кеш паметта и наименуване на нещата. Общоизвестно е, че използването на подходящо ръководство за стил може да ускори разработката, отстраняването на грешки и интегрирането на нови функции в наследения код. За съжаление, по-голямата част от кодовите бази на CSS понякога се създават без правила за организация или именуване. В дългосрочен план това води до CSS кодова база, която е неподдържана.

Името Block Element Modifier е съкратено като BEM. Той гарантира, че всеки, участващ в създаването на уебсайт, използва една и съща кодова база и един и същи език. Можете да се подготвите за промени във външния вид на уебсайта, като използвате правилно именуване.

Дизайн на училищен уебсайт

По-долу има изображение на дизайна на уебсайта на училището.

Заключение

Изтеглихте приложението Strapi и създадохте API в този урок. След това добавихте примерни оценки за показване и направихте няколко маршрута на API достъпни. Не на последно място, копирахте основен уебсайт на JavaScript School и добавихте скриптове за извличане и показване на данни от приложението Strapi. Помислете дали да посочите оценките в сайта и да направите маркерите с възможност за кликване, ако искате да дадете на приложението допълнителни възможности. Ще завърша, като ви предизвикам да направите крачка напред, като включите повече полета в API и включите резервната опция, за да можете да тествате как функционира, когато се добавят нови данни към бекенда.

Ако искате да публикувате своето училищно съдържание, Strapi е отличен вариант. В допълнение към поддръжката на богат текст, той предлага и удобен за потребителя интерфейс за композиция в административния панел. Съдържанието може също да се използва от уебсайта на вашето училище чрез API, който е напълно персонализиран. Разгледайте това обобщение на функциите на Strapi на уебсайта му, за да разберете повече за това какво повече може да предостави. И накрая, изходният код на това приложение е достъпен в Github.