Skip to content

Repository files navigation

📚 Exerciser – Система тестирования студентов

Exerciser – веб-приложение для проведения тестирования студентов. Преподаватели загружают вопросы в формате JSON, управляют экзаменами (редактирование, настройка количества вопросов каждого типа), а студенты проходят тесты через удобный интерфейс на Vue 3.

Версия: 1.3.2
Дата: 2026-06-19


🚀 Быстрый старт (разработка)

Требования

Запуск инфраструктуры (MongoDB, Redis)

git clone https://github.com/itedu-tool/exerciser.git
cd exerciser
docker compose up -d

Запуск бэкенда (API)

cd Exerciser.WebApi
dotnet run

API будет доступен: http://localhost:8080
Документация Scalar UI: http://localhost:8080/scalar/v1

Запуск фронтендов (для разработки)

Административная панель (Pug + Bootstrap)

cd Exerciser.FrontEnd/Admin
npm install
npm start   # http://localhost:3000

Студенческий клиент (Vue 3)

cd Exerciser.FrontEnd/Student
npm install
npm run dev # http://localhost:3001

Примечание: На данном этапе статические файлы не копируются в wwwroot бэкенда, фронтенды запускаются независимо. Для продакшена потребуется отдельная настройка раздачи статики (планируется в следующих релизах).


📋 API Endpoints (v1)

Базовый URL: http://localhost:8080/api/v1

Метод Эндпоинт Описание
GET /health Проверка здоровья (legacy)
GET /api/v1/health Проверка здоровья (v1)
POST /api/v1/exams/import Импорт экзамена из JSON
GET /api/v1/exams Список экзаменов (метаданные)
GET /api/v1/exams/{id} Полный экзамен (вопросы, ответы)
PUT /api/v1/exams/{id} Обновление экзамена
DELETE /api/v1/exams/{id} Удаление экзамена
POST /api/v1/sessions/start Создание сессии (логин студента)
POST /api/v1/attempts/start Начать попытку
POST /api/v1/attempts/{id}/finish Завершить попытку
GET /api/v1/attempts/{id}/result Результат попытки
GET /api/v1/groups Список групп со студентами
POST /api/v1/groups Создать группу
POST /api/v1/groups/import Импорт группы из JSON
POST /api/v1/groups/{id}/students Добавить студента
GET /api/v1/analytics/attempts/last Последние завершённые попытки по студентам и экзаменам

Пример импорта экзамена

Файл exam.json:

{
  "title": "Основы C#",
  "description": "Проверка знаний по основам C#",
  "questions": [
    {
      "text": "Что такое CLR?",
      "type": "TextInput",
      "correctAnswers": ["Common Language Runtime"]
    },
    {
      "text": "Какой модификатор доступа является самым закрытым?",
      "type": "SingleChoice",
      "options": ["public", "private", "protected", "internal"],
      "correctAnswers": ["private"]
    }
  ]
}

Запрос:

curl -X POST http://localhost:8080/api/v1/exams/import -F "file=@exam.json"

Ответ (201 Created):

{
  "id": "507f1f77bcf86cd799439011",
  "title": "Основы C#",
  "questionsCount": 3
}

Получить список экзаменов

curl http://localhost:8080/api/v1/exams | jq

Пример ответа:

[
  {
    "id": "507f1f77bcf86cd799439011",
    "title": "Основы C#",
    "description": "Проверка знаний по основам языка C#",
    "questionsCount": 3,
    "singleChoiceCount": 1,
    "multipleChoiceCount": 1,
    "textInputCount": 1,
    "singleChoiceToShow": 0,
    "multipleChoiceToShow": 0,
    "textInputToShow": 0,
    "createdAt": "2026-06-10T10:30:00Z"
  }
]

🎨 Административная панель

Возможности:

  • Импорт экзаменов из JSON
  • Редактирование экзамена:
    • Изменение названия, описания
    • Добавление/удаление/копирование вопросов
    • Выбор типа вопроса (один вариант / несколько вариантов / ввод текста)
    • Редактирование вариантов ответов и отметка правильных
    • Указание количества вопросов каждого типа для показа студенту (0 = все)
  • Просмотр деталей экзамена (модальное окно)
  • Удаление экзаменов
  • Управление группами и студентами
    • Аналитика: таблица с последними попытками студентов, фильтрация по группам и экзаменам, сортировка по любым столбцам, цветовая индикация прогресса.
  • Диагностика API

Запуск в режиме разработки:

cd Exerciser.FrontEnd/Admin
npm start

👨‍🎓 Студенческий клиент (Vue 3)

Возможности:

  • Вход по группе и студенту
  • Список доступных экзаменов с отображением:
    • Общего количества вопросов и разбивки по типам
    • Количества вопросов, которое будет показано (по каждому типу)
  • Прохождение теста с:
    • Таймером (1 час, автоматическая отправка при истечении)
    • Прогресс-баром отвеченных вопросов
    • Навигационной панелью с номерами вопросов (цветовая индикация: отвечен/не отвечен/текущий)
    • Автоматическим сохранением ответов в sessionStorage (восстановление при перезагрузке)
    • Плавной прокруткой к вопросу и временной подсветкой
  • Страница результатов с детализацией по каждому вопросу (ответы, баллы, правильные ответы)

Запуск в режиме разработки:

cd Exerciser.FrontEnd/Student
npm run dev

🛠️ Разработка и сборка

Линтинг и форматирование

cd Exerciser.FrontEnd/Admin
npm run lint
npm run format

Запуск тестов

На данный момент тесты отсутствуют. Планируется добавить unit-тесты для валидатора и интеграционные тесты с Testcontainers.


🐳 Docker и оркестрация

Сервисы

  • mongodb – БД (образ mongo:8.3)
  • redis – кеш (образ redis:8.6.4)
  • webapi – ASP.NET Core приложение

