Фронтенд-приложение на Vue 3 для анализа академических данных студентов ИРНИТУ: статистика оценок, академический отпуск, предметная аналитика, рейтинг студентов и ML-аналитика (прогнозы и кластеризация).
- 1. О проекте
- 2. Ключевые возможности
- 3. Что обновлено в последних коммитах
- 4. Технологический стек
- 5. Требования
- 6. Быстрый старт
- 7. Полная настройка backend + frontend
- 8. Скрипты npm
- 9. Архитектура приложения
- 10. Навигация и разделы интерфейса
- 11. Детализация view-модулей
- 12. Переиспользуемые компоненты
- 13. API-интеграция
- 14. Авторизация и безопасность
- 15. Тестирование
- 16. Структура проекта
- 17. Конфигурация
- 18. Производственная сборка и деплой
- 19. Диагностика и типовые проблемы
- 20. Рекомендации по развитию
- 21. Связанные репозитории
- 22. Лицензия
- 23. Техническая карта модулей
- 24. Каталог функций по файлам
- 25. Контракты данных и модели API
- 26. Runtime-потоки и сценарии работы
- 27. Onboarding для нового разработчика
Приложение предназначено для визуализации и аналитики учебных данных студентов ИРНИТУ в формате единой веб-панели. Проект ориентирован на сотрудников, преподавателей и аналитиков, которым требуется:
- видеть оперативную статистику по успеваемости;
- фильтровать данные по курсам, группам, дисциплинам;
- оценивать риски отчисления и проблемные зоны;
- анализировать данные в разрезе групп и отдельных студентов;
- использовать результаты ML-подсистемы (прогнозы и кластерный анализ).
Основная идея: объединить разрозненные академические метрики в понятный интерфейс с наглядной визуализацией и быстрыми фильтрами.
- Статистика оценок с агрегатами и графиками.
- Анализ студентов в академическом отпуске (успеваемость).
- Статистика по дисциплинам.
- Рейтинг студентов с фильтрами и сортировкой.
- Аналитические карточки и статусные срезы по студентам.
- Групповая аналитика с рисками и детализацией по выбранной группе.
- Отдельная вкладка ML-аналитики:
- прогноз оценок;
- кластеризация студентов;
- просмотр данных по конкретному студенту (кластер/метрики).
- JWT-аутентификация с автоматическим refresh токена.
- Unit-тесты ключевых views и UI-компонентов.
Ниже перечислены ключевые улучшения, добавленные в диапазоне от базового коммита до текущей версии ветки:
- Добавлена новая view-вкладка
ML АНАЛИТИКА(src/views/StudentAnalyticsView.vue). - Реализованы сценарии:
- обучение/получение прогноза;
- запуск кластеризации;
- получение кластерных данных и поиск по ID студента.
StatisticsViewрасширен блоком аналитики по группам:- сводные KPI-карточки;
- инсайты;
- табличная сводка с рисковыми индикаторами;
- детализация выбранной группы.
StudentRatingViewдополнен:- аналитическими карточками статусов;
- фильтрацией по статусам;
- отображением долгов;
- пакетной (batch) догрузкой больших наборов данных.
- Улучшены доступность и навигация:
- ARIA-атрибуты;
- улучшенное мобильное меню;
- доработки адаптивного поведения вкладок.
- Оптимизирована обработка ошибок API, убраны лишние консольные логи.
- Добавлена тестовая инфраструктура Vitest.
- Подключены
@vue/test-utils,happy-dom, coverage (@vitest/coverage-v8). - Добавлены unit-тесты (
src/__tests__) для ключевых модулей.
Vue 3— базовый UI-фреймворк.Vite— dev-сервер и сборка в текущем процессе разработки.Bootstrap 5— адаптивная сетка и базовые UI-классы.Chart.js— диаграммы и графики.@mdi/font,Material Icons— иконки.
Composition APIдля реактивного состояния.provide/injectдля передачи API-утилит в дочерние modules.localStorageдля хранения токенов и данных пользователя.
Vitest— запуск unit-тестов.@vue/test-utils— тестирование Vue-компонентов.happy-dom— браузероподобная среда для тестов.
В проекте присутствуют конфигурации как Vite (vite.config.js), так и Vue CLI (vue.config.js, @vue/cli-service в package.json). Для основной разработки используется npm run dev (Vite). Скрипты serve/build привязаны к Vue CLI и сохранены для совместимости.
Node.js16+ (рекомендуется 18+).npm8+.
- Django backend с API (по умолчанию:
http://127.0.0.1:8000). - База данных backend: PostgreSQL или SQL Server.
- Пользователь backend (обычно superuser) для авторизации во frontend.
Если backend уже работает локально:
npm install
npm run devПосле запуска frontend доступен по адресу http://localhost:5173.
- Клонировать backend-репозиторий:
git clone https://github.com/kopikou/IRNTU-Dashboard_django_backend-main.git
cd IRNTU-Dashboard_django_backend-main- Создать виртуальное окружение:
Windows (PowerShell):
py -3.12 -m venv venv
.\venv\Scripts\Activate.ps1Linux/macOS:
python3.12 -m venv venv
source venv/bin/activate- Установить зависимости backend:
python -m pip install --upgrade pip setuptools wheel
pip install -r requirements.txt-
Настроить БД в
app/settings.py(PostgreSQL или SQL Server). -
Выполнить миграции:
python manage.py makemigrations
python manage.py migrate- Создать пользователя:
python manage.py createsuperuser- Запустить backend:
python manage.py runserverBackend по умолчанию будет доступен на http://127.0.0.1:8000.
- Установить зависимости:
npm install- Убедиться в прокси-настройке (
vite.config.js):
- префикс:
/api - target:
http://127.0.0.1:8000
- Запустить dev-режим:
npm run dev- Открыть
http://localhost:5173и выполнить вход.
В package.json доступны:
npm run dev— запуск Vite dev-сервера.npm run test— запуск Vitest в watch-режиме.npm run test:coverage— запуск тестов с покрытием.npm run serve— запуск через Vue CLI (legacy/совместимость).npm run build— production-сборка через Vue CLI (legacy/совместимость).
-
src/app.vue:- управление верхнеуровневой навигацией;
- авторизация;
- общая обработка API-запросов;
- provide зависимостей (
fetchData,API_BASE_URL); - динамическая подгрузка views через
defineAsyncComponent.
-
src/views/*.vue:- разделы бизнес-логики и визуализации.
-
src/components/*:- переиспользуемые графические и UI-компоненты.
- Пользователь авторизуется.
app.vueсохраняет токены и предоставляетfetchData.- View-компоненты получают
fetchDataчерезinject. - Компоненты запрашивают API и строят таблицы/диаграммы.
- При
401выполняется refresh токена и повтор запроса.
Маршрутизация реализована не через URL-router, а через табовую навигацию и переключение activeTab в app.vue.
Верхнее меню (desktop + mobile) содержит вкладки:
СТАТИСТИКА ОЦЕНОКАКАДЕМИЧЕСКИЙ ОТПУСКСТАТИСТИКА ПО ПРЕДМЕТАМРЕЙТИНГ СТУДЕНТОВML АНАЛИТИКА
Для мобильной версии реализовано отдельное выпадающее меню с синхронизацией активной вкладки.
Назначение: сводная статистика оценок, таблицы и графики по учебным данным.
Основные возможности:
- фильтры по курсу/семестру/группе/дисциплине;
- summary-панель (средний балл, распределения оценок);
- визуализация через Chart.js;
- расширенный блок аналитики по группам:
- рейтинг групп;
- индикаторы рисков;
- инсайты;
- детализация выбранной группы.
Ключевые API:
GET /api/statistics/marks/GET /api/student-rating/(для enrichment посещаемости по группам)
Назначение: анализ данных студентов в академическом отпуске.
Основные возможности:
- вкладка успеваемости в академическом отпуске;
- сводные показатели и таблицы;
- подготовленная структура под вкладку возвратов (backend-эндпоинт временно отключен).
Ключевые API:
GET /api/academic/performance/GET /api/academic/returns/(временно недоступен на backend)
Назначение: аналитика по дисциплинам.
Основные возможности:
- фильтрация по учебным параметрам;
- сортировка дисциплин;
- метрики по успеваемости и распределению оценок.
Ключевой API:
GET /api/statistics/subject/
Назначение: рейтинг студентов с метриками успеваемости.
Основные возможности:
- фильтры (курс, группа, предмет);
- сортировка (рейтинг, успеваемость, посещаемость, активность);
- график топ-студентов;
- таблица с пагинацией;
- аналитические карточки статусов:
- отличники;
- зона риска;
- хорошая посещаемость;
- отображение долгов и статусов;
- догрузка данных по батчам для больших объемов.
Ключевой API:
GET /api/student-rating/
Назначение: ML-аналитика по студентам.
Сценарии:
- прогнозирование:
- обучение модели прогноза;
- получение прогнозов;
- фильтрация и сортировка прогнозных результатов;
- кластеризация:
- запуск обучения кластерной модели;
- загрузка кластерных данных;
- выбор группы;
- просмотр кластера конкретного студента по ID.
Ключевые API:
POST /api/predictions/train/GET /api/predictions/data/POST /api/analytics/train/GET /api/analytics/data/GET /api/analytics/data/{studentId}/GET /api/groups/
ChartComponent.vue— обертка над Chart.js.ChartFilter.vue— фильтры для графиков.Pagination.vue— пагинация таблиц.PerPageSelector.vue— выбор размера страницы.
UI/MyButton.vueUI/MyInput.vueUI/MySelect.vueUI/MyDialog.vue
PostForm.vue,PostItem.vue,PostList.vue— вспомогательные/демонстрационные компоненты.
- Базовый URL внутри фронтенда:
API_BASE_URL = '/api'(вsrc/app.vue). - Проксирование настроено в
vite.config.js:/api->http://127.0.0.1:8000.
В app.vue реализована функция fetchData(url, options, isRetry):
- добавляет
Authorization: Bearer <accessToken>, если пользователь авторизован; - обрабатывает ошибки HTTP и сообщения backend;
- при
401пытается обновить токен; - после успешного refresh повторяет исходный запрос;
- при неуспехе refresh выполняет logout и повторный вход.
Авторизация:
POST /api/login/POST /api/auth/token/refresh/
Справочники:
GET /api/groups/GET /api/disciplines/
Аналитика/статистика:
GET /api/statistics/marks/GET /api/statistics/subject/GET /api/student-rating/
Академический отпуск:
GET /api/academic/performance/GET /api/academic/returns/(backend может быть отключен)
ML:
POST /api/predictions/train/GET /api/predictions/data/POST /api/analytics/train/GET /api/analytics/data/GET /api/analytics/data/{studentId}/
Content-Type: application/jsonAccept: application/jsonAuthorization: Bearer <token>для защищенных endpoint.
Используется пара токенов:
accessToken— короткоживущий;refreshToken— для обновленияaccessToken.
localStorage.accessTokenlocalStorage.refreshTokenlocalStorage.userData
- API возвращает
401. - Клиент вызывает refresh endpoint.
- При успехе повторяет исходный запрос.
- При неуспехе — сбрасывает сессию и открывает окно логина.
vitest.config.js:- среда
happy-dom; - глобальные API тестов;
setupFiles: ./src/__tests__/setup.js;- alias
@->src.
- среда
View-тесты:
AcademicLeaveView.spec.jsStatisticsView.spec.jsSubjectStatsView.spec.jsStudentRatingView.spec.js
Компоненты:
ChartComponent.spec.jsChartFilter.spec.jsPagination.spec.jsPerPageSelector.spec.jsMyButton.spec.jsMyInput.spec.jsMySelect.spec.jsMyDialog.spec.jsPostForm.spec.jsPostItem.spec.js
npm run testПокрытие:
npm run test:coverageVueFront/
├── public/
│ ├── datasets/
│ └── favicon.ico
├── src/
│ ├── assets/
│ ├── components/
│ │ ├── UI/
│ │ │ ├── MyButton.vue
│ │ │ ├── MyInput.vue
│ │ │ ├── MySelect.vue
│ │ │ └── MyDialog.vue
│ │ ├── ChartComponent.vue
│ │ ├── ChartFilter.vue
│ │ ├── Pagination.vue
│ │ ├── PerPageSelector.vue
│ │ ├── PostForm.vue
│ │ ├── PostItem.vue
│ │ └── PostList.vue
│ ├── views/
│ │ ├── StatisticsView.vue
│ │ ├── AcademicLeaveView.vue
│ │ ├── SubjectStatsView.vue
│ │ ├── StudentRatingView.vue
│ │ └── StudentAnalyticsView.vue
│ ├── __tests__/
│ │ ├── *.spec.js
│ │ └── setup.js
│ ├── app.vue
│ └── main.js
├── index.html
├── vite.config.js
├── vitest.config.js
├── vue.config.js
├── package.json
└── README.md
- dev-сервер:
host: 0.0.0.0port: 5173open: true
- proxy:
/api->http://127.0.0.1:8000
- alias:
@->./src
- test environment:
happy-dom - setup file:
src/__tests__/setup.js - alias
@для импортов в тестах.
Содержит legacy-конфигурацию @vue/cli-service и define-переменные Vue runtime. Используется при запуске CLI-скриптов serve/build.
Сейчас в package.json production-сборка завязана на Vue CLI:
npm run build- Backend доступен из production-среды.
- Настроен CORS на backend.
- Корректно настроен путь API (
/api+ proxy/reverse proxy). - Включены мониторинг ошибок и логи backend.
- Nginx / Apache (статическая раздача + проксирование API).
- Облачные статические платформы (при наличии корректного backend URL и CORS).
Проверьте:
- корректность логина/пароля;
- наличие
refreshTokenвlocalStorage; - доступность
POST /api/auth/token/refresh/; - срок действия токенов на backend.
Проверьте:
- backend реально запущен на
127.0.0.1:8000; - proxy в
vite.config.js; - endpoint существует и доступен;
- права пользователя backend.
Проверьте:
- выбранные фильтры (курс/группа/предмет);
- сортировку и лимиты;
- реальные данные в backend по выбранному диапазону.
Проверьте:
- установлены ли зависимости (
npm install); - версии Node/npm;
- наличие
vitest.config.jsиsrc/__tests__/setup.js.
- Вынести API base URL и параметры окружения в
.env(dev/stage/prod). - Унифицировать build-toolchain (Vite-only) для исключения двойной конфигурации.
- Добавить e2e-тесты (например, Playwright/Cypress) для критических сценариев.
- Расширить покрытие unit-тестами
StudentAnalyticsView. - Ввести централизованный error boundary и уведомления.
- Django backend:
Без backend фронтенд не сможет загрузить рабочие данные.
Проект разработан в учебно-прикладных целях для ИРНИТУ.
Этот раздел описывает архитектуру уже на уровне инженерной реализации: где живет логика, какие зависимости используются, и как в рантайме движутся данные.
app.vue выполняет роль orchestration-layer:
- хранит состояние сессии (
accessToken,refreshToken,userData,isAuthenticated); - содержит единый API-шлюз
fetchData; - управляет верхнеуровневой навигацией (
activeTab); - загружает справочники фильтров (
groups,disciplines); - провайдит
fetchDataиAPI_BASE_URLв дочерние views черезprovide/inject.
Каждый view-экран инкапсулирует:
- собственные фильтры и local state;
- отдельный fetch-цикл API;
- computed-подготовку данных под графики/таблицы;
- сортировку/пагинацию;
- пользовательские интеракции (поиск, click по диаграммам, reset).
ChartComponent.vue— единый адаптер Chart.js + нормализованныйchartClickevent.Pagination.vue— стандартный контрол пагинации с эллипсисами.PerPageSelector.vue— контроль размера страницы.UI/*— базовые UI-компоненты (часть исторического слоя).
- Архитектурно проект придерживается Composition API для views, но содержит legacy-компоненты в Options API.
- В проекте смешанный toolchain (Vite + Vue CLI legacy).
- Вся серверная коммуникация проходит через
fetchData, что упрощает контроль авторизации и ошибок.
Ниже приведен практический справочник по основным функциям. Это не просто перечень имен — это "что делает функция и зачем она нужна".
API_BASE_URL,LOGIN_PATH,TOKEN_REFRESH_PATH— центральные URL-константы API.activeTab— текущий раздел интерфейса.filterOptions— справочные данные для селектов (курсы/семестры/группы/предметы).chartOptions,ratingChartOptions— базовые options Chart.js для дочерних views.- auth-state:
isAuthenticated,accessToken,refreshToken,userData,loginForm.
-
fetchData(url, options, isRetry)- единая обертка над
fetch; - проставляет JSON headers;
- добавляет Bearer token;
- на
401запускает refresh сценарий; - при успешном refresh повторяет исходный запрос;
- на критических auth-ошибках инициирует logout.
- единая обертка над
-
setActiveTab(tabName)- переключает активную вкладку (desktop-flow).
-
toggleMobileMenu(),setActiveTabMobile(tabName)- управление мобильным меню и синхронный переход во view.
-
openLoginModal()- чистит форму и открывает Bootstrap Modal входа.
-
login()- выполняет
POST /api/login/; - сохраняет токены и профиль в
localStorage; - запускает
loadFilterOptions()после успешного входа.
- выполняет
-
logout()- очищает auth/localStorage;
- очищает кэш фильтров;
- перезагружает страницу.
-
logoutAndShowLogin(message)- композиция logout + alert + повторное окно логина.
-
refreshAccessToken()- выполняет
POST /api/auth/token/refresh/; - обновляет
accessToken(и optionallyrefreshToken).
- выполняет
-
loadFilterOptions()- запрашивает группы и дисциплины;
- нормализует/сортирует списки;
- пишет ошибки в
globalError.
currentViewComponent— маппингactiveTab-> async view-component.formattedUserName— форматирование ФИО в короткий вид.
onMounted()- инициализирует Bootstrap Modal;
- восстанавливает auth из localStorage;
- запускает
loadFilterOptions().
Главная статистическая витрина по оценкам + расширенный аналитический блок по группам.
-
fetchStatisticsMarks()- строит query из фильтров;
- вызывает
GET /api/statistics/marks/; - подготавливает таблицу
allStudentsDataчерезprocessStudentData(); - запускает построение групповой аналитики
buildGroupAnalyticsFromMarks().
-
resetFilters()- очищает фильтры и перезапрашивает данные.
-
processStudentData(students)- разворачивает вложенную структуру
student -> subjects -> gradesв плоскую таблицу строк; - нормализует строки оценок (
зачет,незачет,неявка); - сохраняет исходный student ID для строк таблицы.
- разворачивает вложенную структуру
-
sortBy(key)- сортировка таблицы по выбранной колонке;
- отдельная логика для сортировки оценок (число/текст).
-
debouncedSearch(),clearSearch()- отложенный поиск с
setTimeoutи очистка состояния поиска.
- отложенный поиск с
-
handleGradeDistributionClick(data)- drill-down: клик по сегменту диаграммы -> временный grade-фильтр таблицы.
-
clearGradeFilter()- снимает временный фильтр по оценке.
-
onPageChange(page),resetPagination()- стандартный page-flow таблицы.
-
buildGroupAnalyticsFromMarks()- агрегирует данные по группам;
- считает средний балл и количество студентов;
- запускает enrichment посещаемостью.
-
fetchGroupAttendance()- догружает посещаемость групп через
GET /api/student-rating/; - рассчитывает риск-группы (
avgGrade < 3.5илиattendance < 60).
- догружает посещаемость групп через
-
selectGroup(groupName)- включает/выключает выбранную группу для детализации.
-
parseGradeToNumeric(grade),isFailGrade(grade)- сервисные функции для унификации расчетов.
-
gradeBarClass(grade),attendanceBarClass(pct)- маппинг метрик в CSS-классы прогресс-баров.
gradeSummaryChartData,gradeDistributionChartDatafilteredStudents,paginatedStudents,totalPagessortedGroupFull,bestGroup,groupsAtRiskCount,overallAvgGradeselectedGroupStudents,selectedGroupAvgGrade,selectedGroupFailRateselectedGroupSubjectIssues,selectedGroupCriticalSubjectsgroupInsights
- watch на изменение базовых фильтров (
course,semester,group,subject) ->fetchStatisticsMarks().
Рейтинг студентов с аналитическими статусами и постепенной загрузкой больших наборов.
-
buildBaseParams()- формирует query-параметры по фильтрам.
-
fetchRatingBatch(baseParams, offset, limit)- batch-запрос части данных рейтинга.
-
loadRemainingBatches(baseParams, token, initialOffset, total)- последовательная догрузка следующих порций;
- поддерживает отмену устаревшего запроса через
activeLoadToken.
-
fetchStudentRating()- основной orchestrator загрузки:
- сброс состояния;
- загрузка первого батча;
- запуск фоновой догрузки остатка;
- пересчет аналитических статусов.
- основной orchestrator загрузки:
-
deriveAnalyticsFromStudents()- классифицирует студентов в категории:
- top (
avgGrade >= 4.5иriskLevel=низкий); - risk (
riskLevel=высокий); - good attendance (
attendance >= 80без высокого риска).
- top (
- классифицирует студентов в категории:
-
getStudentStatus(studentId),getStudentStatusClass(studentId)- статус и его визуальный class для строки таблицы.
-
setStatusFilter(status)- включает/выключает фильтр по категории статуса.
formatRatingAttendance(p)formatDropoutRisk(r)getDropoutRiskClass(r)formatDebtsTooltip(debtsDetails)
analyticsSummary— total/count/percent по статусам.chartData— top N (поfilters.limit) для графика.ratingChartData— stacked-dataset (успеваемость, активность, посещаемость).filteredStudents,paginatedStudents,totalPages.
- watch базовых фильтров ->
fetchStudentRating(). onMounted-> первичная загрузка рейтинга.
ML-экран: прогнозирование и кластерный анализ.
-
extractGroupBase(name)- нормализует базу названия группы (без завершающих чисел потока).
-
trainAndFetchPredictions()POST /api/predictions/train/;- после обучения автоматически вызывает
fetchPredictions().
-
fetchPredictions()GET /api/predictions/data/по текущим параметрам формы;- обновляет
predictions.
-
onFacultyChange()- сбрасывает зависимые поля формы и текущие результаты.
faculties,filteredGroupBases,canSubmitPredictionsortedPredictions(сортировки + фильтр направления изменений)predSummary(средние/positive/negative/neutral)predChartData(bar-график сравнения текущей и прогнозной оценки)
-
trainClustering()POST /api/analytics/train/;- после тренировки загружает кластерные данные.
-
fetchClusteringData()GET /api/analytics/data/(+ optional?group=...).
-
fetchStudentCluster()GET /api/analytics/data/{studentId}/.
clusterStudentsclusterGroupStatsclusterChartData(scatter-график:x=avg_grade,y=attendance%).
formatGrade,gradeClasschangeTextClass,directionBadgeClass,directionLabelformatChangePercentclusterBadgeClass
onMountedзагружает группы (GET /api/groups/) для формы прогноза.
Аналитика академического отпуска: успеваемость и (архитектурно подготовленная) вкладка возвратов.
fetchAcademicPerformance()->GET /api/academic/performance/.fetchAcademicReturns()-> в текущей версии endpoint отключен backend, функция возвращает информативную ошибку.
sortTable(key),getSortIcon(key)getDebtBadgeClass(debts)debouncedSearch(),debouncedReturnsSearch()clearSearch(),clearChartFilter()onPageChange(page),resetPagination()
handlePerformanceChartClick(data)— фильтр по числу долгов.handleGroupDistributionClick(data)— фильтр по группе.handleReturnDatesClick(data)— фильтр по месяцу возврата.handleStatusChartClick(data)— фильтр по статусу возврата.
debtsChartData,groupAverageDebtsChartData,statusChartDatasortedPerformanceStudents,filteredReturnsStudentspaginatedStudents,paginatedReturnsStudentsuniqueStatuses
- watch
academicSubTabдля ленивой загрузки данных вкладки. - watch
filtersPerformanceс debounce-fetch. onMountedинициализирует первый fetch + Bootstrap Dropdown.
Аналитика дисциплин по фильтрам и сортировкам.
-
fetchSubjectStats()- формирует query по фильтрам;
- запрашивает
GET /api/statistics/subject/.
-
resetFilters()- сброс фильтров в дефолты.
-
selectAllGroups()- массовый выбор всех доступных групп.
-
getSemesterName(value)- преобразование значения семестра в label.
-
getSortByLabel(sortBy)- text-label активной сортировки.
-
onPageChange(page),resetPagination()
gradeDistributionBarDatabestSubjectsChartDataallStudents,paginatedStudents,totalPages
- watch
filters->fetchSubjectStats(). onMounted-> первичный fetch + инициализация Dropdown.
Единый wrapper для Chart.js с корректным lifecycle.
destroyChart()— безопасно уничтожает текущий экземпляр графика.createOrUpdateChart():- уничтожает предыдущий инстанс;
- строит новый Chart;
- проксирует клики из Chart.js в Vue-event
chartClick.
onMounted-> initial render.watch(props.chartData, deep=true)-> rerender.onBeforeUnmount->destroyChart().
onPageChange(page)— валидирует границы и эмититpage-change.displayedPages— вычисление центрального окна страниц.showFirstButton,showLastButton,showLeftEllipsis,showRightEllipsis— computed-флаги визуальной логики.
onChange()— эмититupdate:modelValueиchange.- watch
props.modelValueсинхронизирует внутреннийperPage.
UI/MyButton.vue, UI/MyInput.vue, UI/MySelect.vue, UI/MyDialog.vue, PostForm.vue, PostItem.vue, PostList.vue, ChartFilter.vue — исторический слой переиспользуемых/учебных компонентов (частично не задействован в текущем аналитическом потоке).
Из практических нюансов:
- эти компоненты написаны в Options API;
PostList.vueсодержит import@/comp/PostItem.vue— путь требует проверки при реиспользовании.
Раздел помогает новичку быстро понять структуру payload без чтения всего frontend-кода.
{
"email": "user@example.com",
"password": "secret"
}{
"access": "jwt-access",
"refresh": "jwt-refresh",
"name": "Иванов Иван Иванович",
"email": "user@example.com"
}Ожидаемые ключи:
summary(агрегаты);students(массив студентов со вложенными предметами/оценками).
Типовая структура студента:
{
"id": 12345,
"group": "ИВТ-21-1",
"subjects": [
{
"subject": "Математика",
"grades": [5, 4, "зачет"]
}
]
}Ключи:
students— детализированные метрики;chartData— данные для chart;pagination— total/hasMore для batch-подгрузки.
Ожидаемые поля студента:
id,group,courseavgGrade,attendancePercent,activitydropoutRisk,riskLevelratingdebtCount,debtsDetails
Ключи:
gradeDistributionBarbestSubjectsstudents
Performance-ответ обычно содержит:
studentsdebtsDistributiongroupAverages
Returns-ответ (если endpoint включен):
studentsstatusDistribution
Prediction:
POST /api/predictions/train/GET /api/predictions/data/
Clustering:
POST /api/analytics/train/GET /api/analytics/data/GET /api/analytics/data/{studentId}/
- Пользователь логинится (
login()). - Токены сохраняются в localStorage.
- View вызывает
fetchData(). fetchDataдобавляет Bearer token.- При
401выполняетсяrefreshAccessToken(). - Исходный запрос повторяется.
- Если refresh неуспешен -> logout.
- Пользователь меняет фильтр в
StatisticsView. - Watch триггерит
fetchStatisticsMarks(). - Данные нормализуются
processStudentData(). - Одновременно строится групповая аналитика и таблица.
- Отображаются графики + пагинация.
fetchStudentRating()запрашивает первый batch.- Данные доступны сразу для UI.
- Фоново
loadRemainingBatches()догружает остаток. - После каждого батча пересчитываются аналитические статусы.
- UI отображает прогресс догрузки.
Prediction:
- Выбор faculty/group/course.
trainAndFetchPredictions()(тренировка).fetchPredictions()(получение прогнозов).- Сортировки/фильтры/график.
Clustering:
trainClustering().fetchClusteringData().- Фильтр по группе / поиск студента по ID через
fetchStudentCluster().
Этот чеклист позволяет быстро влиться в проект без потери контекста.
- Запусти backend и frontend.
- Войди через JWT-форму.
- Пройди все вкладки вручную.
- Запусти
npm run test.
src/app.vue— понять auth + fetchData + provide/inject.src/views/StatisticsView.vue— понять шаблон аналитического view.src/views/StudentRatingView.vue— понять batch-load паттерн.src/views/StudentAnalyticsView.vue— понять ML flows.src/components/ChartComponent.vue— общий chart lifecycle.
- Новые фильтры/таблицы: соответствующий
src/views/*.vue. - Новые API-параметры: сначала query-builder в view, затем UI.
- Новые диаграммы: computed chartData +
ChartComponent. - Новые auth-правила: только
app.vue(fetchData,refreshAccessToken,login/logout).
- Не обходить
fetchDataпрямымиfetchвнутри views. - Не хранить auth-логику локально во view.
- При добавлении фильтров проверять:
- reset;
- watch;
- пагинацию;
- пустые состояния.
- Любое изменение таблиц/графиков сопровождать обновлением unit-тестов.
- Функционал работает во всех затронутых вкладках.
- Нет runtime-ошибок в консоли при основных сценариях.
- Unit-тесты проходят (
npm run test). - README обновлен (если изменены API/флоу/модель данных).