c0af5502bf
Политика «все учебники наши»: нигде не упоминаются сторонние авторы. - Миграции (15 файлов): колонка author → 'LearnSpace'; из описаний убран оборот «по учебнику <автор>:»; авторские фамилии вычищены из комментариев. Покрыты Арефьева/Пирютко, Казаков, Латотин/Чеботаревский/Горбунова/Цыбулько, Исаченкова, Жилко/Маркович/Сокольский, Герасимов/Лобанов. - HTML: physics_9_ch5 («по канве учебника Исаченковой» → «по учебной программе»), physics_11_hub (hdr-sub с авторами → описание курса), mocks-redesign (карточки-авторы → LearnSpace). - Генераторы gen_phys9_ch.js/gen_phys11_stubs.js — шаблоны без авторов. - НОВОЕ: update_textbook_authors.js — идемпотентный апдейтер ЖИВОЙ БД (миграции уже применены): author→'LearnSpace' у всех 107 учебников + чистка описаний. DRY-RUN по умолч. ⚠️ Живую БД правит ПОЛЬЗОВАТЕЛЬ: node backend/scripts/update_textbook_authors.js --apply (в БД сейчас author пуст у всех, видимые упоминания были в описаниях «по учебнику …»). review_geom10/11.js не тронуты — там фамилии как поисковые шаблоны детектора, не атрибуция. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
43 lines
2.7 KiB
SQL
43 lines
2.7 KiB
SQL
-- Feature flag for textbooks module
|
||
INSERT OR IGNORE INTO app_settings (key, value) VALUES ('feature_textbooks_enabled', '1');
|
||
|
||
-- Catalog of textbooks (admin-editable; html_path is relative to /frontend/textbooks/)
|
||
CREATE TABLE textbooks (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
slug TEXT UNIQUE NOT NULL,
|
||
subject TEXT NOT NULL, -- 'chemistry', 'physics', 'math', 'biology', ...
|
||
grade INTEGER NOT NULL, -- 9, 10, 11, ...
|
||
title TEXT NOT NULL,
|
||
author TEXT NOT NULL DEFAULT '',
|
||
description TEXT NOT NULL DEFAULT '',
|
||
html_path TEXT NOT NULL, -- relative filename: 'chemistry_9.html'
|
||
para_count INTEGER NOT NULL DEFAULT 0, -- total paragraphs (for progress %)
|
||
color TEXT NOT NULL DEFAULT 'violet',-- visual theme: 'amber','blue','violet','green',...
|
||
sort_order INTEGER NOT NULL DEFAULT 0,
|
||
is_active INTEGER NOT NULL DEFAULT 1,
|
||
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||
);
|
||
|
||
-- Per-user reading progress (one row per (user, textbook))
|
||
CREATE TABLE textbook_progress (
|
||
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||
textbook_id INTEGER NOT NULL REFERENCES textbooks(id) ON DELETE CASCADE,
|
||
paragraphs_read TEXT NOT NULL DEFAULT '[]', -- JSON array of para keys like ["p1","p3","p7"]
|
||
last_para TEXT, -- last opened paragraph key (e.g. 'p15')
|
||
last_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||
PRIMARY KEY (user_id, textbook_id)
|
||
);
|
||
|
||
-- Assignment extension: link to textbook + paragraph range string ("1-5" or "1,3,5")
|
||
ALTER TABLE assignments ADD COLUMN textbook_id INTEGER REFERENCES textbooks(id) ON DELETE SET NULL;
|
||
ALTER TABLE assignments ADD COLUMN textbook_paragraphs TEXT;
|
||
|
||
-- Seed: chemistry 9 + physics 9 (the two files we just copied)
|
||
INSERT INTO textbooks (slug, subject, grade, title, author, description, html_path, para_count, color, sort_order) VALUES
|
||
('chemistry-9', 'chemistry', 9, 'Химия — 9 класс', 'Шиманович Е. Я.',
|
||
'Полный курс химии за 9 класс. §1–60: строение атома, химическая связь, классы соединений, ОВР, металлы и их соединения, электролиз.',
|
||
'chemistry_9.html', 60, 'amber', 1),
|
||
('physics-9', 'physics', 9, 'Физика — 9 класс', 'LearnSpace',
|
||
'Полный курс физики за 9 класс: §1–38. Механика, кинематика, динамика, статика, законы сохранения, импульс, работа и энергия.',
|
||
'physics_9.html', 38, 'blue', 2);
|