Browse Source

plan: align Sprint 7-10 with TZ requirements (roles, API, experiments)

Added missing sprints from TZ spec:
- Sprint 7: Auth (viewer/editor roles, JWT, login, FT-60-64)
- Sprint 8: Real data integration (NestJS proxy → oclinica.ru, FT-41, INT-01-04)
- Sprint 9: Experiments — duplicate button, attribute editor, status workflow (FT-50-56)
- Sprint 10: Final polish, backend deploy

Sprint 6 expanded to all pages (prices, contacts, doctor profile).
Sidebar: Experiments section → "Дубли компонентов / Дубли страниц"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sprint/5
AR 15 M4 1 week ago
parent
commit
5b1ace962a
  1. 6
      apps/web/components/layout/Sidebar.tsx
  2. 191
      docs/SPRINTS.md

6
apps/web/components/layout/Sidebar.tsx

@ -67,10 +67,10 @@ const NAV: NavSection[] = [
], ],
}, },
{ {
title: "Варианты и дубли", title: "Эксперименты",
items: [ items: [
{ label: "Варианты блоков", href: "/variants/blocks", soon: true }, { label: "Дубли компонентов", href: "/variants/blocks", soon: true },
{ label: "Варианты страниц", href: "/variants/pages", soon: true }, { label: "Дубли страниц", href: "/variants/pages", soon: true },
], ],
}, },
]; ];

191
docs/SPRINTS.md

