feat: scaffold frontend app structure
This commit is contained in:
58
PLAN.md
58
PLAN.md
@@ -69,6 +69,8 @@ flowchart LR
|
||||
API -->|"DB_* connection"| DB
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 4.2 Вне рантайма (разово)
|
||||
|
||||
**Seed-скрипт** (запуск вручную при развёртывании/обновлении стартового набора):
|
||||
@@ -88,20 +90,22 @@ flowchart LR
|
||||
|
||||
Один набор полей — в таблице, в JSON тел запросов/ответов API и в опциональном файле для seed. Согласовать **camelCase в API** и **snake_case в SQL** в `docs/backend.md`.
|
||||
|
||||
| Поле | Обяз. | Примечание |
|
||||
| ------ | ------- | ------------ |
|
||||
| `id` | да | Стабильный ключ, напр. `2026-05-03-kazan-marathon` |
|
||||
| `date` | да | День старта `YYYY-MM-DD` |
|
||||
| `title` | да | Название |
|
||||
| `distanceKm` | да | Число км |
|
||||
| `status` | нет | `planned` / `completed`; иначе можно вывести из даты |
|
||||
| `officialUrl` | нет | Ссылка на организатора |
|
||||
| `startTime` | нет | Напр. `09:30` |
|
||||
| `clusterSchedule` | нет | Многострочный текст |
|
||||
| `bibPickup` | нет | Выдача номеров |
|
||||
| `bibNumber` | нет | Стартовый номер |
|
||||
| `finishTime` | нет | Время H:MM:SS / HH:MM:SS; для PR — перевод в секунды |
|
||||
| `notes` | нет | Заметки |
|
||||
|
||||
| Поле | Обяз. | Примечание |
|
||||
| ----------------- | ----- | ---------------------------------------------------- |
|
||||
| `id` | да | Стабильный ключ, напр. `2026-05-03-kazan-marathon` |
|
||||
| `date` | да | День старта `YYYY-MM-DD` |
|
||||
| `title` | да | Название |
|
||||
| `distanceKm` | да | Число км |
|
||||
| `status` | нет | `planned` / `completed`; иначе можно вывести из даты |
|
||||
| `officialUrl` | нет | Ссылка на организатора |
|
||||
| `startTime` | нет | Напр. `09:30` |
|
||||
| `clusterSchedule` | нет | Многострочный текст |
|
||||
| `bibPickup` | нет | Выдача номеров |
|
||||
| `bibNumber` | нет | Стартовый номер |
|
||||
| `finishTime` | нет | Время H:MM:SS / HH:MM:SS; для PR — перевод в секунды |
|
||||
| `notes` | нет | Заметки |
|
||||
|
||||
|
||||
Опционально в миграциях: `created_at`, `updated_at`.
|
||||
|
||||
@@ -115,12 +119,12 @@ flowchart LR
|
||||
- Если дата **строго до сегодня** (локальная дата пользователя) — показать **результат** и **стартовый номер** (необязательны при первом сохранении).
|
||||
- Если дата в будущем — поля результата скрыты.
|
||||
- Опционально: чекбокс «Уже прошёл» для случая **сегодняшней** даты, чтобы открыть поля результата.
|
||||
- Сохранение: **`POST`** на API → запись в БД.
|
||||
- Сохранение: `**POST`** на API → запись в БД.
|
||||
|
||||
### 6.2 Страница забега
|
||||
|
||||
- Все поля модели; для прошедших — акцент на результат и номер.
|
||||
- Редактирование результата и номера **в любой момент**: **`PATCH`** на API, затем обновление состояния на клиенте (refetch / инвалидация кэша).
|
||||
- Редактирование результата и номера **в любой момент**: `**PATCH`** на API, затем обновление состояния на клиенте (refetch / инвалидация кэша).
|
||||
|
||||
### 6.3 Личные рекорды
|
||||
|
||||
@@ -139,19 +143,21 @@ flowchart LR
|
||||
|
||||
## 7. Документация
|
||||
|
||||
Создать каталог **`docs/`**:
|
||||
Создать каталог `**docs/`**:
|
||||
|
||||
| Файл | Назначение |
|
||||
| ------ | ------------ |
|
||||
| `docs/backend.md` | Docker, `DB_*`, миграции, seed, REST API, CORS |
|
||||
| `docs/frontend.md` | Структура `frontend/`, `VITE_*`, сборка, контракт с API |
|
||||
| `docs/ux-spa.md` | Сценарии, экраны, BEM, кратко про a11y |
|
||||
|
||||
Корневой **`README.md`**: описание проекта, быстрый старт, **ссылки на три файла выше**.
|
||||
| Файл | Назначение |
|
||||
| ------------------ | ------------------------------------------------------- |
|
||||
| `docs/backend.md` | Docker, `DB`_*, миграции, seed, REST API, CORS |
|
||||
| `docs/frontend.md` | Структура `frontend/`, `VITE`_*, сборка, контракт с API |
|
||||
| `docs/ux-spa.md` | Сценарии, экраны, BEM, кратко про a11y |
|
||||
|
||||
|
||||
Корневой `**README.md`**: описание проекта, быстрый старт, **ссылки на три файла выше**.
|
||||
|
||||
## 8. Риски и ограничения
|
||||
|
||||
- **`DB_*` и пароли** — только в окружении сервера API; в git — только `.env.example` без реальных секретов.
|
||||
- `**DB`_* и пароли** — только в окружении сервера API; в git — только `.env.example` без реальных секретов.
|
||||
- Актуальные данные после работы в UI — в **БД**; файлы в git не синхронизируются с правками автоматически. Надёжный бэкап — **резервное копирование PostgreSQL**.
|
||||
- Деплой: Postgres + процесс API с env + статическая раздача фронта (или иная схема хостинга — описать в README).
|
||||
- Данные организаторов (расписание стартов) — **вручную** + ссылка; без парсинга чужих сайтов в объёме первой версии.
|
||||
@@ -171,7 +177,7 @@ flowchart LR
|
||||
## 10. Чеклист задач (implementation todos)
|
||||
|
||||
1. Монорепо: `frontend/` + `backend/`, BEM, токены, роутер.
|
||||
2. Postgres в docker-compose, миграции таблицы `races`, бэкенд читает `DB_*`.
|
||||
2. Postgres в docker-compose, миграции таблицы `races`, бэкенд читает `DB_`*.
|
||||
3. REST CRUD + разовый seed (CSV и/или JSON) → БД.
|
||||
4. Клиент API на фронте, типы, загрузка данных для экранов и PR.
|
||||
5. Экраны месяц и год, модалка по дате.
|
||||
@@ -193,4 +199,4 @@ flowchart LR
|
||||
|
||||
---
|
||||
|
||||
*Документ создан как единый актуальный план в корне репозитория. При расхождениях с черновиками в IDE приоритет у этого файла.*
|
||||
*Документ создан как единый актуальный план в корне репозитория. При расхождениях с черновиками в IDE приоритет у этого файла.*
|
||||
Reference in New Issue
Block a user