Vue 3 фронтенд для аналитики академических данных студентов: оценки, рейтинг, графики и ML-инсайты.
Фронтенд-панель для визуализации и анализа учебных данных студентов.
Работает с Django REST API, использует JWT-авторизацию, Chart.js и отдельный ML-раздел.
| Тип проекта | Web frontend · analytics dashboard |
| Статус | Завершённый личный проект |
| Автор | mdkefir |
| Основной стек | Vue 3, Vite, Bootstrap 5, Chart.js, Vitest |
| Backend | Django REST API + JWT |
- О проекте
- Мой вклад
- Возможности
- Архитектура
- Разделы интерфейса
- Структура проекта
- API и авторизация
- Тестирование
- Как запустить
- Связанные репозитории
- Что можно улучшить
student-analytics-dashboard — Vue 3 проект для аналитики академических данных студентов.
Проект объединяет разрозненные метрики успеваемости в единую веб-панель с фильтрами, таблицами и диаграммами.
Панель ориентирована на сотрудников, преподавателей и аналитиков, которым нужно:
- видеть статистику по оценкам и дисциплинам;
- отслеживать рейтинг студентов и зоны риска;
- анализировать академический отпуск;
- использовать ML-подсистему для прогнозов и кластеризации.
Изначально код публиковался в репозитории напарника: ArtemBarlukov/VueFront. Эта версия — мой личный репозиторий с полным исходным кодом и документацией.
Фронтенд целиком разрабатывался мной. Основные направления работы:
- спроектировал
app.vueкак app-shell: навигация, auth-state,provide/inject; - реализовал единый HTTP-слой
fetchDataс Bearer-токенами и auto-refresh при401; - настроил асинхронную подгрузку views и табовую навигацию (desktop + mobile);
- организовал загрузку справочников фильтров (группы, дисциплины).
- JWT-аутентификация: login, хранение токенов в
localStorage, refresh-flow; - обработка истечения сессии, logout и повторный вход;
- централизованная обработка ошибок API.
| Модуль | Что сделано |
|---|---|
StatisticsView |
Статистика оценок, групповая аналитика, KPI, риски, drill-down по графикам |
AcademicLeaveView |
Аналитика академического отпуска, фильтры, сортировка, диаграммы |
SubjectStatsView |
Статистика по дисциплинам, фильтрация, пагинация |
StudentRatingView |
Рейтинг, статусные карточки, долги, batch-загрузка больших данных |
StudentAnalyticsView |
ML-вкладка: прогноз оценок, кластеризация, поиск студента по ID |
- переиспользуемые компоненты:
ChartComponent,Pagination,PerPageSelector, UI-kit; - адаптивное mobile-меню, ARIA-атрибуты, улучшения доступности;
- интеграция Chart.js для всех аналитических разделов.
- настроил Vitest +
@vue/test-utils+happy-dom; - написал unit-тесты для views и UI-компонентов (
src/__tests__/); - оптимизировал обработку ошибок, убрал лишние console.log.
| Раздел | Описание |
|---|---|
| Статистика оценок | Агрегаты, графики, групповая аналитика с KPI и рисками |
| Академический отпуск | Успеваемость студентов в академическом отпуске |
| Статистика по предметам | Аналитика дисциплин с фильтрами и сортировкой |
| Рейтинг студентов | Топ, статусы, долги, batch-загрузка больших наборов |
| ML-аналитика | Прогноз оценок и кластеризация студентов |
- JWT-аутентификация с автоматическим refresh токена;
- единый HTTP-слой
fetchDataс обработкой401; - табовая навигация с адаптивным mobile-меню;
- переиспользуемые компоненты графиков и пагинации;
- unit-тесты ключевых views и UI-компонентов (Vitest).
flowchart TD
User["Пользователь"] --> App["app.vue"]
App --> Auth["JWT login / refresh"]
App --> Views["views/*.vue"]
Views --> Charts["ChartComponent"]
Views --> API["fetchData → /api"]
API --> Backend["Django REST API"]
Backend --> DB["PostgreSQL / SQL Server"]
| Слой | Назначение |
|---|---|
| app.vue | Auth, навигация, fetchData, provide/inject |
| views/ | Бизнес-логика разделов: фильтры, таблицы, графики |
| components/ | Chart.js, пагинация, UI-компоненты |
| Django API | Данные студентов, статистика, ML-endpoints |
Навигация реализована через переключение activeTab в app.vue, а не через URL-router. Views подгружаются асинхронно через defineAsyncComponent.
| Вкладка | Файл | Ключевые API |
|---|---|---|
| Статистика оценок | StatisticsView.vue |
GET /api/statistics/marks/ |
| Академический отпуск | AcademicLeaveView.vue |
GET /api/academic/performance/ |
| Статистика по предметам | SubjectStatsView.vue |
GET /api/statistics/subject/ |
| Рейтинг студентов | StudentRatingView.vue |
GET /api/student-rating/ |
| ML-аналитика | StudentAnalyticsView.vue |
POST /api/predictions/train/, GET /api/analytics/data/ |
| Компонент | Назначение |
|---|---|
ChartComponent.vue |
Обёртка Chart.js с lifecycle и chartClick |
Pagination.vue |
Пагинация таблиц |
PerPageSelector.vue |
Выбор размера страницы |
UI/MyButton.vue, MyInput.vue, MySelect.vue, MyDialog.vue |
Базовые UI-элементы |
student-analytics-dashboard/
├── public/
│ └── datasets/ # Демо-данные (CSV)
├── src/
│ ├── views/
│ │ ├── StatisticsView.vue
│ │ ├── AcademicLeaveView.vue
│ │ ├── SubjectStatsView.vue
│ │ ├── StudentRatingView.vue
│ │ └── StudentAnalyticsView.vue
│ ├── components/
│ │ ├── ChartComponent.vue
│ │ ├── Pagination.vue
│ │ └── UI/
│ ├── __tests__/ # Vitest unit-тесты
│ ├── app.vue # App shell: auth, nav, fetchData
│ └── main.js
├── vite.config.js # Dev-сервер + proxy /api
├── vitest.config.js
├── package.json
└── README.md
Все запросы проходят через fetchData в app.vue:
- добавляет
Authorization: Bearer <token>; - при
401вызываетPOST /api/auth/token/refresh/; - при неуспехе refresh — logout и повторный вход.
| Группа | Endpoints |
|---|---|
| Auth | 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/ |
| ML | POST /api/predictions/train/, GET /api/analytics/data/ |
В vite.config.js запросы /api проксируются на http://127.0.0.1:8000.
| Сценарий | Ожидаемый результат |
|---|---|
npm run test |
Vitest запускает unit-тесты |
| Views | StatisticsView, StudentRatingView, AcademicLeaveView, SubjectStatsView |
| Компоненты | ChartComponent, Pagination, UI-компоненты |
| Coverage | npm run test:coverage генерирует отчёт покрытия |
Стек: Vitest + @vue/test-utils + happy-dom.
- Node.js 16+ (рекомендуется 18+)
- npm 8+
- Запущенный Django backend на
http://127.0.0.1:8000
git clone https://github.com/mdkefir/student-analytics-dashboard.git
cd student-analytics-dashboard
npm install
npm run devОткройте http://localhost:5173 и войдите через JWT-форму.
- Клонируйте и запустите backend:
git clone https://github.com/mdkefir/Auth-and-Permissions-Logic.git
cd Auth-and-Permissions-Logic
py -3.12 -m venv venv
.\venv\Scripts\Activate.ps1 # Windows
pip install -r requirements.txt
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver- Запустите frontend (см. быстрый старт выше).
| Команда | Назначение |
|---|---|
npm run dev |
Vite dev-сервер (основной) |
npm run test |
Unit-тесты (watch) |
npm run test:coverage |
Тесты с покрытием |
npm run build |
Production-сборка (Vue CLI) |
| Репозиторий | Роль |
|---|---|
| mdkefir/Auth-and-Permissions-Logic | Django backend + JWT + permissions |
| ArtemBarlukov/VueFront | Первоначальная публикация кода (репозиторий напарника) |
Без backend фронтенд не загрузит рабочие данные.
- вынести API URL в
.env(dev/stage/prod); - унифицировать toolchain (Vite-only, убрать Vue CLI legacy);
- добавить e2e-тесты (Playwright / Cypress);
- расширить покрытие
StudentAnalyticsView; - перейти на URL-router вместо табовой навигации;
- добавить централизованный error boundary и toast-уведомления.
Frontend dashboard for visualizing and analyzing student academic data.
Works with a Django REST API, uses JWT auth, Chart.js and a dedicated ML section.
| Project type | Web frontend · analytics dashboard |
| Status | Completed personal project |
| Author | mdkefir |
| Main stack | Vue 3, Vite, Bootstrap 5, Chart.js, Vitest |
| Backend | Django REST API + JWT |
- About
- My Contribution
- Features
- Architecture
- UI Sections
- Project Structure
- API & Auth
- Testing
- How to Run
- Related Repositories
- Roadmap
student-analytics-dashboard is my Vue 3 project for student academic data analytics. Essentially the entire frontend is my work — from architecture and authentication to analytics screens, the ML tab and tests.
The project brings scattered performance metrics together in a single web panel with filters, tables and charts.
The dashboard is built for staff, teachers and analysts who need to:
- view grade and subject statistics;
- track student rankings and risk zones;
- analyze academic leave data;
- use the ML subsystem for predictions and clustering.
The code was initially published in a teammate's repository: ArtemBarlukov/VueFront. This version is my personal repository with the full source code and documentation.
I developed the entire frontend. Key areas of work:
- designed
app.vueas the app shell: navigation, auth state,provide/inject; - implemented the unified
fetchDataHTTP layer with Bearer tokens and auto-refresh on401; - set up async view loading and tab navigation (desktop + mobile);
- organized filter reference data loading (groups, disciplines).
- JWT authentication: login, token storage in
localStorage, refresh flow; - session expiry handling, logout and re-login;
- centralized API error handling.
| Module | What I built |
|---|---|
StatisticsView |
Grade statistics, group analytics, KPIs, risks, chart drill-down |
AcademicLeaveView |
Academic leave analytics, filters, sorting, charts |
SubjectStatsView |
Subject statistics, filtering, pagination |
StudentRatingView |
Rankings, status cards, debts, batch loading for large datasets |
StudentAnalyticsView |
ML tab: grade predictions, clustering, student lookup by ID |
- reusable components:
ChartComponent,Pagination,PerPageSelector, UI kit; - responsive mobile menu, ARIA attributes, accessibility improvements;
- Chart.js integration across all analytics sections.
- set up Vitest +
@vue/test-utils+happy-dom; - wrote unit tests for views and UI components (
src/__tests__/); - optimized error handling, removed unnecessary console.log calls.
| Section | Description |
|---|---|
| Grade statistics | Aggregates, charts, group analytics with KPIs and risk indicators |
| Academic leave | Performance analysis for students on academic leave |
| Subject statistics | Discipline analytics with filters and sorting |
| Student ranking | Top lists, status cards, debts, batch loading for large datasets |
| ML analytics | Grade predictions and student clustering |
- JWT authentication with automatic token refresh;
- unified
fetchDataHTTP layer with401handling; - tab navigation with responsive mobile menu;
- reusable chart and pagination components;
- unit tests for key views and UI components (Vitest).
flowchart TD
User["User"] --> App["app.vue"]
App --> Auth["JWT login / refresh"]
App --> Views["views/*.vue"]
Views --> Charts["ChartComponent"]
Views --> API["fetchData → /api"]
API --> Backend["Django REST API"]
Backend --> DB["PostgreSQL / SQL Server"]
| Layer | Responsibility |
|---|---|
| app.vue | Auth, navigation, fetchData, provide/inject |
| views/ | Section business logic: filters, tables, charts |
| components/ | Chart.js, pagination, UI components |
| Django API | Student data, statistics, ML endpoints |
Navigation uses activeTab switching in app.vue rather than a URL router. Views are loaded asynchronously via defineAsyncComponent.
| Tab | File | Key APIs |
|---|---|---|
| Grade statistics | StatisticsView.vue |
GET /api/statistics/marks/ |
| Academic leave | AcademicLeaveView.vue |
GET /api/academic/performance/ |
| Subject statistics | SubjectStatsView.vue |
GET /api/statistics/subject/ |
| Student ranking | StudentRatingView.vue |
GET /api/student-rating/ |
| ML analytics | StudentAnalyticsView.vue |
POST /api/predictions/train/, GET /api/analytics/data/ |
| Component | Responsibility |
|---|---|
ChartComponent.vue |
Chart.js wrapper with lifecycle and chartClick |
Pagination.vue |
Table pagination |
PerPageSelector.vue |
Page size selector |
UI/MyButton.vue, MyInput.vue, MySelect.vue, MyDialog.vue |
Base UI elements |
student-analytics-dashboard/
├── public/
│ └── datasets/ # Demo data (CSV)
├── src/
│ ├── views/
│ │ ├── StatisticsView.vue
│ │ ├── AcademicLeaveView.vue
│ │ ├── SubjectStatsView.vue
│ │ ├── StudentRatingView.vue
│ │ └── StudentAnalyticsView.vue
│ ├── components/
│ │ ├── ChartComponent.vue
│ │ ├── Pagination.vue
│ │ └── UI/
│ ├── __tests__/ # Vitest unit tests
│ ├── app.vue # App shell: auth, nav, fetchData
│ └── main.js
├── vite.config.js # Dev server + /api proxy
├── vitest.config.js
├── package.json
└── README.md
All requests go through fetchData in app.vue:
- adds
Authorization: Bearer <token>; - on
401callsPOST /api/auth/token/refresh/; - on refresh failure — logout and re-login.
| Group | Endpoints |
|---|---|
| Auth | POST /api/login/, POST /api/auth/token/refresh/ |
| Reference data | GET /api/groups/, GET /api/disciplines/ |
| Statistics | GET /api/statistics/marks/, GET /api/statistics/subject/ |
| Ranking | GET /api/student-rating/ |
| Academic leave | GET /api/academic/performance/ |
| ML | POST /api/predictions/train/, GET /api/analytics/data/ |
In vite.config.js, /api requests are proxied to http://127.0.0.1:8000.
| Scenario | Expected result |
|---|---|
npm run test |
Vitest runs unit tests |
| Views | StatisticsView, StudentRatingView, AcademicLeaveView, SubjectStatsView |
| Components | ChartComponent, Pagination, UI components |
| Coverage | npm run test:coverage generates a coverage report |
Stack: Vitest + @vue/test-utils + happy-dom.
- Node.js 16+ (18+ recommended)
- npm 8+
- Running Django backend at
http://127.0.0.1:8000
git clone https://github.com/mdkefir/student-analytics-dashboard.git
cd student-analytics-dashboard
npm install
npm run devOpen http://localhost:5173 and sign in via the JWT form.
- Clone and start the backend:
git clone https://github.com/mdkefir/Auth-and-Permissions-Logic.git
cd Auth-and-Permissions-Logic
py -3.12 -m venv venv
.\venv\Scripts\Activate.ps1 # Windows
pip install -r requirements.txt
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver- Start the frontend (see quick start above).
| Command | Purpose |
|---|---|
npm run dev |
Vite dev server (primary) |
npm run test |
Unit tests (watch) |
npm run test:coverage |
Tests with coverage |
npm run build |
Production build (Vue CLI) |
| Repository | Role |
|---|---|
| mdkefir/Auth-and-Permissions-Logic | Django backend + JWT + permissions |
| ArtemBarlukov/VueFront | Initial code publication (teammate's repository) |
The frontend cannot load live data without the backend.
- move API URL to
.env(dev/stage/prod); - unify toolchain (Vite-only, remove Vue CLI legacy);
- add e2e tests (Playwright / Cypress);
- expand
StudentAnalyticsViewtest coverage; - migrate to URL-based routing instead of tab navigation;
- add a centralized error boundary and toast notifications.