本目录用于每年 2 月、9 月教材改版后的秒过知识库维护。目标是:只需放入新版教材图片、整理结构化源数据、依次运行 dry-run、apply、audit,即可完成更新并留下可追溯记录。
HanziUnit、AncientPoetry 禁止 DELETE,只能 UPDATE 旧行或 INSERT 新行。旧 ID 可能已被历史试题或用户数据引用。Words 允许按目标 BookID 删除后重建,但必须先备份,并且所有写入都必须在事务中完成。MiaoguoBook.UnitNum、MiaoguoBook.WordNum。HanziUnit.Example,并计入 WordNum。语文园地,不添加“一、二”等编号;先后次序由唯一且连续的 OrderID 区分。src/config/dev.js,脚本和报告不得复制、打印或另存数据库密码。程序使用 MiaoguoBook.BookIDOld 查找旧系统数据表的书籍 ID。字段名是 BookIDOld,不是口头描述中常写的 BookOldID。
| 类别 | MiaoguoBook.ID | 数据表 | 关联字段 | 主要字段 |
|---|---|---|---|---|
| 语文写字表 | 1~12 | HanziUnit | HanziBookID=BookIDOld | UnitType、Name、Example、OrderID |
| 语文词语表 | 33~42 | HanziUnit | HanziBookID=BookIDOld | UnitType、Name、Example、OrderID |
| 语文识字表 | 43~52 | HanziUnit | HanziBookID=BookIDOld | UnitType、Name、Example、OrderID |
| 语文古诗文 | 13~30 | AncientPoetry | HanziBookID=BookIDOld | Sort、Category、Tag、Title、Author、Dynasty、PeomContent |
| 语文日积月累 | 54~65 | AncientPoetry | HanziBookID=BookIDOld | Sort、Category、Tag、Title、Author、Dynasty、PeomContent |
| 英语单词表 | 285~292、301~305 | Words | BookID=BookIDOld | Word、LessonID、LessonName、Soundmark、Translate、Sort |
| 英语常用表达法 | 293~300 | Words | BookID=BookIDOld | Word、LessonID、LessonName、Translate、Sort |
本次确认的 HanziUnit.UnitType:识字表为 1,词语表为 2,写字表为 5。
units 元素,name 按书中栏目名写,example 保存这一栏的完整数据。Example 是连续汉字,不加逗号;使用 Unicode 字符数统计 WordNum。Example 使用英文逗号分隔,按非空词条数统计 WordNum。wordNum。语文园地 保持同名,依靠数组位置最终生成 OrderID=1..N。PeomContent 按自然段保存为 JSON 数组,Translation 留空;作者在教材脚注中明确给出时写入 Author。Category=0;成语、名言、儿歌、常识等使用 Category=1,并沿用现有挖空 Title 和完整答案 PeomContent 的结构。PeomContent 字段名是历史拼写,不能擅自改成 PoemContent。写入前必须验证其为合法 JSON,且不超过字段长度。AncientPoetry:找到唯一旧记录就迁移原 ID,同时更新 HanziBookID/Sort/Tag;找不到才新增。HanziBookID=0 脱册并保留正文。迁出、迁入和脱册都会影响关联书的实际行数。Sort 在每本书内统一从 0 连续到 N-1。来源图片重复时按同一内容去重,不生成重复行。MiaoguoBook.WordNum 按该 BookIDOld 最终实际 AncientPoetry 行数设置;经典内容从别册迁入时,供体书的 WordNum 也必须同步调整。LessonID 使用 1~N,LessonName 使用 Unit 1~Unit N。/.../ 统一保存为 [...];教材未给音标时保存 NULL,不能臆造。also Earth 等教材注释保留在 Translate。ˈ,中文标点保留教材语义。Sort 在每个单元内从 1 连续递增。接口本身按 LessonID,Sort,ID 排序,因此不依赖自增 ID 碰巧保持顺序。WordRemark、Level、EnglishExplanation、ExampleSentence 没有教材来源时保存 NULL。以下命令均在仓库根目录执行:
cd /Users/chengjie/Documents/git/miaoguo_system_server
source_chinese_*.json、source_english_*.json,替换为本批次数据,同时改脚本中的文件名和目标书籍映射。node .vscode/秒过知识库更新/update_knowledge_base_2026_fall.mjs --dry-run
MiaoguoBook.ID/BookIDOld、当前行数→目标行数、UnitNum/WordNum、语文新增数和 deletes=0、英语各单元条数。node .vscode/秒过知识库更新/update_knowledge_base_2026_fall.mjs --apply
程序会在获取数据库行锁后、第一条写入前,把目标 MiaoguoBook、HanziUnit、Words 的完整旧数据写入 backups/。之后才执行更新;任一写入或提交前逐字段核验失败,整个事务回滚。
node .vscode/秒过知识库更新/update_knowledge_base_2026_fall.mjs --audit
语文园地、英语每单元首末词。后续批次复制源文件和脚本并修改年份、图片范围及书籍映射:
# 只读预检:校验最终名单、迁移、脱册、行数和元数据
node .vscode/秒过知识库更新/update_ancient_daily_2026_fall.mjs --dry-run
# 生成完整备份后,在单个事务中更新并做提交前审计
node .vscode/秒过知识库更新/update_ancient_daily_2026_fall.mjs --apply
# 事务提交后的独立审计
node .vscode/秒过知识库更新/update_ancient_daily_2026_fall.mjs --audit
--apply 必须保证:没有 DELETE;所有来源条目逐字段匹配;每册 Sort=0..N-1;脱册记录的 HanziBookID=0;目标书和供体书的 WordNum 等于实际行数。执行后再次运行 --dry-run,应得到全部变更计数为 0,以证明脚本可幂等复跑。
对于每本语文书,程序按以下优先级映射新版单元:
INSERT;所有复用的旧行保留原 ID 和原 IsLocked。新增行默认 IsLocked=1。所有目标行都重新写入连续的 OrderID=1..N。
AncientPoetry.ID 更新,保留原主键。INSERT。HanziBookID=0,禁止 DELETE,其他正文信息继续保留。Sort=0..N-1,不能依赖自增 ID 或旧数据中大量相同的 Sort=0。Example/entries 重新计算出的数量等于声明的 wordNum。MiaoguoBook.BookIDOld 与源文件一致。HanziWord.Name 找到;缺字时阻止写库。OrderID 从 1 连续到 N 且无重复,逐行 UnitType/Name/Example 与源文件完全一致。Word/LessonID/LessonName/Soundmark/Translate/Sort 与源文件完全一致,未提供字段仍为 NULL。MiaoguoBook.UnitNum/WordNum 与最终数据一致。HanziUnit.ID 在更新后仍然存在。PeomContent 均为合法 JSON。HanziBookID=0;供体书 WordNum 与迁出后的实际行数一致。--apply 都会生成唯一时间戳备份,绝不能覆盖上一次备份。ID 做 UPDATE;本次新增行如何处理必须根据线上引用情况单独确认,不能盲删。BookID 重建为备份内容,同时恢复对应 MiaoguoBook.UnitNum/WordNum。词语表中的每个最终词语还依赖 MiaoguoLiteracy。维护时不能只更新 HanziUnit.Example,还必须检查线上接口实际会取到的 JSONString 是否具有可用的 CHN:
node .vscode/秒过知识库更新/audit_miaoguo_literacy_2026_fall.mjs
检查范围应覆盖新版词语表的全部最终词语,并标记相对旧版新出现的词语。检查逻辑与 GetMiaoguoLiteracyWords 保持一致:排除 SearchType=shici/eng,按 Word,SearchType DESC 选取每个词的首条记录。以下情况都视为缺失并在写入前列清单:
JSONString 为空或不是合法 JSON;JSONString 中没有 CHN;CHN.PinYin[0].pinyin/explain 不完整,现有接口无法使用。缺失词语需要在 MiaoguoLiteracy 新增一条 SearchType=zici 的记录。可以选择语义和结构相近的已有词语作为模板,但必须按新词真实内容修改 Word、拼音、释义、组词、近反义词等字段,不能只替换顶层 Word。新增前先生成清单和拟写内容供人工复核;确认后再备份、事务插入并重新运行本检查,直到缺失数为 0。
本次补录程序的标准命令如下;后续批次复制脚本和源文件并修改年份:
# 只生成完整 JSONString 和写入计划
node .vscode/秒过知识库更新/update_miaoguo_literacy_2026_fall.mjs --dry-run
# 备份后事务插入,并在提交前后检查全部新版词语
node .vscode/秒过知识库更新/update_miaoguo_literacy_2026_fall.mjs --apply
# 独立复查新增行和全部新版词语
node .vscode/秒过知识库更新/update_miaoguo_literacy_2026_fall.mjs --audit
补录程序从 HanziWord 复用每个汉字已有的楷体图和笔顺动画。每条新增记录至少要有 ENG、CHN.HanZi、非空的 CHN.PinYin[0].pinyin/explain、与字数一致的 KaitiArr/BiShunArr2、Synonym/Antonym、TianKong/PinyinTone。
MiaoguoBook.WordNum 不足以证明数据正确,必须从实际 Example/entries 重新计数。OrderID=0,不能继续依赖自增 ID 排序;本次起统一写连续 OrderID。语文园地 同名是正确数据,不要为“唯一”而擅自编号。MiaoguoBook.WordNum 也会减少。Sort 历史数据常全部为 0;必须按本批次最终清单重新生成连续值。MiaoguoLiteracy 同一个词可能同时有 zici 和 list 等记录;低优先级 list 没有 CHN 不一定影响词语题,必须按线上查询排序判断真正选中的记录。source_chinese_2026_fall.json:2026 秋季语文 8 套结构化源数据。source_english_2026_fall.json:2026 秋季英语单词表和常用表达法源数据。update_knowledge_base_2026_fall.mjs:校验、计划、备份、事务更新、审计程序。dry_run_report_2026_fall.json:写库前更新计划和 ID 映射。apply_report_2026_fall.json:实际事务、备份位置及提交前后审计。audit_report_2026_fall.json:提交后的独立审计结果。audit_miaoguo_literacy_2026_fall.mjs:词语依赖的只读检查程序。MiaoguoLiteracy缺失清单_2026年秋季.md、miaoguo_literacy_audit_2026_fall.json:本批次补录前缺少可用 CHN 的历史快照。MiaoguoLiteracy依赖检查_2026年秋季.md、miaoguo_literacy_dependency_audit_current_2026_fall.json:运行只读检查时更新的当前状态报告。source_miaoguo_literacy_2026_fall.json:缺失词语的拼音、释义、英文释义和近反义词源数据。update_miaoguo_literacy_2026_fall.mjs:构建完整 CHN、备份、事务补录和全词表复查程序。miaoguo_literacy_dry_run_2026_fall.json:20 条补录数据的写入前预览。miaoguo_literacy_apply_report_2026_fall.json:补录 ID、完整 JSONString、事务前后审计和备份位置。miaoguo_literacy_post_apply_audit_2026_fall.json:补录后的独立审计报告。MiaoguoLiteracy补录结果_2026年秋季.md:20 条补录词语的人工复核表。source_ancient_daily_2026_fall.json:六册古诗文、现代背诵课文和日积月累的最终结构化源数据。update_ancient_daily_2026_fall.mjs:古诗文/日积月累的校验、迁移、脱册、备份、事务更新和审计程序。dry_run_ancient_daily_2026_fall.json、apply_ancient_daily_2026_fall.json、audit_ancient_daily_2026_fall.json:对应的预检、执行和独立审计报告。research_ocr_2026_fall.json、research_db_snapshot_2026_fall.json:本次只读调研的 OCR 与数据库快照。古诗文与日积月累调研清单_2026年秋.md、古诗文与日积月累更新结果_2026年秋.md:人工确认清单和最终结果。2026年秋季更新结果.md:便于人工复核的最终清单。backups/:每次执行前的数据库完整备份。