成都小升初规划
这个技能生成一个马卡龙浅色风格的单文件 HTML 看板,共 22 个页签,左侧导航分为五组:
| 分组 | 页签 |
|---|---|
| 目标 | 🧒 我的孩子(默认首页)、总览、摸底测评、目标学校库、招生政策 |
| 路线 | 冲刺路线、知识点体系、课本对照、课外掌握 |
| 训练 | 母题库、题库、英语词汇进阶、刷题与错题、🎒 家庭作业 |
| 出卷 | 🧾 出卷、✅ 批改、🌈 成长分析 |
| 资源 | 书籍清单、🏮 古诗词、✍️ 优秀作文、📰 报刊与真题、资料库 |
内容都放在 data/*.csv 里,构建时由 build/build.py 打包进 index.html。孩子的学习数据默认存在浏览器本地;在页面上「连接数据文件夹」后,会自动写回 CSV。
参考文件
- 数据表字段、分隔符、占位符与日期推算:@references/data-schema.md(改数据前必读)
- 75 种知识点动画的类型与参数:@references/viz-types.md
- 对话示例:@references/examples.md
- 面向家长的使用指南(交付时可一并提供):@references/user-guide.md
目录说明
templates/ 平铺存放看板模板(WorkBuddy 只允许两级目录),包括:
- 11 个构建源文件:
- shell.html、style.css
- JS 七件:viz → app → paper → grow → res → child → boot
- build.py
- version.txt:版本号,构建时写进页面的
<meta name="skill-version">和页脚 - 37 张明文 CSV(题库 qb 除外)
- 题库还原器:
qbgen.py、qbgen_math.py、qb_rest.csv、qb-sha256.txt - 一键脚本
new-board.sh
为什么题库不直接放 qb.csv: SkillHub 禁止上传二进制文件(.gz 也算),而技能包解压后不能超过 3MB,明文 qb.csv 一张就有 3.3MB。题库里「对标·高思课本 / 高思导引 / 奥数精讲与测试」由 qbgen_math.py 按固定随机种子生成,「对标·小托福 1800 词」由 vocab.csv + vocab_grp.csv 按固定规则派生,都能逐字复现,所以包里只放生成器;其余手写或改写过的 1740 道题放在 qb_rest.csv(_pos 列:H=排在生成题之前,G=覆盖同 id 的生成题,T=排在之后)。scripts/new-board.py 生成看板时会自动还原出 data/qb.csv(11532 题),并用 qb-sha256.txt 校验与发版时逐字一致,对不上就报错退出。
改题库: 改手写题,就改 qb_rest.csv;改生成题,就改生成器,或者在 qb_rest.csv 里加一行 _pos=G、id 相同的覆盖行。改完必须重新跑 release.py,指纹才会刷新。不要在 templates/ 里放 qb.csv,否则 release.py 会报错。
scripts/new-board.py 生成看板时,会把这些文件还原成 build/ + data/ 的项目结构。生成后会自检:页面版本号必须等于 templates/version.txt,22 个页签必须齐全,否则直接报错退出。
只能用本技能目录里的模板。 用户电脑上可能还留着以前生成的 index.html(例如 v1 时期 14 个页签的版本),一律不得拿来交付,也不得拿来当模板改。判断方法:打开文件查 <meta name="skill-version" content="…">,没有这个标记,或者版本号低于本技能,就是旧页面。
不要直接改 templates/ 里的文件来改某个孩子的看板,要改生成出来的项目目录。
JS 模块共用一个闭包:app.js 打开 IIFE,boot.js 关闭它。新模块只能插在这两者之间,并同步改 build.py 和 new-board.py 里的文件清单。
内置内容(v2.0)
| 内容 | 数量 | 说明 |
|---|---|---|
| 题库 qb | 11532 | 自编·六年级同步 90(负数、圆柱圆锥、扇形统计图、小说阅读、观点表达、时态综合)、对标·高思课本 1942、对标·高思导引 2271、对标·奥数精讲与测试 1691、对标·小托福 1800 词 3900、自编·语文同步 774、自编·综合素养 329、自编·英语语法 320、自编·英语阅读 147(含 KET/PET 读写 68)、母题配套 68 |
| 题型 qb.type | 6 种 | 填空 9993、单选 656、解答 366、判断 265、多选 116、写作 46;另有 psg 字段关联阅读材料,fig 字段关联图文 |
| 阅读材料 passage | 58 篇 | 供阅读理解大题和图文题使用 |
| 英语词汇进阶 | 4561 词 / 240 组 | KET(A2)1200 词 / 60 组 → PET(B1)1561 词 / 80 组 → 小托福 1800 词 / 100 组;全部是自编句组 |
| 知识点 kp | 170 | 1上–6下,数学 / 语文 / 英语 / 综合,每条带动画解读;六年级 13 条 |
| 学校库 schools | 50 | 中心城区(锦江、青羊、金牛、武侯、成华、高新、天府)头部公办、教育集团校区与民办+郊区新城与远郊各 1–2 所;公办 42、民办 8;官网只填可核实的学校或教育部门页面 |
| 路线节点 route_nodes | 68 | 4 条路线 × 17 个学期节点(1上–6暑),闸口在 5上 / 5下 / 6上 |
| 招生政策 | 5 张表 | 小升初 10 条、中考 7 条、推论 4 条、日历 6 条、区(市)县差异 23 条 |
| 摸底题池 diag_pool | 756 | 1–6 年级 × 语数英,每个池子 42 题;每卷 12 题(基础 6 + 能力 4 + 拓展 2),满分 100 |
| 古诗词 poems | 91 首 | 1–6 年级上下册。每首有逐句译文、字词注释、赏析、记忆法、易错字音、名句,配场景动画舞台(7 种意境),支持 TTS 跟读逐句高亮、挖空填空挑战 |
| 优秀作文 essays | 70 篇 | 中文 50 篇、英语 20 篇;自编示范文,附点评、写法要点和好词好句高亮 |
| 报刊与真题 media | 32 项 | 中文报刊 9、英语报刊 9、数字图书馆 8、奥数真题 5、学习平台 1;只给官方入口 |
| 书籍 books | 21 本 | kind 取 正版购买 / 公版全文 / 官方免费;ebook 字段只放公版或官方免费链接 |
题目的生成口径:
- 数学题由参数化模板自编,答案由程序计算,并做过暴力验算。
- 题目按原书的「年级 × 专题 × 难度」体系对标,不复制原书题目,也不对应原书讲次。
- 成都是六三制(小学 6 年 + 初中 3 年),六年级仍是小学。6 年级的知识点,kp.gr 记为
6上/6下;对应的题目,qb.gr 记为 6。
核心功能的实现要点(改功能前先看)
① 我的孩子(child.js)
- 360° 画像: 由 8 维雷达、六色掌握色谱、16 周活跃日历、连续学习天数和今日待办组成。数据全部从页面操作实时计算,包括:知识点自评、摸底成绩、日常卷批改、题库“做对”、错题复习、任务打卡和作业完成。
- 学习规划: 由本地规则引擎生成,流程如下。
- 先把家长输入的目标拆成若干词条。
- 再与知识点做模糊匹配。中心词有约束:对 4 个字以上的词条,知识点的名称和描述必须含该词条的前两个字,否则匹配分减半。
- 然后自动补前置知识点(同模块里更早学、且掌握度不足 75% 的知识点)。
- 最后按周排程。每周的条目会链接到知识点抽屉、母题、题库筛选和专项卷。
- 规划可以保存、更新和勾选进度。
- 「📋 复制 AI 提问词」会把上下文拼成提问词复制到剪贴板,家长把 AI 的回复粘贴回来,页面按“第 N 周:…”的格式导入。
- 任务: 分为长期计划、每日任务和待办三类。每日任务按日期记打卡日志,并计算连续天数。
- 家庭作业:
- 录入时一行一项,按关键词识别学科;如果某一行只有学科名(例如“数学”),它下面的行沿用这个学科。
- 可以拍照,用 OCR 识别文字填进文本框,家长核对后再录入。
- 「训练 › 家庭作业」页按日期分组列出全部作业。
② 日常出卷(paper.js)
- 可自定义的项目:
- 8 种题型:单选、多选、判断、填空、看图、阅读、解答、写作。
- 每种题型可以开关、改题量(0–60)、改每题分值、上移下移。
- 难度配比(L1 / L2 / L3)。
- 题目顺序:分题型由易到难、题内随机、全卷混排。
- 限定知识点、自定义标题。
- 「⚖ 自动调到 100 分」。
- 组卷规则:
- 数学的单选和判断由数值型填空题派生,生成的干扰项与正误陈述一并存进试卷。
- 阅读理解按材料成组抽题。
- 当前年级的题不足 12 道时,自动放宽到相邻年级。
- 打印: 试卷样式复用摸底卷的
.paper样式。 - 默认分值配置: 各科默认都是 100 分。语文的「解答」默认 0 题,因为语文解答题都挂在阅读材料上,并入阅读理解。
③ 批改(paper.js)
- 录入孩子答案有三种方式:拍照 OCR、粘贴文本、在表格里逐题手填。
- 「按题号填入答案」:用
parseAns解析“1.A 2.对 3.36”这类格式,客观题自动判分。多选和多空填空给部分分。 - 家长也可以逐题勾 ✔ / ✘,或手改得分。
- 保存时:未满分的题按
addWrong(id,"日常卷")进错题本;满分的题记为“做对”。成长分析随之刷新。
④ 成长分析(grow.js)
- 掌握度 = 自评(权重 2)+ 证据(每条权重 1)。证据来自四处:摸底逐题、日常卷逐题得分率、题库“做对”、错题(已攻克算 0.8,未攻克算 0)。
- 六色分档: 未测 / 陌生 / 薄弱 / 一般 / 良好 / 熟练,分界点为 <40%、<60%、<75%、<90%、≥90%。
- 视图: 径向知识图谱(孩子 → 学科 → 模块 → 知识点,点节点打开知识点抽屉)、学科雷达、模块网格、成绩趋势,以及薄弱 Top 10(每项可「去练」或一键出「专项卷」)。
⑤ 资源(res.js)
- 古诗动画用 emoji 场景元素、渐变天空和飘落粒子,配合逐句淡入,不依赖任何外部素材。
- 跟读使用浏览器的 speechSynthesis(zh-CN);浏览器不支持时,退回定时逐句高亮。
⑥ 题库(app.js)
- 每页 60 题,底部是数字分页:首页、上一页、页码窗口、下一页、末页,外加跳页输入框。不用“加载更多”。
- 筛选条使用
chips()的.frows布局:每类筛选一行,标签列定宽,左侧对齐。
当用户要为孩子新建规划看板时
- 收集信息,没说的直接用默认值,不要逐项追问。
- 昵称:宝贝。只收昵称,不要真实姓名、证件号、手机号。
- 当前年级(1–6):3
- 小学名称:可以为空
- 公办 / 民办:民办
- 所在区(市)县:武侯区(可选 23 个:中心城区 5 区、高新区、天府新区、东部新区、郊区新城与远郊 15 个)
- 班级水平:中等
- 路线:C - 推荐路线,用一句话说明理由。
- 班级中等选 C 综合稳健线。
- 数学突出看 A 竞赛线,英语突出看 B 外语线。
- 班级中下选 D 校内稳进线。 - 生成看板:
python scripts/new-board.py <输出目录> --name 小明 --grade 3 --school 某某小学 --nature 民办 --district 武侯区 --level 班级中等 --route C
也可以一步完成生成和测试:bash templates/new-board.sh <输出目录> --name 小明 --grade 3 - 冒烟测试: 运行
node scripts/smoke-test.js <输出目录>/index.html,最后一行必须是bad 0。测试会走通以下流程:
- 全部抽屉
- 摸底批改
- 题库分页
- 四科出卷与自定义
- OCR 批改与错题入库
- 成长分析
- 古诗与作文抽屉
- 规划、任务和作业的 OCR 录入
没有 Node 的环境可以跳过这一步,但要告诉用户没做页面测试。
运行不了 Python 时: 本技能必须用 Python 3.8+ 生成看板(题库要现场还原)。技能包里不带成品页,因为成品页约 4.9MB,超过上限,压缩后又是二进制。请告诉用户先安装 Python,或者在能运行 Python 的环境里生成好再把 index.html 发给他。不要自己手写或拼凑 HTML。
5. 交付。 把 index.html 和 data/ 交给用户,并讲清下文「交付时必须告诉用户」的五点。
当用户要修改或扩充看板内容时
- 先读 @references/data-schema.md。
- 直接编辑对应的 CSV:
- 新增知识点改kp.csv,并从 viz-types.md 里挑一个动画类型;
- 题目改qb.csv:type 决定能进试卷的哪个大题;阅读题要同时在passage.csv里建材料,并在psg字段填材料 id;
- 古诗改poems.csv:body 与 trans 用|逐句对齐,句数必须相等;
- 报刊改media.csv;
- 作文改essays.csv。 - 运行
python scripts/check.py <项目目录>,全部通过后再运行python <项目目录>/build/build.py。 - 运行冒烟测试,要求
bad 0。
当用户要改页面功能或视觉时
- 骨架与锚点: 页面骨架在
build/shell.html。元素 id 是各 JS 模块的锚点,改名要两边同步。动态渲染出来的 id(如#plGoal、#grTxt、#hqTxt)写在 JS 模板字符串里。 - 布局: 内容区不设最大宽度,随屏宽铺满。不要给
main加 max-width。 - 配色: 马卡龙色板变量是
--pink/--mint/--sky/--lav/--butter/--peach,每个都有对应的深色--xxxD。不要引入深色主题。 - 测试钩子:
boot.js暴露了只读的window.__T,供冒烟测试读取内部状态,不影响页面行为。 - 验收: 改完运行 build 和冒烟测试。没有真实浏览器,视觉效果必须请用户截图确认。
当要发布新版本(改了模板、数据或功能)时
- 把版本号同步改到三处:
-SKILL.md的version
-templates/version.txt
-CHANGELOG.md最上面的## vX.Y.Z - 运行
python scripts/release.py <输出目录> [--demo <示例看板目录>]。脚本会依次:
- 检查这三处版本号是否一致;
- 用当前模板现生成一份看板,跑校验和冒烟测试;
- 先把题库还原一遍,刷新templates/qb-sha256.txt;
- 逐个检查进包文件必须是 UTF-8 文本、不含 NUL 字节(SkillHub 禁止二进制),排除一切.gz;
- 检查解压后总大小是否小于 2.9MB(上限 3MB),超了直接报错;
- 打包出.zip和.skill。
任何一步失败都会中止,不会出包。不要手工压缩打包,否则题库指纹可能是旧的,生成看板时会报错。
3. 上传到 SkillHub 时,要在原 skill 下面发新版本,name 不能改。版本说明从 CHANGELOG.md 摘取,并附上「老用户升级须知」。
口径铁律(不能违反)
- 不编造。 学校官网查不到就留空,页面会给出搜索入口并标“待核实”。政策细则标“待核实”。
- 年份和称呼一律用占位符
{XSCY}{ZKY}{NAME}{NATURE}{DIST},不要写死年份。 - 著作权:
- 现代课文只写梗概,并链接国家中小学智慧教育平台。古诗和小古文属于公版,可以给全文。
- 不下载、不搬运受版权保护的电子书。 书单的ebook字段只放两类链接:公版全文(Project Gutenberg、维基文库、中国哲学书电子化计划等)和官方免费平台。其余书籍一律标“正版购买”,给正规购书渠道。
- 报刊只给官方入口,不转载报刊内容。 - 题目和作文全部自编。 页面必须保留“非原书题目、非任何学校真题”的声明。不得把教辅原书或真题的内容成段录入,原书请自购。
- 奥数真题只链接官方或公开发布方(如 AoPS Wiki、MATHCOUNTS 官网)。
- 竞赛以教育部年度白名单为准。 - 成都义务教育阶段公办、民办一律免试入学:公办单校或多校划片,民办与市直属学校各限报 1 所、超额一律电脑随机录取,不得考试选拔。 不写“考进某班”“保进”“提分”“选拔”这类表述。
- 隐私:
- 只收昵称。
- OCR 在浏览器本地识别,图片不上传。
- 页面里的 AI 规划只是“复制提问词”,由家长自己决定发给哪个 AI。 - AI 不代替家长做决定,也不代家长确认任何付费。 订阅类报刊只给官方入口。
交付时必须告诉用户
- 写回 CSV: 用本地文件方式(file://)打开的网页不能静默写硬盘。要写回 CSV,须用 Chrome 或 Edge 点「📂 连接数据文件夹」并授权;每次打开页面都要再点一次授权。
- 改了内容 CSV 后: 已连接文件夹的,刷新页面即可;没连接的,重新运行
build.py。 - OCR 拍照识别: 首次使用要联网,从 cdn.jsdelivr.net 下载 tesseract.js 和中英文字库(约 20MB)。手写体识别率有限,识别结果必须人工核对。离线时改为手打或粘贴,也可以逐题勾选。
- 学习规划: 由本地规则引擎生成,覆盖不到的目标请用「📋 复制 AI 提问词」交给 AI 细化。
- 重新评估: 路线、闸口、冲稳保名单都是初版。到 5 上、5 下、6 上三个闸口,要按摸底成绩和成长分析重新评估。
已知坑
- 分隔符: 列表字段有
|和空格两种分隔符,混用会导致关联丢失。 - 组卷题量:
- 摸底题池每个“年级 × 学科”少于“基础 6 + 能力 4 + 拓展 2”道题时,组不成卷,
check.py会报错。 - 日常卷某题型题量不够时,按实际能抽到的题出卷,并在试卷上方列出短缺项。
- 渲染量: 题库有 1.1 万行,页面一律分页渲染。不要一次性渲染整个 qb。
- 浏览器兼容: 不要用正则后行断言
(?<=…),旧版 Safari 会直接整页空白。 - 加载时机: 模块顶层不能直接读
P()或G(),因为档案要在 boot.js 的loadStore()之后才加载。paper.js 用ensurePc()懒初始化,就是为了避开这个问题。 - 旧页面冒充新版: 技能更新后,用户已经生成的看板不会自动升级。升级方法见 CHANGELOG.md 的「老用户升级须知」:重新生成看板,再复制 6 张孩子数据 CSV。看页脚的「vX.Y.Z · 页面构建于…」就能确认版本。
- 冒烟测试的局限:
scripts/smoke-test.js用的是手写 DOM 桩,不验证视觉效果。它的事件派发会广播给所有带参数的onX处理器,新写的处理器要用closest("[data-xxx]")精确判断事件目标。