Рабочки - Система учета посещений
Веб-приложение для учета посещений людей на различные типы рабочек с системой баллов и автоматическим выбором участников.
Описание
Приложение позволяет:
- Управлять списком людей и типами рабочек
- Отмечать посещения в календаре
- Настраивать расширенные параметры для типов "Рабочка" (сложность, время, после пар)
- Автоматически выбирать людей для участия на основе приоритетов
- Просматривать статистику по баллам и посещениям
- Отправлять уведомления о назначенных людях в Telegram группу
Функциональность
Вкладка "Список"
- Выбор типа рабочки из выпадающего списка
- Отображение статистики для каждого человека (баллы или количество посещений)
- Автоматический выбор людей по приоритету:
- Сначала по наименьшему количеству баллов
- Затем по давности последнего посещения
- При равенстве - случайный выбор
- Возможность убрать человека из списка с автоматической заменой на следующего по приоритету
- Исключение убранных людей из текущего распределения (они не появятся снова до нового выбора)
- Кнопка "Отправить" для отправки уведомления в Telegram группу о выбранных людях
- Модальное окно с детальной информацией о посещениях
Вкладка "Календарь"
- Календарный вид с отметками дней посещений
- Модальное окно для выбора типа рабочки и людей
- Расширенные настройки для типов "Рабочка":
- Сложность (1-3 балла)
- Время (<30 минут, 30 минут - 5 часов, шаг 30 минут)
- Чекбокс "После пар"
- Расчет баллов:
(Сложность × Время_в_баллах) / 10 × (После_пар ? 2 : 1)
Вкладка "Настройки"
- Модуль "Люди": добавление, редактирование и удаление людей
- Модуль "Типы рабочек": управление типами рабочек с возможностью пометить тип как "Рабочка"
Технологии
- Frontend: React 18, Vite
- Backend: Node.js, Express
- База данных: SQLite
- Контейнеризация: Docker, Docker Compose
- Веб-сервер: Nginx
- Уведомления: Telegram Bot API
Требования
- Docker и Docker Compose
- Или Node.js 20+ (для локальной разработки)
Развертывание
Быстрый старт с Docker Compose
-
Клонируйте репозиторий или скопируйте файлы проекта
-
Убедитесь, что Docker и Docker Compose установлены:
docker --version
docker-compose --version
-
(Опционально) Настройте Telegram бота (см. раздел "Настройка Telegram уведомлений")
-
Запустите приложение:
docker-compose up --build
- Откройте браузер и перейдите по адресу:
http://localhost:3000
Остановка приложения
docker-compose down
Очистка данных
Для полной очистки данных (включая базу данных):
docker-compose down -v
rm -rf backend/data
Структура проекта
rab_prog/
├── backend/ # Backend сервер
│ ├── server.js # Express сервер и API
│ ├── package.json # Зависимости backend
│ ├── Dockerfile # Docker образ для backend
│ └── data/ # Директория для SQLite БД (создается автоматически)
├── src/ # Frontend приложение
│ ├── components/ # React компоненты
│ │ ├── ListTab.jsx # Вкладка со списком и выбором
│ │ ├── CalendarTab.jsx # Вкладка с календарем
│ │ ├── SettingsTab.jsx # Вкладка настроек
│ │ └── ...
│ ├── utils/ # Утилиты
│ │ └── api.js # API клиент
│ ├── App.jsx # Главный компонент
│ └── main.jsx # Точка входа
├── docker-compose.yml # Конфигурация Docker Compose
├── Dockerfile # Docker образ для frontend
├── nginx.conf # Конфигурация Nginx
├── package.json # Зависимости frontend
└── vite.config.js # Конфигурация Vite
API Endpoints
Люди
GET /api/people- Получить список людейPOST /api/people- Создать человекаPUT /api/people/:id- Обновить человекаDELETE /api/people/:id- Удалить человека
Типы рабочек
GET /api/work-types- Получить список типовPOST /api/work-types- Создать типPUT /api/work-types/:id- Обновить типDELETE /api/work-types/:id- Удалить тип
Календарь
GET /api/calendar- Получить данные календаряPOST /api/calendar- Сохранить данные календаряDELETE /api/calendar/:date/work-type/:workTypeId- Удалить записи календаря
Telegram
POST /api/telegram/send- Отправить сообщение в Telegram группу
Использование
Первый запуск
- После запуска приложения откройте вкладку "Настройки"
- Добавьте людей в модуле "Люди"
- Добавьте типы рабочек в модуле "Типы рабочек"
- При необходимости отметьте тип как "Рабочка" для расширенных настроек
Работа с календарем
- Перейдите на вкладку "Календарь"
- Нажмите на день для добавления посещений
- Выберите тип рабочки
- Выберите людей
- Для типов "Рабочка" заполните дополнительные параметры:
- Сложность (1-3)
- Время (30 мин - 5 часов)
- Отметьте "После пар", если нужно
- Сохраните изменения
Автоматический выбор людей
- Перейдите на вкладку "Список"
- Выберите тип рабочки
- Укажите количество людей для выбора
- Нажмите кнопку "Выбрать"
- Система автоматически выберет людей по приоритету
- При необходимости нажмите "Убрать" рядом с человеком для замены на следующего по приоритету
- Убранный человек исключается из текущего распределения и не появится снова до нового нажатия "Выбрать"
- Нажмите кнопку "Отправить" для отправки уведомления в Telegram группу о выбранных людях
Просмотр статистики
- На вкладке "Список" отображается статистика для каждого человека
- Для типов "Рабочка" показываются суммарные баллы
- Для обычных типов показывается количество посещений
- Нажмите на карточку человека для просмотра детальной информации
Формула расчета баллов
Для типов "Рабочка":
Баллы = (Сложность × Время_в_баллах) / 10
Где:
- Время_в_баллах = 0.5, если время < 30 минут
- Время_в_баллах = Время_в_минутах / 30, если время ≥ 30 минут
- Если отмечено "После пар": Баллы × 2
Примеры:
-
Сложность: 2, Время: 15 минут, После пар: Нет
- Расчет: (2 × 0.5) / 10 = 0.1 балла
-
Сложность: 2, Время: 90 минут (3 балла), После пар: Да
- Расчет: (2 × 3) / 10 × 2 = 1.2 балла
Логика автоматического выбора
При нажатии кнопки "Выбрать" система сортирует людей по приоритету:
- По минимальному приоритету: сначала люди с флагом
has_min_priority, затем остальные - По баллам: сначала люди с наименьшим количеством баллов
- По давности: среди равных по баллам - те, кто давно не ходил (раньше последняя дата)
- Приоритет отсутствия: люди без записей имеют приоритет
- Исключение: неактивные люди (
is_inactive = true) и убранные из текущего распределения не участвуют в выборе
При нажатии "Убрать":
- Человек удаляется из списка выбранных
- Автоматически добавляется следующий по приоритету из оставшихся кандидатов
- Убранный человек исключается из текущего распределения до нового нажатия "Выбрать"
Разработка
Локальная разработка (без Docker)
Backend
cd backend
npm install
npm run dev
Backend будет доступен на http://localhost:3001
Frontend
npm install
npm run dev
Frontend будет доступен на http://localhost:5173
Не забудьте настроить переменную окружения VITE_API_URL в .env:
VITE_API_URL=http://localhost:3001/api
Сборка для продакшена
# Frontend
npm run build
# Backend уже готов к продакшену
Порт
Приложение доступно на порту 3000 по умолчанию.
Для изменения порта отредактируйте docker-compose.yml:
ports:
- "ВАШ_ПОРТ:80"
База данных
Данные хранятся в SQLite базе данных в файле backend/data/database.db.
База данных создается автоматически при первом запуске.
Важно:
- При использовании Docker данные сохраняются в volume, поэтому они не теряются при перезапуске контейнеров
- База данных исключена из git (см.
.gitignore), не коммитьте файлыbackend/data/*.db
Настройка Telegram уведомлений
Приложение поддерживает отправку уведомлений о выбранных людях в Telegram группу.
Создание Telegram бота
- Откройте @BotFather в Telegram
- Отправьте команду
/newbot - Следуйте инструкциям и получите токен бота (формат:
123456789:ABCdefGHIjklMNOpqrsTUVwxyz)
Получение Chat ID группы
- Добавьте бота в нужную Telegram группу
- Дайте боту права на отправку сообщений
- Получите Chat ID группы одним из способов:
- Добавьте в группу бота @userinfobot - он покажет ID группы
- Или используйте @getidsbot
- Или через API: отправьте сообщение в группу и получите обновления через
https://api.telegram.org/bot<TOKEN>/getUpdates
Настройка переменных окружения
Для Docker:
Создайте файл .env в корне проекта:
TELEGRAM_BOT_TOKEN=ваш_токен_бота
Или установите переменную окружения перед запуском:
export TELEGRAM_BOT_TOKEN=ваш_токен_бота
docker-compose up --build
Для локальной разработки:
Установите переменную окружения:
export TELEGRAM_BOT_TOKEN=ваш_токен_бота
Использование
- Во вкладке "Список" выберите тип рабочки и нажмите "Выбрать"
- При необходимости уберите ненужных людей кнопкой "Убрать"
- Нажмите кнопку "Отправить"
- При первом использовании введите Chat ID группы (сохраняется в localStorage браузера)
- Сообщение будет отправлено в формате:
Название типа рабочки Выбранные люди: Имя1, Имя2, Имя3
Поддержка
При возникновении проблем:
- Проверьте логи Docker:
docker-compose logs - Убедитесь, что порт 3000 свободен
- Проверьте, что Docker и Docker Compose установлены корректно
Лицензия
Проект создан для учебных целей.