galikon/TZ_GALIKON.md

19 KiB
Raw Permalink Blame History

Техническое задание: Галикон

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. База данных (основные таблицы)

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 разработчиков.