Практичне завдання з НІТ: AJAX+API

Опис проекту

У цьому завданні вам необхідно створити простий веб-додаток, який імітує роботу інтернет-магазину. Для побудови вказаного додатку ви можете використовувати верстку, виконану в рамках попередніх завдань.

Основний акцент цього завдання робиться на фронтенд. Перелік товарів та категорій береться з заздалегідь поданого зовнішнього бекенду за допомогою отримання JSON-даних із API. Збереження замовлень відбувається за допомогою відправки POST-запиту на один з методів API із обов'язковим вказанням унікального токена у кожному із запитів. Токен видається персонально кожному із студентів на відповідній сторінці (необхідна аутентифікація через корпоративний обліковий запис у Office 365).

Умовно додаток можна розділити на три представлення (views). Основні представлення додатку:

  • View для перегляду списку товарів з категорії
  • View для перегляду інформації про конкретний товар
  • View для форми для оформлення замовлення
В будь-який момент усі представлення мають мати спільні header та footer. В header сторінки має міститись логотип/назва вашого інтернет магазину (придумайте власні) та, якщо потрібно, пункти меню або інша необхідна інформація. Опціонально одразу після header може виводитись короткий опис магазину. В свою чергу footer має містити інформацію про те, хто розробив додаток.

Переключення між різними представленнями, наприклад, можна зробити за допомогою JS зберігаючи їх код в єдиному файлі. Втім, ви можете спробувати створити іншу реалізацію, якщо уявляєте як та вона буде коректно працювати.

У представленні із товарами самі товари мають виводитись сіткою по декілька в ряд як наразі це робиться в більшості інтернет-магазинів. Міні-картка товару має точно містити такі елементи:

  • Зображення товару
  • Назву товару
  • Ціну товару
  • У разі наявності акційної ціни товару вона заміняє основну, в той час як основна ціна виводиться поруч із явним розрізненням двох цін (наприклад, стара - перекреслена, нова - виділена)
  • Кнопка для додавання товару в кошик
Кнопка для додавання товару в кошик, як не дивно, має додавати його в кошик. Клік по інших елементах має виводити представлення з деталями самого товару.

Окрім того у представленні категорії (згори або збоку) має бути розташований клікабельний список категорій. При кліку на категорію в списку товарів виводяться лише товари з цієї категорії. Також на початку списку категорій має знаходитись пункт для виводу усіх товарів.

В представленні товару має бути деталізована інформація про нього - все те саме, що і у міні-картці товару, текстовий опис товару та, у разі наявності додаткових полей у об'єкті з API можна виводити інформацію з них. Має бути присутня кнопка для додавання товару в кошик. Окрім того має бути передбачена можливість повернення у категорію товару.

В представленні кошику мають бути товари, додані до кошика (або повідомлення про пустий кошик), у товарів має бути вказана поточна кількість однакових товарів в кошику, а також кнопки "+" та "-" для збільшення/зменшення кількості відповідного товару в кошику та кнопка видалення товару з кошику. Окрім того мають бути поля вводу для імені клієнта, номеру телефону та електронної пошти. В кінці - кнопка замовлення. Представлення кошику може виводитись у вигляді окремої сторінки або як бокова менюшка або як модальне вікно - на ваш розсуд, головне - щоби зручно та приємно для вашого користувача.

При кліку на кнопку оформлення замовлення відповідний запит має бути надісланий на відповідний метод з поданого API через AJAX. У разі повернення помилки з API додаток має коректно обробити її та вивести відповідне повідомлення. Особливо важливо коректно виводити помилки у формі створення замовлення для того, щоби користувач вашого додатку знав, що саме він неправильно зробив при оформленні замовлення. У разі успішного оформлення клієнт також має отримати сповіщення про це, а кошик має бути почищений.

Верстка додатку має бути адаптивна, бажано mobile-first. За бажання ви можете користуватись Bootstrap або іншим подібним CSS-фреймворком.

Використання JS-фреймворків (jQuery, React, Angular) - на ваш розсуд. Взагалі, буде прикольно, якщо ви розберетесь в якомусь з сучасних JS-фреймворків для побудови односторінкових повноцінних додатків, але якщо відчуваєте це занадто складним для себе на даний момент - можете помучитись із генерацією HTML за допомогою jQuery.

Головне - попіклуйтесь про те, щоби створений вами простий інтернет-магазин був приємним та зручним у використанні, в тому числі із мобільних девайсів.

Якщо у вас є ідеї як зробити проект ще кращим, аніж вимагається - welcome! Додаткові фічі вітаються.

На виході проект має бути залитий на GitHub у якості публічного репозиторію разом із публікацією через GitHub Pages. Перевірятись ваш проект на працездатність буде шляхом відкриття його як сайту та переглядом репозиторію. Також основні файли проекту мають бути продубльовані завантаженням на distedu у якості zip-архіву.

Опис API

