Skip to content

Releases: itedu-tool/exerciser

Exerciser 1.3.1

Choose a tag to compare

@anst-foto anst-foto released this 19 Jun 10:45
1c2cb07

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).
  • Модальное окно с пояснением формулы расчёта итоговой оценки (закрывает #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) добавлена кнопка "✏️ Редактировать", ведущая на страницу редактирования.
  • Улучшен интерфейс выбора правильных ответов: больше не требуется отдельный блок – пр...
Read more

Exerciser 1.3.0

Choose a tag to compare

@anst-foto anst-foto released this 18 Jun 07:54
bcf5c61

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 символов.
    • Экзамен должен содержать хотя бы один вопрос.
    • Для каждого вопроса проверяется текст, тип, варианты ответов и правильные ответы (в...
Read more

Exerciser 1.2.1

Choose a tag to compare

@anst-foto anst-foto released this 17 Jun 08:38
fd43d89

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-файла (форма с выбором файла).
    • Список экзаменов с кнопками просмотра и удал...
Read more

Exerciser 1.2.0

Choose a tag to compare

@anst-foto anst-foto released this 16 Jun 08:26
5aaa089

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...
Read more

Exerciser 1.1.0

Choose a tag to compare

@anst-foto anst-foto released this 10 Jun 12:59
f937637

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

Choose a tag to compare

@anst-foto anst-foto released this 10 Jun 08:39
7c7e4f9

🎉 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

После запуска:

🔗 Полезные ссылки

🐛 Известные ограничения

  • Отсутствует аутентификация и HTTPS (требуется доработка для production).
  • Редактирование экзаменов не реализовано (только импорт и удаление).
  • Аутентификация MongoDB отключена (включить через переменные окружения).

👏 Благодарности

Автор: Старинин Андрей
Организация: ООО «Компьютерная Академия Топ»
Лицензия: Apache License 2.0


Полный список изменений: CHANGELOG.md