Skip to content

Java62-webinars/book-store

Repository files navigation

Book Store (учебный проект)

Небольшое учебное приложение «Книжный магазин» на React + Redux Toolkit. Данные каталога и корзины сохраняются в LocalStorage.

Стек

  • React (Vite)
  • Redux Toolkit + react-redux
  • Vitest (тесты)
  • ESLint

Быстрый старт

npm i
npm run dev

Откройте адрес, который выведет Vite (обычно http://localhost:5173).

Команды

npm run dev        # запуск в режиме разработки
npm run build      # сборка
npm run preview    # предпросмотр сборки
npm run lint       # eslint
npm run test       # vitest (watch)
npm run test:run   # vitest (single run)
npm run test:ui    # vitest UI

Доменная модель

Book (книга)

Книга в каталоге содержит поля:

  • title: string
  • author: string
  • isbn: string — уникальный идентификатор
  • price: number
  • flagOutOfStock: boolean — снята с продажи / недоступна

CartItem (позиция корзины)

  • isbn: string
  • quantity: number

Сценарий и требования

1) Каталог (Catalog)

Каталог хранится в LocalStorage.

  • При старте приложения:
  • если в LocalStorage есть данные — каталог загружается из хранилища;
  • если хранилище пустое — используется стартовый набор (seed) из 10 книг, затем он сохраняется в LocalStorage.

Операции каталога:

  1. Добавить книгу в каталог (с валидацией).
  2. Снять книгу с продажи / вернуть книгу в продажу (flagOutOfStock).
  3. Обновить цену книги.

Валидации при добавлении/обновлении:

  • title, author, isbn, price не пустые.
  • title, author, isbn — строки.
  • isbn уникальный.
  • isbn должен содержать 10–12 символов.
  • price — число (пример: 99.99).

2) Корзина (Cart)

Корзина нужна для формирования заказа из книг, которые:

  • существуют в каталоге,
  • доступны к продаже (flagOutOfStock !== true).

Операции корзины:

  1. Добавить книгу в корзину:
  • минимальное количество — 1;
  • если книга уже есть в корзине — увеличиваем количество.
  1. Удалить книгу из корзины.
  2. Уменьшить количество:
  • если стало 0 — позиция удаляется.
  1. Увеличить количество до 99.
  2. Очистить корзину.

Агрегаты (итоги корзины):

  • totalUniqueIsbn — количество уникальных ISBN
  • totalQty — общее количество экземпляров
  • totalPrice — суммарная стоимость

3) Заказ (Order)

Пользователь может оформить заказ из корзины.

Правило валидности позиции для заказа:

  • книга должна быть найдена в каталоге (ISBN существует),
  • книга должна быть доступна к продаже (flagOutOfStock !== true).

Поведение при оформлении:

  • если все позиции валидны — заказ создаётся (на текущем этапе можно сохранять в LocalStorage / store).
  • если есть невалидные позиции (книги нет или она outOfStock) — такие позиции исключаются из заказа и показывается уведомление.
  • если после исключения валидных позиций не осталось — заказ не создаётся, показывается ошибка.

После успешного оформления заказа корзина очищается.

LocalStorage

Ключи хранения описаны в src/constants/storageKeys.js:

  • bookshop.catalog.v1 — каталог
  • bookshop.cart.v1 — корзина

Архитектура проекта (в общих чертах)

  • src/entities/* — доменные сущности и чистые функции (без Redux и UI)
  • src/features/* — логика фич (slice, thunks, selectors, persistence)
  • src/ui/* — компоненты UI
  • src/store/store.js — конфигурация Redux store

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors