104 lines
10 KiB
Markdown
104 lines
10 KiB
Markdown
---
|
||
trigger: always_on
|
||
---
|
||
|
||
# Контекст проекта: Система расписания университета
|
||
|
||
## Обзор проекта
|
||
Этот проект представляет собой веб-сайт системы управления университетским расписанием.
|
||
- **Роль**: Образовательная платформа для управления расписанием.
|
||
- **Язык**: Смешанный (Java Backend + Web Frontend).
|
||
- **Публичный URL**: https://magistr.zuev.company
|
||
|
||
## Структура директорий и обязанности
|
||
Проект следует определенной структуре папок. Вы должны придерживаться этих путей:
|
||
|
||
- **`backend/`**: Содержит исходный код бэкенд-приложения на **Java**.
|
||
- При работе с API или серверной логикой фокусируйтесь здесь.
|
||
|
||
- **`frontend/`**: Содержит исходный код фронтенда. Обратите внимание на строгое разделение ролей:
|
||
- `frontend/admin/`: Код, специфичный для интерфейса **Администратора**.
|
||
- `frontend/teacher/`: Код, специфичный для интерфейса **Преподавателя**.
|
||
- `frontend/student/`: Код, специфичный для интерфейса **Студента**.
|
||
- *Ограничение*: Не смешивайте логику между этими папками, если только не создаете общую утилиту.
|
||
|
||
- **`db/`**: Конфигурация и данные базы данных.
|
||
- `db/init/init.sql`: SQL-скрипт, отвечающий за **создание и инициализацию** схемы базы данных (таблицы, начальные данные).
|
||
|
||
- **Корневые файлы**:
|
||
- `compose.yaml`: Конфигурация Docker Compose. Этот файл определяет сервисы (бэкенд, БД, фронтенд-серверы) и то, как они работают вместе.
|
||
- `.env`: Переменные окружения. Содержит конфиденциальные настройки (пароли БД, порты, ключи API).
|
||
|
||
## Внешние зависимости (родительская директория)
|
||
Некоторые компоненты инфраструктуры расположены за пределами корня проекта:
|
||
|
||
- **`../caddy-proxy/`**: Находится на один уровень выше относительно корня проекта.
|
||
- **Роль**: Реверс-прокси, обрабатывающий трафик для `magistr.zuev.company`.
|
||
- **`Caddyfile`**: Конфигурация для маршрутизации и SSL.
|
||
- **`compose.yaml`**: Отдельный файл Docker Compose специально для службы прокси.
|
||
|
||
## Рекомендации по рабочему процессу
|
||
1. **Изменения в базе данных**: Если вам нужно изменить схему базы данных, вы должны обновить `db/init/init.sql`, чтобы изменения сохранялись при пересборке контейнера.
|
||
2. **Конфигурация**: Если вы добавляете новые параметры конфигурации, добавьте их в `.env` и сошлитесь на них в `compose.yaml` или коде приложения.
|
||
3. **Маршрутизация/Прокси**: Если возникают проблемы с доменом или внешним доступом, проверьте конфигурацию в `../caddy-proxy/Caddyfile`.
|
||
|
||
## Языковые предпочтения
|
||
- **Всегда отвечайте на русском**: Это строгое требование пользователя. Все объяснения, комментарии и взаимодействия должны быть на русском языке, если только не будет специально запрошено иное.
|
||
|
||
## Функциональные требования к системе
|
||
|
||
### 1. Ролевая модель
|
||
- **Администратор (Деканат)**: Полный доступ, настройка топологии университета, управление аудиторным фондом, подтверждение переносов, регистрация инцидентов.
|
||
- **Преподаватель**: Просмотр своего расписания, подача заявок на перенос, отметка о своём отсутствии.
|
||
- **Студент**: Только просмотр расписания (Read-only).
|
||
|
||
### 2. Управление ресурсами и топология
|
||
- **Управление аудиториями**:
|
||
- Указание вместимости.
|
||
- Указание тэгов оборудования (Проектор, ПК, Лаборатория).
|
||
- Установка статуса "Не доступно" (блокирует назначение пар в этот период).
|
||
- **Управление группами**:
|
||
- Управление списком студентов (и возможность деления на подгруппы).
|
||
- **Управление дисциплинами**:
|
||
- Создание предметов и привязка их к преподавателям (какие дисциплины имеет право вести конкретный преподаватель).
|
||
|
||
### 3. Логика расписания
|
||
- **Проверка конфликтов**:
|
||
- *Критический конфликт*: Преподаватель не может находиться в двух разных аудиториях одновременно.
|
||
- *Уточнение по преподавателям*: Преподаватель может иметь несколько пар одновременно (для разных групп), только если они проходят в одной и той же аудитории (потоковая лекция).
|
||
- **Потоковые занятия**:
|
||
- Возможность назначить одну лекцию сразу нескольким группам (технически — несколько записей в БД или одна запись со списком групп).
|
||
- Проверка вместимости: вместимость аудитории должна покрывать суммарную численность всех групп, находящихся в этой аудитории в данный слот.
|
||
|
||
### 4. Управление инцидентами (Инклюзия отсутствия)
|
||
- **Отсутствие (Sickness/Business Trip)**: Регистрация отсутствия преподавателя (с указанием причины и периода дат).
|
||
- **Обнаружение коллизий**: Автоматическая подсветка конфликтующих пар в расписании (Red Zone).
|
||
- **Система разрешения конфликтов (Resolution Wizard)**:
|
||
- Предложение подходящей замены преподавателя на этот слот.
|
||
- Предложение переноса занятия на другое время или в другую аудиторию.
|
||
|
||
## Технологический стек (Tech Stack)
|
||
- **Backend**: Java 17, Spring Boot 3.2.5 (Starter Web, Data JPA), кастомная токен-авторизация (используется BCrypt, без полной автоконфигурации Spring Security).
|
||
- **Database**: PostgreSQL.
|
||
- **Frontend**: Vanilla JavaScript + HTML/CSS (без тяжеловесных фреймворков).
|
||
|
||
## Специфика времени и сетка расписания (Time Management)
|
||
- **Гибкие временные слоты**: По умолчанию слоты по 1.5 часа:
|
||
1. 08:00 - 09:30
|
||
2. 09:40 - 11:10
|
||
3. 11:40 - 13:10
|
||
4. 13:20 - 14:50
|
||
5. 15:00 - 16:30
|
||
6. 16:50 - 18:20
|
||
7. 18:30 - 20:00
|
||
- **Кастомное время**: Система должна позволять устанавливать кастомное время начала и конца пары.
|
||
- **Тип расписания**: Календарное расписание, строящееся по принципу чётной / нечётной недели.
|
||
|
||
## Основные сущности базы данных (Data Entities)
|
||
- **Users**: Хранение пользователей и их ролей (Администратор, Преподаватель, Студент) для управления доступом.
|
||
- **Groups**: Группы студентов, их привязка к формам обучения. (Могут делиться на **подгруппы** для лабораторных и практик).
|
||
- **Classrooms**: Аудиторный фонд (название, вместимость, статус доступности, тэги оборудования).
|
||
- **Subjects**: Предметы/Дисциплины (Высшая математика, Физика, Базы данных и т.д.).
|
||
- **Teacher_Subjects**: Связующая таблица (Many-to-Many), определяющая, какие дисциплины ведет конкретный преподаватель.
|
||
- **Lesson_Types**: Типы занятий для валидации (Лекция, Практика, Лабораторная работа).
|
||
- **Lessons / Schedules**: Сами занятия (пары). Каждая запись связывает преподавателя, аудиторию, группу (или подгруппу), предмет (`subject_id`), тип занятия (`lesson_type`) и конкретное время. |