24 KiB
Анализ структуры вкладок и предложения по UX/UI оптимизации системы Magistr
В данном документе представлен детальный анализ текущей структуры интерфейса административной панели (SPA) и настроек системы Magistr. Выявлены пересекающиеся области функционала, сформулированы предложения по их объединению, переносу в настройки или удалению, а также предложены новые функциональные модули и технические решения для оптимизации UX/UI и производительности.
1. Анализ текущей структуры и доступности вкладок
На данный момент в основном SPA-интерфейсе администратора (/admin/) зарегистрировано 13 вкладок, а в дополнительном SPA настроек (/admin/settings/) — 2 вкладки.
В зависимости от роли пользователя, сайдбар фильтруется следующим образом:
| Вкладка (ID) | Описание | Доступность по ролям |
|---|---|---|
users |
CRUD пользователей и архивирование | ADMIN |
groups |
CRUD групп, подгрупп и назначений календарей | ADMIN |
edu-forms |
Справочник форм обучения | ADMIN |
profiles |
Управление профилями обучения специальностей | ADMIN |
equipments |
Каталог оборудования | ADMIN, EDUCATION_OFFICE |
classrooms |
Список аудиторий с привязкой оборудования | ADMIN, EDUCATION_OFFICE |
subjects |
CRUD всех дисциплин и привязка преподавателей | ADMIN |
department-workspace |
Рабочая область кафедры (дисциплины, импорт, нагрузка) | ADMIN, DEPARTMENT |
schedule-view |
Просмотр расписаний (read-only) | ADMIN, EDUCATION_OFFICE, DEPARTMENT, SCHEDULE_VIEWER |
schedule |
Конструктор правил динамического расписания | ADMIN, EDUCATION_OFFICE |
academic-calendar |
Календарные графики и Excel-редактор сетки | ADMIN, EDUCATION_OFFICE |
auditorium-workload |
Матрицы и таблицы загруженности | ADMIN, EDUCATION_OFFICE |
database |
Управление тенантами (БД клиентов) | ADMIN |
| Settings (SPA) | Общие настройки, Управление временными слотами | ADMIN, EDUCATION_OFFICE (ссылка в подвале) |
2. Пересечения функционала и проблемные зоны
2.1. Избыточное дробление академической структуры
Для описания структуры обучения сейчас используются четыре отдельные вкладки:
departments-data(Создание кафедры/специальности)profiles(Профили обучения специальностей)edu-forms(Формы обучения)groups(В блоке создания группы выбираются форма, кафедра, специальность и профиль)
В чём проблема:
- Разрыв контекста: Чтобы завести новую специальность с профилями, администратору сначала нужно пойти во вкладку
departments-data, создать специальность, затем перейти во вкладкуprofiles, выбрать в селекте эту специальность и добавить профили. - Перегрузка меню: 13 вкладок в сайдбаре для роли
ADMIN— это слишком много. Пользователю трудно ориентироваться визуально.
2.2. Дублирование и раздвоение управления дисциплинами
Управление дисциплинами разнесено между вкладками subjects (для администратора) и department-workspace (для кафедры).
В чём проблема:
- Администратор во вкладке
subjectsвидит плоскую таблицу всех дисциплин всех кафедр, но не имеет удобных инструментов фильтрации по кафедре. - Форма создания новой дисциплины во вкладке
subjectsтребует ввода числового ID кафедры вручную (полеnew-subject-departmentтипаnumber). Это критическая UX-ошибка: администратор не должен помнить числовые ID БД наизусть. - Привязка преподавателей к дисциплинам (
teacher_subjects) находится на вкладкеsubjects. При этом сама нагрузка преподавателей и список преподавателей кафедры отображаются на вкладкеdepartment-workspace. Логичнее было бы видеть, какие дисциплины ведёт преподаватель, непосредственно при работе с его нагрузкой или в едином справочнике преподавателей/кафедры.
2.3. Низкая частота использования справочника оборудования (equipments)
Оборудование существует только как подчиненная сущность для аудиторий (чтобы указать, что в аудитории 101 есть 20 ПК и 1 проектор).
В чём проблема:
- Выделение целой вкладки под простой список («Проектор», «ПК») не оправдано. Список оборудования меняется раз в несколько лет.
- При этом привязка оборудования к аудиториям происходит на вкладке
classrooms.
2.4. Перегруженность вкладки групп (groups)
На вкладке групп на одном экране выводятся сразу три тяжелые формы и три таблицы:
- Создание/редактирование групп + таблица групп.
- Создание подгрупп для лабораторных + таблица подгрупп.
- Назначение календарного графика группе + таблица назначений.
В чём проблема:
- Экран перегружен элементами управления.
- Для работы с подгруппами или назначениями графиков конкретной группы пользователю приходится выбирать эту группу из длинного выпадающего списка в отдельной форме, вместо того чтобы выполнять действия в контексте строки этой группы в таблице.
2.5. Нахождение системной вкладки «База данных» в общем меню расписания
Вкладка database отвечает за управление тенантами (добавление новых вузов-клиентов, создание для них БД и запуск Flyway миграций).
В чём проблема:
- Это технический функционал уровня Super-Admin / DevOps. Он не имеет отношения к ежедневному планированию расписания. Нахождение его в одном ряду с расписанием и группами нарушает логику интерфейса.
3. Рекомендации по оптимизации структуры (Что убрать, объединить и перенести)
graph TD
subgraph Было (13 вкладок в меню ADMIN)
direction TB
T1[database]
T2[edu-forms]
T3[departments-data]
T4[profiles]
T5[equipments]
T6[classrooms]
T7[groups]
T8[users]
T9[subjects]
T10[department-workspace]
T11[schedule]
T12[schedule-view]
T13[academic-calendar]
T14[auditorium-workload]
end
subgraph Стало (Сгруппированное меню + настройки)
direction TB
subgraph Основное меню SPA (Группы вкладок)
direction TB
DASH[1. Дашборд / Главная]
subgraph Модуль: Расписание
SCH_ED[2. Конструктор расписания]
SCH_VI[3. Просмотр расписаний]
CAL[4. Календарный график]
WORK[5. Загруженность]
end
subgraph Модуль: Структура
UNIV[6. Структура вуза<br/>Кафедры, Специальности, Профили]
GRP[7. Группы и подгруппы]
SUBJ[8. Дисциплины]
end
subgraph Модуль: Ресурсы
CLASS[9. Аудиторный фонд<br/>Аудитории + Оборудование]
end
USR[10. Пользователи]
end
subgraph SPA Настройки (Настройки системы)
direction TB
SET_GEN[Общие настройки]
SET_TIME[Временные слоты сетка]
SET_FORM[Формы обучения из edu-forms]
SET_DB[Базы данных / Тенанты из database]
end
end
T1 -->|Перенести| SET_DB
T2 -->|Перенести| SET_FORM
T3 -->|Объединить| UNIV
T4 -->|Объединить| UNIV
T5 -->|Объединить| CLASS
T6 -->|Объединить| CLASS
T7 -->|Оптимизировать| GRP
T8 -->|Оставить| USR
T9 -->|Оптимизировать| SUBJ
T10 -->|Сохранить для роли Кафедра| SUBJ
T11 -->|Оставить| SCH_ED
T12 -->|Оставить| SCH_VI
T13 -->|Оставить| CAL
T14 -->|Оставить| WORK
3.1. Перенос в настройки (/admin/settings/)
- База данных (
database): Перенести в SPA настроек в раздел «Управление тенантами». Доступ должен быть только у ролиADMIN. - Формы обучения (
edu-forms): Перенести в настройки. Данный справочник заполняется один раз и не требует оперативного доступа из главного меню.
3.2. Объединение вкладок
- Объединить Кафедры, Специальности и Профили в одну вкладку «Структура вуза» (
university-structure):- Интерфейс делится на две вкладки внутри страницы: «Кафедры» и «Специальности».
- Управление профилями должно происходить прямо внутри списка специальностей. Например, в строке специальности в таблице добавляется кнопка «Профили», открывающая список профилей этой специальности в раскрывающейся строке (accordion) или модальном окне.
- Объединить Аудитории (
classrooms) и Оборудование (equipments) в одну вкладку «Аудиторный фонд»:- Основной экран показывает список аудиторий.
- Рядом располагается кнопка «Управление каталогом оборудования», которая открывает модальное окно с простым списком (добавить/удалить тип оборудования). Это избавит от необходимости держать под это отдельную вкладку в сайдбаре.
3.3. Реорганизация вкладки групп (groups)
- Оставить на вкладке только список групп с возможностью фильтрации по курсу, кафедре и форме обучения.
- Вынести подгруппы и назначения календарей из глобальных форм:
- В строке таблицы для каждой группы добавить действия:
[Подгруппы]— открывает компактное модальное окно для быстрого создания/редактирования подгрупп (лабораторных) именно для этой группы.[Календарь]— открывает модальное окно назначения календарного учебного графика на учебные годы для этой группы.
- Это уберет лишние тяжелые формы с главной страницы и исключит необходимость выбора группы из селектов вручную.
- В строке таблицы для каждой группы добавить действия:
3.4. Оптимизация Дисциплин (subjects) и Кабинета кафедры
- Исправить форму добавления дисциплины: Заменить ручной числовой ввод ID кафедры (
new-subject-department) на стандартный выпадающий список (выбор из загруженных кафедр). - Связать привязку преподавателей с дисциплинами: Вместо двух разрозненных таблиц на вкладке
subjects(«Все дисциплины» и «Привязки преподавателей»), объединить их:- В строке дисциплины выводить список привязанных преподавателей (в виде чипов/badge).
- По клику на кнопку «Преподаватели» в строке дисциплины открывать модальное окно привязки/отвязки преподавателей для этой конкретной дисциплины.
4. Что необходимо добавить (Новый функционал)
4.1. Главная страница / Дашборд (dashboard)
При входе в систему администратор и сотрудники учебного отдела должны видеть не сырые таблицы пользователей или расписания, а высокоуровневую аналитическую панель:
- Информационные карточки (Метрики):
- Всего активных групп / студентов.
- Количество задействованных преподавателей.
- Процент занятости аудиторного фонда на текущий день.
- Количество запланированных пар на сегодня.
- Мониторинг расписания в реальном времени:
- Список идущих прямо сейчас пар (текущий временной слот).
- Ближайшие свободные аудитории.
- Быстрый переход: Кнопки быстрого создания правила расписания, добавления переноса/замены.
4.2. Центр предупреждений и конфликтов (Red Zone)
В соответствии с планируемой бизнес-логикой (раздел 5 docs/BUSINESS_LOGIC.md), система должна автоматически валидировать расписание и предупреждать о коллизиях.
Необходима отдельная вкладка или виджет на дашборде «Конфликты расписания»:
- Критические ошибки (Блокирующие генерацию):
- Накладки преподавателей: Преподаватель назначен в один и тот же временной слот в разные аудитории / к разным группам (кроме потоковых лекций).
- Накладки аудиторий: Две разные пары стоят в одной аудитории в один слот.
- Предупреждения (Мягкие проверки):
- Превышение вместимости: Численность группы (или сумма подгрупп при совмещенных занятиях) превышает физическую вместимость аудитории.
- Недостаток оборудования: Дисциплина (например, лабораторная по химии) требует определенного оборудования, которого нет в назначенной аудитории.
- Превышение нагрузки: Преподаватель превысил недельный лимит часов.
5. Концепция новой структуры меню (Сайдбара)
Для уменьшения визуального шума сайдбар предлагается сделать двухуровневым (сворачиваемые группы) или четко разделить визуальными разделителями:
[ Логотип Magistr ]
---------------------------
👤 Кабинет кафедры <-- (Показывается только для роли DEPARTMENT)
📈 Дашборд <-- (Новый главный экран для ADMIN / EDU_OFFICE)
📁 РАСПИСАНИЕ
🗓 Конструктор правил
🗓 Точечные изменения <-- (Выделенный функционал оверрайдов/переносов)
📅 Календарный график
📊 Загруженность
🔍 Просмотр расписаний
🗂 СУБЪЕКТЫ И РЕСУРСЫ
🏫 Аудиторный фонд <-- (Объединенные Аудитории + Оборудование)
🎓 Группы обучения <-- (Группы + модалки подгрупп/календарей)
🏛 Структура вуза <-- (Кафедры + Специальности + Профили)
📚 Дисциплины <-- (Дисциплины + модалки преподавателей)
⚙️ СИСТЕМА
👥 Пользователи
⚙️ Настройки <-- (Переход в настройки SPA: слоты, БД, формы обучения)
---------------------------
[ Профиль / Выход ]
6. Идеи по оптимизации фронтенда и взаимодействия с API
6.1. Кэширование справочников на клиенте
На данный момент при переключении почти каждой вкладки заново запрашиваются списки кафедр, специальностей, учебных годов и т.д.
- Решение: Реализовать простой кэш-менеджер во фронтенд-клиенте (
api.jsили отдельныйcache.js):Это позволит избежать десятков дублирующих запросов при переключении между вкладкамиconst cache = new Map(); export async function getCachedData(key, fetchPromise) { if (!cache.has(key)) { cache.set(key, await fetchPromise); } return cache.get(key); } export function clearCache(key) { if (key) cache.delete(key); else cache.clear(); }groups,subjects,schedule.
6.2. Ленивая инициализация вкладок (Lazy Loading)
Сейчас в main.js импортируются все JS-модули вкладок одновременно при загрузке страницы:
import { initUsers } from './views/users.js';
import { initGroups } from './views/groups.js';
// ...еще 10 импортов
- Решение: Перейти на динамический импорт модулей инициализации при переходе на конкретную вкладку:
Это уменьшит размер начального JS-бандла и ускорит первую загрузку страницы.
async function switchTab(tab) { // ... const viewModule = await import(`./views/${tab}.js`); viewModule.init(); // ... }
6.3. Единый реестр кастомных выпадающих списков
В проекте реализованы кастомные селекты (выпадающие списки с поддержкой поиска и чекбоксов). При динамической подгрузке HTML-шаблонов часто требуется их повторная инициализация.
- Решение: Создать глобальный шину событий (Event Bus) или MutationObserver, который автоматически подхватывает элементы с классами
.custom-selectили атрибутамиdata-selectи инициализирует их без вызова ручного кодаinitAllCustomDropdowns()в каждом отдельном скрипте представления.
Резюме
Предложенные изменения позволят:
- Сократить количество пунктов основного меню с 13 до 8-9 логически сгруппированных разделов.
- Исключить ручной ввод ID (заменив на селекты) и разгрузить перегруженные интерфейсы (выносом подгрупп и назначений в контекстные модальные окна групп).
- Повысить отзывчивость интерфейса за счет клиентского кэширования справочников и ленивой загрузки JS-модулей.
- Добавить полноценный Дашборд и Центр предупреждений о конфликтах, что выведет аналитические возможности системы на уровень премиум-класса.