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


1. Общее описание


**Название:** Галикон — мобильное веб-приложение для спортсменов, тренеров и родителей.


**Цель:** Единая платформа для юных спортсменов (дети от 10 лет): дневник тренировок, контроль здоровья, рейтинги, чаты, игры, нормативы, сравнение с чемпионами. Аналогов в мире нет.


Пользователи:

- Спортсмен (основной пользователь)

- Тренер (видит своих учеников)

- Родитель (видит профиль ребёнка)

- Администратор (управление пользователями)



2. Технический стек


СлойТехнология


3. Функциональные требования


3.1. Регистрация и вход


Регистрация — 8 шагов:

  • ФИО (string, обязательно)
  • Логин (латиница, уникальный) + пароль (хеширование bcrypt, минимум 6 символов)
  • Вид спорта (select из 39 олимпийских видов)
  • Роль: спортсмен / тренер / родитель (если родитель — поле «Имя ребёнка»)
  • Дата рождения → возраст вычисляется автоматически. Аватарка (эмодзи на выбор) или загрузка фото (JPEG/PNG, макс 5 МБ)
  • Страна (select) → город (datalist с подсказками по стране)
  • Клуб, тренер (ФИО), разряд/звание, цель (произвольный текст)
  • Телефон (обязательно, валидация формата) + 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

    - Индикатор «прочитано/не прочитано»


    Функции:

    - Список чатов с другими пользователями

    - Фильтр по роли: Все / Спортсмены / Тренеры / Родители

    - Отправка текстовых сообщений

    - Счётчик непрочитанных

    - Групповые чаты (создание, добавление участников)


    Встроенные игры (в чате):

  • **Крестики-нолики** — пошаговая игра, синхронизация через WebSocket
  • **Угадай число (1-100)** — 7 попыток, победа < 5 попыток = +2 звезды
  • **Реакция** — измерение времени реакции, рекорд < 300 мс = +1 звезда
  • **Спорт-викторина** — 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. Нефункциональные требования


    Фронтенд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
    ПараметрЗначение


    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. Этапы разработки


    Язык интерфейсаРусский
    АдаптивностьMobile-first, поддержка десктопа
    БраузерыChrome 90+, Safari 14+, Firefox 90+
    ПроизводительностьFirst paint < 2 сек, взаимодействие < 100 мс
    ДоступностьWCAG 2.1 AA
    МасштабируемостьДо 100 000 пользователей
    Резервное копированиеЕжедневный бэкап БД
    ЭтапСодержаниеСрок

    **Итого:** ~10 недель на MVP командой из 2-3 разработчиков.


    1База данных, API авторизации, регистрация2 недели
    2Профиль, дневник, календарь2 недели
    3Чаты (WebSocket) + игры2 недели
    4Рейтинг, кабинет тренера, кабинет родителя1 неделя
    5Инструменты (нормативы, сравнение, видео, витамины)1 неделя
    6Админ-панель, PDF-отчёт1 неделя
    7PWA, тестирование, деплой1 неделя