415 lines
19 KiB
Markdown
415 lines
19 KiB
Markdown
# Техническое задание: Галикон
|
||
|
||
## 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 — загрузка фото
|
||
```
|
||
|
||
---
|
||
|
||
### 3.12. Аналитика и дашборды
|
||
|
||
**Дашборд спортсмена — главный экран аналитики:**
|
||
|
||
**График прогресса (50 м в/с):**
|
||
- Линейный график: дата по оси X, время по оси Y
|
||
- Целевая линия (23″) и текущая линия тренда
|
||
- Автоматический расчёт скорости прогресса (секунд в месяц)
|
||
- Прогноз: когда будет достигнута цель при текущем темпе
|
||
|
||
**Радарная диаграмма навыков:**
|
||
- 6 осей: старт, поворот, подводная фаза, гребок, выносливость, финиш
|
||
- Оценки 1-10 выставляет тренер или сам спортсмен
|
||
- Сравнение с предыдущим месяцем
|
||
|
||
**Круговые диаграммы тренировок:**
|
||
- Распределение по типам: скорость / техника / выносливость / ОФП
|
||
- За текущий месяц и за всё время
|
||
|
||
**Тепловая карта активности:**
|
||
- Календарь GitHub-style: каждый день — квадратик
|
||
- Цвет зависит от километража (0 — серый, 5+ км — ярко-голубой)
|
||
- Видно пропуски тренировок и интенсивные периоды
|
||
|
||
**Счётчики (KPI):**
|
||
- Всего тренировок, общий километраж, лучший результат
|
||
- Среднее самочувствие, динамика пульса, средний сон
|
||
- Недельная/месячная нагрузка
|
||
|
||
**Сравнительная аналитика:**
|
||
- Сравнение своего прогресса со средним по возрастной группе
|
||
- Сравнение с товарищами по клубу (анонимно)
|
||
- Процентиль: «Ты быстрее 78% пловцов твоего возраста»
|
||
|
||
**Экспорт данных:**
|
||
- CSV-выгрузка всех тренировок
|
||
- Excel-отчёт с графиками (автоматическая генерация)
|
||
- PDF-дашборд для тренера
|
||
|
||
**Технологии:**
|
||
- Chart.js / ECharts / D3.js для визуализации
|
||
- Данные агрегируются на бэкенде (SQL-запросы с GROUP BY)
|
||
- Кэширование агрегаций в Redis (обновление раз в час)
|
||
|
||
**API для аналитики:**
|
||
```
|
||
GET /api/analytics/progress/:metric — график прогресса по метрике
|
||
GET /api/analytics/radar — радарная диаграмма
|
||
GET /api/analytics/heatmap — тепловая карта (год)
|
||
GET /api/analytics/distribution — распределение типов тренировок
|
||
GET /api/analytics/kpi — ключевые показатели
|
||
GET /api/analytics/compare — сравнение с группой
|
||
GET /api/analytics/export/csv — CSV-выгрузка
|
||
GET /api/analytics/export/dashboard — PDF-дашборд
|
||
```
|
||
|
||
**Дашборд тренера:**
|
||
- Сводка по всем ученикам: таблица с сортировкой по любому столбцу
|
||
- Групповой график прогресса (все ученики на одном графике)
|
||
- Выделение отстающих (красная зона) и лидеров (зелёная зона)
|
||
- Уведомления: ученик не тренировался 3+ дня → алерт тренеру
|
||
- Экспорт сводного отчёта по группе
|
||
|
||
**Дашборд родителя:**
|
||
- Упрощённая версия: график прогресса ребёнка, счётчики
|
||
- Уведомления о новых достижениях и значках
|
||
- Еженедельный email-отчёт (опционально)
|
||
|
||
---
|
||
|
||
## 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 разработчиков.
|