2025-12-02 12:32:28 +03:00
2025-12-02 12:32:28 +03:00
2025-12-02 12:06:30 +03:00
2025-11-30 15:07:32 +03:00
2025-12-02 10:13:32 +03:00
2025-12-02 09:34:10 +03:00
2025-12-02 10:13:32 +03:00
2025-11-30 15:07:32 +03:00
2025-11-30 15:07:32 +03:00
2025-11-30 15:07:32 +03:00
2025-11-30 15:07:32 +03:00
2025-12-02 10:13:32 +03:00
2025-11-30 15:07:32 +03:00

Рабочки - Система учета посещений

Веб-приложение для учета посещений людей на различные типы рабочек с системой баллов и автоматическим выбором участников.

Описание

Приложение позволяет:

  • Управлять списком людей и типами рабочек
  • Отмечать посещения в календаре
  • Настраивать расширенные параметры для типов "Рабочка" (сложность, время, после пар)
  • Автоматически выбирать людей для участия на основе приоритетов
  • Просматривать статистику по баллам и посещениям
  • Отправлять уведомления о назначенных людях в 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

  1. Клонируйте репозиторий или скопируйте файлы проекта

  2. Убедитесь, что Docker и Docker Compose установлены:

docker --version
docker-compose --version
  1. (Опционально) Настройте Telegram бота (см. раздел "Настройка Telegram уведомлений")

  2. Запустите приложение:

docker-compose up --build
  1. Откройте браузер и перейдите по адресу:
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. После запуска приложения откройте вкладку "Настройки"
  2. Добавьте людей в модуле "Люди"
  3. Добавьте типы рабочек в модуле "Типы рабочек"
    • При необходимости отметьте тип как "Рабочка" для расширенных настроек

Работа с календарем

  1. Перейдите на вкладку "Календарь"
  2. Нажмите на день для добавления посещений
  3. Выберите тип рабочки
  4. Выберите людей
  5. Для типов "Рабочка" заполните дополнительные параметры:
    • Сложность (1-3)
    • Время (30 мин - 5 часов)
    • Отметьте "После пар", если нужно
  6. Сохраните изменения

Автоматический выбор людей

  1. Перейдите на вкладку "Список"
  2. Выберите тип рабочки
  3. Укажите количество людей для выбора
  4. Нажмите кнопку "Выбрать"
  5. Система автоматически выберет людей по приоритету
  6. При необходимости нажмите "Убрать" рядом с человеком для замены на следующего по приоритету
    • Убранный человек исключается из текущего распределения и не появится снова до нового нажатия "Выбрать"
  7. Нажмите кнопку "Отправить" для отправки уведомления в 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 балла

Логика автоматического выбора

При нажатии кнопки "Выбрать" система сортирует людей по приоритету:

  1. По минимальному приоритету: сначала люди с флагом has_min_priority, затем остальные
  2. По баллам: сначала люди с наименьшим количеством баллов
  3. По давности: среди равных по баллам - те, кто давно не ходил (раньше последняя дата)
  4. Приоритет отсутствия: люди без записей имеют приоритет
  5. Исключение: неактивные люди (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 бота

  1. Откройте @BotFather в Telegram
  2. Отправьте команду /newbot
  3. Следуйте инструкциям и получите токен бота (формат: 123456789:ABCdefGHIjklMNOpqrsTUVwxyz)

Получение Chat ID группы

  1. Добавьте бота в нужную Telegram группу
  2. Дайте боту права на отправку сообщений
  3. Получите 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=ваш_токен_бота

Использование

  1. Во вкладке "Список" выберите тип рабочки и нажмите "Выбрать"
  2. При необходимости уберите ненужных людей кнопкой "Убрать"
  3. Нажмите кнопку "Отправить"
  4. При первом использовании введите Chat ID группы (сохраняется в localStorage браузера)
  5. Сообщение будет отправлено в формате:
    Название типа рабочки
    Выбранные люди: Имя1, Имя2, Имя3
    

Поддержка

При возникновении проблем:

  1. Проверьте логи Docker: docker-compose logs
  2. Убедитесь, что порт 3000 свободен
  3. Проверьте, что Docker и Docker Compose установлены корректно

Лицензия

Проект создан для учебных целей.

Description
No description provided
Readme 361 KiB
Languages
JavaScript 78%
CSS 21.6%
Dockerfile 0.2%
HTML 0.2%