Учебный проект интернет‑магазина «пиццы из котиков» на стеке React + TypeScript + Vite с простым backend на Express.
Приложение позволяет просматривать «котиков‑пиццы», добавлять их в корзину, оформлять заказ и просматривать историю заказов с базовой авторизацией.
- Frontend
- React
- TypeScript
- React Router DOM
- Vite
- Backend
- Node.js
- Express
- Прочее
- ESLint (настройки для React/TS)
lowdbдля локальной персистентности backend-состояния вserver-data/db.json- Гостевая сессия в
HttpOnlycookie, токены и корзины в persistent storage
-
Каталог котиков
- Получение списка котиков с бэкенда по
/api/cats - Карточки с выбором опций (шерсть, активность, дополнительные «топпинги»)
- Получение списка котиков с бэкенда по
-
Корзина
- Добавление товара с конкретными опциями (
CartContext) - Поддержка гостей и авторизованных пользователей
- Изменение количества, удаление товара, очистка корзины
- Синхронизация с backend
/api/cart,/api/cart/items,/api/cart/clear - Изоляция гостевой корзины по cookie-сессии вместо общей памяти процесса
- Добавление товара с конкретными опциями (
-
Оформление заказа
- Страница
CheckoutPageи модальное окноCheckoutModal - Валидация адреса (город, улица, дом)
- Выбор способа оплаты (карта / наличные)
- Отправка заказа на бэкенд
/api/orders - Очистка корзины после успешного оформления
- Страница
-
Авторизация
- Регистрация пользователя
/api/register - Логин
/api/login - Хранение токена и пользователя в
localStorage(AuthContext) - Перенос гостевой корзины в корзину пользователя при логине
- Токены backend-сессии сохраняются в
server-data/db.json, поэтому не теряются при рестарте сервера
- Регистрация пользователя
-
История заказов
- Страница
OrdersPage - Получение заказов по
/api/orders - Отображение списка заказов с датой, суммой и составом
- Страница
web-pizza/
server/
app.mjs # createApp(...) и lowdb-backed storage для API
index.mjs # Bootstrap сервера и запуск app.listen(...)
seeds/
users.json # Коммитимый seed пользователей для пустой db.json
server-data/
db.json # lowdb-хранилище cats/users/sessions/carts/orders
users.json # Локальный runtime-файл, не используется как seed в CI
pizza-images/ # Картинки котиков, раздаются как статика /static
src/
auth/
AuthContext.tsx # Контекст авторизации, хранение user + token
cart/
CartContext.tsx # Контекст корзины, работа с /api/cart
components/
auth/ # Модальные окна авторизации и оформления заказа
cats/ # Компоненты каталога котиков
pages/
HomePage.tsx # Главная страница с котиками
CartPage.tsx # Страница корзины
CheckoutPage.tsx # Страница оформления заказа
OrdersPage.tsx # История заказов
App.tsx # Маршрутизация и основные layout-компоненты
main.tsx # Точка входа фронтенда
- Node.js (актуальная LTS‑версия)
- npm
npm installFrontend (Vite):
npm run dev
# по умолчанию http://localhost:5173Backend (Express):
npm run dev:server
# по умолчанию http://localhost:3001Оба сервера одновременно (удобно для разработки):
npm run dev:allnpm run buildnpm run previewGET /api/cats— список котиковPOST /api/register— регистрация пользователяPOST /api/login— логин, возвращаетtokenиuserDELETE /api/users/by-email— удалить пользователя по email (тело запроса:{ "email": string }, ответ:{ deletedUsersCount, deletedOrdersCount })GET /api/cart— текущая корзинаPOST /api/cart/items— добавить товар в корзинуPATCH /api/cart/items/:id— изменить количествоDELETE /api/cart/items/:id— удалить товарPOST /api/cart/clear— очистить корзинуPOST /api/orders— создать заказ (из тела запроса или текущей корзины)GET /api/orders— получить заказы текущего пользователя или гостяDELETE /api/orders/by-email— удалить все заказы пользователя по email (тело запроса:{ "email": string }, ответ:{ deletedCount })
Авторизация реализована через токен в заголовке Authorization: Bearer <token>. Токен хранится в localStorage на фронтенде, а серверная сессия и данные корзины/заказов сохраняются в server-data/db.json. Для гостя backend создаёт HttpOnly cookie guestSessionId, чтобы корзина и история заказов были изолированы между браузерами и тестами.
- Линтинг:
npm run lint- Основная бизнес‑логика фронтенда сосредоточена в контекстах:
src/auth/AuthContext.tsxsrc/cart/CartContext.tsx