Метод Опис
GET /api/category/list перегляд доступних категорій
GET /api/category/<category_id> перегляд інформації про категорію, де <category_id> - ID категорії
GET /api/product/list перегляд усіх товарів
GET /api/product/list/category/<category_id> перегляд усіх товарів з категорії, де ID дорівнює <category_id>
GET /api/product/<product_id> перегляд інформації про товар, де <product_id> - ID товару
POST /api/order/add створення нового замовлення. Список POST-параметрів:
  • token - унікальний токен магазину
  • name - ім'я покупця
  • phone - номер телефону покупця
  • email - електронна адреса покупця
  • products[<product_id>] - кількість товару з ID=<product_id> (параметр може бути представлений декілька разів відповідно до кількості різних товарів в замовленні)

Ініціалізація проекту

Обов'язково
  1. Створюємо папку для проекту.
  2. Створюємо в ній пустий репозиторій.
  3. Виконуємо команду npm init, яка в свою чергу має на виході створити файл package.json.
  4. Створюємо файл .gitignore з вмістом node_modules/ для того, щоби пізніше при інсталяції npm-пакетів вони не потрапляли в репозиторій.
  5. Створюємо перший комміт з повідомленням Init commit.
  6. Інсталюємо Webpack за допомогою команди npm install --save-dev webpack webpack-cli.
  7. У файлі package.json у полі scripts додаємо підполе build з текстом webpack.
  8. Робимо комміт з повідомленням про те, що встановили Webpack.
  9. В проекті створюємо папки src/ для збереження вихідних файлів та docs/ для збереження цільових файлів.
  10. Створюємо файл webpack.config.js з таким вмістом:
  11. В папці src/ створюємо файл index.js та додаємо туди будь-який тестовий код (наприклад, console.log('Hello!');).
  12. В папці docs/ створюємо файл index.html та розміщуємо в ньому скелет HTML-сторінки.
  13. Запускаємо Webpack з метою компіляції файлу src/index.js у файл docs/js/main.js. Для цього виконуємо команду npm run build.
  14. В файлі docs/index.html підключаємо файл docs/js/main.js за допомогою тегу <script src="./js/main.js"></script>.
  15. Відкриваємо файл docs/index.html у браузері та перевіряємо у консолі чи спрацював вивід підключеного скрипта.
  16. Зберігаємо все за допомогою комміту.

Підключення Babel

Обов'язково
  1. Інсталюємо Babel за допомогою команди npm install -D babel-loader @babel/core @babel/preset-env webpack.
  2. Додаємо у файл webpack.config.js такий код:
  3. Для перевірки роботи Babel додаємо у файл index.js код, написаний саме на ES6+, наприклад, console.log(`The time is ${new Date()}`); та запускаємо Webpack.
  4. Відкриваємо файл docs/index.html у браузері та перевіряємо у консолі чи спрацював вивід оновленого скрипта.
  5. Створюємо відповідний комміт.

Підключення Sass

Обов'язково
  1. Інсталюємо Sass за допомогою команди npm install --save-dev node-sass sass-loader css-loader mini-css-extract-plugin.
  2. Додаємо у файл webpack.config.js такий код:
  3. Створюємо папку src/scss та створюємо всередині неї перший SCSS-файл, наприклад, main.scss.
  4. Прописуємо у новоствореному файлі стилів свої перші стилі для проекту.
  5. Для перевірки роботи Sass додаємо у файл index.js код для підключення попередньо створеного файлу, наприклад, import './scss/main.scss'; та запускаємо Webpack.
  6. В файлі docs/index.html підключаємо файл docs/css/main.css за допомогою тегу <link rel="stylesheet" href="./css/main.css">.
  7. Відкриваємо файл docs/index.html у браузері та перевіряємо чи відобразились створені стилі.
  8. Створюємо відповідний комміт.

Виконання проекту

Обов'язково

Тут, впринципі, мало чого пояснювати - пишемо свій HTML код у відповідних файлах в папці docs/ та CSS/SCSS + JS код у відповідних файлах у папці src/ з подальшою компіляцією через Webpack.

У разі потреби - підключаємо зовнішні бібліотеки до проекту. Найкращий спосіб - за допомогою встановлення npm-пакетів та підключення через src/index.js.

Публікація проекту

Обов'язково
  1. Реєструємось на GitHub.
  2. Створюємо новий репозиторій.
  3. Підключаємо його як remote до нашого репозиторію (за допомогою консольної команди, яку пропонує GitHub або через GUI в пунктах Remote - Add...).
  4. Виконуємо push проекту.
  5. На сайті GitHub в репозиторії клікаємо на Settings та скролимо до секції GitHub Pages.
  6. Обираємо папку docs гілки master та клікаємо Save.
  7. Протягом двох хвилин перевіряємо, чи запрацював проект як сайт за адресою, яка з'явилась над пунктом GitHub Pages.
  8. У разі потреби опублкувати оновлення просто виконуємо push для нових коммітів.
  9. При надсиланні роботи на оцінювання завантажуємо основні файли проекту у zip-архіві, а в коментарях до завантаження подаємо лінк на свій проект, опублікований через GitHub Pages.