96 lines
3.6 KiB
Markdown
96 lines
3.6 KiB
Markdown
# Магазин изделий ручной работы
|
|
|
|
Цель проекта — витрина и админка для магазина изделий ручного труда (игрушки, сувениры и т.п.) с простой загрузкой/редактированием данных через фронтенд‑админку.
|
|
|
|
Проект сделан как **монорепозиторий**:
|
|
- `client/` — фронтенд (витрина + админка)
|
|
- `server/` — бэкенд API + БД
|
|
|
|
## Стек
|
|
|
|
### Фронтенд
|
|
|
|
- **React** + **Vite**
|
|
- **axios**
|
|
- **@tanstack/react-query**
|
|
- **MUI (@mui/material)** + emotion
|
|
- **React Router**
|
|
- **Архитектура**: **FSD (Feature-Sliced Design)** — слои `app/pages/widgets/features/entities/shared`
|
|
- **Качество**: ESLint (flat config) + Prettier, границы FSD (`eslint-plugin-boundaries`)
|
|
|
|
### Бэкенд
|
|
|
|
- **Node.js**
|
|
- **Fastify** (+ CORS)
|
|
- **Prisma** (миграции)
|
|
- **SQLite** (локальная БД; легко сменить на Postgres через `DATABASE_URL`)
|
|
|
|
## Основные подходы и договорённости
|
|
|
|
### FSD на фронте
|
|
|
|
- Импорты между слоями ограничены правилами `boundaries` (например `features` может импортировать `entities/shared`, но не наоборот).
|
|
- Alias `@` указывает на `client/src` (см. `client/vite.config.ts` и `client/tsconfig.app.json`).
|
|
|
|
### Данные и админка
|
|
|
|
- Данные загружаются/редактируются через **админку на фронте**.
|
|
- Админ‑роуты бэкенда защищены простым токеном:
|
|
- фронт отправляет `Authorization: Bearer <token>`
|
|
- токен задаётся в `server/.env` как `ADMIN_API_TOKEN`
|
|
|
|
### Форматирование и линтинг (client)
|
|
|
|
- Prettier конфиг: `client/.prettierrc.json`
|
|
- Ignore: `client/.prettierignore`
|
|
- EditorConfig: `client/.editorconfig`
|
|
- Команды:
|
|
- `npm run lint` / `npm run lint:fix`
|
|
- `npm run format` / `npm run format:check`
|
|
|
|
## Запуск
|
|
|
|
### Бэкенд
|
|
|
|
```bash
|
|
cd server
|
|
cp .env.example .env # при необходимости поправьте ADMIN_API_TOKEN
|
|
npm install
|
|
npx prisma migrate dev # если база ещё не создана
|
|
npx prisma db seed # опционально: тестовые категории и товары
|
|
npm run dev
|
|
```
|
|
|
|
Сервер: `http://127.0.0.1:3333`. Проверка: `GET /health`.
|
|
|
|
### Фронтенд
|
|
|
|
В другом терминале:
|
|
|
|
```bash
|
|
cd client
|
|
npm install
|
|
npm run dev
|
|
```
|
|
|
|
Откройте `http://localhost:5173`. Запросы к `/api` проксируются на бэкенд (см. `client/vite.config.ts`).
|
|
|
|
## Админка
|
|
|
|
Раздел **«Админка»** в шапке. Введите тот же секрет, что в `ADMIN_API_TOKEN` (заголовок `Authorization: Bearer …` уже подставляет фронт). Там можно создавать категории и товары, включать показ на витрине.
|
|
|
|
Для боевого размещения фронта и API на разных доменах задайте `VITE_API_URL` (например `https://api.example.com/api`) и **CORS_ORIGIN** на сервере.
|
|
|
|
## API (кратко)
|
|
|
|
Публичные:
|
|
- `GET /api/categories`
|
|
- `GET /api/products?categorySlug=...`
|
|
|
|
Админ:
|
|
- `GET /api/admin/products`
|
|
- `POST /api/admin/products`
|
|
- `PATCH /api/admin/products/:id`
|
|
- `DELETE /api/admin/products/:id`
|
|
- `POST /api/admin/categories`
|