14 KiB
Отчёт об изменениях по задачам научного руководителя
Дата: 2026-05-19
Краткий итог
Выполнен первый цельный релиз архитектурной основы:
- добавлены роли
EDUCATION_OFFICE,DEPARTMENTиSCHEDULE_VIEWER; - добавлена backend-проверка bearer-токена и ролей через
AuthorizationInterceptorи@RequireRoles; - добавлен жизненный цикл справочников:
ACTIVE/ARCHIVED; - физическое удаление ключевых сущностей заменено архивированием там, где это влияет на историю;
- добавлена история переводов преподавателей между кафедрами;
- добавлены точечные изменения расписания: перенос, отмена, замена;
- добавлен расширенный read-only поиск расписания по аудитории, преподавателю, кафедре, группе, дисциплине, типу занятия, паре и чётности;
- добавлены отчёты загруженности по преподавателям, аудиториям, кафедрам, парам и свободным аудиториям;
- просмотр расписаний переведён с плоского списка на совмещённые матричные таблицы чётной/нечётной недели с разрезом по группам, преподавателям или аудиториям;
- вкладка загруженности стала общей для аудиторий, преподавателей и кафедр;
- интерфейсы кафедры и учебного отдела переведены в общий стиль админ-панели через role-based вкладки;
- отдельная миграция
V2удалена, изменения схемы внесены вV1__init.sql; - обновлена документация проекта.
Backend
Роли и авторизация
Поддерживаются роли:
ADMIN;EDUCATION_OFFICE;DEPARTMENT;SCHEDULE_VIEWER;TEACHER;STUDENT.
Добавлены:
AuthSessionService— in-memory UUID-сессии;AuthContext— текущий пользователь вThreadLocal;AuthorizationInterceptor— проверкаAuthorization: Bearer ...;@RequireRoles— ограничение доступа на уровне контроллеров и методов;GET /api/auth/me— текущий пользователь по токену.
Redirect после входа:
ADMIN->/admin/;EDUCATION_OFFICE->/admin/#schedule-view;DEPARTMENT->/admin/#department-workspace;SCHEDULE_VIEWER->/admin/#schedule-view;TEACHER->/teacher/;STUDENT->/student/.
Миграция БД
Отдельная миграция V2__roles_lifecycle_temporal_schedule.sql удалена по текущему решению проекта.
Все изменения схемы внесены в:
backend/src/main/resources/db/migration/V1__init.sql
V1__init.sql теперь сразу создаёт:
- lifecycle-поля к справочникам и пользователям;
teacher_department_assignments;subject_comments;- version-поля к
schedule_rules; - lock-поля к
schedule_rule_slots; schedule_overrides;- стартовых пользователей
учебный_отдел,кафедра_ибипросмотр_расписаний.
Архивирование вместо удаления
Архивирование добавлено для пользователей, аудиторий, оборудования, кафедр, специальностей, групп, подгрупп, дисциплин и правил расписания.
Архивные аудитории, преподаватели, группы и дисциплины запрещены для новых назначений. Историческое расписание при этом не теряет ссылки.
История кафедр преподавателя
Добавлены endpoint:
GET /api/users/{id}/department-history;POST /api/users/{id}/department-transfer;GET /api/users/teachers/by-department/{departmentId}?date=YYYY-MM-DD.
При переводе преподавателя старая запись закрывается, новая открывается с valid_from, а users.department_id обновляется как текущая кафедра.
Расписание и загруженность
Добавлены:
GET /api/schedule/search;GET /api/workload/teachers;GET /api/workload/classrooms;GET /api/workload/departments;GET /api/workload/time-slots;GET /api/workload/free-classrooms;GET/POST/PUT/DELETE /api/edu-office/schedule/overrides.
GET /api/schedule теперь использует общий слой поиска, поэтому учитывает точечные изменения расписания.
Роль SCHEDULE_VIEWER имеет доступ только к read-only просмотру расписаний и справочникам-фильтрам.
Кабинет кафедры API
Добавлены:
GET /api/department/subjects;POST /api/department/subjects/import;GET /api/department/subjects/{subjectId}/comments;POST /api/department/subjects/{subjectId}/comments;GET /api/department/teachers;GET /api/department/schedule.
Для роли DEPARTMENT кафедра берётся из текущего пользователя. Для администратора можно выбрать кафедру в UI.
Frontend
Единая панель по ролям
Отдельные интерфейсы /department/ и /edu-office/ заменены на redirect в общую админ-панель:
/department/->/admin/#department-workspace;/edu-office/->/admin/#schedule-view.
В frontend/admin/js/main.js добавлена фильтрация вкладок:
ADMINвидит все вкладки;EDUCATION_OFFICEвидит просмотр расписаний, конструктор расписания, календарный график, загруженность, аудитории и оборудование;DEPARTMENTвидит кабинет кафедры и просмотр расписаний;SCHEDULE_VIEWERвидит только просмотр расписаний.
Backend не опирается только на скрытие вкладок. AuthorizationInterceptor проверяет bearer-токен для /api/**, а @RequireRoles ограничивает операции на контроллерах и методах. Для кафедры дополнительно закрыты обходные пути:
- общий
/api/subjectsоставлен для записи только администратору, кафедра загружает дисциплины через scoped/api/department/subjects/import; /api/teacher-subjectsдля ролиDEPARTMENTпроверяет, что и преподаватель, и дисциплина относятся к кафедре текущего пользователя;SCHEDULE_VIEWERимеет только read-only доступ к расписаниям и справочникам-фильтрам.
После браузерной проверки исправлено визуальное скрытие недоступных вкладок: layout.css теперь принудительно скрывает .nav-item[hidden] и скрытые пункты меню настроек, поэтому роли больше не видят чужие вкладки в sidebar.
Просмотр расписаний
Добавлена вкладка:
frontend/admin/views/schedule-view.html
frontend/admin/js/views/schedule-view.js
Возможности:
- фильтры по одной дате в периоде, группе, преподавателю, аудитории, кафедре, дисциплине, типу занятия и чётности;
- двухнедельный диапазон для таблиц автоматически строится от понедельника выбранной недели;
- выбор разреза таблиц: автоматически, по группам, по преподавателям или по аудиториям;
- совмещённые матричные таблицы найденных занятий: строки — пары, столбцы — дни недели;
- нечётная неделя отображается в верхней половине ячейки, чётная — в нижней, одинаковые занятия в обе недели схлопываются в цельную ячейку;
- карточки занятий внутри ячеек с дисциплиной, группами, подгруппами, преподавателем, аудиторией, типом занятия, чётностью и ID слота.
Загруженность
Вкладка auditorium-workload оставлена техническим tab id, но в UI называется Загруженность.
Возможности:
- выбор типа загруженности: аудитории, преподаватели или кафедры;
- сводная матрица по выбранной дате: строки — выбранные сущности, столбцы — пары;
- кафедральная матрица группирует занятия по кафедре преподавателя;
- для аудиторий сохранены фильтры корпуса, вместимости и оборудования;
- выбор конкретной аудитории, преподавателя или кафедры заменяет обзор двухнедельной таблицей по дням недели и времени;
- чётная и нечётная недели показываются в одной ячейке: если состояние одинаковое, ячейка цельная, если отличается — делится вертикально.
Кабинет кафедры
Добавлена вкладка:
frontend/admin/views/department-workspace.html
frontend/admin/js/views/department-workspace.js
Возможности:
- просмотр дисциплин кафедры;
- загрузка дисциплин из списка
код; название; - просмотр и добавление комментариев к дисциплинам;
- просмотр преподавателей кафедры;
- просмотр нагрузки преподавателей кафедры за период.
Админка
Обновлено:
- создание пользователей теперь поддерживает роли
DEPARTMENT,EDUCATION_OFFICEиSCHEDULE_VIEWER; - удаление пользователей заменено на архивирование;
- вкладка аудиторий показывает архивные записи и умеет восстанавливать аудиторию;
- удаление аудитории заменено на вывод из эксплуатации;
- настройки временных слотов доступны
ADMINиEDUCATION_OFFICE.
Документация
Обновлены:
AGENTS.md;docs/README.md;docs/API.md;docs/DATABASE.md;docs/BUSINESS_LOGIC.md;docs/FRONTEND.md;docs/ARCHITECTURE.md.
Проверки
Статически проверены новые и изменённые JS-файлы:
node --check frontend/admin/js/main.js
node --check frontend/admin/js/views/schedule-view.js
node --check frontend/admin/js/views/auditorium-workload.js
node --check frontend/admin/js/views/department-workspace.js
node --check frontend/admin/settings/js/main.js
node --check frontend/admin/js/api.js
node --check frontend/admin/js/views/users.js
node --check frontend/admin/js/views/classrooms.js
git diff --check
Backend-компиляция проверяется через Docker Maven:
docker run --rm -v /mnt/HDD/magistr/magistr/backend:/app -w /app maven:3.9-eclipse-temurin-17 mvn -q -DskipTests compile
Результат: компиляция прошла успешно.
Единая V1__init.sql проверена на пустой PostgreSQL 16 внутри Docker: SQL применился успешно.
Локальный mvn в окружении отсутствует, поэтому используется Docker.
Что осталось следующим этапом
Остались задачи, которые требуют отдельного цикла проработки:
- UI для просмотра истории переводов преподавателя в админке;
- UI для списка и редактирования уже созданных
schedule_overrides; - более строгая проверка конфликтов перед сохранением переносов;
- полноценный импорт XLSX/CSV для кафедры вместо текстовой загрузки;
- браузерный smoke-test и проверка ролевых вкладок после запуска
localhost:80.