# Итоги разработки — 21 марта 2026 ## Общая информация | Параметр | Значение | |----------|---------| | Дата | 21 марта 2026 | | Начало работы | 10:56 | | Текущее состояние | Спринты 1–5 завершены | | Затрачено времени | ~5 часов | | Коммитов | 26 | --- ## Хронология по коммитам | Время | Этап | |-------|------| | 10:56–11:41 | Подготовка: структура проекта, ТЗ v1.1, стек, план спринтов, README | | 12:05–12:46 | **Спринт 1** — инфраструктура + создание тестов | | 12:53–13:18 | **Спринт 2** — прохождение теста + результаты + UX | | 13:22–14:08 | **Спринт 3** — редактирование + версионирование | | 14:08–15:11 | **Спринт 4** — AI-помощник (DeepSeek) | | 15:11–16:00 | **Спринт 5** — трекер результатов | --- ## Что реализовано ### Спринт 1 — Инфраструктура + создание тестов (~40 мин) - Docker Compose: PostgreSQL 16, FastAPI, React + Vite, Nginx - Alembic: миграция `001_init` (таблицы tests, questions, answers) - API: `POST /api/tests`, `GET /api/tests`, `GET /api/tests/{id}` - Фронт: создание теста, список тестов, просмотр теста - Исправлено 4 бага при тестировании (entrypoint, PYTHONPATH, nginx DNS, FastAPI docs URL) ### Спринт 2 — Прохождение теста + результаты (~25 мин) - Миграция `002_attempts` (таблицы test_attempts, attempt_answers) - API: `POST /api/attempts`, `POST /api/attempts/{id}/submit`, `GET /api/attempts/{id}/result` - Прохождение: случайный порядок вопросов, таймер с автосабмитом, навигация назад - Страница результатов: балл, зачёт/незачёт, разбор ошибок по каждому вопросу - UX: разделение вида сотрудника (`/tests/:id`) и автора (`/tests/:id/edit`), выпадающее меню «⋯» в списке тестов ### Спринт 3 — Редактирование + версионирование (~46 мин) - Миграция `003_test_versioning` (поле `parent_id` в tests) - API: `PUT /api/tests/{id}`, `GET /api/tests/{id}/versions`, `POST /api/tests/{id}/activate` - Логика: нет попыток → редактировать на месте; есть попытки → создать новую версию (`version+1`, `parent_id=old.id`) - Фронт: общий компонент `TestForm`, страница редактирования с историей версий и активацией - Исправлено 2 бага (FK cascade при bulk DELETE, отображение статуса «Активная») ### Спринт 4 — AI-помощник (DeepSeek) (~63 мин) - Миграция `004_settings` (таблица settings, key-value) - Страница `/settings`: ввод API ключа DeepSeek + кнопка «Проверить подключение» - 6 AI-эндпоинтов: - `POST /api/llm/check` — проверка подключения - `POST /api/llm/generate` — генерация вопросов по теме (= название теста) - `POST /api/llm/improve` — улучшение формулировки вопроса + ответов - `POST /api/llm/distractors` — генерация дистракторов - `POST /api/llm/review` — рецензия всего теста - `POST /api/llm/improve_all` — улучшение всего теста целиком - В форме теста: 4 AI-кнопки с модалами и постатейным сравнением (галочки для применения изменений) - Шапка приложения с навигацией ### Спринт 5 — Трекер результатов (~49 мин) - Миграция `005_attempt_user` (поле `user_id` в test_attempts, дефолт 1 = «Гость») - API: `GET /api/attempts` с фильтрами (test_id, date_from, date_to) и пагинацией - Страница `/tracker`: таблица всех попыток, фильтр по тесту и диапазону дат, пагинация - Колонки: Сотрудник / Тест + версия / Начало / Завершение / Результат / Зачёт --- ## Объём кода | Слой | Файлы | |------|-------| | Backend — модели | `test.py`, `attempt.py`, `setting.py` | | Backend — схемы | `test.py`, `attempt.py`, `setting.py` | | Backend — API роутеры | `tests.py`, `attempts.py`, `llm.py`, `settings.py` | | Backend — сервисы | `llm.py` | | Backend — миграции | `001` → `005` | | Frontend — страницы | TestList, TestCreate, TestDetail, TestEdit, TestTake, AttemptResult, Settings, Tracker | | Frontend — компоненты | `TestForm` (с AI-функциями) | | Frontend — API клиенты | `tests.ts`, `attempts.ts`, `llm.ts`, `settings.ts`, `client.ts` | | Документация | ТЗ v1.2, СТЕК, СПРИНТЫ, README, 12 файлов ШАГИ | | **Итого** | **~46 файлов** | --- ## Текущий статус спринтов | Спринт | Содержание | Статус | |--------|-----------|--------| | 1 | Инфраструктура + создание тестов | ✅ Завершён | | 2 | Прохождение теста + результаты | ✅ Завершён | | 3 | Редактирование + версионирование | ✅ Завершён | | 4 | AI-помощник (DeepSeek) | ✅ Завершён | | 5 | Трекер результатов | ✅ Завершён | | 6 | Авторизация, роли, подразделения | ⬜ Следующий | | 7 | Уведомления в MAX | ⬜ Запланирован | --- ## Технический долг перед Спринтом 6 - `user_id = 1` (Гость) в `test_attempts` — заменить на ID авторизованного пользователя - `GUEST_USER_NAME = "Гость"` в `api/attempts.py` — заменить на JOIN с таблицей `users` - Все эндпоинты открыты без авторизации — добавить JWT Middleware --- ## Запуск проекта ```bash docker compose up --build ``` Приложение: `http://localhost` API документация: `http://localhost/api/docs`