这是一个本地运行、可安装到手机主屏幕的汉字书写恢复工具。当前目标是 Pre-App 阶段的高保真功能合流版:先把真实记忆逻辑和高保真核心体验打磨成可连续自测的 PWA Beta,再决定是否进入原生 App / TestFlight / App Store。
index.html:产品主页面(界面与逻辑,约 120KB)。deck-data.js:内置题库数据(SEED 词卡 + GROUPS 部件分组,约 1.9MB,由生成脚本产出,勿手改)。hanzi-writer.min.js:汉字笔顺渲染库。data/:Hanzi Writer 的单字笔画数据。scripts/:生成数据和验证页面的脚本。generated/:当前生成出的 8105 字覆盖率报告和 6854 个可写候选字结构化结果。sources/:生成脚本依赖的原始字表、字频和词典数据。CHANGELOG.md:按版本记录产品逻辑和 UX 调整。requirements.txt:生成脚本需要的 Python 依赖。
当前界面已经接入设计师新版高保真方向:整体视觉从工具面板改成「宣纸 × 朱砂印」的产品语言,首启页直接讲清楚“提笔忘字”的场景,首页只保留一个“拾”印章作为开始入口。核心数据仍来自真实字库、记忆模型、复习调度和本地存储,界面改版不改变题库和记忆模型的底层逻辑。
练习卡的题面是「词语挖空+拼音」:其他字给出语境,缺的字只显示拼音,避免同音字歧义,也不会把答案泄在题面上。两条结束路径:写出来了点「写好了」,不会写时点「看答案」。揭晓后同屏展示「你写的」和「标准字」,并用四枚印章完成自评:拾到=会写,补拾=看提示写出,差点=写错了,回炉=不会写。新用户第一组校准时会把「会写 / 看提示写出 / 写错了 / 不会写」放在按钮主视觉,印章词作为小字解释;熟悉后再恢复印章词主视觉。盖章后会明确提示系统把这次记成了什么,并提供 3 秒「改一下」窗口,避免误点污染记忆模型。前三枚章会把字收进字盒;回炉会放回口袋,安排更近的复习。
「笔顺提示」是辅助按钮:播放时淡化用户笔迹避免重叠,播完自动恢复,全部提示用完也不会强制进入自评——写不写完、什么时候自评由用户决定。练习是全屏专注场景:底部 Tab 在练习中收起,卡片顶部有退出本组(确认后当前这张不记录,已自评的保留)和「+加字」。题目质量反馈(太简单 / 太生僻 / 词不自然 / 不想练)只在揭晓后出现。写字板只保留自然手写输入,避免把桌面鼠标兼容开关暴露给正式用户。
点「写好了」揭晓的瞬间会做本地自动比对(毫秒级、离线):笔画数相同走逐笔配对精判(位置/端点/长度,能抓「未/末」这类形近),笔画数不同走整体覆盖度判定(距离+方向双重检查)——连笔、断笔不影响判对,这是手机手指书写的常态。产品上把它称为「对照助手 / 系统建议」,只会提示“可能少写了一笔”“可能有几笔没到位”,不会替用户判分;最终仍由用户盖章决定。系统会记录建议和用户自评是否一致,供后续校准算法边界。已知极限:或/戒、日/曰这类墨迹高度重叠的形近对可能放过(宁可放过形近,不误伤写对的人)。比对绝不在书写过程中提示对错(写一半就反馈等于泄题),「看答案」路径也不比对。
当前练习节奏:每组 15 个字。脚本会从通用规范汉字表一级、二级、三级共 8105 字中检查 Hanzi Writer 笔画覆盖,保留可写且分组校验通过的 6854 个候选字,并给每个字生成语境主题、成人回忆难度分和规范等级。生成阶段仍保留内部五级标签用于抽题,但用户侧统一展示为「简单 / 中等 / 难」三档。前端默认跳过过于简单和语境待补的字,优先把同一主题里的中高难度字排在同一组里;三级字只在“偏挑战”且语境可用时进入新题池。
页面会在浏览器本地记录个人记忆状态:会写、看提示写出、不会写、写错了。后三类会更快进入复习,会写的字会延后再出现。首页负责开始今日一组;字盒负责承接练过的字、到期复习和回炉字;我的页负责统计、易错分析、出题偏好和内部工具。
“手感诊断”会根据本地练习记录,先给出“今天先补什么”的行动建议,再汇总用户容易卡住的主题、能力难度、字形结构和具体错题。里面的主题、难度、结构和单字都可以点击,直接进入专项练习。字第一次进入错题本时会有 toast 提示,让「标记看提示写出/不会写/写错了 → 自动进错题本」这条链路可感知。
复习调度会综合最近反馈、卡住次数、掌握度和是否逾期来排序;“不会写”“写错了”和“看提示写出”会进入更短间隔,“会写”会按掌握度延后。
新用户第一次点击「先练 15 字」会进入一组轻校准题,首页会提示“先用 15 个字估一下难度”。题目按中等到高难阶梯展开,并根据本组反馈自动设置初始出题偏好和个人难度偏移。已有练习记录的用户不会被重新打断。
每组 15 字内部会做会话内自适应:连续“会写”会把后续新字推向更高难度,“看提示写出”和“写错了”小幅回退,连续“不会写”才明显降级。每组结束后还可以标记“太简单、刚刚好、太难、词不自然”,这些整组反馈会持久化为个人难度偏移和语境严格度,下次打开仍然生效。
首页可以切换出题偏好:高频易忘、偏实用、偏挑战。每张题卡也可以标记题目质量:太简单、太生僻、词不自然、不想练。这些反馈不会覆盖记忆反馈,而是用于调整后续候选池和难度排序。题目质量反馈是开关,点一次记录、再点一次取消;「不想练」不会立即跳题,避免误触造成数据偏差。
底部导航是 3 个 tab:练习 / 字盒 / 我的。
- 练习:首页,一个极简 launcher——问候语 + 一个大印章「拾」+ 昨日拾得。新用户先进入 15 字校准;老用户有到期先复习、否则练新字。
- 字盒:练过的字都收在这里,按全部、回炉中、已稳筛选;到期字会在顶部形成复习入口,单字可点击专项练。
- 我的:统计(已拾回 / 连续天数 / 回炉中)、手感诊断入口、练习设置(出题偏好、加字)都放在主层级;备份、恢复和清空记录收进“数据管理”,避免普通用户被开发/运营工具打断。
「加字」用来抓现实里提笔忘的字:应用内输入面板边输边预览识别出的字(在库字直接带出拼音,练过的会标出来),Enter 或「加入卡组」确认。入口在「我的」和练习卡顶栏(+加字)。输入的字若在基础字库中,会直接激活对应卡片(带拼音、语境词和部件提示),并按一次真实的「不会写」记入记忆模型——立刻进入今日复习和错题本,之前的「太简单/太生僻」等排除标记也会被清掉;如果用户正在练习,新加入的字会插入当前训练队列,从下一题开始出现;不在字库中的字才会生成自定义卡片。重置卡组时自定义字一并清空。
「我的」里的数据管理收着导出备份、恢复备份和清空记录。备份会把所有 shizi.* 本地数据导出成 JSON(优先走系统分享面板存到文件,其次直接下载);恢复时校验格式并确认后整体覆盖。localStorage 是唯一存储,换手机或清浏览器数据前先备份。题库质检和实验数据默认不暴露给普通用户;开发调试时可以在地址后加 ?dev=1,此时「我的」页会出现「开发工具」入口。
每组结束后会进入结果页:用「今日拾得」字帖展示本组字,并用颜色角标标出这次盖的章。如果卡住较多,结果页会把口袋字上移成「马上再拾」入口,避免用户继续刷新题;单字同样可以点击,直接进入专项练习。
PWA 已配置 manifest、iOS 主屏幕图标、standalone 显示模式和 service worker。应用外壳可离线打开;在线练习时会预热当前 15 个字的笔顺数据。若离线时某个字的笔顺还没缓存,页面会同时放开「揭晓答案」和「写好了」;此时田字格里放不出笔顺动画,答案会以大字显示在下方,用户自己的笔迹保留在格子里,反馈和记忆记录照常进行,避免卡死在单张卡片。
- 地址:https://eim-aa.github.io/shizi-app/
- 发布方式:GitHub Pages 从
main分支根目录自动构建——git push到 main 就是发布,一两分钟后生效。页面走「网络优先」缓存策略,用户下次打开会自动拿到新版。 - 手机安装:iPhone 上用 Safari 打开 → 分享按钮 → 「添加到主屏幕」,之后从主屏幕图标进入即全屏、可离线。
- 提醒测试的朋友:练一阵后去「内部 → 备份数据」导出 JSON 发回来,里面有打开天数、每组反馈和练习记录,就是留存实验的原始数据。
在这个目录中运行:
python3 -m http.server 8000然后打开:
http://127.0.0.1:8000/
第一次运行前安装依赖:
python3 -m pip install -r requirements.txt重新生成 index.html 内置题库、generated/selected_8105_candidates.json 和 generated/hanzi_writer_coverage.json:
python3 scripts/build_8105_chars.py运行浏览器验证:
node scripts/verify_8105_app.js查看当前文件变化:
git status保存一个版本点:
git add .
git commit -m "描述这次改了什么"查看历史版本:
git log --oneline