# Техническое задание: Галикон ## 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 разработчиков.