Exerciser – веб-приложение для проведения тестирования студентов. Преподаватели загружают вопросы в формате JSON, управляют экзаменами (редактирование, настройка количества вопросов каждого типа), а студенты проходят тесты через удобный интерфейс на Vue 3.
Версия: 1.3.2
Дата: 2026-06-19
- Docker и Docker Compose (для инфраструктуры)
- .NET 10 SDK
- Node.js (v20+)
git clone https://github.com/itedu-tool/exerciser.git
cd exerciser
docker compose up -dcd Exerciser.WebApi
dotnet runAPI будет доступен: http://localhost:8080
Документация Scalar UI: http://localhost:8080/scalar/v1
cd Exerciser.FrontEnd/Admin
npm install
npm start # http://localhost:3000cd Exerciser.FrontEnd/Student
npm install
npm run dev # http://localhost:3001Примечание: На данном этапе статические файлы не копируются в
wwwrootбэкенда, фронтенды запускаются независимо. Для продакшена потребуется отдельная настройка раздачи статики (планируется в следующих релизах).
Базовый 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Возможности:
- Вход по группе и студенту
- Список доступных экзаменов с отображением:
- Общего количества вопросов и разбивки по типам
- Количества вопросов, которое будет показано (по каждому типу)
- Прохождение теста с:
- Таймером (1 час, автоматическая отправка при истечении)
- Прогресс-баром отвеченных вопросов
- Навигационной панелью с номерами вопросов (цветовая индикация: отвечен/не отвечен/текущий)
- Автоматическим сохранением ответов в
sessionStorage(восстановление при перезагрузке) - Плавной прокруткой к вопросу и временной подсветкой
- Страница результатов с детализацией по каждому вопросу (ответы, баллы, правильные ответы)
Запуск в режиме разработки:
cd Exerciser.FrontEnd/Student
npm run devcd Exerciser.FrontEnd/Admin
npm run lint
npm run formatНа данный момент тесты отсутствуют. Планируется добавить unit-тесты для валидатора и интеграционные тесты с Testcontainers.
mongodb– БД (образmongo:8.3)redis– кеш (образredis:8.6.4)webapi– ASP.NET Core приложение
docker compose up -ddocker 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
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_ALLOWED_ORIGINS. В продакшене укажите домены фронтендов.
fixed– 100 запросов/мин (общие эндпоинты)import-sliding– 10 запросов/час (импорт экзамена)
- Консоль с цветовой дифференциацией
- Файлы 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 |
| Версия | Дата | Изменения |
|---|---|---|
| 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 | Первый стабильный релиз |
- Fork репозитория
- Создайте ветку (
git checkout -b feature/amazing-feature) - Соблюдайте кодстайл (
.editorconfig,dotnet format,npm run lint) - Напишите тесты (если есть)
- Обновите документацию
- Отправьте 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. Принятие лицензии.
Используя Программу, Лицензиат подтверждает своё согласие с условиями
настоящей Лицензии.
- Репозиторий: https://github.com/itedu-tool/exerciser
- **Docker образ (реестр): ** https://hub.docker.com/repository/docker/anstfoto/exerciser-webapi/general
- Автор на GitHub: https://github.com/anst-foto
- ООО «Компьютерная Академия Топ»: https://top-academy.ru
- Сообщить об ошибке / предложить улучшение: GitHub Issues
- Документация: README.md и docs/
- **Docker образ: ** anstfoto/exerciser-webapi
- Электронная почта: starinin-andrey@ya.ru (автор)
Последнее обновление: 2026-06-19