1
0
Fork 0
mirror of https://github.com/EDeev/quizlab.git synced 2026-10-07 20:49:34 +03:00
quizlab/README.md
Egor Deev 8b83d3d94c README на русском и английском со скриншотами
Скриншоты сняты с работающего стенда lab-2/local и собранного Qt-клиента.
2026-10-05 18:33:22 +00:00

5.4 KiB
Raw Blame History

Quiz API: Django → Docker → Qt

Русский · English

Три лабораторные по архитектуре программных систем, построенные вокруг одного приложения. Сначала REST API викторин на Django REST Framework, затем то же API в Docker в четырёх вариантах развёртывания, затем десктопный клиент на C++/Qt с паттернами Singleton и Adapter.

Статус: учебный проект («Архитектура программных систем», Московский Политех, группа 241-327, весна 2026), завершён

Qt-клиент со списком тестов

Стек: Python · Django · Django REST Framework · PostgreSQL · Docker Compose · nginx · Caddy · C++17 · Qt 6 (Widgets, Network) · CMake

Лабораторные

Что сделано Папка
1 REST API: модель Quiz, сериализатор, ModelViewSet, генератор тестовых данных на Faker, PostgreSQL lab-1/
2 API в контейнерах: gunicorn за nginx, статика из общего тома, свои образы в реестре dcr.deev.su lab-2/
3 Десктопный клиент к API: пять HTTP-методов, таблица и текстовый вид, Singleton и Adapter lab-3/

Варианты развёртывания во второй лабораторной:

Папка Образы PostgreSQL
local/ собираются из исходников в контейнере
web_pg/ готовые из dcr.deev.su/deevev/lab2-* в контейнере
web_lite/ готовые из dcr.deev.su/deevev/lab2-* внешний
caddy/ собираются из исходников, Caddy вместо nginx, HTTPS с самоподписанным сертификатом в контейнере

Как устроено

flowchart LR
    Q[Qt-клиент<br/>ApiClient + QuizJsonAdapter] -->|HTTP JSON| N[nginx или Caddy]
    N -->|/api/, /admin/| G[gunicorn + Django REST Framework]
    N -->|/static/| S[(том со статикой)]
    G --> P[(PostgreSQL)]

API: GET /api/quiz/, GET /api/quiz/<id>/, POST /api/quiz/, PUT /api/quiz/<id>/, DELETE /api/quiz/<id>/. Поля теста: название, описание, автор, лимит времени в минутах, опубликован ли, дата создания.

В клиенте ApiClient — синглтон Мейерса: одно соединение QNetworkAccessManager на всё приложение. QuizJsonAdapter реализует интерфейс IQuizAdapter и переводит QJsonObject в Quiz, поэтому окно работает с классом предметной области, а не с JSON.

Запуск

API в Docker (сборка из исходников, PostgreSQL в контейнере, 100 тестов генерируются при старте):

cd lab-2/local
cp .env.example .env      # задайте пароль БД и DJANGO_SECRET_KEY
docker compose up -d      # API на http://localhost/api/quiz/

Остальные варианты запускаются так же из своих папок. Для caddy/ сначала выполните sh gen-cert.sh, сайт откроется на https://localhost.

Клиент (нужны Qt 6 и CMake):

cd lab-3
cmake -B build && cmake --build build
./build/lab-3             # API по умолчанию — http://localhost:80, другой адрес: QUIZ_API_URL=http://host:port

Первая лабораторная без Docker: PostgreSQL, затем pip install -r lab-1/requirements.txt, python manage.py migrate, python manage.py runserver. Подключение задаётся переменными POSTGRES_*, настройки Django — DJANGO_SECRET_KEY, DJANGO_DEBUG, DJANGO_ALLOWED_HOSTS.

Как выглядит

Браузерный API DRF Текстовый вид клиента
API Текстовый вид

Разработка

Каждая лабораторная — самостоятельная папка, поэтому Django-проект повторяется в lab-1/, lab-2/local/backend/ и lab-2/caddy/backend/. Файлы http.restbook — запросы к API для расширения REST Book в VS Code.

Лицензия

Учебный проект («Архитектура программных систем», Московский Политех, 2026). Код открыт для изучения, отдельной лицензии нет.

Автор

Деев Егор Викторович — GitHub · Telegram · egor@deev.space


⭐ Если проект оказался полезным, поставьте звёздочку!

Сделано с ❤️ — deev.space