@ -181,159 +181,178 @@
## Sprint 5 — Все блоки текущего сайта ## Sprint 5 — Все блоки текущего сайта
**Цель:** Задокументировать ВСЕ блоки страницы perm.oclinica.ru/lor за один спринт. **Цель:** Задокументировать ВСЕ блоки страницы perm.oclinica.ru/lor за один спринт.
Источник: скриншот страницы + CSS сайта. Источник: скриншот страницы + CSS сайта. Только фронтенд, mock-данные.
### Блоки с реального сайта (сверху вниз) ### Блоки с реального сайта (сверху вниз, по скриншоту /lor)
**Шапка и навигация** → `/components/navigation` **Шапка и навигация** → `/components/navigation`
- [ ] FE: Топ-бар: адрес «Б. Цитная, 3», ссылки на разделы, телефон /342/ 255-53-84, кнопка «Заказать звонок» (pill) - [ ] FE: Топ-бар: адрес «Б. Цитная, 3», телефон /342/ 255-53-84, кнопка «Заказать звонок» (pill)
- [ ] FE: Логотип «КЛИНИКА УХО ГОРЛО НОС ИМ. ПРОФ. Е.Н. ОЛЕНЕВОЙ» - [ ] FE: Логотип «КЛИНИКА УХО ГОРЛО НОС ИМ. ПРОФ. Е.Н. ОЛЕНЕВОЙ»
- [ ] FE: Главное меню: Клиника / ЛОР врачи / Заболевания / Вопрос-ответ / ЛОР-операции / Сурдология / Цены / Контакты - [ ] FE: Главное меню: Клиника / ЛОР врачи / Заболевания / Вопрос-ответ / ЛОР-операции / Сурдология / Цены / Контакты
- [ ] FE: Убрать `soon` у `/components/navigation` в Sidebar
**Hero-баннер** → `/blocks/hero` **Hero-баннер** → `/blocks/hero`
- [ ] FE: Левая часть: белый блок, заголовок «ЭНДОСКОПИЧЕСКОЕ...», 3 пункта с галочками, кнопка «Узнать стоимость операции» (primary) - [ ] FE: Левая часть: белый блок, заголовок «ЭНДОСКОПИЧЕСКОЕ...», 3 пункта с галочками, кнопка «Узнать стоимость операции»
- [ ] FE: Правая часть: фото врача, фон #b8e6ed - [ ] FE: Правая часть: фото врача, фон #b8e6ed
- [ ] FE: Под баннером: кнопки соцсетей + счётчик просмотров
**Вводный текст (CEO-блок)** → `/blocks/ceo` **Вводный текст (CEO-блок)** → `/blocks/ceo`
- [ ] FE: Текст специализации клиники, вопросы-стимулы в формате Q&A (— У вас болит ухо?...) - [ ] FE: Текст специализации клиники, Q&A вопросы-стимулы
**Блок врачей** → `/blocks/doctors` **Блок врачей** → `/blocks/doctors`
- [ ] FE: Заголовок «Приём ведут опытные ЛОР врачи» - [ ] FE: Заголовок «Приём ведут опытные ЛОР врачи» + 3 стат-блока + сетка карточек (mock)
- [ ] FE: 3 стат-блока: «Ежедневно 27 врачей», «6 кандидатов наук», «Свыше 12 000 операций»
- [ ] FE: Сетка карточек врачей (6 штук)
**Блок отзывов** → `/blocks/reviews` **Блок отзывов** → `/blocks/reviews`
- [ ] FE: Заголовок «Отзывы о нас», подзаголовок - [ ] FE: Карусель: кавычка, текст отзыва, «Читать полностью», стрелки
- [ ] FE: Карусель: большая кавычка, текст отзыва, ссылка «Читать отзыв полностью», стрелки
**Форма записи «Будьте здоровы!»** → `/blocks/contact-forms` **Формы записи** → `/blocks/contact-forms`
- [ ] FE: Фон #b8e6ed (бирюзовый), заголовок, поля: имя / телефон / выбор врача (select), чекбокс согласия, кнопка «Запишите меня!» - [ ] FE: Форма «Будьте здоровы!» (фон #b8e6ed, поля: имя/телефон/врач, кнопка «Запишите меня!»)
- [ ] FE: Форма «Узнайте стоимость операции» (белый фон, поля: имя/телефон, кнопка «Перезвоните мне»)
**Форма «Узнайте стоимость операции»** → на той же странице `/blocks/contact-forms`
- [ ] FE: Белый фон, заголовок, поля: имя / телефон, чекбокс, кнопка «Перезвоните мне»
**Блок новостей** → `/blocks/news` **Блок новостей** → `/blocks/news`
- [ ] FE: Заголовок «Новости», 4 карточки новостей в ряд (дата + заголовок), кнопка «Все новости» - [ ] FE: 4 карточки новостей в ряд (дата + заголовок), кнопка «Все новости» (mock)
**Footer (подвал)** → `/blocks/contact` **Footer (подвал)** → `/blocks/contact`
- [ ] FE: 4 колонки ссылок: О клинике / Заболевания / Вопрос-ответ / Операции - [ ] FE: 4 колонки ссылок, логотип, адрес, соцсети, часы работы
- [ ] FE: Логотип внизу, адрес «Пермь, ул. Г. Звезда», иконки соцсетей, часы работы
### Общее ### Общее к Sprint 5
- [ ] FE: Добавить LLM-блоки v1.0 на каждую страницу блоков - [ ] FE: LLM-блоки v1.0 на каждую страницу блоков
- [ ] FE: Убрать `soon` у всех блоков в Sidebar - [ ] FE: Убрать `soon` у всех заполненных блоков в Sidebar
- [ ] Docs: Обновить `docs/LLM_CONTEXT.md` — секции по всем блокам - [ ] Docs: Обновить `docs/LLM_CONTEXT.md`
**Результат спринта:** Все блоки текущего сайта задокументированы. **Результат спринта:** Все блоки текущего сайта задокументированы с mock-данными.
--- ---
## Sprint 6 — Страницы (сборки из блоков) ## Sprint 6 — Страницы (сборки из блоков)
**Цель:** Задокументировать полные страницы как сборки уже готовых блоков. **Цель:** Задокументировать полные страницы как сборки уже готовых блоков.
Данные пока mock — реальные появятся в Sprint 8.
### Задачи ### Задачи
- [ ] Research: Изучить реальную страницу заболевания (напр. perm.oclinica.ru/lor/rinit) — какие блоки там, в каком порядке - [ ] Research: Страница заболевания perm.oclinica.ru/lor/rinit — порядок блоков, что отличается от главной
- [ ] Research: Изучить страницу /lor/doctors — фильтры, сетка, пагинация - [ ] Research: Страница врачей /lor/doctors — фильтры, сетка, пагинация
- [ ] FE: Страница `/pages/home` — полная главная (сборка блоков Sprint 5) - [ ] FE: `/pages/home` — сборка блоков из Sprint 5 в порядке реальной страницы /lor
- [ ] FE: Страница `/pages/disease` — страница заболевания (сборка по реальной /lor/rinit) - [ ] FE: `/pages/disease` — страница заболевания по /lor/rinit
- [ ] FE: Страница `/pages/doctors` — страница врачей с фильтрами и пагинацией - [ ] FE: `/pages/doctors` — список врачей с фильтрами (mock) и пагинацией
- [ ] FE: `/pages/prices` — страница цен (Research: реальная структура таблицы)
- [ ] FE: `/pages/contacts` — контакты + карта
- [ ] FE: `/pages/doctor` — профиль врача
- [ ] FE: Убрать `soon` у страниц в Sidebar - [ ] FE: Убрать `soon` у страниц в Sidebar
- [ ] Docs: Обновить `docs/LLM_CONTEXT.md` - [ ] Docs: Обновить `docs/LLM_CONTEXT.md`
**Результат спринта:** 3 полные страницы задокументированы в брендбуке. **Результат спринта:** Все страницы брендбука задокументированы (с mock-данными).
--- ---
## Sprint 7 — Дублирование компонентов и блоков ## Sprint 7 — Авторизация (viewer / editor)
**Цель:** Возможность создавать дубли существующих компонентов и блоков для адаптации под конкретные страницы или разделы. **Цель:** Реализовать систему ролей из ТЗ: `viewer` видит брендбук, `editor` видит кнопки дублирования.
Требует бэкенд (NestJS) и БД (PostgreSQL + Prisma).
### Концепция ### Задачи — бэкенд
Каждый задокументированный блок/компонент можно «продублировать» — получить копию с другим наполнением (другой врач, другое заболевание, другие тексты). Дубль хранится как вариант и отображается рядом с оригиналом. - [ ] BE: Prisma-модель `User` (id, email, name, passwordHash, role: viewer/editor, createdAt)
- [ ] BE: Prisma миграция + seed (создать тестовых пользователей: 1 viewer, 1 editor)
- [ ] BE: NestJS модуль `auth` — JWT-авторизация, `/api/auth/login`, `/api/auth/me`
- [ ] BE: JWT-токен в httpOnly cookie (не localStorage) — ФТ-64
- [ ] BE: Guard для защиты эндпоинтов по роли
### Задачи ### Задачи — фронтенд
- [ ] Design: Определить UI «дублирования» — кнопка Duplicate на каждой карточке блока/компонента - [ ] FE: Страница `/login` — форма email + пароль + кнопка «Войти» — ФТ-61
- [ ] FE: Компонент `DuplicateCard` — обёртка над блоком с пометкой «Вариант» и именем - [ ] FE: Редирект неавторизованных на `/login` — ФТ-60
- [ ] FE: На страницах компонентов (buttons, forms, cards) — кнопка «+ Создать вариант» - [ ] FE: После входа — редирект обратно на запрошенную страницу — ФТ-62
- [ ] FE: Секция «Варианты» на каждой странице блока — список дублей с метками - [ ] FE: В шапке брендбука: имя пользователя, роль, кнопка «Выйти» — ФТ-63
- [ ] FE: Статические варианты блоков (задаются в коде, не CRUD): например, Hero для раздела Аллергология - [ ] FE: `editor` видит шапку с дополнительными действиями; `viewer` — только чтение
- [ ] Docs: Обновить `docs/LLM_CONTEXT.md` — описание системы вариантов
**Результат спринта:** Система вариантов/дублей для компонентов и блоков. **Результат спринта:** Рабочая авторизация, два типа пользователей, защищённые маршруты.
--- ---
## Sprint 8 — Дублирование страниц ## Sprint 8 — Реальные данные (интеграция с oclinica.ru)
**Цель:** Возможность создавать дубли страниц — шаблон одной страницы адаптируется под другой раздел клиники (ЛОР → Аллергология → Сурдология). **Цель:** Подключить реальные данные с сайта клиники — врачи, новости, услуги, цены, отзывы.
Данные проксируются через NestJS с кэшем 15 минут — ИНТ-01-04.
### Концепция ### Задачи — бэкенд
Страница заболевания для ЛОР-раздела — это шаблон. Аллергология использует те же блоки, но с другим контентом. Брендбук показывает этот шаблон и его варианты. - [ ] BE: Research — проверить доступные эндпоинты oclinica.ru (JSON:API Drupal или /node?_format=json)
- [ ] BE: NestJS модуль `oclinica` — HTTP-клиент к oclinica.ru API
- [ ] BE: Кэш TTL 15 минут (in-memory или Redis) — ИНТ-03
- [ ] BE: Graceful degradation: если API недоступен — возврат mock-данных — ИНТ-04
- [ ] BE: Эндпоинты: `/api/doctors`, `/api/news`, `/api/services`, `/api/prices`, `/api/reviews`
### Задачи ### Задачи — фронтенд
- [ ] Design: Определить структуру шаблона страницы — какие блоки обязательны, какие опциональны - [ ] FE: Блок «Наши врачи» (`/blocks/doctors`) — реальные карточки врачей с фото
- [ ] FE: На странице `/pages/disease` — секция «Варианты этой страницы» с примерами для разных разделов - [ ] FE: Блок «Новости» (`/blocks/news`) — реальные новости
- [ ] FE: Страница `/pages/home` — варианты для Аллергологии (другой Hero, другой CEO-текст) - [ ] FE: Страницы (`/pages/*`) — замена mock-данных на реальные
- [ ] FE: Компонент `PageTemplate` — отображение структуры страницы как схемы блоков
- [ ] Docs: Обновить `docs/LLM_CONTEXT.md` — шаблоны страниц
**Результат спринта:** Шаблонная система страниц, варианты для разных разделов сайта. **Результат спринта:** Брендбук показывает реальных врачей, новости, услуги с сайта клиники.
--- ---
## Sprint 9 — Оставшиеся страницы: Цены, Контакты, Врач ## Sprint 9 — Эксперименты: дублирование компонентов
**Цель:** Задокументировать оставшиеся страницы. **Цель:** Реализовать систему создания дублей — `editor` может дублировать любой компонент/блок,
редактировать атрибуты и отправить на согласование. ФТ-50 – ФТ-56.
### Задачи
- [ ] Research: Реальная страница цен — структура таблицы, фильтры ### Задачи — бэкенд
- [ ] Research: Реальная страница контактов — карта, адреса клиник, часы, схема проезда - [ ] BE: Prisma-модель `ExperimentalComponent` (id, name, baseComponent, attributes JSON, status, authorId, createdAt, updatedAt)
- [ ] Research: Страница профиля врача — структура, блоки - [ ] BE: Prisma миграция
- [ ] FE: Страница `/pages/prices` - [ ] BE: NestJS модуль `components` — CRUD: `POST /api/components`, `GET /api/components`, `PATCH /api/components/:id`, `DELETE /api/components/:id`
- [ ] FE: Страница `/pages/contacts` - [ ] BE: Эндпоинт смены статуса: `PATCH /api/components/:id/status` (draft→review→approved)
- [ ] FE: Страница `/pages/doctor` - [ ] BE: Guard: мутирующие операции только для `editor` — ФТ-52, ФТ-55
- [ ] Docs: Финальное обновление `docs/LLM_CONTEXT.md`
### Задачи — фронтенд
**Результат спринта:** Все страницы брендбука задокументированы. - [ ] FE: Кнопка «Дублировать» на каждом компоненте/блоке (видна только `editor`) — ФТ-51
- [ ] FE: Форма редактирования атрибутов дубля — ФТ-52:
- Текстовые поля (заголовки, описания)
- Color picker — только из токенов бренда (`--brand-*`)
- Выбор размера из допустимых значений
- Real-time preview при изменении
- Кнопки: «Сохранить как черновик», «Отмена»
- [ ] FE: Раздел `/variants/blocks` — список всех дублей компонентов — ФТ-50, ФТ-56:
- `viewer`: только approved
- `editor`: все (draft, review, approved)
- [ ] FE: Карточка дубля: название, автор, дата, статус, базовый компонент, превью — ФТ-56
- [ ] FE: Управление статусом для `editor`: draft→review→approved, удаление draft — ФТ-54, ФТ-55
**Результат спринта:** Рабочая система создания и согласования дублей компонентов.
--- ---
## Sprint 10 — Финальная полировка и деплой ## Sprint 10 — Финальная полировка и деплой
**Цель:** Финальный релиз. **Цель:** Финальный релиз — smoke-тест, адаптивность, деплой бэкенда.
### Задачи ### Задачи
- [ ] FE: Полный smoke-тест всего брендбука - [ ] BE+FE: Полный smoke-тест всего брендбука (все роли, все страницы)
- [ ] FE: LLM-блоки на всех страницах — проверка актуальности - [ ] FE: LLM-блоки на всех страницах — проверка актуальности
- [ ] FE: Мобильная адаптация — финальная проверка - [ ] FE: Мобильная адаптация — финальная проверка (1440 / 768 / 375px)
- [ ] Деплой: автоматический деплой через Gitea Actions → Vercel (при пуше в `main`) - [ ] FE: Accessibility-аудит WCAG AA — особенно форма дублирования
- [ ] Design: Финальный ревью брендбука - [ ] Деплой BE: выбрать хостинг для NestJS + PostgreSQL (Railway / Render / VPS клиники)
- [ ] Деплой: автоматический деплой через Gitea Actions → Vercel (push в `main`)
- [ ] Docs: Финальное обновление `docs/LLM_CONTEXT.md`, `DEPLOY.md`
### Текущий статус деплоя ### Текущий статус деплоя
- **Фронтенд:** https://web-oclinica.vercel.app (Vercel Hobby) - **Фронтенд:** https://web-oclinica.vercel.app (Vercel Hobby)
- **Команда деплоя:** `cd apps/web && vercel --prod --yes` - **Команда деплоя:** `cd apps/web && vercel --prod --yes`
- **Бэкенд:** локально (Docker Compose), хостинг выбирается в Sprint 10
**Результат спринта:** Брендбук полностью готов и задеплоен. **Результат спринта:** Брендбук полностью готов, оба сервиса задеплоены, реальные данные, роли работают.
--- ---
## Сводная таблица ## Сводная таблица
| Спринт | Тема | Источник / Суть | | Спринт | Тема | Слой | Суть |
|--------|---------------------------------------|------------------------------------------------| |--------|---------------------------------|---------------|--------------------------------------------------------|
| 1 | Инициализация + Логотип | PDF брендбука | | 1 | Инициализация + Логотип | FE | PDF брендбука, первая страница |
| 2 | Цвета, Типографика, Оффлайн элементы | PDF брендбука + Oracal каталог | | 2 | Цвета, Типографика, Оффлайн | FE | PDF + Oracal каталог |
| 3 | Кнопки и форм-контролы | CSS реального сайта | | 3 | Кнопки и форм-контролы | FE | CSS реального сайта |
| 4 | Карточки, бейджи, алерты | CSS реального сайта | | 4 | Карточки, бейджи, алерты | FE | CSS реального сайта |
| 5 | ВСЕ блоки текущего сайта | Все блоки /lor одним спринтом | | 5 | ВСЕ блоки сайта | FE | Все блоки /lor, mock-данные |
| 6 | Страницы (сборки) | Главная + Заболевание + Врачи | | 6 | Все страницы (сборки) | FE | Сборки из блоков, mock-данные |
| 7 | Дублирование компонентов и блоков | UI для создания вариантов блоков | | 7 | Авторизация (viewer / editor) | BE + FE | JWT, роли, login-страница, шапка с именем |
| 8 | Дублирование страниц | Шаблоны страниц + варианты по разделам | | 8 | Реальные данные | BE + FE | NestJS прокси → oclinica.ru, кэш 15 мин |
| 9 | Цены, Контакты, Врач | Оставшиеся страницы по реальному сайту | | 9 | Эксперименты (дубли) | BE + FE | Duplicate button, форма атрибутов, статусы, раздел |
| 10 | Финальная полировка | Smoke-тест + LLM-блоки + деплой | | 10 | Финальная полировка | BE + FE | Smoke-тест, деплой бэкенда, адаптивность |
--- ---

Loading…
Cancel
Save