Техническое задание Галикон для разработчиков

This commit is contained in:
Dauren777 2026-06-01 12:18:33 +00:00
parent a489a4ab58
commit 53bb80dc5e

344
TZ_GALIKON.md Normal file
View File

@ -0,0 +1,344 @@
# Техническое задание: Галикон
## 1. Общее описание
**Название:** Галикон — мобильное веб-приложение для спортсменов, тренеров и родителей.
**Цель:** Единая платформа для юных спортсменов (дети от 10 лет): дневник тренировок, контроль здоровья, рейтинги, чаты, игры, нормативы, сравнение с чемпионами. Аналогов в мире нет.
**Пользователи:**
- Спортсмен (основной пользователь)
- Тренер (видит своих учеников)
- Родитель (видит профиль ребёнка)
- Администратор (управление пользователями)
---
## 2. Технический стек
| Слой | Технология |
|------|-----------|
| Фронтенд | React / Vue 3 + TypeScript, PWA |
| Бэкенд | Node.js (Express/Fastify) или Go |
| База данных | PostgreSQL |
| Кэш | Redis |
| Файлы | S3-совместимое хранилище (MinIO) |
| Чат | WebSocket (Socket.io) |
| Push-уведомления | Firebase Cloud Messaging / Web Push API |
| Авторизация | JWT + refresh tokens |
| Хостинг | Docker + Kubernetes или VPS |
---
## 3. Функциональные требования
### 3.1. Регистрация и вход
**Регистрация — 8 шагов:**
1. ФИО (string, обязательно)
2. Логин (латиница, уникальный) + пароль (хеширование bcrypt, минимум 6 символов)
3. Вид спорта (select из 39 олимпийских видов)
4. Роль: спортсмен / тренер / родитель (если родитель — поле «Имя ребёнка»)
5. Дата рождения → возраст вычисляется автоматически. Аватарка (эмодзи на выбор) или загрузка фото (JPEG/PNG, макс 5 МБ)
6. Страна (select) → город (datalist с подсказками по стране)
7. Клуб, тренер (ФИО), разряд/звание, цель (произвольный текст)
8. Телефон (обязательно, валидация формата) + Email (обязательно)
**Вход:**
- Логин + пароль
- JWT access token (15 мин) + refresh token (30 дней)
- Rate limiting: 5 попыток → блокировка на 1 минуту
- Автовыход через 30 минут бездействия
**Безопасность:**
- Пароли: bcrypt с солью
- CSP-заголовки
- Санитизация всех пользовательских вводов (XSS-защита)
- HTTPS обязательно
- CORS только для доверенных доменов
---
### 3.2. Профиль спортсмена
**Отображение:**
- Аватар, ФИО, вид спорта, роль
- Дата рождения, возраст, страна, город
- Клуб, тренер, разряд, цель
- Телефон, email
**Значки (геймификация):**
Автоматический подсчёт по данным пользователя:
- 🏊 Первая тренировка (1+ запись в дневнике)
- 📖 10 тренировок
- 🔥 30 тренировок
- 🏆 Рекордсмен (есть достижения)
- 🎯 Снайпер (победа в игре «Угадай число»)
- ⚡ Молния (реакция < 300 мс)
- 🧠 Знаток (викторина 5+/8)
- 💪 100 км (суммарный километраж > 100)
**Достижения:**
Пользователь добавляет: название, дата, описание. Отображаются списком.
**Отчёт для тренера (PDF):**
- Генерация PDF на сервере (Puppeteer / wkhtmltopdf)
- Содержит: ФИО, спорт, клуб, тренер, разряд, цель, значки, достижения, последние 10 записей дневника
---
### 3.3. Дневник тренировок
**Поля записи:**
- Дата (date, обязательно)
- Тип тренировки (select: Скорость / Техника / Выносливость / ОФП / Соревнование)
- Километраж (число, км)
- Лучшее время (строка)
- Самочувствие (1-5)
- Заметка (текст)
**История:**
- Список записей, сортировка по дате (новые сверху)
- Удаление записи
**Агрегация (для тренера):**
- Всего тренировок
- Суммарный километраж
- Среднее самочувствие
- График прогресса по времени (библиотека Chart.js)
---
### 3.4. Календарь соревнований
**Добавление события:**
- Название (string)
- Дата (date)
- Место (string)
**Отображение:**
- Предстоящие (сортировка по дате)
- Прошедшие (сортировка по дате, обратная)
**Дополнительно (желательно):**
- Push-уведомление за день до события
- Цветовое кодирование по типу (соревнование / сборы / тренировка)
---
### 3.5. Чаты
**Архитектура:**
- WebSocket-соединение (Socket.io)
- Комнаты: личные (1-на-1), групповые
- Сообщения хранятся в PostgreSQL
- Индикатор «прочитано/не прочитано»
**Функции:**
- Список чатов с другими пользователями
- Фильтр по роли: Все / Спортсмены / Тренеры / Родители
- Отправка текстовых сообщений
- Счётчик непрочитанных
- Групповые чаты (создание, добавление участников)
**Встроенные игры (в чате):**
1. **Крестики-нолики** — пошаговая игра, синхронизация через WebSocket
2. **Угадай число (1-100)** — 7 попыток, победа < 5 попыток = +2 звезды
3. **Реакция** — измерение времени реакции, рекорд < 300 мс = +1 звезда
4. **Спорт-викторина** — 8 вопросов, результат 5+/8 = +1-5 звёзд
---
### 3.6. Рейтинговая система
**Звёзды начисляются за:**
- Победы в играх
- Высокие результаты викторины
- Голоса других пользователей
**Рейтинг:**
- Топ-5 спортсменов по звёздам
- Отображение: место, ФИО, звёзды, результаты викторины, победы в играх
- Топ-3 выделены золотом/серебром/бронзой
---
### 3.7. Инструменты
**Нормативы:**
- Статическая таблица разрядов по плаванию (50 м бассейн): МСМК → 2 юношеский
- Дистанции: 50 м, 100 м, 400 м вольный стиль
**Сравнение с чемпионами:**
- Данные Калеба Дрессела по возрастам (14-18 лет)
- Пользователь вводит своё время и возраст → сравнение
- Показывает: текущий результат → КМС → результат Дрессела в этом возрасте
**Анализ видео:**
- Загрузка видео (MP4, макс 200 МБ)
- Плеер с покадровой перемоткой (шаг 0.033 сек, 0.1 сек, 1 сек)
- Счётчик текущего кадра
- Play/Pause
**Витамины:**
- Чек-лист на сегодня: D3, Омега-3, Магний, Цинк, BCAA
- Сохранение истории по дням
**Сон и пульс:**
- Запись часов сна и утреннего пульса
- Средние значения за 7 дней
**Анализы:**
- Гемоглобин, Ферритин, Витамин D, Витамин B12
- История значений с датами
**Видеоуроки:**
- Список поисковых запросов для YouTube (12 тем по технике плавания)
---
### 3.8. Кабинет тренера
**Поиск учеников:**
- Автоматически: все пользователи, у которых поле «Тренер» совпадает с ФИО тренера
**Отображение по каждому ученику:**
- Аватар, ФИО, вид спорта, разряд, цель
- Суммарный километраж
- Последние 5 тренировок (дата, тип, км, время)
---
### 3.9. Кабинет родителя
**Привязка ребёнка:**
- Родитель вводит логин ребёнка → привязка (сохраняется в профиле родителя)
**Отображение:**
- Профиль ребёнка (как у спортсмена)
- Статистика: всего тренировок, км, среднее самочувствие
- Значки ребёнка
- Дневник тренировок (последние 15 записей)
- Цель и тренер ребёнка
- Кнопка «Отвязать»
---
### 3.10. Админ-панель
**Доступ:**
- Отдельный мастер-пароль администратора
**Функции:**
- Просмотр всех пользователей (ФИО, роль, логин, спорт, клуб, звёзды)
- Удаление пользователя
- Сброс пароля пользователя
---
### 3.11. PWA (Progressive Web App)
**Требования:**
- manifest.json с иконками (192x192, 512x512)
- Service Worker для офлайн-доступа
- Установка на домашний экран (iOS/Android)
- Режим standalone (без адресной строки браузера)
- Splash screen на iOS
---
## 4. Нефункциональные требования
| Параметр | Значение |
|----------|---------|
| Язык интерфейса | Русский |
| Адаптивность | Mobile-first, поддержка десктопа |
| Браузеры | Chrome 90+, Safari 14+, Firefox 90+ |
| Производительность | First paint < 2 сек, взаимодействие < 100 мс |
| Доступность | WCAG 2.1 AA |
| Масштабируемость | До 100 000 пользователей |
| Резервное копирование | Ежедневный бэкап БД |
---
## 5. API (основные эндпоинты)
```
POST /api/auth/register — регистрация
POST /api/auth/login — вход
POST /api/auth/refresh — обновление токена
GET /api/profile — профиль текущего пользователя
PUT /api/profile — обновление профиля
GET /api/profile/:id — профиль другого пользователя
POST /api/achievements — добавить достижение
GET /api/diary — дневник (список)
POST /api/diary — новая запись
DELETE /api/diary/:id — удалить запись
GET /api/events — календарь
POST /api/events — добавить событие
DELETE /api/events/:id — удалить событие
GET /api/chats — список чатов
GET /api/chats/:id/messages — сообщения чата
POST /api/chats/:id/messages — отправить сообщение
WS /ws/chat — WebSocket для чата
POST /api/vote/:userId — проголосовать за пользователя
GET /api/ranking — рейтинг (топ)
GET /api/coach/students — ученики тренера
POST /api/parent/link — привязать ребёнка
GET /api/admin/users — список пользователей (админ)
DELETE /api/admin/users/:id — удалить пользователя (админ)
POST /api/admin/users/:id/reset-password — сброс пароля (админ)
GET /api/report/pdf — PDF-отчёт для тренера
POST /api/upload/avatar — загрузка аватара
POST /api/upload/video — загрузка видео
POST /api/upload/photo — загрузка фото
```
---
## 6. База данных (основные таблицы)
```sql
users: id, login, password_hash, name, sport, role, birth_date, age,
country, city, club, coach, rank, goal, phone, email,
avatar_url, photo_url, stars, quiz_score, games_won,
created_at, updated_at
achievements: id, user_id, title, date, description
diary_entries: id, user_id, date, type, km, best_time, feel, note
events: id, user_id, title, date, location
messages: id, chat_id, from_user_id, to_user_id, text, read, created_at
chats: id, type (direct/group), name
chat_members: chat_id, user_id
vitamins: id, user_id, date, vitamin_type, taken
sleep_log: id, user_id, date, hours, pulse
tests: id, user_id, test_type, value, date
parent_links: parent_id, child_id
votes: voter_id, target_id, created_at
```
---
## 7. Этапы разработки
| Этап | Содержание | Срок |
|------|-----------|------|
| 1 | База данных, API авторизации, регистрация | 2 недели |
| 2 | Профиль, дневник, календарь | 2 недели |
| 3 | Чаты (WebSocket) + игры | 2 недели |
| 4 | Рейтинг, кабинет тренера, кабинет родителя | 1 неделя |
| 5 | Инструменты (нормативы, сравнение, видео, витамины) | 1 неделя |
| 6 | Админ-панель, PDF-отчёт | 1 неделя |
| 7 | PWA, тестирование, деплой | 1 неделя |
**Итого:** ~10 недель на MVP командой из 2-3 разработчиков.