Releases: itedu-tool/exerciser
Release list
Exerciser 1.3.1
Changelog
Все заметные изменения в этом проекте будут документироваться в этом файле.
Формат основан на Keep a Changelog,
и этот проект придерживается Semantic Versioning.
[1.3.1] - 2026-06-19
Добавлено
Frontend (Student)
- Расчёт итоговой оценки по формуле
T = 2 + 3 × (S / K)с округлением вниз (закрывает #3). - Цветовое оформление итоговой оценки в зависимости от значения:
- 2 — очень плохо (
alert-danger), - 3 — удовлетворительно (
alert-warning), - 4 — хорошо (
alert-info), - 5 — превосходно (
alert-success).
- 2 — очень плохо (
- Модальное окно с пояснением формулы расчёта итоговой оценки (закрывает #3).
Изменено
Frontend (Student)
- Убрано отображение типа вопроса на странице прохождения и странице результатов (закрывает #1).
- Убрано общее количество вопросов на странице списка экзаменов — оставлена только информация о том, сколько вопросов будет показано студенту (закрывает #5).
- Изменён формат отображения количества вопросов: вместо
X из YтеперьXиливсе (Y)в зависимости от настроек экзамена.
Удалено
Frontend (Admin & Student)
- Удалена ссылка «Перейти к содержимому» (
skip-link) из общего шаблона админ-панели (layout.pug) и из студенческого клиента (index.html) (закрывает #7).
[1.3.0] - 2026-06-18
Добавлено
Backend
- Аналитика по студентам для преподавателя.
- Добавлен эндпоинт
GET /api/v1/analytics/attempts/last, возвращающий последнюю завершённую попытку для каждой
комбинации студент + экзамен. - Добавлен DTO
AttemptAnalyticsDtoс данными: студент, группа, экзамен, баллы, процент, дата завершения,
длительность. - В
AttemptRepositoryдобавлен методGetLastFinishedAttemptsByStudentAndExamAsyncс использованием MongoDB
Aggregation Framework.
- Добавлен эндпоинт
Frontend (Admin)
- Страница аналитики (
analytics.htmlиanalytics.js):- Таблица с последними попытками студентов.
- Прогресс-бар с цветовой индикацией (зелёный ≥70%, жёлтый 40–69%, красный <40%).
- Фильтрация по группам и экзаменам (выпадающие списки).
- Сортировка по любому столбцу (клик по заголовку, повторный клик меняет направление).
- Кнопка сброса всех фильтров.
- Индикация активной сортировки (стрелка ▲/▼).
Изменено
Frontend (Admin)
- В навигационное меню (
layout.pug) добавлен пункт 📊 Аналитика. - Версия админ-панели повышена до 1.2.0.
Зависимости (основные изменения)
- Нет новых зависимостей.
Документация
- Обновлены
Exerciser.WebApi.httpи Postman коллекция – добавлен запрос для нового эндпоинта аналитики.
[1.2.1] - 2026-06-17
Добавлено
Frontend (Student)
- Выбор тем – добавлена возможность переключать цветовые схемы (аналогично админ-панели). Выбор сохраняется в
localStorage. - Прилипание таймера и прогресс-бара – при прокрутке страницы таймер и прогресс всегда видны в верхней части экрана.
Изменено
Frontend (Student)
- Улучшен интерфейс прохождения теста:
- Убрана панель навигации по вопросам.
- Кнопки «Отмена» и «Завершить тест» теперь расположены внизу формы (после всех вопросов).
- Вопросы отображаются без указания типа (упрощённый вид).
- Страница результатов: добавлена цветовая индикация для каждого вопроса:
- Зелёная граница – вопрос полностью правильный.
- Красная граница – вопрос полностью неправильный.
- Оранжевая граница – вопрос частично правильный.
- Запрет отправки формы по Enter – теперь завершить тест можно только кликом по кнопке.
- Обновлён подсчёт баллов:
- Для вопросов с множественным выбором балл вычисляется как (правильно выбранные − ошибочно выбранные), но не меньше
0. - Для текстовых вопросов – 3 балла за точное совпадение.
- Для одиночного выбора – 1 балл за правильный ответ.
- Для вопросов с множественным выбором балл вычисляется как (правильно выбранные − ошибочно выбранные), но не меньше
Исправлено
- Исправлен Vue Router warning об устаревшем
next()в навигационном guard (заменён на возврат значения). - Исправлена проблема с выбором тем (добавлен Bootstrap JS и корректная инициализация).
Зависимости (основные изменения)
- Добавлен пакет
bootstrap(локально) для поддержки dropdown и корректной работы тем.
[1.2.0] - 2026-06-15
Добавлено
Backend
- Возможность указать количество вопросов каждого типа для показа студенту.
- В модель
Examдобавлены поляSingleChoiceToShow,MultipleChoiceToShow,TextInputToShow. - Обновлены DTO:
ExamSummaryDto,ExamDetailsDto,ImportExamDto. - Валидатор проверяет, что указанное количество не превышает доступное (0 = все).
- Логика
StartAttemptтеперь формирует выборку отдельно для каждого типа вопросов.
- В модель
Frontend (Student)
- Студенческий клиент на Vue 3 + Vite.
- Страница входа (выбор группы и студента из выпадающих списков).
- Список доступных экзаменов с отображением:
- общего количества вопросов и разбивки по типам;
- количества вопросов, которое будет показано студенту (по каждому типу).
- Страница прохождения теста:
- таймер (1 час, автоматическая отправка при истечении);
- прогресс-бар отвеченных вопросов;
- навигационная панель с номерами вопросов (цветовая индикация: отвечен/не отвечен/текущий);
- автоматическое сохранение ответов в
sessionStorage(восстановление при перезагрузке); - плавная прокрутка к вопросу и временная подсветка.
- Страница результатов с детализацией по каждому вопросу (ответы, баллы, правильные ответы).
- Использование прокси Vite для API-запросов (CORS не требуется в разработке).
DevOps и инфраструктура
- Обновлён README.md (актуальная информация о версиях, запуске фронтендов, студенческом клиенте).
Изменено
Frontend (Admin)
- Страница редактирования экзамена (
edit.pugиedit.js):- Добавлены три поля для указания количества вопросов каждого типа (SingleChoice, MultipleChoice, TextInput).
- При сохранении эти поля передаются в PUT-запрос и валидируются (не более доступного количества).
- Предпросмотр экзамена показывает настройки показа.
- Страница списка экзаменов (
teacher.pug,teacher.js):- В карточке экзамена отображаются настройки показа (
singleChoiceToShow,multipleChoiceToShow,
textInputToShow). - Детальное модальное окно также показывает эти параметры.
- В карточке экзамена отображаются настройки показа (
- Добавлено подробное логирование в
teacher.js,edit.js,groups.js,health.js(вывод в консоль браузера).
Frontend (Student)
api.js– интерсептор для добавленияX-Session-IdизlocalStorage, обработка FormData.auth.js– хранениеsessionId,groupId,studentIdвlocalStorage.router/index.js– защита маршрутов, перенаправление неавторизованных пользователей.- Компоненты вопросов –
QuestionSingleChoice.vue,QuestionMultipleChoice.vue,QuestionTextInput.vue.
Исправлено
- Импорт групп – проблема, из-за которой обработчик
submitне срабатывал, исправлена (форма импорта теперь
корректно отправляется). - Ошибка сериализации
JsonElementв MongoDB – при завершении попытки клиент присылал ответы в видеJsonElement,
что вызывало исключение. Добавлено преобразование в примитивные типы (string,List<string>,null). - CORS для студенческого клиента – настроен прокси Vite, теперь разработка не требует правки CORS на бэкенде.
Устарело
- Поле
QuestionsToShowвExamи DTO – заменено наSingleChoiceToShow,MultipleChoiceToShow,
TextInputToShow. Старые экзамены со значением 0 продолжают работать (показываются все вопросы соответствующего
типа).
Безопасность
- Non-root пользователь в Docker-образе (UID 1001) – уже было, сохранено.
- Прокси Vite для разработки – изолирует фронтенд от прямого доступа к API.
Известные проблемы
- Аутентификация MongoDB в
docker-compose.ymlотключена (рекомендуется включить для продакшена). - HTTPS не настроен (требуется сертификат и настройка Kestrel или обратного прокси).
Зависимости (основные изменения)
- Vue 3 + Vite – для студенческого клиента.
- Vue Router 4 – маршрутизация.
- Axios – HTTP-клиент.
[1.1.1] - 2026-06-11
Изменено
- Обновление GitHub Actions для совместимости с Node.js 24
actions/checkoutобновлён с v4 до v6.docker/build-push-actionобновлён с v6 до v7.softprops/action-gh-releaseобновлён с v2 до v3.- Все шаги workflow теперь используют Node.js 24 (в соответствии с требованием GitHub).
[1.1.0] - 2026-06-10
Добавлено
Backend
- Эндпоинт
PUT /api/v1/exams/{id}для полного обновления экзамена. - Метод
UpdateAsyncвIExamRepositoryиExamRepository(замена документа в MongoDB). - Валидация обновлённых данных через существующий
ExamImportValidator.
Frontend (Admin panel)
- Страница редактирования экзамена (
edit.htmlиedit.js):- Возможность изменять название и описание экзамена.
- Добавление, удаление и редактирование текста вопросов.
- Выбор типа вопроса (один вариант / несколько вариантов / ввод текста).
- Динамическое добавление и удаление вариантов ответов.
- Отметка правильных ответов с помощью чекбоксов (MultipleChoice) или радио-кнопок (SingleChoice) – элемент
управления расположен слева от текста варианта. - Кнопка удаления варианта в виде иконки 🗑️.
- Кнопки перемещения вопросов вверх/вниз для изменения порядка следования.
- Кнопка копирования вопроса – дублирует существующий вопрос с добавлением суффикса "(копия)".
- Кнопка предпросмотра – открывает модальное окно с read‑only отображением всего экзамена (название, описание,
вопросы, варианты, правильные ответы).
- В списке экзаменов (
teacher.html) добавлена кнопка "✏️ Редактировать", ведущая на страницу редактирования. - Улучшен интерфейс выбора правильных ответов: больше не требуется отдельный блок – пр...
Exerciser 1.3.0
Changelog
Все заметные изменения в этом проекте будут документироваться в этом файле.
Формат основан на Keep a Changelog,
и этот проект придерживается Semantic Versioning.
[1.3.0] - 2026-06-18
Добавлено
Backend
- Аналитика по студентам для преподавателя.
- Добавлен эндпоинт
GET /api/v1/analytics/attempts/last, возвращающий последнюю завершённую попытку для каждой комбинации студент + экзамен. - Добавлен DTO
AttemptAnalyticsDtoс данными: студент, группа, экзамен, баллы, процент, дата завершения, длительность. - В
AttemptRepositoryдобавлен методGetLastFinishedAttemptsByStudentAndExamAsyncс использованием MongoDB Aggregation Framework.
- Добавлен эндпоинт
Frontend (Admin)
- Страница аналитики (
analytics.htmlиanalytics.js):- Таблица с последними попытками студентов.
- Прогресс-бар с цветовой индикацией (зелёный ≥70%, жёлтый 40–69%, красный <40%).
- Фильтрация по группам и экзаменам (выпадающие списки).
- Сортировка по любому столбцу (клик по заголовку, повторный клик меняет направление).
- Кнопка сброса всех фильтров.
- Индикация активной сортировки (стрелка ▲/▼).
Изменено
Frontend (Admin)
- В навигационное меню (
layout.pug) добавлен пункт 📊 Аналитика. - Версия админ-панели повышена до 1.2.0.
Зависимости (основные изменения)
- Нет новых зависимостей.
Документация
- Обновлены
Exerciser.WebApi.httpи Postman коллекция – добавлен запрос для нового эндпоинта аналитики.
[1.2.1] - 2026-06-17
Добавлено
Frontend (Student)
- Выбор тем – добавлена возможность переключать цветовые схемы (аналогично админ-панели). Выбор сохраняется в
localStorage. - Прилипание таймера и прогресс-бара – при прокрутке страницы таймер и прогресс всегда видны в верхней части экрана.
Изменено
Frontend (Student)
- Улучшен интерфейс прохождения теста:
- Убрана панель навигации по вопросам.
- Кнопки «Отмена» и «Завершить тест» теперь расположены внизу формы (после всех вопросов).
- Вопросы отображаются без указания типа (упрощённый вид).
- Страница результатов: добавлена цветовая индикация для каждого вопроса:
- Зелёная граница – вопрос полностью правильный.
- Красная граница – вопрос полностью неправильный.
- Оранжевая граница – вопрос частично правильный.
- Запрет отправки формы по Enter – теперь завершить тест можно только кликом по кнопке.
- Обновлён подсчёт баллов:
- Для вопросов с множественным выбором балл вычисляется как (правильно выбранные − ошибочно выбранные), но не меньше 0.
- Для текстовых вопросов – 3 балла за точное совпадение.
- Для одиночного выбора – 1 балл за правильный ответ.
Исправлено
- Исправлен Vue Router warning об устаревшем
next()в навигационном guard (заменён на возврат значения). - Исправлена проблема с выбором тем (добавлен Bootstrap JS и корректная инициализация).
Зависимости (основные изменения)
- Добавлен пакет
bootstrap(локально) для поддержки dropdown и корректной работы тем.
[1.2.0] - 2026-06-15
Добавлено
Backend
- Возможность указать количество вопросов каждого типа для показа студенту.
- В модель
Examдобавлены поляSingleChoiceToShow,MultipleChoiceToShow,TextInputToShow. - Обновлены DTO:
ExamSummaryDto,ExamDetailsDto,ImportExamDto. - Валидатор проверяет, что указанное количество не превышает доступное (0 = все).
- Логика
StartAttemptтеперь формирует выборку отдельно для каждого типа вопросов.
- В модель
Frontend (Student)
- Студенческий клиент на Vue 3 + Vite.
- Страница входа (выбор группы и студента из выпадающих списков).
- Список доступных экзаменов с отображением:
- общего количества вопросов и разбивки по типам;
- количества вопросов, которое будет показано студенту (по каждому типу).
- Страница прохождения теста:
- таймер (1 час, автоматическая отправка при истечении);
- прогресс-бар отвеченных вопросов;
- навигационная панель с номерами вопросов (цветовая индикация: отвечен/не отвечен/текущий);
- автоматическое сохранение ответов в
sessionStorage(восстановление при перезагрузке); - плавная прокрутка к вопросу и временная подсветка.
- Страница результатов с детализацией по каждому вопросу (ответы, баллы, правильные ответы).
- Использование прокси Vite для API-запросов (CORS не требуется в разработке).
DevOps и инфраструктура
- Обновлён README.md (актуальная информация о версиях, запуске фронтендов, студенческом клиенте).
Изменено
Frontend (Admin)
- Страница редактирования экзамена (
edit.pugиedit.js):- Добавлены три поля для указания количества вопросов каждого типа (SingleChoice, MultipleChoice, TextInput).
- При сохранении эти поля передаются в PUT-запрос и валидируются (не более доступного количества).
- Предпросмотр экзамена показывает настройки показа.
- Страница списка экзаменов (
teacher.pug,teacher.js):- В карточке экзамена отображаются настройки показа (
singleChoiceToShow,multipleChoiceToShow,textInputToShow). - Детальное модальное окно также показывает эти параметры.
- В карточке экзамена отображаются настройки показа (
- Добавлено подробное логирование в
teacher.js,edit.js,groups.js,health.js(вывод в консоль браузера).
Frontend (Student)
api.js– интерсептор для добавленияX-Session-IdизlocalStorage, обработка FormData.auth.js– хранениеsessionId,groupId,studentIdвlocalStorage.router/index.js– защита маршрутов, перенаправление неавторизованных пользователей.- Компоненты вопросов –
QuestionSingleChoice.vue,QuestionMultipleChoice.vue,QuestionTextInput.vue.
Исправлено
- Импорт групп – проблема, из-за которой обработчик
submitне срабатывал, исправлена (форма импорта теперь корректно отправляется). - Ошибка сериализации
JsonElementв MongoDB – при завершении попытки клиент присылал ответы в видеJsonElement, что вызывало исключение. Добавлено преобразование в примитивные типы (string,List<string>,null). - CORS для студенческого клиента – настроен прокси Vite, теперь разработка не требует правки CORS на бэкенде.
Устарело
- Поле
QuestionsToShowвExamи DTO – заменено наSingleChoiceToShow,MultipleChoiceToShow,TextInputToShow. Старые экзамены со значением 0 продолжают работать (показываются все вопросы соответствующего типа).
Безопасность
- Non-root пользователь в Docker-образе (UID 1001) – уже было, сохранено.
- Прокси Vite для разработки – изолирует фронтенд от прямого доступа к API.
Известные проблемы
- Аутентификация MongoDB в
docker-compose.ymlотключена (рекомендуется включить для продакшена). - HTTPS не настроен (требуется сертификат и настройка Kestrel или обратного прокси).
Зависимости (основные изменения)
- Vue 3 + Vite – для студенческого клиента.
- Vue Router 4 – маршрутизация.
- Axios – HTTP-клиент.
[1.1.1] - 2026-06-11
Изменено
- Обновление GitHub Actions для совместимости с Node.js 24
actions/checkoutобновлён с v4 до v6.docker/build-push-actionобновлён с v6 до v7.softprops/action-gh-releaseобновлён с v2 до v3.- Все шаги workflow теперь используют Node.js 24 (в соответствии с требованием GitHub).
[1.1.0] - 2026-06-10
Добавлено
Backend
- Эндпоинт
PUT /api/v1/exams/{id}для полного обновления экзамена. - Метод
UpdateAsyncвIExamRepositoryиExamRepository(замена документа в MongoDB). - Валидация обновлённых данных через существующий
ExamImportValidator.
Frontend (Admin panel)
- Страница редактирования экзамена (
edit.htmlиedit.js):- Возможность изменять название и описание экзамена.
- Добавление, удаление и редактирование текста вопросов.
- Выбор типа вопроса (один вариант / несколько вариантов / ввод текста).
- Динамическое добавление и удаление вариантов ответов.
- Отметка правильных ответов с помощью чекбоксов (MultipleChoice) или радио-кнопок (SingleChoice) – элемент управления расположен слева от текста варианта.
- Кнопка удаления варианта в виде иконки 🗑️.
- Кнопки перемещения вопросов вверх/вниз для изменения порядка следования.
- Кнопка копирования вопроса – дублирует существующий вопрос с добавлением суффикса "(копия)".
- Кнопка предпросмотра – открывает модальное окно с read‑only отображением всего экзамена (название, описание, вопросы, варианты, правильные ответы).
- В списке экзаменов (
teacher.html) добавлена кнопка "✏️ Редактировать", ведущая на страницу редактирования. - Улучшен интерфейс выбора правильных ответов: больше не требуется отдельный блок – правильность отмечается прямо в строке варианта.
Исправлено
- Исправлена ошибка, из-за которой модальное окно предпросмотра открывалось сразу при загрузке страницы редактирования.
- Исправлено дублирование кода в обработчиках событий фронтенда (переход на корректное использование параметра
btnвforEach).
Изменено
- Описание API в README дополнено эндпоинтом
PUT.
[1.0.0] - 2026-06-10
🚀 Добавлено
Backend (.NET 10 / ASP.NET Core)
- Минимальное API для управления экзаменами (CRUD).
- Модели данных:
ExamиQuestionс поддержкой UUID v7 в качестве первичного ключа в MongoDB. - DTO для импорта и ответов API:
ImportExamDto,ExamDetailsDto,ExamSummaryDto,HealthCheckResponseDto. - MongoDB репозиторий (
ExamRepository) с методамиCreateAsync,GetAllAsync,GetByIdAsync,DeleteAsyncиUpdateAsync. - Валидатор импорта (
ExamImportValidator) со следующими правилами:- Название экзамена обязательно, макс. 500 символов.
- Описание макс. 2000 символов.
- Экзамен должен содержать хотя бы один вопрос.
- Для каждого вопроса проверяется текст, тип, варианты ответов и правильные ответы (в...
Exerciser 1.2.1
Changelog
Все заметные изменения в этом проекте будут документироваться в этом файле.
Формат основан на Keep a Changelog,
и этот проект придерживается Semantic Versioning.
[1.2.1] - 2026-06-17
Добавлено
Frontend (Student)
- Выбор тем – добавлена возможность переключать цветовые схемы (аналогично админ-панели). Выбор сохраняется в
localStorage. - Прилипание таймера и прогресс-бара – при прокрутке страницы таймер и прогресс всегда видны в верхней части экрана.
Изменено
Frontend (Student)
- Улучшен интерфейс прохождения теста:
- Убрана панель навигации по вопросам.
- Кнопки «Отмена» и «Завершить тест» теперь расположены внизу формы (после всех вопросов).
- Вопросы отображаются без указания типа (упрощённый вид).
- Страница результатов: добавлена цветовая индикация для каждого вопроса:
- Зелёная граница – вопрос полностью правильный.
- Красная граница – вопрос полностью неправильный.
- Оранжевая граница – вопрос частично правильный.
- Запрет отправки формы по Enter – теперь завершить тест можно только кликом по кнопке.
- Обновлён подсчёт баллов:
- Для вопросов с множественным выбором балл вычисляется как (правильно выбранные − ошибочно выбранные), но не меньше 0.
- Для текстовых вопросов – 3 балла за точное совпадение.
- Для одиночного выбора – 1 балл за правильный ответ.
Исправлено
- Исправлен Vue Router warning об устаревшем
next()в навигационном guard (заменён на возврат значения). - Исправлена проблема с выбором тем (добавлен Bootstrap JS и корректная инициализация).
Зависимости (основные изменения)
- Добавлен пакет
bootstrap(локально) для поддержки dropdown и корректной работы тем.
[1.2.0] - 2026-06-15
Добавлено
Backend
- Возможность указать количество вопросов каждого типа для показа студенту.
- В модель
Examдобавлены поляSingleChoiceToShow,MultipleChoiceToShow,TextInputToShow. - Обновлены DTO:
ExamSummaryDto,ExamDetailsDto,ImportExamDto. - Валидатор проверяет, что указанное количество не превышает доступное (0 = все).
- Логика
StartAttemptтеперь формирует выборку отдельно для каждого типа вопросов.
- В модель
Frontend (Student)
- Студенческий клиент на Vue 3 + Vite.
- Страница входа (выбор группы и студента из выпадающих списков).
- Список доступных экзаменов с отображением:
- общего количества вопросов и разбивки по типам;
- количества вопросов, которое будет показано студенту (по каждому типу).
- Страница прохождения теста:
- таймер (1 час, автоматическая отправка при истечении);
- прогресс-бар отвеченных вопросов;
- навигационная панель с номерами вопросов (цветовая индикация: отвечен/не отвечен/текущий);
- автоматическое сохранение ответов в
sessionStorage(восстановление при перезагрузке); - плавная прокрутка к вопросу и временная подсветка.
- Страница результатов с детализацией по каждому вопросу (ответы, баллы, правильные ответы).
- Использование прокси Vite для API-запросов (CORS не требуется в разработке).
DevOps и инфраструктура
- Обновлён README.md (актуальная информация о версиях, запуске фронтендов, студенческом клиенте).
Изменено
Frontend (Admin)
- Страница редактирования экзамена (
edit.pugиedit.js):- Добавлены три поля для указания количества вопросов каждого типа (SingleChoice, MultipleChoice, TextInput).
- При сохранении эти поля передаются в PUT-запрос и валидируются (не более доступного количества).
- Предпросмотр экзамена показывает настройки показа.
- Страница списка экзаменов (
teacher.pug,teacher.js):- В карточке экзамена отображаются настройки показа (
singleChoiceToShow,multipleChoiceToShow,textInputToShow). - Детальное модальное окно также показывает эти параметры.
- В карточке экзамена отображаются настройки показа (
- Добавлено подробное логирование в
teacher.js,edit.js,groups.js,health.js(вывод в консоль браузера).
Frontend (Student)
api.js– интерсептор для добавленияX-Session-IdизlocalStorage, обработка FormData.auth.js– хранениеsessionId,groupId,studentIdвlocalStorage.router/index.js– защита маршрутов, перенаправление неавторизованных пользователей.- Компоненты вопросов –
QuestionSingleChoice.vue,QuestionMultipleChoice.vue,QuestionTextInput.vue.
Исправлено
- Импорт групп – проблема, из-за которой обработчик
submitне срабатывал, исправлена (форма импорта теперь корректно отправляется). - Ошибка сериализации
JsonElementв MongoDB – при завершении попытки клиент присылал ответы в видеJsonElement, что вызывало исключение. Добавлено преобразование в примитивные типы (string,List<string>,null). - CORS для студенческого клиента – настроен прокси Vite, теперь разработка не требует правки CORS на бэкенде.
Устарело
- Поле
QuestionsToShowвExamи DTO – заменено наSingleChoiceToShow,MultipleChoiceToShow,TextInputToShow. Старые экзамены со значением 0 продолжают работать (показываются все вопросы соответствующего типа).
Безопасность
- Non-root пользователь в Docker-образе (UID 1001) – уже было, сохранено.
- Прокси Vite для разработки – изолирует фронтенд от прямого доступа к API.
Известные проблемы
- Аутентификация MongoDB в
docker-compose.ymlотключена (рекомендуется включить для продакшена). - HTTPS не настроен (требуется сертификат и настройка Kestrel или обратного прокси).
Зависимости (основные изменения)
- Vue 3 + Vite – для студенческого клиента.
- Vue Router 4 – маршрутизация.
- Axios – HTTP-клиент.
[1.1.1] - 2026-06-11
Изменено
- Обновление GitHub Actions для совместимости с Node.js 24
actions/checkoutобновлён с v4 до v6.docker/build-push-actionобновлён с v6 до v7.softprops/action-gh-releaseобновлён с v2 до v3.- Все шаги workflow теперь используют Node.js 24 (в соответствии с требованием GitHub).
[1.1.0] - 2026-06-10
Добавлено
Backend
- Эндпоинт
PUT /api/v1/exams/{id}для полного обновления экзамена. - Метод
UpdateAsyncвIExamRepositoryиExamRepository(замена документа в MongoDB). - Валидация обновлённых данных через существующий
ExamImportValidator.
Frontend (Admin panel)
- Страница редактирования экзамена (
edit.htmlиedit.js):- Возможность изменять название и описание экзамена.
- Добавление, удаление и редактирование текста вопросов.
- Выбор типа вопроса (один вариант / несколько вариантов / ввод текста).
- Динамическое добавление и удаление вариантов ответов.
- Отметка правильных ответов с помощью чекбоксов (MultipleChoice) или радио-кнопок (SingleChoice) – элемент управления расположен слева от текста варианта.
- Кнопка удаления варианта в виде иконки 🗑️.
- Кнопки перемещения вопросов вверх/вниз для изменения порядка следования.
- Кнопка копирования вопроса – дублирует существующий вопрос с добавлением суффикса "(копия)".
- Кнопка предпросмотра – открывает модальное окно с read‑only отображением всего экзамена (название, описание, вопросы, варианты, правильные ответы).
- В списке экзаменов (
teacher.html) добавлена кнопка "✏️ Редактировать", ведущая на страницу редактирования. - Улучшен интерфейс выбора правильных ответов: больше не требуется отдельный блок – правильность отмечается прямо в строке варианта.
Исправлено
- Исправлена ошибка, из-за которой модальное окно предпросмотра открывалось сразу при загрузке страницы редактирования.
- Исправлено дублирование кода в обработчиках событий фронтенда (переход на корректное использование параметра
btnвforEach).
Изменено
- Описание API в README дополнено эндпоинтом
PUT.
[1.0.0] - 2026-06-10
🚀 Добавлено
Backend (.NET 10 / ASP.NET Core)
- Минимальное API для управления экзаменами (CRUD).
- Модели данных:
ExamиQuestionс поддержкой UUID v7 в качестве первичного ключа в MongoDB. - DTO для импорта и ответов API:
ImportExamDto,ExamDetailsDto,ExamSummaryDto,HealthCheckResponseDto. - MongoDB репозиторий (
ExamRepository) с методамиCreateAsync,GetAllAsync,GetByIdAsync,DeleteAsyncиUpdateAsync. - Валидатор импорта (
ExamImportValidator) со следующими правилами:- Название экзамена обязательно, макс. 500 символов.
- Описание макс. 2000 символов.
- Экзамен должен содержать хотя бы один вопрос.
- Для каждого вопроса проверяется текст, тип, варианты ответов и правильные ответы (включая уникальность вариантов, для
SingleChoice— ровно один правильный ответ).
- Сервис миграций MongoDB (
MongoDbMigrationService) для автоматического создания индексов:- Текстовый индекс на поле
Title. - Обычный индекс на поле
CreatedAt(по убыванию).
- Текстовый индекс на поле
- Кеширование: интерфейс
ICacheServiceс реализациейDistributedCacheServiceна основеIDistributedCache(поддерживает Redis и MemoryCache). - Rate Limiting:
fixed: 100 запросов/минуту (очередь 10) — для большинства эндпоинтов.import-sliding: 10 запросов/час (очередь 5) — для эндпоинта импорта.
- Логирование: Настроен NLog с выводом в консоль и файлы (JSON, текст, отдельный файл для ошибок), ротация файлов раз в день, хранение до 30 архивов.
- CORS: Настраивается через переменную
CORS_ALLOWED_ORIGINS(разрешённые источники). - Health Check: Эндпоинты
/healthи/api/v1/healthвозвращают статус сервиса, временную метку и временную зону. - OpenAPI: Автоматическая генерация спецификации (
/openapi/v1.json) и интерактивная документация Scalar UI (/scalar/v1).
Frontend (Admin Panel)
- Административная панель на Pug + Bootstrap 5 (Bootswatch).
- Управление экзаменами:
- Импорт экзамена из JSON-файла (форма с выбором файла).
- Список экзаменов с кнопками просмотра и удал...
Exerciser 1.2.0
Changelog
Все заметные изменения в этом проекте будут документироваться в этом файле.
Формат основан на Keep a Changelog,
и этот проект придерживается Semantic Versioning.
[1.2.0] - 2026-06-15
Добавлено
Backend
- Возможность указать количество вопросов каждого типа для показа студенту.
- В модель
Examдобавлены поляSingleChoiceToShow,MultipleChoiceToShow,TextInputToShow. - Обновлены DTO:
ExamSummaryDto,ExamDetailsDto,ImportExamDto. - Валидатор проверяет, что указанное количество не превышает доступное (0 = все).
- Логика
StartAttemptтеперь формирует выборку отдельно для каждого типа вопросов.
- В модель
Frontend (Student)
- Студенческий клиент на Vue 3 + Vite.
- Страница входа (выбор группы и студента из выпадающих списков).
- Список доступных экзаменов с отображением:
- общего количества вопросов и разбивки по типам;
- количества вопросов, которое будет показано студенту (по каждому типу).
- Страница прохождения теста:
- таймер (1 час, автоматическая отправка при истечении);
- прогресс-бар отвеченных вопросов;
- навигационная панель с номерами вопросов (цветовая индикация: отвечен/не отвечен/текущий);
- автоматическое сохранение ответов в
sessionStorage(восстановление при перезагрузке); - плавная прокрутка к вопросу и временная подсветка.
- Страница результатов с детализацией по каждому вопросу (ответы, баллы, правильные ответы).
- Использование прокси Vite для API-запросов (CORS не требуется в разработке).
DevOps и инфраструктура
- Обновлён README.md (актуальная информация о версиях, запуске фронтендов, студенческом клиенте).
Изменено
Frontend (Admin)
- Страница редактирования экзамена (
edit.pugиedit.js):- Добавлены три поля для указания количества вопросов каждого типа (SingleChoice, MultipleChoice, TextInput).
- При сохранении эти поля передаются в PUT-запрос и валидируются (не более доступного количества).
- Предпросмотр экзамена показывает настройки показа.
- Страница списка экзаменов (
teacher.pug,teacher.js):- В карточке экзамена отображаются настройки показа (
singleChoiceToShow,multipleChoiceToShow,textInputToShow). - Детальное модальное окно также показывает эти параметры.
- В карточке экзамена отображаются настройки показа (
- Добавлено подробное логирование в
teacher.js,edit.js,groups.js,health.js(вывод в консоль браузера).
Frontend (Student)
api.js– интерсептор для добавленияX-Session-IdизlocalStorage, обработка FormData.auth.js– хранениеsessionId,groupId,studentIdвlocalStorage.router/index.js– защита маршрутов, перенаправление неавторизованных пользователей.- Компоненты вопросов –
QuestionSingleChoice.vue,QuestionMultipleChoice.vue,QuestionTextInput.vue.
Исправлено
- Импорт групп – проблема, из-за которой обработчик
submitне срабатывал, исправлена (форма импорта теперь корректно отправляется). - Ошибка сериализации
JsonElementв MongoDB – при завершении попытки клиент присылал ответы в видеJsonElement, что вызывало исключение. Добавлено преобразование в примитивные типы (string,List<string>,null). - CORS для студенческого клиента – настроен прокси Vite, теперь разработка не требует правки CORS на бэкенде.
Устарело
- Поле
QuestionsToShowвExamи DTO – заменено наSingleChoiceToShow,MultipleChoiceToShow,TextInputToShow. Старые экзамены со значением 0 продолжают работать (показываются все вопросы соответствующего типа).
Безопасность
- Non-root пользователь в Docker-образе (UID 1001) – уже было, сохранено.
- Прокси Vite для разработки – изолирует фронтенд от прямого доступа к API.
Известные проблемы
- Аутентификация MongoDB в
docker-compose.ymlотключена (рекомендуется включить для продакшена). - HTTPS не настроен (требуется сертификат и настройка Kestrel или обратного прокси).
Зависимости (основные изменения)
- Vue 3 + Vite – для студенческого клиента.
- Vue Router 4 – маршрутизация.
- Axios – HTTP-клиент.
[1.1.1] - 2026-06-11
Изменено
- Обновление GitHub Actions для совместимости с Node.js 24
actions/checkoutобновлён с v4 до v6.docker/build-push-actionобновлён с v6 до v7.softprops/action-gh-releaseобновлён с v2 до v3.- Все шаги workflow теперь используют Node.js 24 (в соответствии с требованием GitHub).
[1.1.0] - 2026-06-10
Добавлено
Backend
- Эндпоинт
PUT /api/v1/exams/{id}для полного обновления экзамена. - Метод
UpdateAsyncвIExamRepositoryиExamRepository(замена документа в MongoDB). - Валидация обновлённых данных через существующий
ExamImportValidator.
Frontend (Admin panel)
- Страница редактирования экзамена (
edit.htmlиedit.js):- Возможность изменять название и описание экзамена.
- Добавление, удаление и редактирование текста вопросов.
- Выбор типа вопроса (один вариант / несколько вариантов / ввод текста).
- Динамическое добавление и удаление вариантов ответов.
- Отметка правильных ответов с помощью чекбоксов (MultipleChoice) или радио-кнопок (SingleChoice) – элемент управления расположен слева от текста варианта.
- Кнопка удаления варианта в виде иконки 🗑️.
- Кнопки перемещения вопросов вверх/вниз для изменения порядка следования.
- Кнопка копирования вопроса – дублирует существующий вопрос с добавлением суффикса "(копия)".
- Кнопка предпросмотра – открывает модальное окно с read‑only отображением всего экзамена (название, описание, вопросы, варианты, правильные ответы).
- В списке экзаменов (
teacher.html) добавлена кнопка "✏️ Редактировать", ведущая на страницу редактирования. - Улучшен интерфейс выбора правильных ответов: больше не требуется отдельный блок – правильность отмечается прямо в строке варианта.
Исправлено
- Исправлена ошибка, из-за которой модальное окно предпросмотра открывалось сразу при загрузке страницы редактирования.
- Исправлено дублирование кода в обработчиках событий фронтенда (переход на корректное использование параметра
btnвforEach).
Изменено
- Описание API в README дополнено эндпоинтом
PUT.
[1.0.0] - 2026-06-10
🚀 Добавлено
Backend (.NET 10 / ASP.NET Core)
- Минимальное API для управления экзаменами (CRUD).
- Модели данных:
ExamиQuestionс поддержкой UUID v7 в качестве первичного ключа в MongoDB. - DTO для импорта и ответов API:
ImportExamDto,ExamDetailsDto,ExamSummaryDto,HealthCheckResponseDto. - MongoDB репозиторий (
ExamRepository) с методамиCreateAsync,GetAllAsync,GetByIdAsync,DeleteAsyncиUpdateAsync. - Валидатор импорта (
ExamImportValidator) со следующими правилами:- Название экзамена обязательно, макс. 500 символов.
- Описание макс. 2000 символов.
- Экзамен должен содержать хотя бы один вопрос.
- Для каждого вопроса проверяется текст, тип, варианты ответов и правильные ответы (включая уникальность вариантов, для
SingleChoice— ровно один правильный ответ).
- Сервис миграций MongoDB (
MongoDbMigrationService) для автоматического создания индексов:- Текстовый индекс на поле
Title. - Обычный индекс на поле
CreatedAt(по убыванию).
- Текстовый индекс на поле
- Кеширование: интерфейс
ICacheServiceс реализациейDistributedCacheServiceна основеIDistributedCache(поддерживает Redis и MemoryCache). - Rate Limiting:
fixed: 100 запросов/минуту (очередь 10) — для большинства эндпоинтов.import-sliding: 10 запросов/час (очередь 5) — для эндпоинта импорта.
- Логирование: Настроен NLog с выводом в консоль и файлы (JSON, текст, отдельный файл для ошибок), ротация файлов раз в день, хранение до 30 архивов.
- CORS: Настраивается через переменную
CORS_ALLOWED_ORIGINS(разрешённые источники). - Health Check: Эндпоинты
/healthи/api/v1/healthвозвращают статус сервиса, временную метку и временную зону. - OpenAPI: Автоматическая генерация спецификации (
/openapi/v1.json) и интерактивная документация Scalar UI (/scalar/v1).
Frontend (Admin Panel)
- Административная панель на Pug + Bootstrap 5 (Bootswatch).
- Управление экзаменами:
- Импорт экзамена из JSON-файла (форма с выбором файла).
- Список экзаменов с кнопками просмотра и удаления.
- Модальное окно для просмотра деталей экзамена (вопросы, варианты, правильные ответы).
- Редактирование экзамена: отдельная страница
edit.htmlс возможностью изменять название, описание, вопросы, варианты и правильные ответы (добавление/удаление вопросов и вариантов).
- Страница диагностики API: проверка доступности различных эндпоинтов (
/health,/,/scalar/v1,/api/v1/health, OpenAPI спецификации). - Динамическая смена тем: поддержка 13 цветовых схем Bootswatch с сохранением выбора в
localStorage. - Общий модуль
utils.js: содержит функцииshowMessage,apiRequest,escapeHtmlи другие, используемые на всех страницах.
DevOps & Инфраструктура
- Docker Compose: Описаны сервисы
mongodb,redisиwebapiс healthcheck'ами и зависимостями. - Dockerfile: Multi-stage сборка на основе Alpine Linux, non-root пользователь (UID 1001).
- GitHub Actions: Автоматическая сборка и публикация образа
exerciser-webapi:latestна Docker Hub при пуше в веткуmaster(и по требованию). - Postman коллекция: Полный набор запросов для тестирования API (Health, Exams, API Information) с переменными окружения и встроенными тестами.
- Документация:
- Подробный
README.mdс описанием установки, API, архитектуры, конфигурации и устранения неполадок. API_EXAMPLES.mdс примерами запросов и ответов.POSTMAN_SETUP.mdс руководством по импорту и использованию Postman.
- Подробный
🛠 Изменено
- Обновление README: добавлены разделы об архитектуре, безопасности, rate limitin...
Exerciser 1.1.0
Changelog
Все заметные изменения в этом проекте будут документироваться в этом файле.
Формат основан на Keep a Changelog,
и этот проект придерживается Semantic Versioning.
1.1.0 - 2026-06-10
Добавлено
Backend
- Эндпоинт
PUT /api/v1/exams/{id}для полного обновления экзамена. - Метод
UpdateAsyncвIExamRepositoryиExamRepository(замена документа в MongoDB). - Валидация обновлённых данных через существующий
ExamImportValidator.
Frontend (Admin panel)
- Страница редактирования экзамена (
edit.htmlиedit.js):- Возможность изменять название и описание экзамена.
- Добавление, удаление и редактирование текста вопросов.
- Выбор типа вопроса (один вариант / несколько вариантов / ввод текста).
- Динамическое добавление и удаление вариантов ответов.
- Отметка правильных ответов с помощью чекбоксов (MultipleChoice) или радио-кнопок (SingleChoice) – элемент управления расположен слева от текста варианта.
- Кнопка удаления варианта в виде иконки 🗑️.
- Кнопки перемещения вопросов вверх/вниз для изменения порядка следования.
- Кнопка копирования вопроса – дублирует существующий вопрос с добавлением суффикса "(копия)".
- Кнопка предпросмотра – открывает модальное окно с read‑only отображением всего экзамена (название, описание, вопросы, варианты, правильные ответы).
- В списке экзаменов (
teacher.html) добавлена кнопка "✏️ Редактировать", ведущая на страницу редактирования. - Улучшен интерфейс выбора правильных ответов: больше не требуется отдельный блок – правильность отмечается прямо в строке варианта.
Исправлено
- Исправлена ошибка, из-за которой модальное окно предпросмотра открывалось сразу при загрузке страницы редактирования.
- Исправлено дублирование кода в обработчиках событий фронтенда (переход на корректное использование параметра
btnвforEach).
Изменено
- Описание API в README дополнено эндпоинтом
PUT.
1.0.0 - 2026-06-10
🚀 Добавлено
Backend (.NET 10 / ASP.NET Core)
- Минимальное API для управления экзаменами (CRUD).
- Модели данных:
ExamиQuestionс поддержкой UUID v7 в качестве первичного ключа в MongoDB. - DTO для импорта и ответов API:
ImportExamDto,ExamDetailsDto,ExamSummaryDto,HealthCheckResponseDto. - MongoDB репозиторий (
ExamRepository) с методамиCreateAsync,GetAllAsync,GetByIdAsync,DeleteAsyncиUpdateAsync. - Валидатор импорта (
ExamImportValidator) со следующими правилами:- Название экзамена обязательно, макс. 500 символов.
- Описание макс. 2000 символов.
- Экзамен должен содержать хотя бы один вопрос.
- Для каждого вопроса проверяется текст, тип, варианты ответов и правильные ответы (включая уникальность вариантов, для
SingleChoice— ровно один правильный ответ).
- Сервис миграций MongoDB (
MongoDbMigrationService) для автоматического создания индексов:- Текстовый индекс на поле
Title. - Обычный индекс на поле
CreatedAt(по убыванию).
- Текстовый индекс на поле
- Кеширование: интерфейс
ICacheServiceс реализациейDistributedCacheServiceна основеIDistributedCache(поддерживает Redis и MemoryCache). - Rate Limiting:
fixed: 100 запросов/минуту (очередь 10) — для большинства эндпоинтов.import-sliding: 10 запросов/час (очередь 5) — для эндпоинта импорта.
- Логирование: Настроен NLog с выводом в консоль и файлы (JSON, текст, отдельный файл для ошибок), ротация файлов раз в день, хранение до 30 архивов.
- CORS: Настраивается через переменную
CORS_ALLOWED_ORIGINS(разрешённые источники). - Health Check: Эндпоинты
/healthи/api/v1/healthвозвращают статус сервиса, временную метку и временную зону. - OpenAPI: Автоматическая генерация спецификации (
/openapi/v1.json) и интерактивная документация Scalar UI (/scalar/v1).
Frontend (Admin Panel)
- Административная панель на Pug + Bootstrap 5 (Bootswatch).
- Управление экзаменами:
- Импорт экзамена из JSON-файла (форма с выбором файла).
- Список экзаменов с кнопками просмотра и удаления.
- Модальное окно для просмотра деталей экзамена (вопросы, варианты, правильные ответы).
- Редактирование экзамена: отдельная страница
edit.htmlс возможностью изменять название, описание, вопросы, варианты и правильные ответы (добавление/удаление вопросов и вариантов).
- Страница диагностики API: проверка доступности различных эндпоинтов (
/health,/,/scalar/v1,/api/v1/health, OpenAPI спецификации). - Динамическая смена тем: поддержка 13 цветовых схем Bootswatch с сохранением выбора в
localStorage. - Общий модуль
utils.js: содержит функцииshowMessage,apiRequest,escapeHtmlи другие, используемые на всех страницах.
DevOps & Инфраструктура
- Docker Compose: Описаны сервисы
mongodb,redisиwebapiс healthcheck'ами и зависимостями. - Dockerfile: Multi-stage сборка на основе Alpine Linux, non-root пользователь (UID 1001).
- GitHub Actions: Автоматическая сборка и публикация образа
exerciser-webapi:latestна Docker Hub при пуше в веткуmaster(и по требованию). - Postman коллекция: Полный набор запросов для тестирования API (Health, Exams, API Information) с переменными окружения и встроенными тестами.
- Документация:
- Подробный
README.mdс описанием установки, API, архитектуры, конфигурации и устранения неполадок. API_EXAMPLES.mdс примерами запросов и ответов.POSTMAN_SETUP.mdс руководством по импорту и использованию Postman.
- Подробный
🛠 Изменено
- Обновление README: добавлены разделы об архитектуре, безопасности, rate limiting, кешировании, валидации и Docker.
- Рефакторинг фронтенда:
- Выделение общих функций в
utils.js(устранение дублирования). - Перемещение всех скриптов в папку
scripts/для улучшения структуры. - Настройка ESLint для корректной работы с глобальными переменными.
- Выделение общих функций в
🐛 Исправлено
- Обработка ошибок в API: Добавлена базовая обработка исключений для возврата осмысленных сообщений об ошибках.
- Валидация импорта: Исправлены несколько багов, связанных с проверкой правильных ответов для
SingleChoiceиMultipleChoice. - Фронтенд: Устранены проблемы с отображением ошибок при импорте и загрузке списка экзаменов.
🚧 Устарело
- Legacy health-check эндпоинт (
/health) помечен как устаревший. Рекомендуется использовать версионированный эндпоинт/api/v1/health.
🔒 Безопасность
- Non-root пользователь в контейнере (UID 1001).
- Alpine Linux в качестве базового образа для минимизации поверхности атак.
- Rate Limiting для защиты от DDoS и брутфорса.
- Валидация размера файла при импорте (максимум 10 MB).
📦 Зависимости
Обновлены следующие пакеты до актуальных версий:
- MongoDB.Driver → 3.9.0
- NLog → 5.2.8
- NLog.Web.AspNetCore → 5.3.2
- Scalar.AspNetCore → 1.2.5
- Microsoft.Extensions.Caching.StackExchangeRedis → 10.0.0
📌 Известные проблемы
- Redis кеширование: Реализован интерфейс
ICacheService, но активно используется только MemoryCache (задел на будущее). - Аутентификация MongoDB: В
docker-compose.ymlотключена (для простоты разработки). Для production рекомендуется включить и задать пароль через переменные окружения. - HTTPS: Не настроен (требуется настройка сертификатов или использование обратного прокси).
Exerciser v1.0.0
🎉 Exerciser v1.0.0
Первый стабильный релиз системы тестирования студентов.
✨ Что нового?
- API на ASP.NET Core 10 для управления экзаменами (импорт, просмотр, удаление).
- Admin-панель (Pug + Bootstrap): импорт JSON, просмотр списка экзаменов, детальный просмотр вопросов и ответов, удаление.
- Валидация импорта JSON (проверка полей, типов вопросов, вариантов ответов).
- Индексы MongoDB для быстрого поиска по названию и сортировки по дате.
- Rate Limiting (100 запросов/мин, для импорта 10 запросов/час).
- Интерактивная документация API (Scalar UI) и коллекции Postman.
- Docker Compose (MongoDB + Redis + API) для быстрого развёртывания.
- GitHub Actions для автоматической сборки и публикации Docker образа.
📦 Как начать?
git clone https://github.com/itedu-tool/exerciser.git
cd exerciser
cp .env.example .env
docker compose up -dПосле запуска:
- Админ-панель: http://localhost:3000
- API документация: http://localhost:8080/scalar/v1
🔗 Полезные ссылки
🐛 Известные ограничения
- Отсутствует аутентификация и HTTPS (требуется доработка для production).
- Редактирование экзаменов не реализовано (только импорт и удаление).
- Аутентификация MongoDB отключена (включить через переменные окружения).
👏 Благодарности
Автор: Старинин Андрей
Организация: ООО «Компьютерная Академия Топ»
Лицензия: Apache License 2.0
Полный список изменений: CHANGELOG.md