Files
Learn_System/backend
Maxim Dolgolyov 0d9226f6d5 feat(phys8 ch2): Phase 2.3 — оставшиеся 14 IV-6 (Ch2 завершена)
scrubberWidget() helper в скрипте — генерирует виджет с N
scrubbers + 1 readout + live SVG render.

§13 Проводники/диэлектрики: 2 стержня, движущиеся электроны в меди,
застрявшие в стекле. Анимация через setInterval.

§14 Электростатическая индукция: + палочка + проводник, при
сближении видны индуцированные −/+ заряды на сторонах.

§15 q=ne: сфера тела с радиально размещёнными ±зарядами,
расчёт n = q/e.

§16 Строение атома: ядро + N электронов на orbitals (2-8-8-2 shells).

§18 A=qU: 2 пластины + drag-arrow с подписью работы.

§19 ЭДС: батарея с readout ε = A/q.

§20 I=q/t: провод с анимированными носителями.

§21 Замкнутая цепь: батарея + switch + лампа, кнопка открыть/замкнуть.

§23 R=ρl/S: динамический wire с длиной/толщиной по scrubberу,
R вычисляется для меди.

§24 Последовательное: 2 резистора, общее R=R1+R2, I.

§26 P=UI: светящаяся лампа brightness ∝ P, лучи при P>120 Вт.

§27 A=UIt: time-bar 0-24 ч, A в кВт·ч.

§29 B≈I вокруг провода: концентрические штриховые круги, opacity ∝ |I|.

§31 Электромагнит: соленоид (число катушек по N), железный сердечник,
полевые линии-параболы с интенсивностью по B=NI.
2026-05-30 10:20:49 +03:00
..

LearnSpace Backend — Фаза 1

Быстрый старт

cd backend
npm install

# 1. Скопировать и заполнить переменные окружения
cp .env.example .env

# 2. Создать базу данных в PostgreSQL
createdb learnspace

# 3. Применить миграции (создать таблицы)
npm run migrate

# 4. Загрузить тестовые вопросы
npm run seed

# 5. Запустить сервер
npm run dev

API

Auth

Метод URL Тело Описание
POST /api/auth/register { email, password, name } Регистрация
POST /api/auth/login { email, password } Вход
GET /api/auth/me Текущий пользователь

Предметы

Метод URL Описание
GET /api/subjects Список предметов
GET /api/subjects/:slug/topics Темы предмета

Сессии тестирования

Метод URL Тело Описание
POST /api/sessions { subject_slug, mode, count, topic_id? } Начать тест
POST /api/sessions/:id/answer { question_id, option_id, time_spent_sec? } Отправить ответ
POST /api/sessions/:id/finish Завершить тест + разбор
GET /api/sessions/:id/result Результат завершённого теста
GET /api/sessions/history История тестов

Все /api/sessions/* требуют заголовок:

Authorization: Bearer <token>

Добавление вопросов

Создать JSON-файл в data/ по образцу questions-bio.json:

{
  "subject": "chem",
  "topics": [{ "name": "Органическая химия", "order": 1 }],
  "questions": [
    {
      "topic": "Органическая химия",
      "difficulty": 2,
      "text": "Текст вопроса",
      "options": ["А", "Б", "В", "Г"],
      "answer": 0,
      "explanation": "Объяснение правильного ответа"
    }
  ]
}

Затем повторно запустить npm run seed.

Структура проекта

backend/
├── data/                     ← JSON с вопросами
├── src/
│   ├── server.js             ← точка входа
│   ├── middleware/auth.js    ← JWT верификация
│   ├── db/
│   │   ├── pool.js           ← соединение с PostgreSQL
│   │   ├── migrate.js        ← запуск миграций
│   │   ├── seed.js           ← загрузка вопросов
│   │   └── migrations/       ← SQL-файлы схемы
│   ├── routes/               ← маршруты
│   └── controllers/          ← бизнес-логика
└── .env.example