chore: консолидация незакоммиченной работы (биохимия + System Health + lab/textbooks)

Зафиксирована накопленная незакоммиченная работа рабочего дерева, КРОМЕ файлов
учебника «Химия 7» (migration 046, chemistry_7_*.html, chem7_svg.js, тест —
оставлены незакоммиченными по запросу).

Включает: модуль биохимии (ядро BIO, 3D VSEPR, химдвижок, баланс, challenges,
пути из БД), System Health Level 1 (вердикт/мониторинг), а также frontend-
страницы и lab/textbooks-правки параллельной сессии.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-30 18:12:55 +03:00
parent 6c1e003340
commit 5381679c68
55 changed files with 10203 additions and 305 deletions
@@ -0,0 +1,16 @@
-- 044_bio_user_pathway.sql
-- Прогресс прохождения метаболических путей (Learn-режим biochem-pathways).
-- Раньше прогресс не сохранялся; теперь шаг и факт завершения хранятся на
-- пользователя по ключу пути (glycolysis / krebs / oxidation / synthesis ...).
-- Награда (XP) начисляется один раз при первом завершении пути.
CREATE TABLE IF NOT EXISTS bio_user_pathway (
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
pathway TEXT NOT NULL,
step INTEGER NOT NULL DEFAULT 0,
completed INTEGER NOT NULL DEFAULT 0,
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
PRIMARY KEY (user_id, pathway)
);
CREATE INDEX IF NOT EXISTS idx_bio_user_pathway ON bio_user_pathway(user_id);
@@ -0,0 +1,15 @@
-- 045_bio_pathways.sql
-- Метаболические пути как данные (вместо ~700 строк хардкода в
-- biochem-pathways.html). Каждый путь — самодостаточный документ (граф узлов
-- и рёбер + шаги Learn-режима с квизами) в data_json; страница грузит их через
-- API. Document-подход выбран намеренно: путь всегда читается целиком,
-- реляционных запросов к узлам/рёбрам нет.
CREATE TABLE IF NOT EXISTS bio_pathways (
id INTEGER PRIMARY KEY AUTOINCREMENT,
slug TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
color TEXT NOT NULL DEFAULT '#9B5DE5',
ord INTEGER NOT NULL DEFAULT 0,
data_json TEXT NOT NULL DEFAULT '{}'
);