Запуск всех сервисов (инфраструктура)

docker compose up -d

Прод-сборка образа бэкенда

docker build -f Exerciser.WebApi/Dockerfile -t exerciser-webapi:latest .

Примечание: Для продакшена бэкенд может раздавать статику, если она будет скопирована в wwwroot. Это планируется добавить в следующих релизах.


📄 Документация и инструменты

  • Scalar UI: http://localhost:8080/scalar/v1
  • OpenAPI спецификация: http://localhost:8080/openapi/v1.json
  • Postman коллекция: .postman/Exerciser.postman_collection.json
  • HTTP-файл: Exerciser.WebApi/Exerciser.WebApi.http

🔒 Безопасность и конфигурация

Переменные окружения (файл .env)

MONGO_ROOT_USERNAME=admin
MONGO_ROOT_PASSWORD=changeme
MONGO_DATABASE=exerciser_db

REDIS_PASSWORD=

ASPNETCORE_ENVIRONMENT=Production
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:5000,http://localhost:3001
LOG_LEVEL=Info

CORS

Настраивается через CORS_ALLOWED_ORIGINS. В продакшене укажите домены фронтендов.

Rate Limiting

  • fixed – 100 запросов/мин (общие эндпоинты)
  • import-sliding – 10 запросов/час (импорт экзамена)

Логирование (NLog)

  • Консоль с цветовой дифференциацией
  • Файлы JSON и текст в папке logs/ (ротация каждый день, хранение 30 дней)
  • Отдельный файл для ошибок

📦 Зависимости (основные)

Компонент Технология Версия
Backend .NET 10 / ASP.NET Core 10.0
MongoDB MongoDB.Driver 3.9.0
Redis StackExchange.Redis 10.0.0
API docs Scalar.AspNetCore 1.2.5
Логирование NLog 5.2.8
Admin frontend Pug + Bootstrap 5 -
Student frontend Vue 3 + Vite -

📌 Версионирование

Проект в целом следует Semantic Versioning. Версия API (бэкенда) – 1.2.0.

Компонент Версия
Backend API 1.3.0
Admin Panel 1.2.1
Student Client 1.0.2

История версий API

Версия Дата Изменения
1.3.2 2026-06-19 Рефакторинг бэкенда (см. CHANGELOG) – API без изменений
1.3.1 2026-06-19 UI-изменения студенческого клиента: расчёт оценки, скрытие типа вопроса и общего количества, удаление skip-link
1.3.0 2026-06-18 Добавлена аналитика по студентам (последние попытки, фильтры, сортировка)
1.2.1 2026-06-17 Улучшения студенческого клиента: правильный подсчёт баллов, выбор тем, прилипающий таймер
1.2.0 2026-06-15 Выбор количества вопросов по типам; студенческий клиент; исправления
1.1.1 2026-06-11 Обновление GitHub Actions
1.1.0 2026-06-10 Редактирование экзаменов
1.0.0 2026-06-10 Первый стабильный релиз

🤝 Участие в разработке

  1. Fork репозитория
  2. Создайте ветку (git checkout -b feature/amazing-feature)
  3. Соблюдайте кодстайл (.editorconfig, dotnet format, npm run lint)
  4. Напишите тесты (если есть)
  5. Обновите документацию
  6. Отправьте Pull Request в ветку master

📜 Лицензия и права

© 2026 Старинин Андрей Николаевич, ООО «Компьютерная Академия Топ» (ИНН 7724406449).
Автор программы: Старинин Андрей Николаевич GitHub: anst-foto
Email: starinin-andrey@ya.ru

Данное программное обеспечение распространяется на условиях лицензии Apache License 2.0.
Ниже приведён русскоязычный краткий текст лицензии. Полный официальный текст на английском языке находится в файле LICENSE и на сайте https://www.apache.org/licenses/LICENSE-2.0.

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   Термины и условия использования, воспроизведения и распространения

   1. Определения.

      "Лицензия" означает настоящие условия использования, воспроизведения
      и распространения, изложенные в разделах 1–9 настоящего документа.

      "Лицензиар" означает владельца авторских прав или лицо, уполномоченное
      владельцем авторских прав, которое предоставляет Лицензию.

      "Лицензиат" означает физическое или юридическое лицо, осуществляющее
      действия, разрешённые настоящей Лицензией.

      "Произведение" (или "Программа") означает программное обеспечение,
      охраняемое авторским правом, предоставляемое по этой Лицензии.

   2. Предоставление лицензии.

      Лицензиар настоящим предоставляет Лицензиату бессрочную, всемирную,
      безвозмездную, неисключительную лицензию на использование, воспроизведение,
      подготовку производных произведений, публичное отображение, публичное
      исполнение, сублицензирование и распространение Произведения и его
      производных на условиях настоящей Лицензии.

   3. Условия распространения.

      При каждом распространении Произведения или его производной части
      Лицензиат обязан сохранять все уведомления об авторских правах,
      уведомления о патентах, уведомления об отсутствии гарантий и ссылку
      на настоящую Лицензию. Распространение должно осуществляться на тех же
      условиях, что и исходное Произведение.

   4. Ограничение ответственности.

      ПРОГРАММА ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ
      ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ
      ПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННОЙ ЦЕЛИ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ.
      НИ В КОЕМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ
      ПО КАКИМ-ЛИБО ИСКАМ, УБЫТКАМ ИЛИ ДРУГИМ ТРЕБОВАНИЯМ.

   5. Принятие лицензии.

      Используя Программу, Лицензиат подтверждает своё согласие с условиями
      настоящей Лицензии.

🔗 Ссылки


👥 Поддержка


Последнее обновление: 2026-06-19

About

система тестирования студентов

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages