Система представляет собой микросервисную архитектуру для проверки студенческих работ с детекцией плагиата. Система состоит из трех основных сервисов:
- API Gateway - центральный сервис-посредник для маршрутизации запросов клиентов
- File Storing Service - сервис для хранения и получения файлов
- File Analysis Service - сервис для анализа работ и создания отчетов
Клиент → API Gateway → File Storing Service
→ File Analysis Service
- Порт: 8080
- Принимает все клиентские запросы
- Маршрутизирует запросы к соответствующим микросервисам
- Обрабатывает ошибки при недоступности сервисов
- Порт: 8081
- Хранение загруженных файлов на диске
- Получение файлов по ID
- Сохранение метаданных о файлах в БД
- Порт: 8082
- Анализ загруженных файлов
- Создание отчетов о проверке
- Детекция плагиата
- Сохранение результатов анализа в БД
- C++17
- SQLite (база данных)
- Docker & Docker Compose
- HTTP/REST API
В простейшей версии плагиат определяется следующим образом:
- Если существует более ранняя отправка той же работы (по ID задания) другим студентом
- Сравнение выполняется по хэш-сумме файла
- Если хэш-суммы совпадают, устанавливается флаг плагиата
-
Клиент → API Gateway:
POST /api/works/submit{ "student_id": "student123", "assignment_id": "assignment1", "file": "<base64 encoded file>" } -
API Gateway → File Storing Service:
POST /files/upload- Передача файла для сохранения
- Получение file_id
-
API Gateway → File Analysis Service:
POST /analysis/analyze- Запрос на анализ файла
- Передача file_id и метаданных
-
File Analysis Service → File Storing Service:
GET /files/{file_id}- Получение файла для анализа
-
File Analysis Service:
- Выполнение анализа
- Проверка на плагиат
- Сохранение отчета в БД
-
API Gateway → Клиент: Возврат статуса и submission_id
-
Клиент → API Gateway:
GET /api/works/{work_id}/reports -
API Gateway → File Analysis Service:
GET /analysis/reports?assignment_id={work_id} -
File Analysis Service:
- Запрос к БД для получения всех отчетов по заданию
- Формирование JSON ответа
-
API Gateway → Клиент: Возврат списка отчетов
{ "reports": [ { "submission_id": "sub1", "student_id": "student123", "status": "completed", "plagiarism_detected": false, "created_at": "2024-01-01T12:00:00Z" } ] }
- Если один из микросервисов недоступен, API Gateway возвращает ошибку 503 Service Unavailable
- Логирование ошибок в консоль
- Возврат понятных сообщений об ошибках клиенту
- Docker
- Docker Compose
docker compose up --build# Проверка статуса сервисов
curl http://localhost:8080/health
curl http://localhost:8081/health
curl http://localhost:8082/health
# Используем полученный base64 код
# Отправка работы (пример с base64 закодированным файлом)
echo "Hello World! This is a test file." | base64
curl -X POST http://localhost:8080/api/works/submit \
-H "Content-Type: application/json" \
-d '{"student_id":"student1","assignment_id":"assignment1","file":"SGVsbG8gV29ybGQhIFRoaXMgaXMgYSB0ZXN0IGZpbGUuCg=="}'
# Отправка второй работы другим студентом (для проверки плагиата)
curl -X POST http://localhost:8080/api/works/submit \
-H "Content-Type: application/json" \
-d '{"student_id":"student2","assignment_id":"assignment1","file":"SGVsbG8gV29ybGQhIFRoaXMgaXMgYSB0ZXN0IGZpbGUuCg=="}'
# Получение отчетов
curl http://localhost:8080/api/works/assignment1/reports- Отправьте работу от первого студента (см. пример выше)
- Отправьте ту же самую работу (с тем же base64 содержимым) от другого студента
- Запросите отчеты - у второй отправки должен быть флаг
plagiarism_detected: true
GET /health- проверка здоровья сервисаPOST /api/works/submit- отправка работы на проверкуGET /api/works/{work_id}/reports- получение отчетов по работе
POST /files/upload- загрузка файлаGET /files/{file_id}- получение файлаGET /health- проверка здоровья сервиса
POST /analysis/analyze- запрос на анализ файлаGET /analysis/reports- получение отчетовGET /health- проверка здоровья сервиса
.
├── api-gateway/
│ ├── src/
│ │ └── main.cpp
│ ├── Dockerfile
│ └── CMakeLists.txt
├── file-storing-service/
│ ├── src/
│ │ └── main.cpp
│ ├── Dockerfile
│ └── CMakeLists.txt
├── file-analysis-service/
│ ├── src/
│ │ └── main.cpp
│ ├── Dockerfile
│ └── CMakeLists.txt
├── docker-compose.yml
└── README.md