Skip to content

Repository files navigation

🐍 Питон-Портал

Учебный портал для изучения Python (и немного SQL) — полностью на русском, с запуском кода прямо в браузере. Два входа: учитель проверяет результаты, ученик проходит уроки.

Создан для занятий один-на-один: ученик практикуется между встречами, учитель видит прогресс и сам код. Дизайн дружелюбный, всё по-русски, а у каждой английской функции есть всплывающая подсказка с переводом и произношением.


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

  • 📚 15 уроков от «Привет, мир» до мини-проекта (Python + 4 урока по SQL), плюс практикумы (открываются после базового курса) и «глубокие погружения» — боковая ветка, где одна тема разбирается с самых основ (доступна всегда).
  • ▶️ Код запускается в браузере — Python через Pyodide, SQL через sql.js. Сервер код не выполняет.
  • Автопроверка заданий: Python — через тесты (assert или сверка вывода), SQL — сравнением результата запроса с эталоном.
  • 💡 Глоссарий встроенных функций и ключевых слов с русским произношением («принт», «лэн», «рэндж»…) и объяснением, откуда взялось название. Наводишь курсор на термин в уроке — подсказка появляется прямо там.
  • 👩‍🏫 Кабинет учителя: прогресс каждого ученика, баллы, история попыток с кодом, кнопка сброса прогресса. Учитель тоже может проходить уроки (вкладка «Уроки»).
  • Легко расширять: новый урок — это один файл.

🧱 Стек

SvelteKit + @sveltejs/adapter-cloudflareCloudflare Pages; данные в Cloudflare D1 (SQLite); Pyodide + sql.js (WebAssembly) в браузере; CodeMirror 6; вход по куки-сессии, пароли через PBKDF2 (Web Crypto). Всё в рамках бесплатного тарифа Cloudflare.


🚀 Локальный запуск

Нужен Node.js 20+.

# 1. Установить зависимости
npm install

# 2. Создать базу D1 (один раз). Команда напечатает database_id —
#    вставьте его в wrangler.jsonc вместо REPLACE_WITH_YOUR_DATABASE_ID
npm run db:create

# 3. Создать таблицы в ЛОКАЛЬНОЙ базе (её использует npm run dev)
npm run db:migrate:local

# 4. Создать учителя и ученика (см. раздел «Логины» ниже).
#    Команда печатает SQL — запустите напечатанную строку с --local.
npm run hash -- teacher "пароль-учителя" "Роман" teacher
npm run hash -- student "пароль-ученика" "Максим" student

# 5. Запустить
npm run dev          # http://localhost:5173

Локальная разработка использует встроенную эмуляцию D1 (адаптер Cloudflare сам поднимает её через getPlatformProxy()), поэтому отдельный wrangler запускать не нужно.


🔑 Логины и пароли

Вход выполняется по логину (username) — это первый аргумент команды hash, а не отображаемое имя:

npm run hash -- <логин> <пароль> "<Имя для показа>" <teacher|student>
#                  ↑ это логин для входа

Команда npm run hash только печатает SQL — чтобы пользователь появился, нужно выполнить напечатанную строку:

  • строка с --local → для npm run dev (база на вашем компьютере);
  • строка с --remote → для развёрнутого сайта (нужен npx wrangler login).

Сменить пароль или имя — просто запустите hash ещё раз с тем же логином: команда делает upsert (обновляет существующего пользователя), а не падает.

--local и --remote — это две разные базы. Пользователей нужно завести в той, куда вы заходите.


☁️ Деплой на Cloudflare Pages

💡 Хочешь, чтобы каждый git push деплоил сам (рекомендуется)? Настрой автодеплой из GitHub — пошагово в docs/deploy-github.md. Ниже — ручной вариант через CLI.

# 1. Войти в Cloudflare (откроется браузер)
npx wrangler login

# 2. Создать таблицы в БОЕВОЙ базе
npm run db:migrate:remote

