103 lines
6.2 KiB
Markdown
103 lines
6.2 KiB
Markdown
# 2026-05-19 — Статическая страница «О покупке» (удаление админ-CRUD)
|
||
|
||
## Цель
|
||
|
||
Убрать ручное наполнение информационной страницы админом через `InfoPageBlock` CRUD.
|
||
Заменить на статическую страницу с хардкод-контентом в React-компонентах: схемы процессов,
|
||
пошаговые инструкции, карточки доставки, список оплат, условия возврата.
|
||
|
||
## Что удаляется
|
||
|
||
| Файл/директория | Действие |
|
||
|---|---|
|
||
| `client/src/pages/admin-info/` | Удалить целиком (AdminInfoPage + index.ts) |
|
||
| `client/src/entities/info/` | Удалить целиком (api, model, index.ts) |
|
||
| `server/src/routes/api/info-page.js` | Удалить целиком |
|
||
| `server/src/routes/api.js` | Убрать `import` + вызов `registerInfoPageRoutes` |
|
||
| `server/prisma/schema.prisma` | Удалить модель `InfoPageBlock` и связанный индекс |
|
||
| `client/src/pages/admin-layout/ui/AdminLayoutPage.tsx` | Убрать пункт меню «Инфо-страница», импорт и роут |
|
||
| Миграция `20260503144425_...` | Не трогать, Prisma обработает через `db:migrate` |
|
||
|
||
После удаления модели Prisma нужно выполнить `npm run db:migrate` в `server/`.
|
||
|
||
## Что остаётся
|
||
|
||
- Публичный роут `GET /api/info-page/blocks` удаляется — страница больше не ходит на сервер
|
||
- Роут `/info` в `client/src/app/routes/index.tsx` остаётся как есть
|
||
- Ссылка «О покупке» в футере `MainLayout.tsx` остаётся как есть
|
||
|
||
## Новая структура страницы
|
||
|
||
```
|
||
client/src/pages/info/
|
||
ui/
|
||
InfoPage.tsx -- контейнер: заголовок + секции
|
||
sections/
|
||
HowToOrderSection.tsx -- Stepper: 5 шагов покупки
|
||
DeliverySection.tsx -- Grid-карточки: самовывоз, курьер, почта
|
||
PaymentSection.tsx -- List со способами оплаты
|
||
ReturnsSection.tsx -- Paper-блоки: возврат, гарантия
|
||
index.ts -- export { InfoPage }
|
||
```
|
||
|
||
## Дизайн секций
|
||
|
||
### InfoPage (контейнер)
|
||
|
||
- Typography `variant="h4"`: «Информация для покупателей»
|
||
- Typography `color="text.secondary"` с текущим подзаголовком
|
||
- Секции рендерятся последовательно с `Stack spacing={4}`
|
||
|
||
### HowToOrderSection
|
||
|
||
- MUI `Stepper` вертикальный, `activeStep=-1` (все шаги видны, не активные)
|
||
- 5 шагов с `StepLabel`, каждый содержит:
|
||
- Заголовок шага
|
||
- Пояснительный текст
|
||
- Иконку через `StepIconComponent` или проп icon в `Step`
|
||
|
||
Шаги:
|
||
1. «Выберите товары» (ShoppingCart) — Найдите нужное в каталоге, добавьте в корзину
|
||
2. «Проверьте корзину» (ClipboardList) — Проверьте состав заказа, количество и итоговую сумму
|
||
3. «Укажите контакты и адрес» (Mail) — Заполните имя, телефон, email и адрес доставки
|
||
4. «Выберите доставку и оплату» (Truck) — Выберите удобный способ получения и оплаты
|
||
5. «Подтвердите заказ» (CheckCircle) — Проверьте всё ещё раз и нажмите «Оформить заказ»
|
||
|
||
### DeliverySection
|
||
|
||
- Три карточки в `Grid container spacing={2}` с `Paper variant="outlined"`:
|
||
- **Самовывоз** (Store) — Бесплатно. Адрес. Перед визитом согласуем время.
|
||
- **Курьер по городу** (Truck) — Доставка в пределах города. Сроки и стоимость уточняются.
|
||
- **Почта / СДЭК** (Package) — Отправка с трек-номером. Стоимость по тарифу перевозчика.
|
||
|
||
### PaymentSection
|
||
|
||
- MUI `List` с `ListItem` элементами, каждый с `ListItemIcon`:
|
||
- Банковская карта онлайн (CreditCard)
|
||
- Оплата при получении (Banknote)
|
||
- Текст: «Оплата происходит после подтверждения заказа мастером.»
|
||
|
||
### ReturnsSection
|
||
|
||
- Два `Paper variant="outlined"` блока:
|
||
- «Возврат» — Если товар не соответствует описанию или есть дефект, свяжитесь с нами. Мы заменим изделие или вернём деньги.
|
||
- «Гарантия» — Мы отвечаем за качество каждого изделия. Все дефекты, возникшие не по вине покупателя, устраняем или меняем изделие.
|
||
|
||
## Константы
|
||
|
||
Использовать существующие:
|
||
- `PICKUP_ADDRESS_FULL`, `PICKUP_COORDINATES` из `@/shared/constants/pickup-point`
|
||
- `STORE_EMAIL` из `@/shared/constants/store`
|
||
- Для способов оплаты — текст захардкожен, т.к. payment-method из shared/constants содержит только ключи
|
||
|
||
## Иконки
|
||
|
||
Все иконки из `lucide-react`: ShoppingCart, ClipboardList, Mail, Truck, CheckCircle, Store, Package, CreditCard, Banknote.
|
||
|
||
## Что НЕ входит в scope
|
||
|
||
- Сохранение обратной совместимости с текущей динамической страницей
|
||
- Миграция существующих данных InfoPageBlock (они просто удаляются)
|
||
- Автообновление контента админом (страница статическая)
|
||
- Телефоны поддержки (если понадобятся — отдельной задачей)
|