Техническое задание Галикон для разработчиков
This commit is contained in:
parent
a489a4ab58
commit
53bb80dc5e
344
TZ_GALIKON.md
Normal file
344
TZ_GALIKON.md
Normal file
@ -0,0 +1,344 @@
|
||||
# Техническое задание: Галикон
|
||||
|
||||
## 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 — загрузка фото
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 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 разработчиков.
|
||||
Loading…
Reference in New Issue
Block a user