# 3. Завести учителя и ученика в боевой базе
npm run hash -- teacher "пароль" "Роман" teacher   # затем выполнить строку с --remote
npm run hash -- student "пароль" "Максим" student   # затем выполнить строку с --remote

# 4. Собрать и задеплоить
npm run pages:deploy

Первый деплой попросит создать проект Pages и ветку — соглашайтесь с умолчаниями. Привязка базы DB прикрепляется автоматически (за счёт pages_build_output_dir в wrangler.jsonc) — кликать в дашборде не нужно.

Любое обновление в дальнейшем — одна команда:

npm run pages:deploy

Своё доменное имя добавляется в дашборде Cloudflare: проект Pages → Custom domains.

Если деплой «не видит базу» — почти всегда не вставлен реальный database_id (шаг 2 локального запуска) в wrangler.jsonc.


👀 Как пользоваться

  • Ученик заходит под своим логином → видит карточки уроков и общий прогресс → открывает урок, читает теорию (термины подсвечены — наводи курсор), запускает код в редакторе (кнопка «Запустить» или Ctrl+Enter), решает упражнения. Прогресс сохраняется автоматически.
  • Учитель заходит под своим логином → вкладка «Ученики»: список, прогресс, и по клику — детали ученика с его кодом и кнопкой «Сбросить прогресс». Вкладка «Уроки» даёт учителю те же уроки, чтобы посмотреть/пройти самому.
  • Глоссарий — отдельная страница со всеми терминами, поиском и фильтрами.

➕ Как добавить урок

  1. Скопируйте любой файл из src/lib/content/lessons/.
  2. Заполните теорию, упражнения и квиз (формат описан в src/lib/content/schema.js).
  3. Подключите модуль в src/lib/content/lessons/index.js.
  4. Метаданные урока (название, уровень, время) — в src/lib/content/catalog.js.

Типы упражнений:

  • Python (lang:'python') — задайте tests: каждый тест это либо code (Python с assert, падает при ошибке), либо expectStdout (сверка вывода).
  • SQL (lang:'sql') — задайте seedSql (создание таблиц + данные) и check.expectedQuery (эталонный запрос; результат ученика сверяется с ним).

Глоссарий пополняется в src/lib/content/glossary.json — любое слово оттуда автоматически подсвечивается в теории, если написать его в обратных кавычках.

Проверить, что все эталонные решения проходят свои тесты:

node scripts/verify-lessons.mjs

🗂️ Структура

migrations/                 SQL-миграции для D1
scripts/
  gen-hash.mjs              создание/смена пользователя (хеш пароля + SQL)
  copy-sql-wasm.mjs         копирует sql-wasm.wasm в static/ (авто перед dev/build)
  verify-lessons.mjs        проверка, что решения проходят тесты
src/
  app.css                   дизайн-система
  hooks.server.js           сессии и защита маршрутов по ролям
  lib/
    server/                 crypto (PBKDF2), доступ к D1, сессии
    runtime/                python.js (Pyodide) и sqldb.js (sql.js)
    content/                schema, catalog, glossary, lessons/
    components/             редактор кода, упражнение, квиз, глоссарий-тултип …
  routes/
    login/ logout/          вход и выход
    app/                    кабинет ученика: список уроков и сам урок
    teacher/                кабинет учителя: ученики, детали, сброс прогресса
    glossary/               страница глоссария
    api/progress/           сохранение прогресса и попыток
docs/research-notes.md      технические заметки по интеграции

🛠️ Команды

Команда Что делает
npm run dev запустить локально
npm run build собрать для продакшена
npm run check проверка типов (svelte-check)
node scripts/verify-lessons.mjs проверить, что решения проходят тесты
npm run db:migrate:local / :remote миграции в локальную / боевую D1
npm run hash -- <логин> <пароль> "<Имя>" <роль> создать/обновить пользователя
npm run pages:deploy собрать и задеплоить на Cloudflare Pages

Сделано с ❤️ для тех, кто только начинает. Удачи в обучении! 🐍

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages