**Название:** Галикон — мобильное веб-приложение для спортсменов, тренеров и родителей.
**Цель:** Единая платформа для юных спортсменов (дети от 10 лет): дневник тренировок, контроль здоровья, рейтинги, чаты, игры, нормативы, сравнение с чемпионами. Аналогов в мире нет.
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 пользователей |
| Резервное копирование | Ежедневный бэкап БД |
| Этап | Содержание | Срок |