` 由客户端 JS 从 `noteContent` 还原注入,静态 HTML 残缺不可信):`parseSection` 改为只探测有无 ``(判 type)、不再采其内容,`code_demo` 恒置 NULL(代码留 P2 由 LLM 补+人工跑);源清单剔除软文页 `first-ai-agent.html`、补入 3 个概念页;另修 `htmlToText` 漏归一化 `\r` 导致代码混进正文 |
| 2026-10 | **P1 章节筛选落地**:新增 `db/seed/ingest-filter.json` 按页编码人工 A/B/C 分级(drop 剔除跨页重复/纯复述、merge 子节要点并入父题、keep 保留出题),`ingest-articles.js` 加载并应用筛选(未命中项告警);首场景 4 页 55 题经筛→ **30 道精选题**,真实 schema 事务验证 `logic` JSON_VALID 30/30、`code_demo` 全空、回滚零残留;P1 下一步逐节接百炼 qwen3.8-flash 改写出题(需 `DASHSCOPE_API_KEY`,已入 `.env.example` 与方案第九节) |
| 2026-10 | **P1 改写出题落地(无 key 手工路径)**:`ingest-articles.js` 新增 `--llm`(百炼改写)/`--dry`(提示词预览)/`--from-json`(把人工改写的严格 JSON 渲染为 draft SQL)三种模式;因当前无可用的 `DASHSCOPE_API_KEY`,首源 `runoob-ai-agent` 的 30 道规则粗题改由人工逐条改写(问句化题面 + 结构化答案 + 剥离代码),并对 module 35 现有 60 题语义查重→ 精选 **19 题**(13 互补 + 6 入门改写)导入 draft、经 `/admin` 人工审核全部 `confirmed`;产物见 `db/seed/ingest-manual.runoob-ai-agent.json` 与 `questions.llm.draft.runoob-ai-agent.sql`。**适用边界实测结论**:代码密集型教程(如 runoob Vue2)因 runoob 代码抽不到 + 存量题已覆盖而性价比极低,不纳入自动摄取 |
| 2026-10 | 教程→题卡摄取 **P0/P1 全量并入 `master`**(`--no-ff` 合并,`feature/ingest-articles` 特性分支本地+远程已清理) |
| 2026-10 | 新增设计稿 [`docs/review-engine-plan.md`](./docs/review-engine-plan.md):**间隔重复记忆引擎**(SM-2 起步→FSRS 二期,`review_schedule` 到期排期表 + 今日复习/评分/统计接口 + 双端离线合并)与其**共用的「最小账号体系」地基**(`user` 表 + 游客 `user_key` 认领,`answer_log`/错题本零迁移);`payment-plan.md` 悬置的「权益跟谁走」据此定稿、复用同一地基。**均为仅设计、未落地** |
| 2026-10 | **最小账号体系地基落地(increment 1,仅 server + db)**:`db/schema/migrations/0001_add_user.sql` 新增 `user` 表(`user_key`/`identity` 双唯一、`pwd_hash` scrypt、`status` 软封);`core/auth.js` 加 `issueToken(sub,{role})`+`roleOf()`+scrypt 散列/校验(零新依赖);新增 `modules/user-auth`(`POST /auth/register`、`POST /auth/user/login`、`POST /auth/claim-guest` 游客认领零迁移、`GET /auth/me` 按角色分流);**角色闸与安全同批**:`enforce()` 由「任何有效票放行写面」改为「非管理票只能命中用户级写名单」,整库导出 `requireAuth`→`requireAdmin`(防注册用户越权改题/拖全库)。18 项启动冒烟全绿(含用户票写题/导出的 403 越权拦截);web/mobile 消费与记忆引擎待后续 |
| 2026-10 | **web 新增个人中心页 `/me`**:身份卡(昵称 / 标识 / 票归属 / 到期 / 认领与退出)+ 成绩墙 + 近 14 天作答趋势 + 模块分布前 8 + 最近流水 + 错题待复习;配套 server 只读接口 `GET /api/stats/me`(汇总 / 趋势 / 模块分布 / 最近流水四组一次回齐,`days` 与 `limit` 走 `clampSize` 钳制);趋势日期骨架由 MySQL 递归 CTE 生成(避开进程与库时区错位导致的头尾多一天),正确率与 `/stats/overview` 同口径且把「已自评条数」单列下发;`stores/me.ts` 以「请求时的身份」而不是布尔作已加载标记,换账号/退出后自动重拉。web 单测 9 文件 **103 例**。 |
| 2026-10 | **web 新增技术栈脑图页 `/map`**:把 7 个分类 / 35 个技术栈 / 全库题卡画成一张可折叠目录(根 → 分类 → 模块 → 题目),点题目直接进看书模式定位该题。画布用 **mind-elixir 5.15.1**(MIT、框架无关,依赖写死版本 —— 该包 `latest` 目前指向 `6.0.0-next.x` 预发布),`/map` 路由懒加载,库与库样式只进这个 chunk。分层与懒加载:首屏只铺 43 个节点,点模块 `+` 才拉 `GET /api/questions?moduleId=&status=confirmed&pageSize=100`(后端上限就是 100),一模块一条请求、并发去重、收起再展开走缓存;首屏之外还有题时补一个「还有 N 题 · 点此进看书模式」节点,不让模块悄悄少题;未拉 / 加载中 / 失败各有自己的占位子节点(`metadata.action` = `load` / `retry` / `more`),失败原地重试 —— 没有 children 就没有展开箭头,失败渲染成空又会被读成「这个模块没题」。只读与交互:`editable / contextMenu / toolBar / keypress` 全关 + `allowUndo: false`(全站唯一写入口是录入后台,画布能拖能改却没有持久化通道等于让人白改);点击走事件委托读 `[data-nodeid]` 元素上的 `nodeObj.metadata`,因为库的 `selectNewNode` 只在键盘导航时触发,鼠标点击没有等价事件。三处浏览器实测才暴露的问题一并修掉:① 首屏 100% 时左右两翼被 `overflow: hidden` 裁掉 → 建实例后 `scaleFit()` 到一屏;② 展开 84 题后整棵树被顶到视口下方 —— `refresh()` 改了画布自然尺寸却不重算 translate,现每次重排先 `toCenter()`,再按模块题目标签量一次即时平移 `move(dx/scale, dy/scale)`(`scrollIntoView` 拿的是含整棵子树的 `me-parent` 矩形,且 300ms 过渡会吞掉连续两次调用);③ 52% 下 12px 题面只剩 6px 高读不了 → 展开后回到 100% 再居中。可测部分:树装配抽成纯函数 `utils/mindmap.ts`,跨页状态(题目缓存 / 加载态 / 展开与分类收起集合)全部落在 `stores/map.ts`,新增单测 14 例(装配 9 + store 5,并发只发一条请求、失败不落缓存、force 可覆盖错误态均有断言),web 单测 11 文件 **117 例**(约定见 `web/README.md` 的「技术栈脑图」) |
| 2026-10 | **封板终检 `seal-2026-10-27`**:把「封板后只加数据」这条路真跑了一轮并写成章节(新增 📦 一节)—— 走 API 录草稿 → 确认 → 查各级计数 → 删除复原:Linux 模块 `confirmed 84 → 85`、全库 `3370 → 3371`、`GET /api/questions?status=confirmed&pageSize=100` 回包含新题、脑图头部与根节点同步显示 3371、画布上 Linux 变 85 题且新题就在首屏,删除后复核回到 3370;题号按模块内 `MAX(card_no) + 1` 续排,删过题的模块会跳号(实测新题显示 `#91`)属预期。数据体检:35 模块 / 3370 已确认 / 草稿 0 / 零确认题模块 0。同时修掉一处「只加数据也会踩到」的缺陷:脑图分类配色原按分类在模块列表里的出现顺序取色,改任一模块 `sort_order` 或新增分类会把后面整片分类换色,现按分类名排序稳定取色(`categoryColorMap`),web 单测 11 文件 **120 例** |
---
## 👨💻 作者
**Forever 丿顾北-Byte**
- Gitee: [template-warehouse](https://gitee.com/template-warehouse)
---
**Code Notes KB** · 一端录入 · 三端同源 · 持续更新