Онлайн-платформа для создания и прохождения курсов. Проект сделан как pet-project для студента ИТМО: современный многостраничный frontend, Flask-архитектура, будущая схема БД, CI для ветки dev и минимальная Docker-заготовка.
Текущая степень готовности: frontend MVP готов, backend представлен архитектурным каркасом и демо-API.
Открой эти файлы в таком порядке:
START_HERE.md— команды запуска, Docker, тесты, основные страницы.PROJECT_GUIDE_FULL.md— подробный гайд по архитектуре и всем файлам.QA_CHECKLIST_MTS_SAVIN.md— большой чек-лист вопросов для QA-собеседования.PREP_MATERIALS_EVENING_MORNING.md— материалы на вечер и утро перед собеседованием.docs/api-contract.md— будущий REST API.docs/database.md— проектирование базы данных.docs/backend-evening-task.md— задача на вечер для backend-резюме.
- отдельная страница входа и регистрации;
- роли
studentиteacherна уровне UI; - каталог курсов;
- тестовый курс
Flask Launchpad; - страница курса с описанием, навыками и кнопкой записи;
- запись на курс в демо-режиме через
localStorage; - профиль пользователя с карточками записанных курсов;
- страница прохождения курса;
- sidebar со списком блоков;
- блок теории;
- блок практики;
- textarea для отправки решения;
- демо-вердикт после отправки решения;
- моковые данные в JSON;
- Flask factory;
- SQLAlchemy-модели для будущего backend-а;
- API-заготовки;
- GitHub Actions для
dev; - Dockerfile и docker-compose.
- полноценная серверная авторизация;
- хеширование и проверка паролей в production-сценарии;
- настоящая запись на курсы в БД;
- настоящая проверка решений;
- история посылок на UI;
- кабинет преподавателя;
- CRUD курсов;
- загрузка файлов;
- production-деплой.
Frontend:
- HTML5;
- CSS3;
- JavaScript без фреймворков;
- Bootstrap 5;
- Bootstrap Icons;
- Jinja2 templates.
Backend scaffold:
- Python 3.12;
- Flask;
- Flask-SQLAlchemy;
- Flask-Migrate;
- SQLite.
Infrastructure:
- Git;
- GitHub Actions;
- Docker;
- Docker Compose.
python -m venv .venvLinux / macOS:
source .venv/bin/activateWindows PowerShell:
.venv\Scripts\Activate.ps1pip install -r requirements-dev.txt
python run.pyОткрой:
http://127.0.0.1:5000
python -m unittest discover -s tests -v
python -m compileall app run.pydocker compose up --buildПосле запуска:
http://127.0.0.1:5000
Главные ветки:
main— стабильная версия;dev— основная ветка разработки;feature/<name>— новая функциональность;fix/<name>— исправления;docs/<name>— документация;refactor/<name>— рефакторинг без изменения поведения.
Обычный процесс:
git checkout dev
git pull origin dev
git checkout -b feature/backend-authПосле изменений:
git status
git add .
git commit -m "feat: add auth api skeleton"
git push origin feature/backend-authДальше открыть Pull Request в dev. После прохождения CI и ревью можно мержить. В main переносить только стабильные версии.
Формат коммитов:
feat: add course detail page
fix: repair enroll button state
docs: update database design
test: add mock content validation
refactor: split api service functions
chore: update docker config
Файл .github/workflows/dev-ci.yml запускается на push и pull request в dev.
Pipeline делает:
- checkout репозитория;
- установку Python 3.12;
- установку зависимостей из
requirements-dev.txt; - запуск unittest-тестов;
- проверку компиляции Python-файлов.
Сейчас это CI. Полноценный CD можно добавить позже: build Docker image, push в Docker Hub, деплой на VPS.
PROJECT-USTUPIK/
├── .github/workflows/dev-ci.yml
├── app/
│ ├── data/mock_data.py
│ ├── models/
│ ├── routes/
│ ├── services/
│ ├── static/
│ │ ├── css/style.css
│ │ ├── data/mock-content.json
│ │ └── js/
│ ├── templates/
│ ├── __init__.py
│ ├── config.py
│ └── extensions.py
├── docs/
├── tests/
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── requirements-dev.txt
└── run.py
Пример переменных окружения. Здесь лежит SECRET_KEY, режим разработки и строка подключения к SQLite. Настоящий .env не нужно коммитить.
Исключает виртуальное окружение, кэш Python, SQLite-базы, .env, IDE-файлы и артефакты тестов.
CI для ветки dev. При пуше или Pull Request в dev ставит зависимости, запускает тесты и компиляцию Python-файлов.
Минимальный контейнер на python:3.12-slim. Копирует зависимости, ставит их, копирует проект и запускает python run.py.
Поднимает сервис web на порту 5000. Передаёт переменные окружения для Flask и SQLite.
Production-зависимости: Flask, SQLAlchemy-интеграция, миграции и dotenv.
Dev-зависимости. Сейчас подключает requirements.txt и pytest. Тесты написаны на unittest, но pytest пригодится для будущего backend-а.
Точка входа. Создаёт приложение через create_app() и запускает сервер на 0.0.0.0:5000, чтобы работало и локально, и в Docker.
Application factory. Создаёт Flask-приложение, подключает конфиг, инициализирует db и migrate, регистрирует blueprints страниц и API.
Конфигурация приложения. Хранит SECRET_KEY, SQLALCHEMY_DATABASE_URI, отключает лишнее отслеживание SQLAlchemy и включает нормальную JSON-кириллицу.
Единая точка расширений Flask. Здесь создаются db = SQLAlchemy() и migrate = Migrate(). Такой подход нужен, чтобы не получать циклические импорты.
Загружает mock-content.json, кэширует его и даёт функции get_courses() и get_course_by_slug(). Это временный слой данных до настоящей БД.
SQLAlchemy-модель пользователя. Поля: username, email, password_hash, role, is_active, created_at, updated_at. Связи: созданные курсы, записи на курсы, посылки.
SQLAlchemy-модель курса. Поля: title, slug, short_description, full_description, difficulty, cover_image, is_published, author_id, timestamps. Связи: автор, модули, записи, посылки.
SQLAlchemy-модель блока курса. Поддерживает theory и practice. Для теории хранится theory_content, для практики — practice_prompt, practice_stub, checker_type.
SQLAlchemy-модель записи пользователя на курс. Хранит user_id, course_id, status, progress_percent, enrolled_at, completed_at. Есть уникальность пары (user_id, course_id).
SQLAlchemy-модель посылки решения. Хранит пользователя, курс, модуль, текст решения, вердикт, feedback, runtime_ms, created_at.
Экспортирует все модели из пакета, чтобы их было удобно импортировать и чтобы Flask-Migrate видел модели.
Сервис авторизации для демо-режима. Нормализует роль и собирает демо-пользователя. Позже сюда можно перенести проверку пароля, регистрацию и Flask-Login.
Сервис курсов. Возвращает список курсов, ищет курс по slug и собирает демо-ответ записи на курс.
Сервис проверки решения. Сейчас это демо-проверка по текстовым признакам. Позже тут может быть очередь, sandbox, запуск тестов и запись вердикта в БД.
Экспортирует функции сервисного слоя.
Маршруты HTML-страниц: /, /login, /courses, /courses/<slug>, /profile, /learn/<slug>.
Демо API авторизации: /api/auth/login, /api/auth/register, /api/auth/logout. Сейчас возвращает демо-пользователя.
Общие API-заготовки: healthcheck, список курсов, курс по slug, текущий пользователь, отправка решения.
API-заготовка записи на курс: POST /api/courses/<slug>/enroll.
API-заготовки профиля: summary, мои курсы, мои посылки.
Экспортирует blueprints.
Базовый HTML layout. Подключает Bootstrap, Icons, шрифт Inter, главный CSS, navbar, footer, toast и общий JS.
Навигация: логотип, ссылки на курсы, профиль, вход и бейдж текущей роли.
Нижний блок с описанием проекта и технологическими бейджами.
Страница входа и регистрации. Содержит tabs входа/регистрации, выбор роли student/teacher и форму. Логика находится в auth.js.
Каталог курсов. Содержит hero-блок, поиск, фильтры и контейнер coursesGrid, куда JavaScript рендерит карточки.
Пустой контейнер для подробной страницы курса. Данные и HTML собираются в course-detail.js.
Профиль пользователя: имя, email, роль, количество курсов, accepted-счётчик, empty-state и сетка курсов.
Страница прохождения курса. Содержимое полностью рендерится через learn.js: sidebar, теория, практика, verdict-card.
Визуальная система: тёмный фон, glow-эффекты, glassmorphism-карточки, responsive-сетка, кнопки, формы, анимации появления, стили каталога, профиля и прохождения курса.
Общие frontend-хелперы: загрузка моковых данных, работа с localStorage, запись на курс, счётчик accepted, toast, роль в navbar, reveal-анимации и pointer-glow.
Логика авторизации в демо-режиме. Переключает вход/регистрацию, роли, сохраняет пользователя в localStorage и переводит в каталог.
Загружает моковые курсы, фильтрует по поиску и тегам, рендерит карточки курсов.
Находит курс по slug, рендерит описание, навыки, outcomes и кнопку записи. После записи переводит на /learn/<slug>.
Читает пользователя и enrollments из localStorage, показывает профиль и карточки курсов пользователя.
Рендерит прохождение курса. Для теории показывает текстовые параграфы. Для практики показывает условие, textarea и демо-проверку решения.
Единственный тестовый курс. Внутри один блок теории и один блок практики.
Архитектура проекта, слои, flow пользователя, backend roadmap.
Проектирование базы данных: таблицы, поля, связи, индексы, жизненный цикл данных.
Контракт будущего REST API: auth, courses, profile, submissions.
Задание на вечер для прокачки backend-резюме: REST API, Flask, SQLAlchemy, pytest, Docker, Git.
Подготовка к QA-вакансии: чек-лист вопросов, темы по Савину, DevTools, API, баг-репорты, вечерний и утренний план.
Проверяет, что ключевые шаблоны, JS, CSS, docs и workflow существуют, а в шаблонах есть нужные маркеры.
Проверяет моковые данные: есть один курс, slug, теги, теория, практика, подсказки и expected-поля.
- Создать миграции:
flask --app run.py db init
flask --app run.py db migrate -m "initial schema"
flask --app run.py db upgrade- Заменить чтение
mock-content.jsonна запросы к БД. - Подключить Flask-Login или JWT.
- Реализовать регистрацию и вход с
werkzeug.security. - Реализовать
POST /api/courses/<slug>/enrollчерез таблицуenrollments. - Реализовать
POST /api/submissionsс записью вsubmissions. - Добавить историю посылок в профиль и в страницу практики.
- Добавить teacher panel для создания курсов и модулей.
Если frontend уже готов и ты работаешь один по вечерам:
| Блок | Время |
|---|---|
| Настроить миграции и реальные модели | 4–6 часов |
| Auth: регистрация, логин, роли | 6–10 часов |
| API курсов и модулей | 5–8 часов |
| Запись на курс и профиль | 5–8 часов |
| Отправка решений и хранение вердиктов | 6–10 часов |
| История посылок | 3–5 часов |
| Тесты API и сервисов | 5–8 часов |
| Интеграция frontend с API | 5–8 часов |
| Docker Compose + polish | 3–5 часов |
MVP backend без teacher-panel: 26–40 часов.
Полный аккуратный MVP с teacher-panel: 42–65 часов.
Реалистично для вечерней разработки: 2–3 недели, если работать регулярно.
Сначала сделать настоящий backend для auth + enrollments + submissions. После этого проект уже можно красиво показывать в backend-резюме как Flask/SQLAlchemy/REST API/CI/Docker pet-project.