【生活育儿、社会公益赛道】字帖生成器 — 纯前端PWA离线汉字书法练习工具(复赛版)

【生活娱乐-亲子教育、社会公益赛道】字帖生成器 — 纯前端 PWA 离线汉字书法练习工具(复赛最终版 v3.0.0)

A Type, A Trace — 一键生成带拼音、组词、笔画分解、动态笔顺演示的描红字帖,支持矢量 PDF 输出,PWA 离线安装。

本文为 TRAE AI 创造力大赛复赛作品说明帖(最终版 v3.0.0)。作品体验入口、源码包等交付物已通过飞书问卷私密提交,仅供评审查看;按大赛规则,社区帖内不放置体验链接、二维码或可下载的源码/安装包。


:clipboard: 本帖修订说明(2026-08-07)

本帖于 2026-07-23 发布(v2.9.5 时代)、07-26 更新至 v2.9.7,08-06 整合修订至 v2.9.9。此后项目持续推进至 v3.0.0,本帖下方回复楼层中已沉淀了大量重要内容(字体需求答疑、创作心路长文、笔顺功能"克制—破局"决策、v2.9.8 真离线升级、v2.9.9 AI 组词升级、v3.0.0 双引擎 AI 升级等)。

本次修订(v3.0.0 最终版)依据 《复赛参赛指南》(topic 152171) ,对照项目最新 功能和特点做了深度核对(已按规则隐藏仓库地址,retake 分支),将主贴 + 全部回复楼层整理合并为一份完整的作品说明帖,体现历次迭代的最新进展与当前状态。复赛截止时间为 2026-08-09 23:59,本帖即为最终提交版本。

版本更新记录:

时间 版本 里程碑
2026-07-05 v1.0 初赛 Demo(单 HTML 文件)
2026-07-21 ~ 07-26 v2.0 ~ v2.9.7 复赛:工程化重构 + PWA + 学习闭环 + 界面辅助
2026-08-05 补充创作心路长文(“一个普通人的 AI 探索”)
2026-08-06 v2.9.8 真离线动态笔画笔顺演示(9574 字打包)+ 导航 16 步
2026-08-06 v2.9.9 笔画弹窗加载态 + AI 组词补齐(DeepSeek) + 拼音纠错 + 引导 17 步
2026-08-07 v3.0.0 双引擎 AI(DeepSeek + 火山引擎豆包)+ 三模式分流 + 超时重试 + 缓存穿透修复 + 级联开关 + 引导 18 步

这个动态演示笔画笔顺的功能到2.9.8之后才有,2.9.9之后才初步完善离线和在线功能:


20260807_154253


20260807_152355


0. 一句话定位(最新)

离线优先的汉字学习闭环平台——从"字帖生成工具"升级为"汉字学习闭环平台":输入汉字,一键生成带拼音、组词、笔画分解、动态笔顺演示的描红字帖,矢量 PDF 三轨输出,PWA 离线安装;配合历史记录、练习反馈、艾宾浩斯复习计划、难度评估、内置模板库、文件导入、双引擎 AI 组词,形成 “生成 → 练习 → 反馈 → 复习” 的完整学习闭环。

当前版本 v3.0.0(2026-08-07 部署上线):在 v2.9.9 实现 AI 组词补齐(DeepSeek)与拼音纠错的基础上,新增 火山引擎豆包双引擎支持(API Key 前缀自动识别)、三模式 AI 分流(fast / single_check / poly_check)、5 分钟硬超时 + 部分成功处理、指数退避重试、缓存穿透修复(pinyinChecked)、级联开关联动、HTTP 状态码中文诊断、4 级健壮 JSON 解析、紧急逃生门(localStorage.ai_model_override),导航引导增强至 18 步,并修复多项健壮性 Bug。


1. 团队介绍

项目 说明
参赛身份 个人参赛
社区昵称 u309409433785034
编程年限 业余爱好 20+ 年,熟悉 Matlab / Mathematica;Html/CSS/JS 素人
职业背景 材料和化学方向工程技术人员,小学生家长,关注教育科技与汉字书写传承
擅长领域 产品需求分析、技术方案设计、AI 辅助开发(全程自己没写一句代码,代码全部由 AI 生成,我扮演的是"目不转睛、吹毛求疵、写代码做测试的 LLM 们见了都怕的产品经理")
为什么做 自书法练习者,深感市面字帖工具痛点:内容固定、依赖网络、输出模糊。希望用技术降低练字门槛,服务教师、家长和书法爱好者

初赛晋级作品:【学习工作赛道】字帖生成器 — 纯前端离线汉字书法练习工具(另见初赛帖子 71664)

关于"为什么做"的一点私心(补自楼层回复)

孩子上小学后每天要练字,市面字帖要么内容固定、要么依赖网络、要么收费,更头疼的是付费字帖打印出来还是位图,放大就模糊,根本谈不上描红精度。我自己平时爱写毛笔字,同样苦于找不到适合自己进度的字帖——就像背单词不想每次都是 abandon,临字帖抬眼就是"永和九年"。

有一次我开 1.6L 的经济型车接送孩子,被另一个小朋友感慨"哇,这么豪华"。这句话让我瞬间震惊:在有些孩子看来平平常常、甚至还老嫌弃的东西,对别人却可能是遥不可及。还有很多类似的小学生,他们也应该在不付费的情况下享受类似的机会——这是 MIT 协议的初衷,也跟 TRAE 用自身算力缓冲池过剩算力普惠广大未付费用户的初衷类似:用自己有限的余力,借 TRAE 慷慨赞助的东风(2.9.9版本及之前仍是 free 用户,平时实在用不了那么多 token,不过3.0.0之后已经是Lite用户了),取之于免费,还之于 MIT 与普惠。


2. 产品简介(复赛版)

2.1 是什么

字帖生成器是一款纯前端、可 PWA 离线安装的应用,基于 Vite + ES Module 工程化构建。无需服务器、无需安装、无需联网,安装到桌面/手机主屏后完全离线可用。输入汉字后自动生成带拼音标注、组词提示、笔画分解、动态笔顺演示的描红字帖,支持矢量 PDF 输出。

相比初赛 Demo 的"单 HTML 文件",复赛版本已升级为工程化 PWA 应用:完整的构建流程、CI/CD 自动部署、模块化代码结构,并新增了学习闭环(历史记录 / 练习反馈 / 复习计划 / 学习报告)、界面辅助(设置中心 / 新手引导 / 演示模式 / 难度评估)、SVG 矢量字格引擎(5 种网格 × 3 种渲染模式 × 物理级 18mm 精度)、离线动态笔顺演示(9574 字)与 双引擎 AI 组词补齐(DeepSeek + 火山引擎豆包)。
进入复赛之后的早期版本界面(此后持续迭代更新,界面设计以后还可根据反馈调整):

复赛早期版本主界面

字帖生成器主界面

字帖生成效果

v2.9.3 之后修改的界面(Desktop):

v2.9.3 后 Desktop 界面

字帖预览(移动端、Desktop 等效果一致性好):

字帖预览 1

字帖预览 2

版本更迭2.9.5之后在Matepad上的字帖效果:

2.2 面向谁

  • 中小学语文教师 — 快速生成课堂练习字帖,自定义练习内容,支持 txt/md/csv/xlsx/docx 批量导入生字
  • 家长 — 为孩子定制课后练字纸,随时打印,保护儿童隐私(全部数据本地处理,不上传)
  • 书法爱好者 — 自由切换多款开源书法字体,个性化练习
  • 教育资源匮乏地区 — 无网络环境可用,服务教育公平(乡村老师无网教室打开手机即用)
  • 任何想写好汉字的人 — 正如作者所说:“自从用了电脑,打字技术增长,但字却越来越丑”

2.3 完整功能清单(按引入版本归类,初赛/复赛对照)

# 功能 说明 初赛 复赛
1 智能描红字帖生成 输入汉字自动生成田字格描红字帖 :white_check_mark: :white_check_mark:
2 拼音自动标注 pinyin-pro 引擎,带声调显示 :white_check_mark: :white_check_mark:
3 组词辅助 1719 条自定义词典 + cnchar 回退 :white_check_mark: :white_check_mark:
4 笔画分解 hanzi-writer SVG 笔画渲染(静态参考) :white_check_mark: :white_check_mark:
5 矢量 PDF 导出 浏览器打印 + jsPDF/svg2pdf + Puppeteer 三轨方案 :white_check_mark: :white_check_mark: 增强
6 日间/夜间主题 CSS 变量驱动,Dark 模式范字自动反色 :white_check_mark: :white_check_mark: 增强
7 字体上传 用户自定义字体(FontFace API) :white_check_mark: :white_check_mark:
8 PWA 离线安装 Service Worker 缓存,安装到桌面/主屏 :cross_mark: :white_check_mark: 新增
9 开源字体(版权合规) 霞鹜文楷/思源宋体/文鼎楷体等 6 款 :cross_mark: :white_check_mark: 新增
10 Vite 工程化构建 ES Module 模块化,27 个 JS 模块文件 + 19 个 CSS :cross_mark: :white_check_mark: 新增
11 CI/CD 自动部署 自动化构建部署(GitHub Actions → Pages) :cross_mark: :white_check_mark: 新增
12 Tailwind CSS v4 现代化 UI 框架集成 :cross_mark: :white_check_mark: 新增
13 Lucide Icons 现代化 SVG 图标库 :cross_mark: :white_check_mark: 新增
14 单文件构建能力 vite-plugin-singlefile 生成可离线分发单 HTML :cross_mark: :white_check_mark: 新增
15 在线访问 评审可直接打开体验(链接按规则走飞书问卷) :cross_mark: :white_check_mark: 新增
16 历史记录 自动保存最近 20 条生成记录,支持重新生成/删除/清空 :cross_mark: :white_check_mark: 新增
17 练习反馈闭环 整体反馈(轻松/有点难/需要继续)+ 单字反馈(掌握/复习/错字) :cross_mark: :white_check_mark: 新增
18 复习计划生成 基于艾宾浩斯遗忘曲线(7天/3天/1天规则),本地自动生成复习计划 :cross_mark: :white_check_mark: 新增
19 内置模板库 20 个预设模板(唐诗宋词 8 + 三字经 2 + 千字文 2 + 常用字 3 + 成语 3 + 节日 2) :cross_mark: :white_check_mark: 新增
20 分级字库 3 级 18 分类(初级 1-5 画/中级 6-10 画/高级 10+ 画) :cross_mark: :white_check_mark: 新增
21 设置中心面板 滑块(格子大小/每行字数/每页行数/字体大小)+ 开关(拼音/组词/笔画/笔顺)+ 主题三选 :cross_mark: :white_check_mark: 新增
22 新手引导 3 步聚光灯引导(输入框→生成按钮→打印按钮),首次自动触发,现扩展至 18 步 :cross_mark: :white_check_mark: 新增
23 演示模式 一键加载示例并生成字帖,3 秒操作提示,脉冲动画 :cross_mark: :white_check_mark: 新增
24 难度评估 cnchar 笔画数计算,5 级星级 + 初级/中级/高级标签,实时评估 :cross_mark: :white_check_mark: 新增
25 米字格/回宫格 新格子样式(纯 CSS 实现),含打印友好样式 :cross_mark: :white_check_mark: 新增
26 学习报告样式 报告卡片/统计区域/柱状图/进度条样式(v3.0.0 已升级为纯原生 Canvas 学习报告面板:7 天趋势/难度分布/掌握率) :cross_mark: :white_check_mark: 新增
27 SVG 矢量字格引擎 参数化 Inline SVG(viewBox 100×100 抽象坐标 + CSS mm 物理尺寸),屏幕/PDF/打印三者一致 :cross_mark: :white_check_mark: 新增 v2.4
28 5 种网格类型 田字格 / 米字格 / 九宫格 / 回字格 / 拼音田字格(上 30% 四线三格 + 下 70% 田字格),侧栏一键切换 :cross_mark: :white_check_mark: 新增 v2.4
29 3 种渲染模式 stroke-order(首字彩色笔顺示范)/ trace(浅灰描红 0.1–0.4 透明度可调)/ blank(空白自写) :cross_mark: :white_check_mark: 新增 v2.4
30 物理级 18mm 精准尺寸 CSS width:18mm + @page margin + preferCSSPageSize,误差 <0.1mm,绝不跨页断格 :cross_mark: :white_check_mark: 新增 v2.4
31 4 色网格颜色预设 传统绿(默认)/ 朱砂红 / 靛青蓝 / 墨黑,侧栏快切 :cross_mark: :white_check_mark: 新增 v2.4
32 320px 双栏工作台 左侧柔光侧栏 + 右侧 A4 沉浸式预览,移动端自动改抽屉 :cross_mark: :white_check_mark: 新增 v2.4
33 接口契约层 contracts/interfaces.js:GridCellProps / GridType / RenderMode / PdfExportOptions 标准 Props,多 Agent 并行开发零冲突 :cross_mark: :white_check_mark: 新增 v2.4
34 文件导入 支持 txt/md/csv/xlsx/docx 导入生词(xlsx/docx 动态 import 按需加载) :cross_mark: :white_check_mark: 新增
35 智能推荐 离线规则版,按难度/主题/场景三维度推荐 :cross_mark: :white_check_mark: 新增
36 系统字体自动匹配 启动时自动从当前操作系统(Windows/Linux/macOS/Android/HarmonyOS)已安装字体中匹配加载 1-2 种楷体(避免加载问题作了限制),下拉菜单以 ★ 标识 :cross_mark: :white_check_mark: 新增 v2.9.x
37 离线动态笔顺演示 点击字格弹窗逐笔演示,9574 个汉字离线数据(11.75MB Gzip 二进制 + Web Worker 解压)+ HanziWriter 双图层 + 播放/暂停 + 速度 1x-5x 可调 + 最多 4 窗并存 + 多窗口 :cross_mark: :white_check_mark: 新增 v2.9.8
38 笔画弹窗加载态 首次访问数据未就绪时点击字格立即显示加载动画弹窗 + 就绪徽章 :cross_mark: :white_check_mark: 新增 v2.9.9
39 AI 组词补齐 大模型补齐默认词库缺失的二字组词,设置中心开关 + API Key 配置,localStorage 缓存 + 中断支持 :cross_mark: :white_check_mark: 新增 v2.9.9
40 AI 拼音纠错 AI 组词时同步注音核对 + 全局拼音校验(多音字修正),显示纠错报告(原拼音→纠正拼音+原因) :cross_mark: :white_check_mark: 新增 v2.9.9
41 双引擎 AI(DeepSeek + 豆包) API Key 前缀自动识别(sk-→DeepSeek,ark-→火山引擎豆包),无需手动切换引擎;豆包免费入门、DeepSeek 性价比付费,覆盖不同用户群体 :cross_mark: :white_check_mark: 新增 v3.0.0
42 三模式 AI 分流 fast(仅补齐组词,批次 10 字)/ single_check(单音字校验,批次 10 字)/ poly_check(多音字深度校验,批次 6 字 + 自动升级强模型);多音字本地预判定,大幅降低 token 消耗 :cross_mark: :white_check_mark: 新增 v3.0.0
43 缓存穿透修复 缓存条目新增 pinyinChecked 字段:全量检查/拼音纠错对已有组词缓存的字不再误跳过;补齐组词不再覆盖已有拼音纠正记录 :cross_mark: :white_check_mark: 新增 v3.0.0
44 5 分钟硬超时 + 部分成功处理 HARD_TIMEOUT_MS=300000,超时返回 partialSuccess + 已完成字数 + 诊断建议;兼容旧 WebView 的 AbortSignal.any 缺失 :cross_mark: :white_check_mark: 新增 v3.0.0
45 指数退避重试 MAX_RETRY=3,500ms×attempt 退避;重试全失败的批次跳过但继续后续批次 :cross_mark: :white_check_mark: 新增 v3.0.0
46 级联开关联动 启用总开关 → 默认勾"组词补齐";勾"全量检查" → 自动勾选其余两项并禁用(灰显)+ 黄色耗时预警条;取消恢复可编辑 :cross_mark: :white_check_mark: 新增 v3.0.0
47 错误诊断建议 按 HTTP 状态码分类的中文诊断(401/403/404/429/网络错误/超时/JSON 解析失败) :cross_mark: :white_check_mark: 新增 v3.0.0
48 健壮 JSON 解析 4 级解析策略(直接解析→剥离代码块→提取首个 {…}→提取首个 […]),适配豆包 lite 等弱模型输出多余文字/代码块场景 :cross_mark: :white_check_mark: 新增 v3.0.0
49 引导 18 步 新增"AI 组词补齐"+"AI 调用流程解读"两步;autoOpen 机制联动打开设置面板/侧栏/历史栏 :cross_mark: :white_check_mark: 新增 v3.0.0
50 紧急逃生门 localStorage.ai_model_override 可免打包切换模型(补丁C) :cross_mark: :white_check_mark: 新增 v3.0.0

2.4 用户使用路径

访问在线地址(评审经飞书问卷获取)
       ↓
[首次使用] 新手引导 18 步 → 浏览器提示安装 PWA → 点击安装到桌面/主屏
       ↓
[快速体验] 点击"演示模式"按钮 → 自动加载示例并生成字帖
       ↓
[自主使用] 在文本框输入要练习的汉字(或从模板库/分级字库/文件导入选字)→ 难度评估实时显示
       ↓
选择字体(霞鹜文楷/思源宋体/文鼎楷体等开源字体 + 系统楷体自动匹配 ★)
       ↓
[可选] 选择网格类型(田字格/米字格/九宫格/回字格/拼音田字格)与渲染模式(笔顺示范/描红/空白)
       ↓
[可选] 打开设置中心调整格子大小/每行字数/显示选项/颜色预设;[可选] 配置 AI 组词(DeepSeek 或豆包 API Key)
       ↓
点击「生成字帖」→ 实时预览拼音+组词+笔画 → 自动保存到历史记录
       ↓
[笔顺学习] 点击任意字格 → 弹窗逐笔演示笔顺(速度 1x-5x,最多 4 窗)→ 窗口可最小化/最大化/拖拽
       ↓
[练习反馈] 标记整体难度(轻松/有点难/需要继续)
       ↓
[单字反馈] 悬停字帖格子标记单字状态(掌握/复习/错字),状态色环(绿/黄/红)
       ↓
[AI 组词] 设置中心启用 → 输入 API Key → 点击运行 → 三模式分流批量补齐组词/校验拼音 → 查看统计与纠错报告
       ↓
点击右下角打印按钮 → 浏览器打印预览(全平台)/ jsPDF 矢量导出 / Puppeteer 命令行(桌面端)
       ↓
[复习] 次日打开 → 首页显示"今日待复习" → 一键加载复习字帖;学习报告查看 7 天趋势/掌握率
       ↓
[离线使用] 关闭网络后刷新页面 → 仍可正常使用(含笔顺动态演示、AI 已缓存结果)

2.5 PWA 安装与离线使用

本作品是标准 PWA(Progressive Web App),支持安装到桌面/手机主屏,安装后完全离线可用(Service Worker 预缓存全部核心资源含字体;v2.9.8 起 SW 安装包优化至 3.3MB,笔顺数据与字体按需缓存、长期有效)。

如何安装 PWA 应用(演示视频,含 Node.js 支持与 Puppeteer 矢量 PDF 导出功能的 Desktop 使用方式;Windows 从 bat/powershell 脚本启动,Linux/macOS 用 .sh 脚本启动):

桌面端:

  • Microsoft Edge(推荐,开发测试用):打开页面 → 地址栏右侧出现 ⊕ 安装图标 → 点击「安装」→ 桌面生成独立应用图标;备用入口:右上角 ⋯ →「应用」→「将此站点作为应用安装」
  • Google Chrome:地址栏右侧 ⊕ 图标 →「安装」;或 ⋮ →「保存和分享」→「将页面作为应用安装」
  • Brave / Opera / Vivaldi / 国产浏览器(360/搜狗等):地址栏 ⊕ 图标或菜单中搜索"安装应用"

移动端:

  • Android(Chrome/Edge/Firefox):浏览器菜单 ⋮ →「添加到主屏幕」或「安装应用」
  • iOS 16.4+(Safari):分享按钮 →「添加到主屏幕」(16.4+ 才支持 PWA 推送和离线)
  • Firefox:桌面版不支持 PWA 安装,可正常在线使用;移动版支持「添加到主屏幕」

离线验证:安装后断开网络(关 Wi-Fi 或拔网线)→ F5 刷新 → 页面正常加载,所有功能可用(含字体、拼音、笔画渲染、动态笔顺演示);或 F12 → Network → Online 改 Offline 刷新验证。

2.6 相比初赛 Demo 的升级(详细对比)

维度 初赛 Demo 复赛完整作品 升级幅度
代码结构 单 HTML 文件(1.1MB) Vite 工程化(27 JS 文件 + 19 CSS + 3 数据文件) :wrench: 工程化
构建工具 无(手动管理) Vite 5.4 + vite-plugin-singlefile + vite-plugin-pwa :wrench: 工程化
部署方式 ZIP 下载解压 在线访问 + CI/CD 自动部署(体验入口按规则走飞书问卷) :rocket: 部署
离线能力 双击 HTML 文件 PWA 安装到桌面/主屏,Service Worker 缓存;v2.9.8 起"真离线" :mobile_phone: PWA
字体版权 9 款含商业字体(仅演示用) 6 款开源字体全部合规(OFL/Apache-2.0/GUST) :balance_scale: 合规
UI 框架 原生 CSS Tailwind CSS v4 + Lucide Icons :artist_palette: 现代化
字格渲染 CSS Grid 拼凑 SVG 矢量引擎(viewBox 抽象坐标 + 18mm 物理尺寸 + 行级统一边框) :triangular_ruler: 矢量化
依赖管理 CDN + 内嵌 npm 统一管理版本(12 运行时 + 5 开发) :wrench: 工程化
版本控制 Git + 备份分支(25+)+ 标签回退策略(28+ tags) :wrench: 工程化
文档规范 README + CHANGELOG README(中英)+ CHANGELOG + 参赛文档 + 方案文档 + TASK_BOARD :memo: 规范
学习闭环 历史记录 + 练习反馈 + 复习计划(艾宾浩斯规则)+ 学习报告 :graduation_cap: 教育化
内容辅助 模板库 20 个 + 分级字库 3 级 18 分类 + 演示模式 + 难度评估 + 文件导入 + 智能推荐 :books: 内容化
笔顺学习 静态笔画分解 离线动态笔顺演示(9574 字,Web Worker 解压) :pencil: 动态化
AI 能力 双引擎 AI 组词补齐 + 拼音纠错(DeepSeek + 火山引擎豆包,三模式分流),AI 贯穿开发全程 :robot: AI 化
用户体验 无引导 新手引导 18 步 + 设置中心 + FAB 拖拽 + Dark/触屏/移动端适配 :sparkles: 体验化

2.7 产品边界与免责声明

  • 本工具是辅助练字的工具,不替代学校书法课程、专业书法教师指导与教材
  • AI 组词/拼音纠错为可选增强功能,默认关闭,需用户自配 API Key;受大模型概率生成特性影响,冷僻字/多音字偶需多次点击;AI 结果仅供参考,以权威教材/字典为准
  • 隐私承诺:全部数据本地处理,本工具自身不设任何服务器、不留存任何用户数据;AI 数据仅发往用户自选的模型服务商(DeepSeek/火山引擎豆包)
  • 字帖内容与字体均来自开源生态;用户自上传字体/内容的版权与合规责任由用户自行承担

3. 产品演示视频

视频 1(复赛主流程,v2.9.5 时代):演示了包含 Node.js 支持和 Puppeteer 矢量格式 PDF 导出功能的 Desktop 使用方法;使用 Windows,可从 .bat 或 .ps1 脚本启动,Linux/macOS 用 .sh 脚本;电脑比较老旧、天气热、降温只靠风扇,所以视频中反应比较迟钝。

从脚本打开全功能使用视频(约 12MB,曾因论坛 20MB 上限险些传不上)

视频 2(v2.9.8,动态笔顺演示):见楼层 13 回复,演示点击字格呼出离线动态笔顺演示窗口(双窗口截图 + 视频)。

V3.0.0这个双引擎“AI辅助组词”的功能不得不提,以前一直以为豆包Lite免费版总体表现一般,不过这次这个对比说明,在辅导学生方面豆包确有过人之处(含 v3.0.0 双引擎 AI 组词、三模式分流、级联开关演示);因为等待时间要1-2分钟(设置了超过5分钟强行截停),所以我只放操作视频和对比结果。

测试用生字集-人教版五年级下册语文2019版生字

昼耘桑晓蝴蚂蚱嗡樱拔瞎铲锄割尾承拴瓢逛妒忌曹督委鲁遮寨擂呐插冈饥碟斤俺榜杖申兼勿拖悉坠膛截仞岳摩遗涕巫彭拟谋瑞损锻炼眷赴搞殊尊签革庆诊沃龄匪绷审剂施吭崭衷慈祥荣跤搂仗鞭欺挠扳腕剃腮疤监侄喉咙浆傅袱桶障芝圣犯馅轰堪诈傻捏怔矛盾誉吾赢拳擦策荐艘航肆帽桅撕逗唬钩扭咧舱鸥瞄尼斯艇纵艄翘垫帘姆祷雇簇哗码笼仪眺骏驰辽绵凳吆铛罐恢踢牲畜梁诣禽拇搔痒秽轧拧螺纽扣貌仓渺享庸憎

豆包2.0Lite组词结果(没有遗漏,用时76秒):

DeepSeek V4Flash组词结果(有遗漏,用时65秒)

操作视频

字帖自带的开源工具对某些生字无法给出合适的组词,默认就显示“组词”;刚刚导入的时候可以看到,这批生字,有多个仅仅依靠开源的、自带的工具,不能完成组词,这也是2.9.8及之前版本的一个痛点。2.9.9引入deepseek,3.0.0则进一步引入在这方面更擅长的豆包(我辅导功课常常会在技穷的时候倾向于求助豆包和豆包爱学)。——如果有专用微调的大模型,可能会更好。

20260807_155334_first20s


4. 产品创作历程

4.1 想法诞生

作为一名书法练习者,我在日常练字中遇到几个痛点:

  • 市面上的字帖内容固定、无法定制
  • 在线字帖工具依赖网络且常收费
  • 打印出来的字帖往往是位图、放大后模糊不清
  • 缺少拼音、组词、笔画分解等教学辅助信息

于是想到用前端技术,做一个完全离线、自由定制、高清矢量输出的字帖工具。

我自从用了电脑,打字技术增长,但字却越来越丑;自从练习写字之后,用小楷毛笔在 A4 复印纸上都能写出这个水平的字了:

——一个真实用户对"写一手好字"的执念,是这个项目最初的起点。

4.2 初赛 Demo(2026-07-05)

初赛阶段采用"最小可行产品"策略:

  • 单 HTML 文件实现核心功能(拼音 + 组词 + 笔画 + PDF)
  • 双击即可运行,零安装零依赖
  • 9 款字体内置(含商业字体,仅演示用)
  • 极光毛玻璃 UI,日间/夜间双主题
  • Puppeteer 矢量 PDF 双轨方案

初赛成果:成功晋级复赛。(初赛 7 条 Session ID 见 5.5 节)

4.3 复赛完整作品(2026-07-21 至 2026-08-07)

复赛围绕"从工具到产品"的核心目标,经历了 7 大维度升级(v2.0–v2.9.7)→ 真离线破局(v2.9.8)→ AI 组词扩展(v2.9.9)→ 双引擎 AI + 健壮性加固(v3.0.0) 四个阶段。

阶段一:工程化重构(Vite + ES Module)

将 1.1MB 单 HTML 文件拆分为模块化工程:

  • 17 个功能模块(src/modules/)+ 2 个组件 + 1 个工具 + 1 个契约:main.js / fontManager.js / settings.js / gridRenderer.js / pdfExport.js / puppeteerClient.js / zuci.js / strokes.js / history.js / feedback.js / review.js / settingsCenter.js / onboarding.js / demoMode.js / difficulty.js / aiZuci.js / hanziDataStore.js / strokeDemoModal.js / fileImporter.js / recommender.js / reportPanel.js / fabDrag.js / Sidebar.js / GridEngine.js / pdfExport.js(utils)等(v3.0.0 扩展至 27 个 JS 源文件)
  • 19 个 CSS 文件:base / components / fab / grid / main / print / tailwind / theme / history / feedback / review / grid-styles / report / settingsCenter / onboarding / demoMode / difficulty / strokeDemoModal / grid-svg 等
  • 3 个数据文件:customZuCi.js(1719 条组词)/ templates.js(20 个模板)/ vocabulary.js(3 级 18 分类字库)
  • 构建工具:Vite 5.4 + vite-plugin-singlefile(保留单 HTML 分发能力)
  • 依赖管理:pinyin-pro / cnchar / hanzi-writer / jspdf / svg2pdf / mammoth / xlsx / fflate 全部 npm 安装

阶段二:PWA 离线支持

  • vite-plugin-pwa 0.20.5:Workbox 预缓存策略
  • Service Worker:字体与笔顺数据 CacheFirst 策略(v2.9.8 起 SW 安装包优化至 3.3MB,大文件按需缓存)
  • manifest.webmanifest:lang=zh-CN,3 个图标含 maskable
  • 可安装到桌面/手机主屏,像原生应用一样独立运行

阶段三:开源字体替换(版权合规)

初赛字体 复赛字体 协议
姜浩硬笔楷书 霞鹜文楷 Regular + Light OFL
华文楷体 思源宋体 SC Regular OFL
方正仿宋 GBK 文鼎楷体(TW-Kai) Apache 2.0
田英章楷书 30Light TW-Kai OFL
商业字体 ×6 开源字体 ×6 :balance_scale: 全部合规
  • 追加能力:个人使用时,可添加电脑上已安装或已有个性化字体;v2.9.x 起启动时自动从操作系统已安装字体中匹配 1-2 种楷体(★ 标识)
  • 字体合规红线(历次升级时多次声明):未嵌入方正楷体_GBK 或其它需特别授权的字体,默认字体文鼎楷体,可选霞鹜文楷/思源宋体/TeX Gyre Adventor/楷体/KaiTi。

阶段四:UI 现代化

  • Tailwind CSS v4:渐进集成,保留 CSS 变量主题系统
  • Lucide Icons:主题切换(sun/moon)+ 打印(printer)+ 设置(settings)+ 演示(sparkles)
  • 响应式适配:@media max-width:680px 移动端适配

阶段五:CI/CD 自动部署

  • GitHub Actions:push 到 retake 分支自动触发构建部署(体验入口按规则走飞书问卷)
  • deploy.yml 工作流:字体下载 → Vite 构建 → Pages 部署
  • download-fonts.sh:CI 环境自动下载开源字体(霞鹜文楷、思源宋体、文鼎楷体 TW-Kai,全开源协议)
  • Pages:https 持续可用,无需续费;部署期间修复 4 个 CI 构建阻断问题、通过 gh api CLI 修复部署权限

阶段六:学习闭环(教育化升级):star: 复赛核心差异化

将"字帖生成工具"升级为"汉字学习闭环平台":

  • 历史记录:每次生成字帖自动保存到 localStorage(最多 20 条),右侧可折叠侧边栏,支持重新生成/删除/清空
  • 练习反馈闭环:整体反馈三按钮(很轻松/有点难/需要继续)+ 单字反馈悬停图标(已掌握 :white_check_mark:/需要复习 :counterclockwise_arrows_button:/总是写错 :cross_mark:)+ 状态色环(绿/黄/红),数据保存 localStorage
  • 复习计划生成:基于艾宾浩斯遗忘曲线本地规则(已掌握→7 天后复习 / 需要复习→3 天后复习 / 总是写错→明天复习),首页顶部"今日待复习"区域,一键加载待复习字并生成字帖,统计信息(已掌握/待复习/错字数)
  • 学习报告面板(v3.0.0 完整版):纯原生 JS + Canvas 图表(7 天趋势 / 难度分布 / 掌握率),不引入图表库

阶段七:内容辅助与体验优化

  • 内置模板库:20 个预设模板(唐诗宋词 8 + 三字经 2 + 千字文 2 + 常用字 3 + 成语 3 + 节日 2)
  • 分级字库:3 级 18 分类(初级 1-5 画 / 中级 6-10 画 / 高级 10+ 画)
  • 设置中心面板:滑块 + 开关 + 主题选项,实时更新预览
  • 新手引导:3 步聚光灯引导 → 5 步 → 9 步 → 16 步(v2.9.8)→ 17 步(v2.9.9 含 AI 组词补齐步骤)→ 18 步(v3.0.0 新增 AI 调用流程解读)
  • 演示模式:一键加载示例并生成字帖,3 秒操作提示
  • 难度评估:cnchar 笔画数计算,5 级星级,实时评估
  • 米字格/回宫格:新格子样式,含打印友好样式
  • 智能推荐:离线规则版,按难度(3 级)/主题(13 类)/场景(6 类)三维度推荐,单字点击追加/模板点击覆盖/一键加载分类全部

阶段八:SVG 矢量字格引擎(v2.4,复赛中期关键架构升级)

复赛版本中期,将 CSS Grid 拼凑渲染升级为参数化 Inline SVG 矢量引擎

  • GridEngine.js:viewBox 100×100 抽象坐标 + CSS mm 物理尺寸,一处修改全局生效
  • 5 种网格类型:田字格 / 米字格 / 九宫格 / 回字格 / 拼音田字格(上 30% 四线三格 + 下 70% 田字格)
  • 3 种渲染模式:stroke-order(首字彩色笔顺示范)/ trace(浅灰描红,透明度 0.1–0.4 可调)/ blank(空白自写)
  • 18mm 精准物理尺寸:CSS width:18mm + @page margin + preferCSSPageSize,误差 < 0.1mm,绝不跨页断格
  • 4 色网格颜色预设:传统绿(默认)/ 朱砂红 / 靛青蓝 / 墨黑
  • 接口契约层 contracts/interfaces.js(GridCellProps/GridType/RenderMode/PdfExportOptions):模块间标准 Props,多 Agent 并行开发零冲突
  • 行级统一边框(v2.4.14):整行外框 + 竖线绘制在同一个 SVG 中,消除多个独立 cell 的亚像素累积误差;改用填充矩形代替 stroke,确保 PDF 中线宽精确(stroke 在 PDF 中可能渲染为 0 宽度)
  • currentColor 智能反色(v2.9.7):范字使用 currentColor,dark 模式自动反色,打印时 print.css 强制黑色
  • 320px 双栏工作台:左侧柔光侧栏 + 右侧 A4 沉浸式预览,移动端自动改抽屉

阶段九:真离线破局——离线动态笔画笔顺演示(v2.9.8,2026-08-06 凌晨)

这是一个"克制 → 破局"的故事,完整记录见楼层 11–14。

为什么 v2.9.7 之前没有动态笔顺?(楼层 11 详细论证)

  1. 数据依赖冲突:HanziWriter 每个汉字需独立 JSON 数据文件,原型阶段近万个零碎 JSON 文件,要么请求 CDN(违背离线初衷)、要么全打包(构建体积灾难性膨胀),与"离线普惠"底线冲突;
  2. 核心场景错位:字帖归宿是"打印出来的纸",静态笔画分解参考(功能 #4)已足够;动态演示是屏幕交互场景,强行嵌入会打断"批量生成、一键打印"心流;
  3. 做产品要做减法:AI 时代实现炫酷功能前所未有地容易,但技术上摆不平问题就忌讳 Feature Creep;初赛"动态笔顺"作为技术探索更适合独立识字工具。

破局(楼层 12–13):后来发现可以把近万个 JSON 文件自己重新打包、压缩成一个数据文件,编写专门的检索和读取工具,实现完全离线的动态笔顺——“炫酷而耗时,但对字帖基本功能的改良有限(如果有的话,应该是可以离线很彻底)”。于是连夜更新 v2.9.8:

  • 内置 9574 个汉字离线数据(11.75MB Gzip 二进制,Web Worker 后台解压,不阻塞主线程)
  • 双图层架构:底层 0.25 不透明度轮廓始终显示,顶层逐笔动画覆盖
  • 播放/暂停两态切换,速度 1x–5x 可调并持久化到 localStorage
  • 最多 4 个演示窗口并存,支持最小化/最大化/关闭/拖拽
  • 引导流程 9 步 → 16 步;新增独立笔顺演示介绍页 stroke-demo-guide.html
  • 新增 fflate 依赖;hanziDataStore.js 用 import.meta.env.BASE_URL + new URL 修复子路径 404;vite.config.js globIgnores 排除大文件 precache,SW 从 140MB 降至 3.3MB
  • 多级降级方案:Web Worker → 主线程 fflate 解压 → .js Base64 降级 → 网络备选;支持自定义数据扩展(冷僻字/新造字),localStorage 持久化

性能取舍:出于对设备性能的考虑,限制最多开 4 个动态演示窗口。

阶段十:AI 组词补齐 + 拼音纠错(v2.9.9,2026-08-06)

“又是一次规划之外的迭代,但极大地弥补了真实使用场景下的体验缺口。”

缘起:v2.9.8 实现"真离线"后才发现,联网加载过程中受网速限制仍会卡顿;笔画演示在低网速/缓冲期容易受影响。v2.9.9 核心任务:解决未完全加载或低网速缓冲过程中依然流畅使用笔画笔顺及动态演示的问题

核心修复与升级:

  1. 本地缓存 + 网络同步双轮驱动:动态笔画笔顺即时可用,缓冲期 Bug 彻底修复(修复本地数据缓冲时功能短暂瘫痪的漏洞),Mobile/Desktop 双端压测通过;
  2. 笔画弹窗加载态:首次访问数据未就绪时,点击字格立即显示加载动画弹窗 + 就绪徽章;
  3. 重磅:AI 组词接入(DeepSeek API):为解决某些生字组词不完整甚至完全没有组词的痛点,在增加 API Key 的情况下添加"AI 组词":
    • 入口深藏、默认关闭,需手动输入用户自己的 DeepSeek API Key;
    • 目前定位测试期,暂时只提供 DeepSeek(性价比与口碑兼备);
    • 受 LLM 概率生成特性影响,冷僻字/多音字场景有时需多次点击"AI 组词"才得到理想结果;
  4. AI 拼音纠错增强(同日晚间):AI prompt 升级为"注音核对 + 精准组词 + 全局拼音校验"——角色设定为专业汉语教学与拼音专家,组词前先核对 pinyin-pro 预设拼音、多音字自动修正,杜绝地名/人名专有名词(如"鹤"禁用"鹤壁"),词性多样化,JSON 结构化输出 {chars, fix_count, fixes};新增 getAiPinyin() 仅当 AI 明确修正时返回纠正值,GridEngine 两处拼音生成点优先使用 AI 纠正结果,设置中心显示纠错报告(原拼音→纠正拼音+原因);缓存扩展向后兼容;
  5. 导航引导 16 步 → 17 步(新增 AI 组词补齐步骤,autoOpen: ‘settings’ 高亮 AI 区域)。

v2.9.9 其他修复:汉字打印无法正常显示(强制 light 主题 + FontFace URL 加引号)、页脚黑色底色、触屏版 Light 主题渲染(内联 color-scheme)、导航按钮显示、localStorage 规则优化、最小化/最大化按钮失效(固定 vw/vh)、速度滑块失效(hanzi-writer 3.7.3 无 updateOptions,直接赋值 _options)。

阶段十一:v3.0.0 双引擎 AI + 健壮性加固(2026-08-07)

“为了把豆包大模型放进去,还花了两个 9.9 元,购买了火山引擎 Lite 和 Trae Work 权限——其实都不是真用得上,只是测试产品调用大模型的很简单的附加功能而已。事实证明:必须从开源社区进一步汲取能量,或者微调出专用小模型,否则原创的要求很高。

缘起:v2.9.9 的 AI 组词(DeepSeek)上线后收到真实反馈:DeepSeek 需要用户自配 API Key 且为付费接口,部分用户希望有免费入口;同时弱模型/弱网环境下偶发 JSON 解析失败、卡死无响应。v3.0.0 目标:把"单引擎、单一模式"升级为"双引擎、三模式分流"的健壮 AI 管道,并整体加固超时、重试、缓存与诊断。

真实参赛经历(如实记录):为了把豆包大模型放进产品做测试,我分别购买了火山引擎 Lite 权限Trae Work 权限用来测试"产品调用大模型"这个很简单的附加功能而已。实测后发现:接入一个全新的大模型,API 格式差异、JSON 输出差异、弱模型能力差异都会带来一连串工程问题;这次迭代让我最深刻的体会是——必须从开源社区进一步汲取能量(比如借鉴社区开源的健壮 JSON 解析、超时重试、请求合并方案),或者微调出专用小模型,否则"原创的要求很高"。这也是为什么我在致谢里强调开源社区的价值:个人开发者单打独斗做 AI 应用,站在巨人肩膀上才是正路。

核心升级(v3.0.0,共 10 项):

  1. 双引擎 AI 自动识别:API Key 前缀自动路由——sk- → DeepSeek(deepseek-v4-flash,支持 response_format: json_object,性价比优),ark- → 火山引擎豆包(doubao-seed-2-0-lite-260428 快速模式,免费入门);全量检查时豆包自动升级 doubao-seed-2-1-turbo-260628 强模型紧急逃生门 localStorage.ai_model_override 可免打包切换模型(补丁C)
  2. 三模式分流:AI 处理前用 pinyin-pro multiple 模式判定多音字,将待处理字分为三组——fast(仅补齐组词,批次 10 字,max_tokens 2048)/ single_check(单音字校验已有组词,批次 10 字,max_tokens 4096)/ poly_check(多音字深度校验音义匹配,批次 6 字 + 自动升级强模型);不同提示词 + 不同批次,大幅减少不必要的 AI 调用、降低 token 消耗
  3. 缓存穿透修复(pinyinChecked 字段):缓存条目结构 {zuci, pinyin, pinyinFixed, pinyinChecked, wordsDetail, ts};pinyinChecked 字段确保全量检查/拼音纠错模式下,已有组词缓存但未经拼音校验的字不再被误跳过;补丁B 修复"仅拼音纠错后的字再次组词补齐时被误跳过"的问题,且补齐组词时不再覆盖已有拼音纠正记录
  4. 5 分钟硬超时 + 部分成功处理:HARD_TIMEOUT_MS = 300000;combineSignals() 合并外部 signal + 超时 signal(兼容旧 WebView 的 AbortSignal.any 缺失,补丁A);超时后返回 partialSuccess: true + 已完成的字数 + 诊断建议
  5. 重试机制:MAX_RETRY = 3,指数退避(500ms × attempt);重试全失败的批次跳过但继续下一批
  6. 健壮 JSON 解析(4 级策略):直接解析 → 剥离 markdown 代码块 → 提取首个 {…} → 提取首个 […];适配豆包 lite 等弱模型可能输出多余文字或代码块的场景
  7. 级联开关联动:启用总开关 → 默认勾"组词补齐";勾"全量检查" → 自动勾选其余两项并禁用(灰显)+ 显示黄色耗时预警条;取消"全量检查" → 恢复可编辑状态;面板重新打开时自动同步默认勾选状态
  8. 错误诊断建议:按 HTTP 状态码分类给出中文建议(401/403/404/429/网络错误/超时/JSON 解析失败)
  9. AI 运行按钮升级:运行中变为":stop_button: 中断"(AbortController);旋转图标(SMIL animateTransform,无需 CSS keyframes)+ 批次进度(已处理/总数 · 批次 N/M);完成后显示详细统计:✓ DeepSeek:共 X · 默认 X · AI X · 缺失 X(Xms)
  10. 引导 18 步:新增"AI 组词补齐"+"AI 调用流程解读"两个步骤(autoOpen: ‘settings’ 联动);防御性编程——每步前检查 selector 存在且可见,不可见步骤自动跳过;IntersectionObserver 滚动边角提示

实测数据:v3.0.0 提交记录实测 90 字组词一次通过(豆包 JSON mode);双引擎 + 三模式分流后 token 消耗较"全部丢给 AI"方案显著下降。

豆包适配的艰难历程(2026-08-07 楼层 18 追加):接入豆包的过程远没有想象中顺利——豆包 lite 作为弱模型,JSON 输出稳定性、响应格式与 DeepSeek 差异明显,经过多轮调试(提取共用 SYSTEM_PROMPT、四级健壮 JSON 解析、3 次指数退避重试、批次降为 6 字 + 强模型兜底)才终于把豆包也修改得能用了。更深层的反思是:如果只用通用大模型,稍微复杂点的任务,自动生成的提示词效果并不理想,可能需要在大模型微调、提示词改进等方面深入打磨——但这已经超过了我作为个人开发者的能力范畴。这也是为什么我把"从开源社区汲取健壮性方案 / 微调专用小模型"写进体会:普通开发者做 AI 应用,能站在巨人肩膀上把产品体验打磨好,已经是很有价值的事了。

版本迭代节奏说明:从 v1.0.1 到 v3.0.0,更新日志记录了 90+ 次 commits、28+ 个版本标签。这些数字不是用来炫耀的,每一次都对应着真实的使用反馈和功能改进。引导从 5 步到 18 步、Dark 模式优化、移动端首次使用引导、桌面端 FAB 拖拽吸附、双引擎 AI……都是因为我真正在使用它、打磨它。业余时间也足以完成——早年混迹 Stackoverflow/StackExchange 养成的"如何提高提问、追问和回答质量"的肌肉记忆,融入 Prompting 技巧之后,vibe coding 的难度并没有想象中那么高,AI 交互出来的交付物,有时候居然能够出人意外地好。

5. TRAE 实践过程

本项目全程使用 TRAE IDE 完成。以下是开发关键步骤、Session ID 和踩坑经验。

5.1 技术架构

技术点 方案 版本 说明
构建工具 Vite ^5.4.0 开发服务器(port 3000)+ 生产构建(outDir: dist)
模块化 ES Module 27 个 JS 源文件(17 模块 + 2 组件 + 1 工具 + 1 契约)+ 19 个 CSS + 3 数据文件
单文件打包 vite-plugin-singlefile ^2.0.0 生成可离线分发单 HTML
PWA vite-plugin-pwa ^0.20.0 Workbox 预缓存(3.3MB 核心)+ 大文件运行时缓存
UI 框架 @tailwindcss/vite + tailwindcss ^4.3.3 Tailwind CSS v4 渐进集成
图标库 lucide-static ^1.25.0 现代化 SVG 图标
拼音转换 pinyin-pro ^3.0.0 自动标注声调 + 多音字判定(multiple 模式,MIT)
组词查询 cnchar + cnchar-words ^3.0.0 智能组词 + 1719 条自定义词典 + 笔画数计算
笔画渲染 hanzi-writer ^3.5.0 → 3.7.3 SVG 笔画分解 + 动态笔顺动画(MIT)
笔顺数据 自研打包 9574 汉字离线数据(11.75MB Gzip)+ Web Worker + fflate 解压
AI 引擎 DeepSeek + 火山引擎豆包 v3.0.0 双引擎自动识别(sk-→DeepSeek,ark-→豆包),三模式分流(fast/single_check/poly_check),默认关闭、用户自配 API Key,localStorage 缓存
AI 健壮性 超时重试 + 缓存穿透修复 v3.0.0 HARD_TIMEOUT_MS=300000、MAX_RETRY=3 指数退避、pinyinChecked 字段、4 级健壮 JSON 解析、HTTP 状态码中文诊断、级联开关
PDF 导出 puppeteer ^23.0.0 矢量 PDF 生成(.cjs 脚本)+ jsPDF/svg2pdf 纯前端导出
客户端 PDF jspdf + svg2pdf.js ^2.5.2 / ^2.7.0 纯前端矢量导出轨道(拒绝位图化 html2canvas)
文件导入 mammoth + xlsx ^1.6.0 / ^0.18.5 DOCX/Excel 动态 import 按需加载
字体加载 FontFace API 动态注册 + document.fonts.check() 验证 + 超时重试(5s + 3s)
主题切换 CSS 变量 + data-theme 日间/夜间/系统三模式 + Lucide 图标切换
跨模块通信 CustomEvent calligraphy:history-updated / char-feedback-updated / settings-updated
数据持久化 localStorage calligraphy_ 前缀(history / char_feedback / settings / onboarded / strokeSpeed / aiCache / deepseek_api_key 等)
CI/CD GitHub Actions deploy.yml 自动构建部署到 Pages
版本控制 Git retake 分支(默认)+ backup 备份分支(25+)+ tag 快照(28+,含 v2.9.7 / v2.9.8 / v2.9.9 / v3.0.0)
开发工具 TRAE IDE AI 辅助编码、调试、部署、多 Agent 并行开发(Trae Work 付费试用辅助验证,主力靠 Trae CN IDE)

5.2 vite.config.js 关键配置

{
  base: './',                    // 相对路径,支持子目录部署
  cssMinify: false,              // 保护 @media print 关键规则不被 esbuild 合并/丢弃
  target: 'es2020',              // 保留 ES2020+ 语法
  plugins: [
    tailwindcss(),               // Tailwind CSS v4
    viteSingleFile(),            // 单 HTML 打包
    VitePWA({
      registerType: 'autoUpdate',
      manifest: {
        name: '字帖生成器',
        short_name: '字帖',
        lang: 'zh-CN',
        theme_color: '#9E2A2B',
        display: 'standalone',
        icons: [                 // 3 个 SVG 图标(含 maskable)
          { src: 'icon-192.svg', purpose: 'any' },
          { src: 'icon-512.svg', purpose: 'any' },
          { src: 'icon-192-maskable.svg', purpose: 'maskable' }
        ]
      },
      workbox: {
        maximumFileSizeToCacheInBytes: 41943040,  // 40MB 上限
        globIgnores: [           // v2.9.8 起:大文件排除 precache(SW 140MB → 3.3MB)
          '**/hanzi-data.bin', '**/hanzi-data-embedded.js', '**/fonts/**'
        ],
        runtimeCaching: [        // 大文件按需加载(CacheFirst,长期有效)
          { urlPattern: /hanzi-data/, handler: 'CacheFirst',
            options: { cacheName: 'hanzi-data', expiration: { maxAgeSeconds: 60*60*24*365*10, maxEntries: 10 } } },
          { urlPattern: /\.(?:woff2?|ttf|otf)$/, handler: 'CacheFirst',
            options: { cacheName: 'fonts-cache', expiration: { maxAgeSeconds: 60*60*24*365, maxEntries: 20 } } }
        ]
      }
    })
  ],
  build: { outDir: 'dist', emptyOutDir: true },
  server: { port: 3000, open: true }
}

5.3 关键开发步骤

步骤一:Vite 工程化重构 — 分析全局变量引用关系生成检查清单 → 划分 10 个迁移模块、制定迁移顺序 → 配置 vite.config.js(singlefile + pwa + tailwind)→ 验证功能完整性

步骤二:PWA 配置与离线策略 — 配置 vite-plugin-pwa 0.20.5 → Workbox 预缓存(字体 CacheFirst,最大 40MB)→ 生成 PWA 图标(SVG → 192/512/maskable)→ 验证 Service Worker 注册和离线可用性

步骤三:开源字体替换与 CI 集成 — 评估 6 款开源字体协议合规性 → 编写 download-fonts.sh → 处理思源宋体 zip 解压路径问题(硬编码 → find 动态查找)→ 修复 pdfExport.js 中 14 处字体引用

步骤四:CI/CD 部署与问题排查 — 配置 GitHub Actions deploy.yml → 排查修复 4 个 CI 构建阻断问题 → gh api CLI 修复部署权限 → 验证 Pages 部署成功(HTTP 200)

步骤五:UI 现代化与图标替换 — 集成 Tailwind CSS v4(@import “tailwindcss”)→ 替换 Lucide sun/moon/printer/settings/sparkles 图标 → 保留 CSS 变量主题系统渐进迁移

步骤六:学习闭环三件套(多 Agent 并行开发):star: — Agent A:历史记录 + 练习反馈 + 复习计划(顺序执行,有依赖);Agent B:模板库数据 + 分级字库 + 米字格/回宫格样式 + 学习报告样式(纯新增文件零冲突);Agent C:设置中心 + 新手引导 + 演示模式 + 难度评估。技术亮点:自定义事件跨模块通信;单字反馈 DOM 事件委托不修改 gridRenderer.js;settingsCenter 通过 toggleTheme() 与现有 settings.js 同步;所有新 UI 在 @media print 下隐藏不影响 PDF 导出

步骤七:SVG 矢量字格引擎(v2.4) — GridEngine.js 参数化渲染(viewBox 100×100 + CSS mm)→ 5 网格 × 3 渲染模式 → 18mm 物理精度验证(误差 <0.1mm)→ contracts/interfaces.js 契约层(多 Agent 零冲突基础)→ 行级统一边框(填充矩形代替 stroke)

步骤八:v2.9.8 真离线笔顺(多 Agent 并行) — 9574 字 JSON 打包为单 bin(fflate)→ hanziDataStore.js(BASE_URL + new URL 修复子路径)→ Web Worker 解压 → 双图层 HanziWriter 动画 → 弹窗管理(4 窗 + 最小化/最大化/拖拽)→ SW precache 优化(globIgnores,140MB → 3.3MB)

步骤九:v2.9.9 AI 组词 + 拼音纠错 — callDeepSeekDirect 重写(注音核对 + 精准组词 + 全局校验)→ JSON 结构化输出 → getAiPinyin() 纠错回退 → 缓存扩展(zuci/pinyin/pinyinFixed/wordsDetail/ts,向后兼容)→ 设置中心纠错报告 → 引导第 17 步

步骤十:v3.0.0 双引擎 AI + 健壮性加固 — 双引擎抽象层(detectApiKeyType 前缀路由 + getAiProvider 返回 endpoint/model/label)→ 三模式分流(多音字判定 → fast/single_check/poly_check 分批)→ combineSignals() 超时合并(补丁A)→ MAX_RETRY 指数退避 → extractJsonRobust 4 级解析 → pinyinChecked 缓存穿透修复(补丁B)→ 级联开关联动 + 黄色预警条 → HTTP 状态码中文诊断 → localStorage.ai_model_override 逃生门(补丁C)→ 引导 18 步

5.4 开发踩坑与经验

踩坑 1:思源宋体 zip 解压路径不一致 — CI 环境硬编码路径 /tmp/shs/SourceHanSerifSC-Regular.otf 找不到,实际解压到 /tmp/shs/OTF/SimplifiedChinese/…;解决:find /tmp/shs -name “SourceHanSerifSC-Regular.otf” | head -1 动态查找

踩坑 2:PowerShell 重定向导致 UTF-16 编码 — Git 备份分支恢复 fontManager.js 时 PowerShell > 重定向默认保存 UTF-16 LE(BOM: FF-FE),Vite 报 invalid JS syntax;解决:.NET [IO.File]::WriteAllText + UTF8Encoding($false) 重写为 UTF-8(457,850 → 228,957 bytes)

踩坑 3:部署权限 — CI 构建成功但部署失败 Branch “retake” is not allowed to deploy to github-pages;解决:gh api --method POST …/deployment-branch-policies -f name=retake 添加 retake 到允许列表

踩坑 4:gh api 与 git push 历史不一致 — gh api Contents API 推送的文件创建不同 Git 历史导致 push 被拒;解决:创建备份分支保护本地提交 → git reset --hard origin/retake 同步远程最新

踩坑 5:多 Agent 并行开发的文件冲突 — 多个 Agent 同时改 main.js/index.html 会冲突;解决:Agent B 只新增文件不修改现有代码(零冲突),Agent A/C 顺序执行(C 基于 A 的结果)

踩坑 6:近万个笔顺 JSON 的迁移噩梦 — 原型阶段解压后近万个零碎文件,没用 FastCopy 时在不同硬盘间迁移是噩梦;后来想到合并 JSON、压缩到一个文件并提供检索函数(→ v2.9.8 的 hanzi-data.bin)

踩坑 7:v2.9.8 子路径 404 — 子路径部署下 hanzi-data.bin 404;解决:import.meta.env.BASE_URL + new URL 构建 URL

踩坑 8:SW precache 过大 — 大文件进 precache 导致 SW 安装包 140MB、hanzi-data.bin 加载失败;解决:globIgnores 排除,降至 3.3MB

踩坑 9:部署超时 — v2.9.9 部署两次出现 deployment_queued 超时(平台侧瞬时问题);解决:重跑后成功,构建本身无问题

踩坑 10:豆包 lite 弱模型 JSON 输出不稳定 — doubao-seed-2-0-lite 有时在 JSON 前后输出多余文字或 markdown 代码块,直接 JSON.parse 失败;解决:extractJsonRobust 4 级解析策略(剥离代码块 → 提取首个 {…} → 提取首个 […]),实测 90 字组词一次通过

踩坑 11:旧 WebView 缺失 AbortSignal.any — 部分旧版 WebView 不支持 AbortSignal.any,多信号合并直接报错;解决:combineSignals() 手写合并外部 signal + 超时 signal(补丁A)

踩坑 12:缓存穿透——拼音纠错与组词补齐互相踩 — 已有组词缓存但未校验拼音的字被跳过;仅拼音纠错后的字再次组词补齐时被误跳过;解决:缓存条目新增 pinyinChecked 字段(补丁B),且补齐组词不再覆盖已有拼音纠正记录

踩坑 13(真实参赛经历):测试"产品调用大模型"的附加功能 — 为了把豆包大模型放进产品,买了火山引擎 Lite 和 Trae Work Lite 权限,实测后发现通用大模型解决类似问题在效率和稳健性方面并不总能如期望的好等方面;更深刻的教训是:接入新模型必须从开源社区汲取健壮性方案(JSON 解析/超时重试等)或微调专用小模型,否则原创要求很高——技术选型要多参考开源社区成熟实践,少走弯路

5.5 关键 Session ID(TRAE 开发凭证)

以下 Session ID 用于证明作品由 TRAE 开发完成。获取方法:以 TraeCN IDE 为例,在一段对话开始的地方,双击红圈的 Trae 图标,跳出 “copy success” 一闪即逝,剪贴板就有 session id 了。

复赛阶段(Trae CN 新版格式 {username}:{hash}_{thread_id}.{message_id}.{agent_id}:Trae CN.T({timestamp})):

# 任务 时间 Session ID
1 Vite 工程化重构 + 模块拆分 07-23 .309409433785034:3987398260dd2c55f46e45830d638dbc_6a60feb9103e2f9262702768.6a611202103e2f9262702b26.6a611202add19038c350563e:Trae CN.T(7/23/2026, 2:54:58 AM) 等 2 条
2 PWA 配置 + Service Worker + 图标生成 07-23 .309409433785034:d732eba08e3ece643f08f2a02d1326a3_6a60feb9103e2f9262702768.6a611f21103e2f9262702f49.6a611f20add19038c350564c:Trae CN.T(7/23/2026, 3:50:57 AM) 等 2 条
3 CI/CD 部署问题排查与修复 07-23 .309409433785034:ca178f8f8709b9913f6a99fcd3af0988_6a60feb9103e2f9262702768.6a611b2f103e2f9262702d98.6a611b2fadd19038c3505645:Trae CN.T(7/23/2026, 3:34:07 AM)
4 开源字体替换 + download-fonts.sh 07-23 .309409433785034:5a2e8d058e554d7d40156364ca4dd553_6a60feb9103e2f9262702768.6a611bf4103e2f9262702e12.6a611bf3add19038c3505648:Trae CN.T(7/23/2026, 3:37:24 AM)
5 Tailwind CSS + Lucide Icons 集成 07-23 .309409433785034:686e359a6ebda8afdd28bd2bf1b28cf4_6a60feb9103e2f9262702768.6a610ee4103e2f9262702a4f.6a610ee4add19038c350563a:Trae CN.T(7/23/2026, 2:41:40 AM)
6 学习闭环三件套(历史+反馈+复习)多 Agent 并行 07-23 .309409433785034:4fea733d3b7183eee00f1ee10b4ba9bf_6a60feb9103e2f9262702768.6a61474f103e2f92627035fa.6a61474eadd19038c3505668:Trae CN.T(7/23/2026, 6:42:23 AM)
7 界面辅助(设置中心+引导+演示+难度评估) 07-23 .309409433785034:6039b174c9754ff1f45af3d0aa41427b_6a60feb9103e2f9262702768.6a614408103e2f926270357b.6a614407add19038c3505662:Trae CN.T(7/23/2026, 6:28:24 AM)
8 SVG 矢量字格引擎 + 契约层(v2.4) 07-25/26 .309409433785034:534a413834ec6f61284db3dbeeaa6798_6a61fcaebe4273f5764bb50c.6a64c1f675d3caad3f2d947e.6a64c1f3906468fed4eea49c:Trae CN.T(7/25/2026, 10:02:30 PM) 等 2 条
9 v2.9.8 真离线笔顺升级(多 Agent) 08-06 .309409433785034:4f7b2982bb12da9ffe9517194d1a1e38_6a73dfbe269d50748c245d17.6a73e16e269d50748c245d19.6a73e16eb6da2e3ffe41b19d:Trae CN.T(8/6/2026, 9:20:46 AM)
10 v2.9.9 AI 组词 + 拼音纠错 08-06 .309409433785034:1e88be66cb76d0dcfe4cc1cb47ccf9ab_6a73dfbe269d50748c245d17.6a7468503b952a3bcc56002b.6a74684ea167bfa655d1db75:Trae CN.T(8/6/2026, 6:56:16 PM) 等 2 条
11 v3.0.0 双引擎 AI + 健壮性加固(豆包适配) 08-07 309409433785034:aec2b0f4fdf605d26820b1c7e53c6a9c_6a752c4b7d04eb6a59bb373e.6a7538c13bdf2001d16b4c81.6a7538c13bdf2001d16b4c7f:TraeWork CN.0.1.45.no_sid.no_ppe.T(2026/8/7 09:45:37)(Trae Work,楼层 18 补充)

注:复赛 Session ID 为 Trae CN 新版格式;v3.0.0 豆包适配为 Trae Work 会话(2026-08-07 09:45,楼层 18 补充);共 17 条(复赛 12 + 初赛 7),满足大赛 ≥3 条要求。
复赛开发过程截图:

复赛开发过程截图(1)

复赛 Session ID:

.309409433785034:a11c35564a5fba4de8491b2e5be71a35_6a65420875d3caad3f2d96fd.6a65779c75d3caad3f2d9ba4.6a65779b906468fed4eea4b1:Trae CN.T(7/26/2026, 10:57:32 AM)

复赛开发截图(a11c)


复赛开发过程截图(2)

复赛 Session ID:

.309409433785034:9712b3aeee26622146a29e85b4e59e78_6a65420875d3caad3f2d96fd.6a654bda75d3caad3f2d9914.6a654bd9906468fed4eea4a5:Trae CN.T(7/26/2026, 7:50:50 AM)

复赛开发截图(9712)


复赛开发过程截图(3)


复赛 Session ID:

.309409433785034:534a413834ec6f61284db3dbeeaa6798_6a61fcaebe4273f5764bb50c.6a64c1f675d3caad3f2d947e.6a64c1f3906468fed4eea49c:Trae CN.T(7/25/2026, 10:02:30 PM)

复赛开发截图(534a-1)

复赛 Session ID:

.309409433785034:534a413834ec6f61284db3dbeeaa6798_6a61fcaebe4273f5764bb50c.6a64c1f675d3caad3f2d947e.6a64c1f3906468fed4eea49c:Trae CN.T(7/25/2026, 10:02:30 PM)

复赛开发截图(534a-2)

复赛开发过程截图(4)

复赛开发过程截图(5)

初赛阶段(完整三段式 {thread_id}.{message_id}.{agent_id},已发表于初赛帖子 72722 / 71664,7 条已验证):

  1. 独立 HTML 打包、JS 内嵌(07-05 19:48):6a49f7e8f615ceaf1589607b.6a4a44899a9540f3b14ec753.6a4a4488b75d9ac48d921ab0
  2. 模板字符串修复、UI 增强、字体配置(07-05 20:16):6a49f7e8f615ceaf1589607b.6a4a4b199a9540f3b14eca1a.6a4a4b19b75d9ac48d921ab1
  3. PDF 乱码修复、矢量输出、Puppeteer 脚本(07-05 21:04):6a49f7e8f615ceaf1589607b.6a4a564b9a9540f3b14ecd6a.6a4a564ab75d9ac48d921ab2
  4. 开发过程截图(1)(07-06 04:36):6a49f7e8f615ceaf1589607b.6a4ac0459a9540f3b14ed5c4.6a4ac044b75d9ac48d921ab8

TRAE 开发过程截图(1)

  1. JSON 解析、三层防御、keep-alive 去重、编码兼容(07-06 05:01):6a49f7e8f615ceaf1589607b.6a4ac6429a9540f3b14ed689.6a4ac640b75d9ac48d921aba

TRAE 开发过程截图(2)

  1. 开发过程截图(3)(07-06 05:09):6a49f7e8f615ceaf1589607b.6a4ac81f9a9540f3b14ed6ae.6a4ac81eb75d9ac48d921abb

TRAE 开发过程截图(3)

  1. “我连文档都是用 AI 写的”(07-06 05:16):6a49f7e8f615ceaf1589607b.6a4ac9b99a9540f3b14ed718.6a4ac9b8b75d9ac48d921abc

TRAE 开发过程截图(4)

5.6 项目文件结构(v3.0.0)

字帖生成器/
├── src/                          # 源代码(27 个 JS 文件,9,973 行)
│   ├── main.js                   # 入口文件(事件绑定+初始化+模块集成)
│   ├── data/                     # 数据文件(3 个,65KB)
│   │   ├── customZuCi.js         # 自定义组词数据(1719条,57KB)
│   │   ├── templates.js          # 内置模板库(20个模板)
│   │   └── vocabulary.js         # 分级字库(3级18分类)
│   ├── components/               # 组件(2 个)
│   │   ├── GridEngine.js         # SVG 矢量字格引擎(viewBox 100×100 + CSS mm,703行)
│   │   └── Sidebar.js            # 侧栏组件(427行)
│   ├── contracts/
│   │   └── interfaces.js         # 接口契约层(GridCellProps/GridType/RenderMode/PdfExportOptions)
│   ├── modules/                  # 功能模块(17 个)
│   │   ├── aiZuci.js             # 双引擎 AI 组词+拼音纠错(DeepSeek+豆包,三模式分流,509行)⭐v3.0.0
│   │   ├── settingsCenter.js     # 设置中心(15 项设置 + 级联开关联动,680行)⭐v3.0.0
│   │   ├── onboarding.js         # 新手引导(18步聚光灯 + autoOpen 联动,716行)⭐v3.0.0
│   │   ├── strokeDemoModal.js    # 笔顺演示弹窗(双图层 + 4窗管理,711行)⭐v2.9.8
│   │   ├── fileImporter.js       # 多格式文件导入(txt/md/csv/xlsx/docx,405行)
│   │   ├── recommender.js        # 智能推荐(3维度13主题20模板,351行)
│   │   ├── hanziDataStore.js     # 笔顺数据仓库(BASE_URL+new URL,9574字bin,337行)⭐v2.9.8
│   │   ├── reportPanel.js        # 学习报告面板(纯原生 Canvas 图表,578行)
│   │   ├── feedback.js           # 练习反馈(整体+单字,196行)
│   │   ├── history.js            # 历史记录(localStorage+侧边栏,168行)
│   │   ├── fabDrag.js            # FAB 拖拽(Pointer Events + 8px 吸附,301行)
│   │   ├── puppeteerClient.js    # Puppeteer客户端(本地服务→在线代理→失败回退,189行)
│   │   ├── fontManager.js        # 字体管理(FONT_LIST+loadFonts+系统楷体自动匹配★)
│   │   ├── difficulty.js         # 难度评估(5级星级,108行)
│   │   ├── settings.js           # 基础设置(主题+页眉页脚+localStorage)
│   │   ├── strokes.js            # 笔画加载(hanzi-writer)
│   │   ├── zuci.js               # 组词查询(三级回退:customZuCi→cnchar→AI缓存)
│   │   └── hanziDataWorker.js    # Web Worker 解压(28行)
│   ├── utils/
│   │   └── pdfExport.js          # 双轨 PDF 导出(jsPDF+svg2pdf / 原生 print,816行)
│   └── styles/                   # 样式文件(19 个,3,486 行)
├── public/                       # 静态资源
│   ├── icon-192.svg / icon-512.svg / icon-192-maskable.svg  # PWA 图标
│   ├── stroke-demo-guide.html    # 笔顺演示介绍页 ⭐v2.9.8
│   ├── fonts/                    # 开源字体(CI 下载,114MB)
│   └── hanzi-data/               # 离线汉字笔画数据(hanzi-data.bin 12MB + 嵌入式降级 + fflate)
├── .github/workflows/
│   └── deploy.yml                # CI/CD 工作流(retake 分支触发)
├── scripts/
│   └── download-fonts.sh         # CI 字体下载脚本(4款开源字体)
├── index.html                    # HTML 入口
├── vite.config.js                # Vite 配置(base:'./' + singlefile + pwa + tailwind)
├── package.json                  # 项目配置(MIT协议,17 依赖)
├── puppeteer-pdf.cjs             # Puppeteer PDF 生成脚本(CommonJS)
├── puppeteer-server.cjs          # Puppeteer HTTP 服务
├── README.md / README_EN.md      # 项目文档(中英文)
├── README_contest.md             # 参赛文档
├── CHANGELOG.md                  # 更新日志(Keep a Changelog 格式)
├── TASK_BOARD.md                 # 任务看板
├── 启动Puppeteer.bat             # Windows 启动脚本
├── 启动Puppeteer.ps1             # PowerShell 启动脚本
└── 启动Puppeteer.sh              # Linux/macOS 启动脚本

5.7 package.json 依赖清单与 npm scripts

运行时依赖(12 个):

包名 版本 用途
pinyin-pro ^3.0.0 拼音转换(带声调)+ 多音字判定
cnchar + cnchar-words ^3.0.0 汉字处理 + 组词 + 笔画数
hanzi-writer ^3.5.0 → 3.7.3 笔画 SVG 渲染 + 动态笔顺动画
lucide-static ^1.25.0 SVG 图标库
puppeteer ^23.0.0 服务端矢量 PDF 生成
jspdf + svg2pdf.js ^2.5.2 / ^2.7.0 客户端纯矢量 PDF 导出
fflate ^0.8.3 笔顺数据 Gzip 解压 :star:v2.9.8
mammoth ^1.6.0 DOCX 文件解析(动态 import)
xlsx ^0.18.5 Excel 文件解析(动态 import)

开发依赖(5 个):

包名 版本 用途
vite ^5.4.0 构建工具
vite-plugin-singlefile ^2.0.0 单 HTML 打包
vite-plugin-pwa ^0.20.0 PWA 支持
@tailwindcss/vite ^4.3.3 Tailwind v4 Vite 插件
tailwindcss ^4.3.3 Tailwind CSS v4

npm scripts:

命令 说明
npm run dev 启动开发服务器(port 3000)
npm run build 生产构建(输出到 dist/)
npm run preview 预览构建结果(port 4173)
npm run pdf Puppeteer 生成矢量 PDF
npm run pdf:help PDF 命令帮助
npm run pdf:test 测试 PDF 生成(床前明月光)

构建验证(v3.0.0): JS 源文件 27 个 / 9,973 行,CSS 19 个 / 3,486 行|模块化结构:17 模块 + 2 组件 + 1 工具 + 1 契约|依赖 17 个(12 运行时 + 5 开发)|构建错误/警告 0/0|PWA precache 3.3MB(v2.9.8 起)|核心 JS/CSS 产物轻量,全量构建产物约 140MB(含开源字体 114MB + 离线笔顺数据 12MB)|Git 版本标签 28+,备份分支 25+。

6. 技术方案分享

6.1 纯前端 PWA + 矢量 PDF 三轨方案

核心理念:零后端依赖,保护用户隐私,离线可用。

用户输入汉字
    ↓
pinyin-pro 转换拼音 → cnchar 组词 → hanzi-writer 笔画 →(可选)双引擎 AI 组词补齐(DeepSeek / 豆包,三模式分流)
    ↓
SVG 矢量引擎渲染字格(拼音行 + 汉字行 + 笔画行/动态笔顺演示)
    ↓
方案A:window.print() → 浏览器打印预览 → 另存为 PDF(全平台)
方案B:jsPDF + svg2pdf 纯前端导出(免安装)
方案C:Puppeteer 无头浏览器 → 矢量 PDF(文字可选可复制,桌面端命令行)
    ↓
PWA Service Worker 缓存所有资源 → 完全离线可用(含 9574 字笔顺数据)

技术亮点:

  • FontFace API 动态注册字体 + document.fonts.check() 验证加载 + 超时重试(5 秒超时 + 3 秒额外等待)
  • JSON 解析三层防御(Connection:close + safeJsonParse + 请求去重)→ v3.0.0 升级为 4 级健壮 JSON 解析(直接解析 → 剥离代码块 → 提取首个 {…} → 提取首个 […])
  • vite-plugin-singlefile 保留单 HTML 离线分发能力
  • 系统楷体自动匹配:启动时从操作系统已安装字体中匹配 1-2 种楷体(★ 标识),解决"字体需求"这一字帖核心痛点(楼层 3/6 的问答落地为功能)
  • Web Worker 解压:9574 字笔顺数据(11.75MB Gzip bin)后台解压不阻塞主线程,多级降级(Worker→主线程→Base64→网络备选)
  • SVG 矢量引擎细节:viewBox 100×100 抽象坐标 + CSS mm 物理尺寸;行级统一边框消除亚像素误差;填充矩形代替 stroke 保证 PDF 线宽精确;shape-rendering: geometricPrecision;currentColor 智能反色
  • ?printdebug=1 真机调试、微信/QQ X5 内核检测、移动端打印适配(含华为 MatePad HarmonyOS 打印多轮修复)

6.2 学习闭环技术方案

生成字帖 → 自动保存到历史记录(localStorage,最多20条)
    ↓
练习反馈 → 整体反馈(3按钮)+ 单字反馈(DOM事件委托+悬停图标)
    ↓
复习计划 → 艾宾浩斯规则(mastered→7天 / review→3天 / error→1天)
    ↓
学习报告 → 纯原生 Canvas 图表(7天趋势/难度分布/掌握率)
    ↓
首页待复习 → 一键加载复习字 → 生成字帖 → 更新练习时间

跨模块通信:自定义事件 calligraphy:history-updatedcalligraphy:char-feedback-updatedcalligraphy:settings-updated

6.3 双引擎 AI 技术方案(v3.0.0 核心创新)

输入汉字
    ↓
本地预处理:多音字判定(pinyin-pro multiple 模式)
    ↓
三模式分流
├── fast          → 仅补齐组词(批次 10 字,max_tokens 2048)
├── single_check  → 单音字校验(批次 10 字,max_tokens 4096)
└── poly_check    → 多音字深度校验(批次 6 字,自动升级强模型)
    ↓
引擎自动识别(API Key 前缀)
├── sk-  → DeepSeek(deepseek-v4-flash,JSON mode)
└── ark- → 火山引擎豆包(doubao-seed-2-0-lite-260428 / 全量检查升级 doubao-seed-2-1-turbo-260628)
    ↓
健壮性管道
├── 指数退避重试(MAX_RETRY=3,500ms×attempt)
├── 5 分钟硬超时(HARD_TIMEOUT_MS=300000,partialSuccess 部分成功返回)
└── 4 级健壮 JSON 解析(适配弱模型多余输出)
    ↓
结果回写:localStorage 缓存(zuci/pinyin/pinyinFixed/pinyinChecked/wordsDetail/ts)
         → AI 拼音优先于默认拼音(getAiPinyin 回退)→ 纠错报告展示

设计要点:

  • 双引擎自动识别:用户只需粘贴任意一家 API Key,前缀 sk-/ark- 自动路由,无需手动切换;豆包免费入门 + DeepSeek 性价比付费,覆盖不同用户群体
  • 三模式分流是工程优化:不是简单"全部丢给 AI",而是本地预分流后针对性调用——多音字才走深度校验(批次缩小 + 强模型),普通字走快速补齐,大幅降低 token 消耗
  • 缓存穿透修复:pinyinChecked 字段解决"全量检查与组词补齐互相误跳过"的经典缓存问题(补丁B)
  • 紧急逃生门:localStorage.ai_model_override 可免打包切换模型,为未来模型升级留好后门(补丁C)
  • 失败友好:超时不卡死(返回部分成功 + 诊断建议),重试不阻塞(失败批次跳过继续后续批次),错误看得懂(HTTP 状态码中文诊断)

6.4 代码规模统计(v3.0.0)

指标 数值
JS 源文件 27 个,9,973 行
CSS 文件 19 个,3,486 行
模块化结构 17 模块(src/modules/)+ 2 组件 + 1 工具 + 1 契约
依赖 17 个(12 运行时 + 5 开发)
离线汉字 9,574 个(12MB Gzip bin + Web Worker 解压,多级降级)
预设模板 20 个(唐诗宋词 8 + 三字经 2 + 千字文 2 + 常用字 3 + 成语 3 + 节日 2)
引导步骤 18 步
网格类型 5 种(田字格/米字格/九宫格/回字格/拼音田字格)
颜色预设 4 套(传统绿/朱砂红/靛青蓝/墨黑)
AI 引擎 2 个(DeepSeek + 火山引擎豆包)
AI 模式 3 种(fast / single_check / poly_check)
PDF 导出轨道 3 条(浏览器打印 / jsPDF+svg2pdf / Puppeteer)
文件导入格式 5 种(txt/md/csv/xlsx/docx)
Git 版本标签 28+
代码总计 约 13,500 行(JS + CSS)

7. 社会价值分析

教育公平

  • 无网络环境可用:农村学校、无网络家庭、教育资源匮乏地区(乡村老师无网教室打开手机即用;离线优先设计,不背云端模型包袱)
  • 零成本:无需付费、无需注册、无需账号;AI 组词提供 免费入门入口(豆包 Lite),不因付费能力剥夺任何人使用 AI 辅助学习的权利,DeepSeek在可预知的大幅涨价之前费用还是比较低的
  • 隐私保护:所有数据本地处理,不上传儿童学习数据(AI 组词为可选功能,默认关闭、自配 Key,数据也仅发往用户自选的 DeepSeek/豆包)

文化传承

  • 汉字书写教育:拼音 + 组词 + 笔画 + 动态笔顺演示 四位一体,辅助正确书写
  • 开源字体推广:霞鹜文楷、思源宋体等开源字体,推动字体生态
  • 技术降低门槛:让每个人都能自由定制练字内容(MIT 开源,任何人可定制和深入开发)

学习科学

  • 艾宾浩斯遗忘曲线:基于科学记忆规律自动生成复习计划
  • 渐进式学习:难度评估帮助用户选择合适内容
  • 反馈驱动:练习反馈数据驱动个性化复习与学习报告

环保理念

  • 按需打印:只打印需要的练习内容,减少纸张浪费
  • 数字预览:屏幕预览确认后再打印,避免错误打印

8. 产品迭代规划

8.1 已完成(复赛最终版 v3.0.0,2026-08-07)

  • :white_check_mark: Vite 工程化重构(27 JS 文件 + 19 CSS + 3 数据文件 + 契约层)
  • :white_check_mark: PWA 离线支持(v2.9.8 起 SW 3.3MB 轻量安装 + 大文件运行时缓存)
  • :white_check_mark: 开源字体替换(6 款全合规 + 系统楷体自动匹配 ★)
  • :white_check_mark: CI/CD 自动部署(GitHub Actions → Pages)
  • :white_check_mark: UI 现代化(Tailwind + Lucide)
  • :white_check_mark: SVG 矢量字格引擎(5 网格 × 3 渲染模式 × 18mm 物理精度 + 行级统一边框)
  • :white_check_mark: 历史记录 / 练习反馈闭环 / 复习计划(艾宾浩斯)/ 学习报告面板
  • :white_check_mark: 内置模板库(20 个)/ 分级字库(3 级 18 分类)/ 文件导入(txt/md/csv/xlsx/docx)/ 智能推荐
  • :white_check_mark: 设置中心 / 新手引导(18 步)/ 演示模式 / 难度评估(5 级星级)
  • :white_check_mark: 米字格/九宫格/回宫格/田字格/拼音田字格 5 种网格
  • :white_check_mark: 离线动态笔画笔顺演示(9574 字,v2.9.8)
  • :white_check_mark: AI 组词补齐 + 拼音纠错(DeepSeek,v2.9.9)
  • :white_check_mark: 双引擎 AI(DeepSeek + 火山引擎豆包)+ 三模式分流(v3.0.0)
  • :white_check_mark: 超时重试 + 缓存穿透修复 + 级联开关 + 错误诊断 + 4 级健壮 JSON 解析 + 紧急逃生门(v3.0.0)
  • :white_check_mark: 演示视频录制上传(12MB,曾因 20MB 上限险些被拒)

8.2 进行中 / 取舍说明

  • :hourglass_not_done: 移动端深度优化(已完成初步优化,随版本持续更新;含 MatePad HarmonyOS 打印修复、触屏版 Light 主题修复)
  • :hourglass_not_done: AI 功能稳定性打磨(双引擎已上线,持续根据真实反馈优化提示词与批次策略)
  • 笔顺演示改写为独立分支功能(不追加主文件版本迭代,作为分支功能之一,MIT 开源欢迎参与者二次开发——楼层 12 说明)

8.3 未来规划(MIT 开源;任何人可自己定制和深入开发)

  • :clipboard: AI 智能推荐升级(规则版本离线可用已实现;双引擎已接入,可进一步引入更多学习型模型解决知识更新问题)
  • :clipboard: 专用小模型 / 开源社区模型微调(v3.0.0 实战证明:必须从开源社区进一步汲取能量,或微调出专用小模型,否则原创要求很高——这是下一步最想做的方向)
  • :clipboard: 学习报告完善(本地统计,含更多图表维度)
  • :clipboard: 更多格子样式(九宫格已追加,还可以改善)
  • :clipboard: 多语言支持(英文界面——写汉字用,似乎不需要?)
  • :clipboard: 教师批量生成(已添加"导入文件",可批量导入新生字)

9. 版权与字体说明

项目 协议
项目代码 MIT 许可证,可自由使用、修改、分发
霞鹜文楷 Regular/Light OFL(SIL Open Font License)
思源宋体 SC Regular OFL(SIL Open Font License)
文鼎楷体(TW-Kai) Apache 2.0 License
我逸清晨体楷书 OFL(SIL Open Font License)
TW-Kai OFL(SIL Open Font License)
TeX Gyre Adventor(拼音字体) GUST Font License
pinyin-pro / cnchar / hanzi-writer / jspdf / svg2pdf / fflate / mammoth / xlsx MIT License

分发中的所有字体均为开源协议,无版权风险,可安全商用。用户完全可以通过定制、扩展功能引入可以合法免费个人使用但不能打包分发的优秀字体(如方正楷体等)。历次升级时反复确认:未引入任何不合规字体。


10. 致谢

  • TRAE IDE — 提供强大的 AI 辅助开发环境,让非专业开发者也能完成工程化项目,多 Agent 并行开发能力极大提升开发效率。写代码、修 Bug,TRAE IDE 在我用过的几款国内 AI 编程工具里综合表现稳居第一(楼层 13 实测体会);用其它工具都可能导致拖延。修改代码优先用 Trae IDE;本次为测试还付费购买了 Trae Work 权限试用(楼层 12 经验:当前 Trae Work 写代码效率还是不如 IDE,但作为多 Agent 并行验证的补充手段是有价值的)。
  • DeepSeek — 为 AI 组词功能提供高性价比大模型 API(楼层 16:收到梁兄 API 调价通知后仍果断支持)。
  • 火山引擎豆包 — 为双引擎 AI 提供免费入门的大模型入口(doubao-seed-2-0-lite-260428 / doubao-seed-2-1-turbo-260628),让"零成本 AI 辅助"成为可能。
  • 开源社区 — pinyin-pro、cnchar、hanzi-writer、Vite、Tailwind CSS、Lucide、fflate、jsPDF、svg2pdf.js、mammoth、SheetJS 等优秀开源项目;v3.0.0 实战更让我深刻体会到:个人开发者做 AI 应用,必须从开源社区汲取能量——健壮 JSON 解析、超时重试、请求合并这些"踩坑方案",社区早有成熟实践。
  • 字体作者 — 霞鹜文楷、思源系列、文鼎楷体等开源字体的创作者
  • 初赛评委与测试用户 — 你们的反馈让作品更完善
  • 所有关注汉字书写教育的人 — 一字一世界,一笔一乾坤

11. 附录:创作心路(楼层 9 全文收录)

以下内容来自楼主在回复楼层 9 的长文《字帖生成器:一个普通人的 AI 探索,却让我看到了未来办公文档的影子》,作为对原贴的重要补充完整收录。

一、始于一个真实得不能再真实的需求

孩子上小学后,每天要练字。市面上的字帖要么内容固定、要么依赖网络、要么收费,更让人头疼的付了费的字帖、打印出来还是位图,放大一点就模糊,根本谈不上"描红"的精度。我自己平时也爱写写毛笔字,同样苦于找不到合适自己进度的字帖(就像背单词不想每次都是 abandon;临字帖,抬眼就是"永和九年")。——我开 1.6L 的经济型车接送孩子,被另一个小朋友感慨"哇,这么豪华",这句感慨让我瞬间震惊:在我们家孩子看来平平常常、甚至还老是嫌弃的,对别人却可能是遥不可及。还有很多类似的小学生,他们应该在不付费的情况下也能够享受类似的机会。这是 MIT 协议的初衷。——这也跟 TRAE 用自己剩余算力、普惠广大未付费用户的初衷类似:我用自己有限的余力,借了 TRAE 的慷慨赞助(至今仍是 free 用户、因为平时实在用不了那么多 token)的东风,取之于免费,还之于 MIT 和普惠。

我就在想:为什么不能自己做一份呢?不就是一份文档吗?有那么难吗?——这个想法早在 ChatGPT 版本还不到 4.0、Claude Sonnet 3.7 在国内有中转可用的时候就萌生了。那个时候 VibeCoding 这个词还没有提出来,我已经实际在这么做(我的 CSDN 博客上留有痕迹和时间戳)。

放在 ChatGPT 时刻以前,这个想法只能停留在脑子里——毕竟我的前端水平只是一个"素人",稀里糊涂懂一点 HTML/CSS/JS 细枝末节,但真要到开发一个完整应用的程度,还是有很大距离。然而,这次不一样,因为我遇到了 TRAE。

从需求到动手,只隔着一个 AI 的距离。

二、AI 赋能:一百次提示词,从零到完整产品

整个开发过程,我使用了 TRAE IDE 的 AI 辅助编程功能,全程实际使用的提示词(Fast Pass,等切换积分制 Credit 的时候我已经完工了)不超过 100 次(含 Fast Pass 时代凌晨无须排队的 Quick Pass)。是的,你没有听错——不到一百次的人机对话,我就从几乎为零开始,完成了一个从单 HTML 文件到工程化 PWA 应用的完整蜕变。

这听起来有点不可思议,但事实就是如此。AI 帮我写代码框架、帮我排查问题、帮我重构模块,而我只需要描述清楚"我想要什么"。我不需要成为前端专家,我只需要成为一个合格的需求提出者和决策者。

初赛时,我的项目只是从一堆散落的文件整理出的一个单 HTML 文件,双击就能运行,核心功能已经能跑通。进入复赛后,我决定不满足于"能用",而是要做成"好用"。于是,在 AI 的帮助下,我用大约几十天时间,把 1.1MB 的单 HTML 拆解为 14 个 JS 模块和 17 个 CSS 文件,引入 Vite 构建工具,配置 PWA 离线支持,完善了 CI/CD 自动部署流程,增加了历史记录、复习计划、分级字库、模板导入等学习闭环功能。——而这些 Vite、PWA、CI/CD 对我来说,都是全新的字眼,需要找 AI 导师搞搞清楚它们是啥,对项目有什么作用,会不会来捣乱、增加调试复杂度。

这是一个从"玩具"到"工具"的质变过程,而 AI 就是这个过程的加速器。

三、这个项目到底优点在哪里?

  1. 离线优先,随时可用。我坚持"纯前端、零依赖、完全离线可用"的设计理念。你把它安装到桌面或手机主屏(PWA),之后不需要服务器、不需要网络,打开即用(没塞大模型 API Key 调用也是有意的,虽然知道增加 LLM 调用能够显著增色——这部分留给开源和用户在其分支版本自定义和修改——这也是为离线、普惠而须做的取舍;但"AI"的应用贯穿开发全程,我自己没有写一句代码)。这意味着:乡村小学的老师在没有网络的教室里,打开手机就能给孩子生成字帖;家长在地铁上、飞机上也能随时定制练字纸。这不是一个"云端应用",这是一个像纸笔一样随身的工具。

  2. 真正的矢量 PDF,放大多少倍都清晰。字帖最终是要打印出来练字的。如果打印出来是模糊的位图,那还有什么意义?我实现了双轨矢量 PDF 输出方案:一是直接用浏览器 window.print(),另存为 PDF 即为矢量;二是使用 Puppeteer 无头浏览器生成矢量 PDF,文字可选中、可复制。两种方案覆盖了桌面端和移动端的所有场景。这是专业级的输出质量,绝非普通截图可比。

  3. 从"生成"到"学习"的闭环。很多字帖工具只负责生成,用完即走。我的项目不止于此——用户可以对每个字标记"掌握/复习/错字",系统会根据反馈自动生成复习计划,按艾宾浩斯遗忘曲线安排下次练习。加上历史记录、难度评估(笔画数分级)、内置模板库(唐诗宋词、三字经、千字文、常用字、成语等)、文件导入功能(支持 txt/md/csv/xlsx/docx 导入生词)……它已经从单纯的"工具"变成了一个"汉字学习平台"。

  4. 跨平台适配,一个代码全端跑通。从桌面端 Windows/macOS/Linux 到移动端 Android/iOS/HarmonyOS,从浏览器直接打印到 PWA 离线使用,一个代码库全部搞定。尤其是针对华为 MatePad 的 HarmonyOS 打印问题,我专门做了多轮修复,确保移动端打印也能完美输出。

  5. 持续迭代,认真对待每一个用户反馈。从 v1.0.1 到 v3.0.0,更新日志记录了 90+ 次 commits,这些数字不是用来炫耀的,每一次都对应着真实的使用反馈和功能改进。引导流程从 5 步扩展到 18 步、Dark 模式优化、移动端首次使用引导、桌面端 FAB 拖拽吸附……这些细节,都是因为我真正在使用它、打磨它。——这些次数也意味着,业余时间也足以完成;可能早年混迹于 Stackoverflow、StackExchange 这类论坛,已经习惯了把如何提高提问、追问和回答质量的肌肉记忆融入提示词技巧之中,所以自我感觉 vibe coding 起来其难度并没有想象中那么高:AI 交互出来的交付物,有时候居然能够出人意外地好。

四、我不懂"大模型微调",但我懂"应用落地"——这正是大多数普通用户的特征

有人可能会问:你的技术栈是什么?用了什么大模型?说实话,我的技术栈简单得令人发指——Vite + Tailwind CSS + 几个开源 JS 库(pinyin-pro、cnchar、hanzi-writer、Puppeteer)。

没有微调、没有 RAG、没有复杂的 Agent 框架,这不是偷懒,而是为了"离线普惠"刻意做的取舍——也正因为不背云端模型的包袱,它才能做到乡村无网可用。我想证明的是:AI 时代,不堆技术栈,同样能做出有深度、有温度的应用。

当前 AI 办公市场正处于一个"过渡期":大模型能力增长趋缓,产品形态远未定型,各家厂商还在赛马、还在抢入口。在这个阶段,最重要的不是比拼模型的参数,而是如何把现有能力封装成用户真正需要的产品

我的字帖生成器,就是这种"应用落地"思维的一个活生生的例子。它不追求酷炫,但追求实用;它不依赖云端,但离线可用;它不强行绑定 AI,但 AI 贯穿了开发的每一个环节。

五、为什么我认为它可能是"下一代办公文档"的雏形?

前段时间我读到一篇文章,提到 HTML 正成为"新 Markdown",因为它可以把 AI 输出从"可读文本"升级为"可审计、可比较、可操作、可回灌的协作界面"。我深有同感。

我的字帖生成器,其核心界面就是一个完整的 HTML 文档——你在浏览器中直接预览、交互、调整、打印,所有操作都在一个页面内完成。而它的"编辑"方式,是通过自然语言输入(你告诉它"我要练这些字":当前是通过 LLM 获取相关文字,支持 md、docx、csv 等格式导入。比如,人民教育出版社 2019 年五年级语文上下册教材生字,这是需要素材、LLM 处理的部分),AI 帮你生成结构化的字帖 HTML。这不就是未来办公文档的样子吗? 你只管说你要什么,AI 负责生成内容、排版、交互、输出,而你只需要看到一个可视化的结果。

虽然 HTML 目前还有"只能看、难编辑"的短板,但 AI 完全有能力弥补这一点——就像我使用 TRAE,通过自然语言指示 AI 修改 HTML 和 CSS 一样。"所见即所得、所见即可改"正在成为现实。

传统文档格式如 DOCX、PPTX、XLSX 不会消失,但它们会退居二线——成为数据源和导出格式。而 HTML 将成为呈现与交互的主角,AI 将成为真正的"编辑器"。我的字帖生成器,可能就是这种趋势中一个微不足道、可以交给时间去验证的不成熟猜想或确凿的先例。

六、为自己加油,也为所有普通创作者加油

参加这次比赛,我最大的收获不是奖项本身,而是让我亲身体验到:AI 正在抹平技术门槛,让每一个有想法的人都有可能把想法变成现实。

我不懂复杂的前端工程,但 AI 帮我完成了重构;我不懂设计模式,但 AI 帮我梳理了模块;我不懂 PWA 配置,但 AI 一步步教我实现。我是一个普通人,但有了 AI,我可以做出不普通的东西。

这种经历让我坚信,在 AI 办公应用这个不确定的过渡期,最理性的策略不是等待"最终答案",而是立刻动手,从真实需求出发,做出能解决实际问题的产品。 数据会积累,反馈会回流,产品会迭代——只要迈出第一步,就已经走在路上了。

我的字帖生成器还远未完美,它是我一个普通人的探索,也是我对未来办公文档形态的一次尝试。我希望评委和观众能看到它的价值,更希望所有看到这个项目的普通人能受到一点启发:别怕技术门槛,AI 会帮你跨过去。

12. 附录:社区互动与答疑(楼层问答收录)

楼层 2(迟迟):“好强的复赛作品” — 感谢鼓励!

楼层 3(u4298416450437755):如果要加载新的字体,可以去哪里寻找?导入字体需要什么格式文件?

答(楼层 4):可以自己搜索、下载、必要的时候购买字体,电脑上自己喜欢的、已经安装的字体都可以加载了备用;后面代码 MIT 协议开源,你还可以用 TRAE 把自己喜欢的字体直接嵌入到代码中作为默认使用。不要想当然认为代码都是别人写或别人用 AI 写的,这种开源的、MIT 协议的,你可以拿去随便改、随便用。
补充(楼层 6):复赛公开的最终版本,启动时自动从当前操作系统(计划支持 Windows/Linux/macOS/Android/HarmonyOS)已安装字体中自动匹配和加载 1-2 种(为避免加载问题作了限制)楷体类型的字体,字体下拉菜单中前面会有五角星符号(★)标识。选择新字体后点击生成或刷新,即对字帖应用新字体,然后就可以打印。

楼层 7(骆谦实):这个垂直领域很实用了,可以直接连接打印机使用吗?

答(楼层 8):可以的;选择打印机就可以。

楼层 10(u907554062350092):“好厉害” ×2 — 感谢鼓励!

楼层 16(关于 AI 组词):AI 组词需要自己准备 API Key 吗?收费吗?

答:是的,AI 组词为可选增强功能,默认关闭,需在设置中心输入自己的 API Key;支持 DeepSeek(sk- 前缀)与火山引擎豆包(ark- 前缀)双引擎自动识别。豆包 Lite 提供免费入门额度,DeepSeek 性价比与口碑兼备(收到梁兄 API 调价通知后仍果断支持)。受大模型概率生成特性影响,冷僻字/多音字场景有时需多次点击才得到理想结果;AI 结果仅供参考,以权威教材/字典为准。

楼层 18(2026-08-07,v3.0.0 豆包适配完成)

进一步的追加——发现如果只用通用大模型,稍微复杂点的任务,自动生成的提示词效果并不理想,可能需要在大模型微调、提示词改进等方面深入打磨,但这已经超过我作为个人开发者的能力范畴了。

大模型局限反思

好消息是:我终于把豆包也修改得能用了,太不容易了(豆包 lite 弱模型在 JSON 输出稳定性、响应格式上差异明显,经过多轮调试终于适配完成)。

豆包适配完成

附 Trae Work Session ID:309409433785034:aec2b0f4fdf605d26820b1c7e53c6a9c_6a752c4b7d04eb6a59bb373e.6a7538c13bdf2001d16b4c81.6a7538c13bdf2001d16b4c7f:TraeWork CN.0.1.45.no_sid.no_ppe.T(2026/8/7 09:45:37)(豆包适配测试、和最终的V3.0.0产品的备份和部署都 Trae Work 完成;界面截图见楼层 18 附图)

Trae Work 界面截图

愿这份小小的工具,能为汉字教学与书写传承尽一份力。

作品体验入口、源码包等交付物已通过飞书问卷私密提交,仅供评审查看。 按大赛规则,社区帖内不放置体验链接、二维码或可下载的源码/安装包;如需在线体验或有任何疑问,欢迎通过论坛私信联系作者(u309409433785034)。


本文为 TRAE AI 创造力大赛复赛作品说明帖(最终版)|发布日期:2026-07-23(v2.9.5)→ 07-26 更新(v2.9.7)→ 2026-08-06 整合修订(v2.9.9)→ 2026-08-07 最终版(v3.0.0)|版本:复赛 V3.0.0

2 个赞

好强的复赛作品

如果要加载新的字体,可以去哪里寻找?导入字体需要什么格式文件?

可以自己搜索、下载、必要的时候购买字体,电脑上自己喜欢的已经安装的字体,都可以加载了备用,然后加载;后面代码MIT协议开源,你还可用Trae把自己喜欢的字体直接嵌入到代码中、作为默认的使用。不要想当然认为代码都是别人写或别人用AI写,这种开源的、MIT协议的,你可以拿去随便改、随便用

所有的都是我让AI写的,我自己不写

版本还在完善、功能还在更新,针对这个其实对字帖来说很重要的字体需求,复赛公开的最终版本,启动的时候会自动从当前操作系统(计划支持windows,linux,macos,android,homonyOS)已经安装的字体中自动匹配和加载1-2种(为了避免加载问题,作了限制)楷体类型的字体,字体下拉菜单中前面会有五角星符号标识。选择新的字体之后、点击生成或刷新,对字帖应用新的字体,然后就可以打印。

这个垂直领域很实用了,我有一个问题?

这个是可以直接连接打印机就可以使用的吗!?

可以的;选择打印机就可以

1 个赞

字帖生成器:一个普通人的AI探索,却让我看到了未来办公文档的影子

我是字帖生成器的作者,一个材料和化学方向的工程技术人员,业余编程爱好者,也是一位小学生的家长。参加TRAE AI创造力大赛,对我来说是一次充满惊喜的旅程——从最初只是为了解决自己练字的小需求,到如今拿出一个具备完整产品形态、离线可用、跨平台、矢量输出的字帖生成工具,我从未想过一个“素人”也能做到这一步。而这背后,AI(尤其是TRAE IDE)给了我前所未有的力量。

我其实老早就想提交了,因为做一个简单的任务、如果旷日持久,这不应该是AI加持效率时代的做事风格。何况,抛砖引玉,如果能够给大家以参考借鉴、能够激励其他选手:想要进决赛,起码超过这个;——这正是我想看到的!截至目前看到这么多优秀的帖子,我感觉自己似乎可以遁了,但还是想表达一些仅仅原贴、原作品不能表达的补充内容。

而我还想以参赛者的身份,展示这个项目,分享我的探索过程,也谈谈我对AI办公应用前景的一些不成熟的看法。


一、始于一个真实得不能再真实的需求

孩子上小学后,每天要练字。市面上的字帖要么内容固定、要么依赖网络、要么收费,更让人头疼的付了费的字帖、打印出来的字帖还是位图,放大一点就模糊,根本谈不上“描红”的精度。我自己平时也爱写写毛笔字,同样苦于找不到合适自己进度的字帖(就像背单词、不想每次开始都是abandon;临字帖,抬眼就是“永和九年”)。——我开1.6L的经济型车接送孩子,被另一个小朋友感慨“哇,这么豪华”,这句感慨让我瞬间震惊了:在我们家孩子看来平平常常、甚至还老是嫌弃的,对别人却可能是遥不可及。还有很多类似的小学生,他们应该在不付费的情况下也能够享受类似的机会。这是MIT协议的初衷。——这也跟Trae用自己剩余算力、普惠广大未付费用户的初衷类似:我用自己有限的余力,借了Trae的慷慨赞助(至今仍是free用户、因为平时实在用不了那么多token)的东风,取之于免费,还之于MIT和普惠.

我就在想:为什么不能自己做一份呢?不就是一份文档吗?有那么难吗?——这个想法早在ChatGPT版本还不到4.0, Claude Sonnet 3.7在国内有中转可用的时候就萌生了。那个时候VibeCoding这个词,还没有提出来,我已经实际在这么做(我的CSDN博客上留有痕迹和时间戳)。

放在ChatGPT时刻以前,这个想法只能停留在脑子里——毕竟我的前端水平只是一个“素人”,稀里糊涂懂一点HTML/CSS/JS细枝末节,但真要到开发一个完整应用的程度,还是有很大距离。然而,这次不一样,因为我遇到了TRAE。

从需求到动手,只隔着一个AI的距离。


二、AI赋能:一百次提示词,从零到完整产品

整个开发过程,我使用了TRAE IDE的AI辅助编程功能,全程实际使用的提示词(Fast Pass,等切换积分制Credit的时候我已经完工了)不超过100次(含Fast Pass时代凌晨无须排队的Quick Pass)。是的,你没有听错——不到一百次的人机对话,我就从几乎为零开始,完成了一个从单HTML文件到工程化PWA应用的完整蜕变。

这听起来有点不可思议,但事实就是如此。AI帮我写代码框架、帮我排查问题、帮我重构模块,而我只需要描述清楚“我想要什么”。我不需要成为前端专家,我只需要成为一个合格的需求提出者和决策者。

初赛时,我的项目只是从一堆散落的文件整理出的一个单HTML文件,双击就能运行,核心功能已经能跑通:输入汉字,自动生成带拼音、组词、笔画描红的字帖,打印输出矢量PDF。功能虽简单,但已经能满足基本需求。

进入复赛后,我决定不满足于“能用”,而是要做成“好用”。于是,在AI的帮助下,我用了大约几十天时间,把1.1MB的单HTML拆解为14个JS模块和17个CSS文件,引入Vite构建工具,配置PWA离线支持,完善了CI/CD自动部署流程,增加了历史记录、复习计划、分级字库、模板导入等学习闭环功能。——而这些Vite, PWA, CI/CD对我来说,都是全新的字眼,需要找AI导师搞搞清楚它们是啥,对项目有什么作用,会不会来捣乱、增加调试复杂度。

这是一个从“玩具”到“工具”的质变过程,而AI就是这个过程的加速器。


三、这个项目到底好在哪里?——我需要坦诚地讲几点

我知道市场上字帖工具不少,但我的字帖生成器有几个特点,仍是独有的,甚至也许能够代表了未来“AI办公文档”的一些方向、是未来AI办公文档的一个典型的雏形:

1. 离线优先,随时可用

我坚持“纯前端、零依赖、完全离线可用”的设计理念。你把它安装到桌面或手机主屏(PWA),之后不需要服务器、不需要网络,打开即用(没塞大模型api key调用也是有意的,虽然知道增加LLM调用能够显著增色——这部分留给开源和用户在其分支版本总自定义和修改——这也是为离线、普惠而须做的取舍,但"AI"的应用贯穿开发全程、我自己没有写一句代码,就是个目不转睛、吹毛求疵、写代码做测试的LLM们见了都怕的产品经理)。这意味着什么?意味着乡村小学的老师在没有网络的教室里,打开手机就能给孩子生成字帖;意味着家长在地铁上、飞机上也能随时定制练字纸。这不是一个“云端应用”,这是一个像纸笔一样随身的工具。

2. 真正的矢量PDF,放大多少倍都清晰

字帖最终是要打印出来练字的。如果打印出来是模糊的位图,那还有什么意义?我实现了双轨矢量PDF输出方案:一是直接用浏览器window.print(),另存为PDF即为矢量;二是使用Puppeteer无头浏览器生成矢量PDF,文字可选中、可复制。两种方案覆盖了桌面端和移动端的所有场景。这是专业级的输出质量,绝非普通截图可比。

3. 从“生成”到“学习”的闭环

很多字帖工具只负责生成,用完即走。我的项目不止于此——用户可以对每个字标记“掌握/复习/错字”,系统会根据反馈自动生成复习计划,按艾宾浩斯遗忘曲线安排下次练习。加上历史记录、难度评估(笔画数分级)、内置模板库(唐诗宋词、三字经、千字文、常用字、成语等)、文件导入功能(支持txt/md/csv/xlsx/docx导入生词)……它已经从单纯的“工具”变成了一个“汉字学习平台”。

4. 跨平台适配,一个代码全端跑通

从桌面端Windows/macOS/Linux到移动端Android/iOS/HarmonyOS,从浏览器直接打印到PWA离线使用,一个代码库全部搞定。尤其是针对华为MatePad的HarmonyOS打印问题,我专门做了多轮修复,确保移动端打印也能完美输出。

5. 持续迭代,认真对待每一个用户反馈

从v1.0.1到v2.9.7,更新日志记录了92次commits,这些数字不是用来炫耀的,每一次都对应着真实的使用反馈和功能改进。引导流程从5步扩展到9步、Dark模式优化、移动端首次使用引导、桌面端FAB拖拽吸附……这些细节,都是因为我真正在使用它、打磨它。——这些次数也意味着,业余时间也足以完成,可能早年混迹于Stackoverflow, stackexchange这类论坛,已经习惯了把如何提高提问、追问和回答质量的肌肉记忆、融入提示词Prompting技巧之中,所以自我感觉vibeCoding起来其难度并没有想象中那么高:AI交互出来的交付物,有时候居然能够出人意外地好。


四、我不懂“大模型微调”,但我懂“应用落地”——这正是大多数普通用户的特征

有人可能会问:你的技术栈是什么?用了什么大模型?说实话,我的技术栈简单得令人发指——Vite + Tailwind CSS + 几个开源JS库(pinyin-pro、cnchar、hanzi-writer、Puppeteer)。

没有微调、没有RAG、没有复杂的Agent框架,这不是偷懒,而是为了"离线普惠"刻意做的取舍**——也正因为不背云端模型的包袱,它才能做到乡村无网可用。我想证明的是:AI 时代,不堆技术栈,同样能做出有深度、有温度的应用

当前AI办公市场正处于一个“过渡期”:大模型能力增长趋缓,产品形态远未定型,各家厂商还在赛马、还在抢入口。在这个阶段,最重要的不是比拼模型的参数,而是如何把现有能力封装成用户真正需要的产品

我的字帖生成器,就是这种“应用落地”思维的一个活生生的例子。它不追求酷炫,但追求实用;它不依赖云端,但离线可用;它不强行绑定AI,但AI贯穿了开发的每一个环节。


五、为什么我认为它可能是“下一代办公文档”的雏形?

前段时间我读到一篇文章,提到HTML正成为“新Markdown”,因为它可以把AI输出从“可读文本”升级为“可审计、可比较、可操作、可回灌的协作界面”。我深有同感。

我的字帖生成器,其核心界面就是一个完整的HTML文档——你在浏览器中直接预览、交互、调整、打印,所有操作都在一个页面内完成。而它的“编辑”方式,是通过自然语言输入(你告诉它“我要练这些字”:当前是通过LLM获取相关文字,支持md,docx,csv等格式导入。比如,人民教育出版社2019年五年级语文上下册教材生字
人教社2019版五年级语文上下册生字.zip (1.7 KB)
这是需要素材、LLM处理的部分),AI帮你生成结构化的字帖HTML。这不就是未来办公文档的样子吗? 你只管说你要什么,AI负责生成内容、排版、交互、输出,而你只需要看到一个可视化的结果。

虽然HTML目前还有“只能看、难编辑”的短板,但AI完全有能力弥补这一点——就像我使用TRAE,通过自然语言指示AI修改HTML和CSS一样。“所见即所得、所见即可改”正在成为现实。

传统文档格式如DOCX、PPTX、XLSX不会消失,但它们会退居二线——成为数据源和导出格式。而HTML将成为呈现与交互的主角,AI将成为真正的“编辑器”。 我的字帖生成器,可能就是这种趋势中一个微不足道、可以交给时间去验证的不成熟猜想或确凿的先例。


六、为自己加油,也为所有普通创作者加油

参加这次比赛,我最大的收获不是奖项本身,而是让我亲身体验到:AI正在抹平技术门槛,让每一个有想法的人都有可能把想法变成现实。

我不懂复杂的前端工程,但AI帮我完成了重构;我不懂设计模式,但AI帮我梳理了模块;我不懂PWA配置,但AI一步步教我实现。我是一个普通人,但有了AI,我可以做出不普通的东西。

这种经历让我坚信,在AI办公应用这个不确定的过渡期,最理性的策略不是等待“最终答案”,而是立刻动手,从真实需求出发,做出能解决实际问题的产品。 数据会积累,反馈会回流,产品会迭代——只要迈出第一步,就已经走在路上了。

我的字帖生成器还远未完美,它是我一个普通人的探索,也是我对未来办公文档形态的一次尝试。我希望评委和观众能看到它的价值,更希望所有看到这个项目的普通人能受到一点启发:别怕技术门槛,AI会帮你跨过去。


这是一个普通用户的AI办公方式的探索,感谢TRAE给予的机会,也感谢每一个愿意花时间了解这个项目、提出反馈和需求的人。

字帖生成器,我为自己加油,也为所有敢于动手的创作者加油!

:face_blowing_a_kiss:好厉害 :face_blowing_a_kiss:好厉害

1 个赞

2.9.7版本及之前为什么没把“动态笔顺动画”塞进最终产品?

初赛提交 Demo 时,我曾构想并预告过复赛将追加“汉字偏旁笔顺动态演示”功能。利用 HanziWriter 实现笔画动画和偏旁高亮,原型跑通后视觉效果确实非常惊艳。

但在复赛整合阶段,经过真实的本地化打包测试后,我权衡再三,最终决定克制这个“看起来很炫”的需求,将其从主流程中剥离

因为当时对技术实现的理解,觉得它与我复赛版最核心的底线——**“离线普惠”**产生了不可调和的冲突。具体有三个层面的“浅度”考量:

第一,底层数据依赖与“离线普惠”的冲突

HanziWriter 的机制决定了每个汉字都需要独立的 JSON 数据文件。在原型验证阶段,我尝试过把数据下载到本地(下面截图中这近万个零碎文件就是证据,没用 FastCopy 时在不同硬盘间迁移这些解压后的 JSON 简直是噩梦;当时居然没想到合并这些JSON、压缩到一个文件,提供检索和检索函数)。

这就面临一个死结:要么每次用户输入新字时临时去请求 CDN 数据,这在乡村弱网或完全离线的环境下会直接失效,彻底违背了 PWA 离线可用的初衷;要么把这近万个 JSON 文件全部打包进项目,但这会让构建体积和加载速度面临灾难性的膨胀。无论怎么选,都无法兼顾“动态动画”与“极致轻量离线”。

第二,核心场景的错位:打印纸 vs 屏幕动画

字帖的核心归宿是“打印出来的纸”。用户在纸上临摹时,需要的是静态的笔画分解参考(这一点在复赛版主帖功能 #4 中保留并做了深度优化)。而“逐笔动态演示”是面向“屏幕交互”的。强行把几十秒的动画塞进以“批量生成、一键打印”为导向的工具里,不仅性价比低,还会打断用户的使用心流。

第三,做完整产品,最难的是“做减法”

在 AI 辅助编程时代,实现一个炫酷的功能变得前所未有的容易。但做产品,如果技术上不能摆平可能产生的问题,就比较忌讳“功能蔓延 (Feature Creep)”。初赛的“动态笔顺”是一个很好的技术探索,但它更适合作为一个独立的识字学习工具,而不是嵌入在字帖生成器内部。技术落后的情况下,只能先坚守产品的边界,把“生成-打印-复习”的闭环做到极致,确保复赛提交的是完整的成品、这才是复赛阶段首要目标。

简单说,与其强行集成、互相掣肘,不如保持各自领域的专注。

附上当时做本地化打包测试时的截图、原型验证的 Demo HTML 文件和演示视频,欢迎社区的朋友拿去二次开发,做成独立的笔顺学习 App。

动态演示笔画笔顺DEMO.html (8.0 KB)

补充:后来发现克服近万个JSON零碎的问题、把它们压缩成一个数据文件,编写专门的检索和读取工具,把这个完全离线的功能添加到字帖中,也可以实现,只不过炫酷而耗时、对字帖基本功能的改良有限(如果有的话,应该就是可以离线很彻底)。

这个改写不追加到主文件的版本更新和功能迭代中去了,只是作为其可能的分支功能之一。MIT开源的意图本身是希望对相关功能好奇的参与者,一起来修改出适合自己的。

此外,我使用Trae Work的一个经验,修改代码优先用Trae IDE,当前Trae Work写代码效率还是不如IDE。

本来说好不更新,V2.9.7就打住。结果发现9574个JSON文件可以自己重新打包、离线使用,这就不同了。于是连夜更新到2.9.8,追加了可以离线实现的动态笔画笔顺演示功能。刚刚部署好。我的体会,写代码、修BUG,Trae IDE在我用过的几款国内AI编程工具里,综合表现稳居第一。用其它工具都可能会导致拖延。

出于对设备性能的考虑,限制了最多可以开四个动态演示窗口。我这里放两个的截图:

以及视频

字帖生成器 v2.9.7 → v2.9.8 升级简报

部署生效链接

项目 链接
主页(字帖生成器 v2.9.8) 根据大赛规则,暂时隐藏
笔顺演示功能介绍页 根据大赛规则,暂时隐藏
GitHub 仓库 根据大赛规则,暂时隐藏
回退标签 v2.9.7 git checkout v2.9.7(本地与远程均已保留)

一、升级概览

本次升级通过多 Agent 并行执行,将 distribution 项目从 v2.9.7 一次性更新到 v2.9.8,整合了笔顺演示、导航增强及多项 Bug 修复,同时严格保障字体合规性。

二、新增功能

  1. 离线汉字笔画笔顺动态演示

    • 点击字格弹出标准窗口式弹窗,逐笔演示笔顺
    • 内置 9574 个汉字离线数据(11.75MB Gzip 二进制,Web Worker 后台解压)
    • 双图层架构:底层 0.25 不透明度轮廓始终显示,顶层逐笔动画覆盖
    • 播放/暂停两态切换,速度 1x-5x 可调并持久化到 localStorage
    • 最多 4 个弹窗并存,支持最小化/最大化/关闭/拖拽
  2. 导航介绍增强

    • 引导流程从 9 步扩展到 16 步
    • 新增独立笔顺演示介绍页 stroke-demo-guide.html

三、Bug 修复

  • 汉字打印无法正常显示(强制 light 主题 + FontFace URL 加引号)
  • 页面页脚黑色底色问题
  • 触屏版 Light 主题无法正常渲染(内联 color-scheme 声明)
  • 导航时部分按钮无法显示
  • localStorage 规则优化(速度持久化)
  • 最小化/最大化按钮失效(改用固定 vw/vh 尺寸)
  • 速度滑块失效(hanzi-writer 3.7.3 无 updateOptions,直接赋值 _options

四、部署修复(GitHub Pages 子路径适配)

  • hanziDataStore.js 使用 import.meta.env.BASE_URL + new URL 构建 URL,修复子路径下 hanzi-data.bin 404
  • vite.config.js 添加 globIgnores 排除大文件 precache,SW 安装包从 140MB 降至 3.3MB
  • stroke-demo-guide.html 返回链接改为相对路径 ./

五、字体合规保障

[!IMPORTANT]
未引入任何不合规字体。保持 v2.9.7 的字体种类和默认字体不变。

  • 默认字体:文鼎楷体(TW-Kai,免费开源)
  • 可选字体:霞鹜文楷、霞鹜文楷 Light、思源宋体、TeX Gyre Adventor、楷体、KaiTi
  • 未嵌入方正楷体_GBK 或其它需特别授权的字体

六、版本号与文档更新

  • package.json 版本号 → 2.9.8
  • HTML 前端显示版本号 → v2.9.8
  • CHANGELOG.md 追加 v2.9.8 变更记录
  • stroke-demo-guide.html 版本号同步更新
  • 引导页品牌文字保持"字帖生成器"序列,无外部项目引用

七、备份与回退

备份方式 位置
Git 标签 v2.9.7v2.9.7-snapshotv2.9.8(本地+远程)
备份分支 backup/pre_v298_upgrade_20260806(本地+远程)
回退命令 git checkout v2.9.7git reset --hard backup/pre_v298_upgrade_20260806

八、测试验证

  • 桌面端:Puppeteer 真实浏览器验证笔顺演示功能正常,hanzi-data.bin 加载成功
  • 线上验证:通过浏览器访问确认 v2.9.8 已部署,默认字体为文鼎楷体,引导流程 16 步,笔顺演示介绍页正常
  • 构建验证:Vite 构建通过,PWA Service Worker precache 降至 3.3MB
  • 工作目录:已清理测试文件,git status 干净

九、提交记录

8665366 docs(v2.9.8): CHANGELOG追加部署修复记录
54d1c3f fix(v2.9.8): 修复PWA SW precache过大导致hanzi-data.bin加载失败
27acd9c fix(v2.9.8): 修复GitHub Pages子路径下hanzi-data资源404
2abf6bf feat(v2.9.8): 笔顺演示+导航增强+Bug修复(字体合规保障)

升级已全部完成,v2.9.8 已在线运行。如需回退到 v2.9.7,可通过上述标签或备份分支操作。

对应Session ID (Trae CN IDE):
.309409433785034:4f7b2982bb12da9ffe9517194d1a1e38_6a73dfbe269d50748c245d17.6a73e16e269d50748c245d19.6a73e16eb6da2e3ffe41b19d:Trae CN.T(8/6/2026, 9:20:46 AM)

以往的一个Fast Pass 当前 816.20积分:

Trae Work做了一些辅助的验证工作,但主力还靠Trae CN IDE

字帖生成器 (Calligraphy Sheet Generator) v2.9.9 更新日志

“又是一次规划之外的迭代,但极大地弥补了真实使用场景下的体验缺口。”


:light_bulb: 缘起:从“真离线”发现的体验盲区

本来 Desktop 测试效果是最理想的,但没想到 v2.9.7 之前并没有实实在在“真离线”。在 v2.9.8 实现了真离线的情况下才发现,原来连接网络的过程中,受限于网速加载缓慢,仍然会带来功能卡顿或失效的用户体验。

在低网速或资源缓冲期间,笔画演示功能容易受到影响。因此 v2.9.9 的更新显得尤为必要:核心任务就是解决在未完全加载或低网速缓冲过程中,依然能够流畅使用笔画笔顺及动态演示功能的问题。


:high_voltage: 核心修复与体验升级

1. 本地缓存 + 网络同步双轮驱动

  • 动态笔画笔顺即时可用:开启本地缓存与网络同步双重机制。即使处于低网速或资源缓冲阶段,点击汉字也能顺畅呼出动态笔画笔顺演示。
  • 缓冲期 Bug 彻底修复:修复了本地数据缓冲时功能短暂瘫痪不可用的漏洞,提升了系统整体稳定性。
  • 双端压测通过:已在 Mobile(移动端)与 Desktop(桌面端)完成全流程闭环测试,体验均恢复正常流畅。

:robot: 重磅扩展:“AI 组词”接入 (DeepSeek API)

正当准备收尾时,突然收到了来自 DeepSeek 梁兄关于 API 调价的通知(性价比依然高,这次果断支持先涨 100%):

为了解决某些生字组词不完整、甚至完全没有组词的痛点,在增加 API Key 的情况下,顺手添加了“AI 组词”功能:

AI 功能说明:

  • 入口深藏,默认关闭:功能默认不开启,深藏在“设置”面板中,需要手动输入用户自己的 DeepSeek API Key。
  • 目前定位测试期:目前属于功能有待完善的测试期,暂时只提供了 DeepSeek API Key(从全球 Token 消耗量排名无脑评价,性价比与口碑兼备)。
  • LLM 生成式特点:受大模型概率生成特性的影响,针对部分冷僻字或多音字场景,有时需要多次点击“AI 组词”功能,才可能得到最理想的结果。

:camera_with_flash: 实测效果展示

测试样本选用 人教社 2019 版五年级上册语文生字,进行 AI 组词与注音测试:

1. 设置面板与提示词/参数设置

添加 API Key 后的 AI 组词功能配置界面,包含了第一个版本的提示词设置以及大模型参数设置:

2. 亮色主题(Light Theme)测试效果

第一次使用 Light 主题进行 AI 组词生成的排版效果:

3. 暗色主题(Dark Theme)测试效果

第二次使用 Dark Theme,用了两次才将生字全部组词完成的沉浸式展示:


:hammer_and_wrench: 构建与开发者 Session 追溯

  • 版本跨越:v2.9.8 ➔ v2.9.9
  • Trae CN IDE Session ID
    .309409433785034:1e88be66cb76d0dcfe4cc1cb47ccf9ab_6a73dfbe269d50748c245d17.6a7468503b952a3bcc56002b.6a74684ea167bfa655d1db75:Trae CN.T(8/6/2026, 6:56:16 PM)

我已经心有余而积分不足了,我已经暴露了,积分还剩1000多,实际跑完已经不到1000了

用户希望增强 AI 功能:在组词的同时加入拼音核对与纠错。先审查当前拼音生成流程和 AI 调用代码。

全部完成。以下是简报。


简报:v2.9.9 AI 组词补齐 + 拼音纠错增强

一、完成内容

1. 导航引导新增 AI 组词补齐步骤(16步 → 17步)

  • [onboarding.js](file:///c:/poem2pdf/distribution/src/modules/onboarding.js) 新增第17步,autoOpen: 'settings' 主动打开设置面板高亮 AI 区域
  • 步骤说明强调 AI 概率属性:一次补齐未必全覆盖,多重复点击可逐步补齐
  • 新增 autoOpen: 'settings' 支持(静态导入 openSettings,复用已存在面板的 _open 避免重建导致 target 引用失效)

2. AI prompt 增强为"注音核对 + 精准组词 + 全局拼音校验"

参考您提供的提示词,[aiZuci.js](file:///c:/poem2pdf/distribution/src/modules/aiZuci.js) 的 callDeepSeekDirect 重写为:

  • 角色:专业汉语教学与拼音专家
  • 注音核对:组词前先核对 pinyin-pro 预设拼音,多音字自动修正
  • 精准组词规则:杜绝地名/人名专有名词(如"鹤"禁用"鹤壁"),词性多样化,鲜明体现字义
  • 全局校验:复核所有词组带声调拼音,统计修正次数
  • JSON 输出{chars[], fix_count, fixes[]} 结构化格式

3. 代码处理 JSON 输出

  • 缓存扩展{zuci, pinyin, pinyinFixed, wordsDetail, ts}(向后兼容旧缓存)
  • 新增 getAiPinyin(char):仅当 AI 明确修正了拼音时返回纠正值
  • [GridEngine.js](file:///c:/poem2pdf/distribution/src/components/GridEngine.js) 两处拼音生成点(辅助行 + 词组格)均优先使用 AI 纠正结果
  • [settingsCenter.js](file:///c:/poem2pdf/distribution/src/modules/settingsCenter.js) 补齐完成后显示纠错报告(次数 + 明细:原拼音 → 纠正拼音(原因)

二、文件变更

文件 变更
src/modules/aiZuci.js 重写 prompt、JSON 解析、缓存扩展、新增 getAiPinyin
src/components/GridEngine.js 两处拼音生成集成 AI 纠正回退
src/modules/settingsCenter.js 状态区显示拼音纠错报告
src/modules/onboarding.js 第17步描述补充拼音纠错说明
CHANGELOG.md / README.md 同步更新

三、提交与部署

  • commit: 77d3b8ffeat(v2.9.9): AI组词补齐增加拼音纠错(注音核对+精准组词+全局校验)
  • tag: v2.9.9 已更新指向最新提交(原 fb31c7277d3b8f,可回退)
  • GitHub Pages: 部署成功(中途遭遇一次 Pages 后端超时,重跑后通过)
  • 线上验证: 注音核对拼音纠错pinyin_fixed杜绝地名getAiPinyin 全部在线上页面确认存在 ✓

四、备注

[!NOTE]
GitHub Pages 部署两次出现 deployment_queued 超时(GitHub 侧瞬时问题),重跑后成功。构建本身无问题。

[!WARNING]
拼音纠错仅对"默认词库缺失二字组词的汉字"生效(即 AI 补齐时顺便核对拼音)。若需对所有汉字检查拼音,需后续扩展为独立的"全量拼音核对"模式。


2.9.7 版本的时候本计划封笔的主贴【2026年8月6日更新、备份】

【生活育儿、社会公益赛道】字帖生成器 — 纯前端PWA离线汉字书法练习工具(复赛版)

A Type, A Trace — 一键生成带拼音、组词、笔画分解的描红字帖,支持矢量 PDF 输出,PWA 离线安装。

本文为 TRAE AI 创造力大赛复赛作品说明帖。作品体验入口、源码包等交付物已通过飞书问卷私密提交,仅供评审查看。


1. 团队介绍

项目 说明
参赛身份 个人参赛
社区昵称 u309409433785034
编程年限 业余爱好20+年,熟悉Matlab/mathematica,Html/CSS/JS素人
职业背景 材料和化学方向工程技术人员,小学生家长,关注教育科技与汉字书写传承
擅长领域 产品需求分析、技术方案设计、AI 辅助开发
为什么做 自书法练习者,深感市面字帖工具痛点:内容固定、依赖网络、输出模糊。希望用技术降低练字门槛,服务教师、家长和书法爱好者

初赛晋级作品:【学习工作赛道】字帖生成器 — 纯前端离线汉字书法练习工具


2. 产品简介(复赛版)

是什么

字帖生成器是一款纯前端 、可PWA 离线应用,基于 Vite + ES Module 工程化构建。无需服务器、无需安装、无需联网,安装到桌面/手机主屏后完全离线可用。输入汉字后自动生成带拼音标注、组词提示、笔画分解的描红字帖,支持矢量 PDF 输出。

相比初赛 Demo 的"单 HTML 文件",复赛版本已升级为工程化 PWA 应用,具备完整的构建流程、CI/CD 自动部署、模块化代码结构,并新增了学习闭环(历史记录 / 练习反馈 / 复习计划)和界面辅助(设置中心 / 新手引导 / 演示模式 / 难度评估)功能。

这是进入复赛之后早期版本界面,已经更新(界面设计以后还可根据反馈调整):

字帖生成器主界面

字帖生成效果

这是2.9.3之后修改的界面(Desktop):

字帖预览(移动端、Desktop等效果一致性好):

面向谁

  • 中小学语文教师 — 快速生成课堂练习字帖,自定义练习内容
  • 家长 — 为孩子定制课后练字纸,随时打印,保护儿童隐私
  • 书法爱好者 — 自由切换 6 款开源书法字体,个性化练习
  • 教育资源匮乏地区 — 无网络环境可用,服务教育公平
  • 任何想写好汉字的人 — 正如作者所说:“自从用了电脑,打字技术增长,但字却越来越丑”

完整功能清单

# 功能 说明 初赛 复赛
1 智能描红字帖生成 输入汉字自动生成田字格描红字帖 :white_check_mark: :white_check_mark:
2 拼音自动标注 pinyin-pro 引擎,带声调显示 :white_check_mark: :white_check_mark:
3 组词辅助 1719条自定义词典 + cnchar 回退 :white_check_mark: :white_check_mark:
4 笔画分解 hanzi-writer SVG 笔画渲染 :white_check_mark: :white_check_mark:
5 矢量 PDF 导出 浏览器打印 + Puppeteer 双轨方案 :white_check_mark: :white_check_mark:
6 日间/夜间主题 CSS 变量驱动,Lucide 图标 :white_check_mark: :white_check_mark:增强
7 字体上传 用户自定义字体 :white_check_mark: :white_check_mark:
8 PWA 离线安装 Service Worker 缓存,安装到桌面/主屏 :cross_mark: :white_check_mark:新增
9 开源字体(版权合规) 霞鹜文楷/思源宋体/文鼎楷体等6款 :cross_mark: :white_check_mark:新增
10 Vite 工程化构建 ES Module 模块化,14个JS模块+17个CSS :cross_mark: :white_check_mark:新增
11 CI/CD 自动部署 GitHub Actions 自动构建部署到 Pages :cross_mark: :white_check_mark:新增
12 Tailwind CSS v4 现代化 UI 框架集成 :cross_mark: :white_check_mark:新增
13 Lucide Icons 现代化 SVG 图标库 :cross_mark: :white_check_mark:新增
14 单文件构建能力 vite-plugin-singlefile 生成可离线分发单HTML :cross_mark: :white_check_mark:新增
15 GitHub Pages 在线访问 评审可直接打开体验 :cross_mark: :white_check_mark:新增
16 历史记录 自动保存最近20条生成记录,支持重新生成/删除/清空 :cross_mark: :white_check_mark:新增
17 练习反馈闭环 整体反馈(轻松/有点难/需要继续)+ 单字反馈(掌握/复习/错字) :cross_mark: :white_check_mark:新增
18 复习计划生成 基于艾宾浩斯遗忘曲线(7天/3天/1天规则),本地自动生成复习计划 :cross_mark: :white_check_mark:新增
19 内置模板库 20个预设模板(唐诗宋词8+三字经2+千字文2+常用字3+成语3+节日2) :cross_mark: :white_check_mark:新增
20 分级字库 3级18分类(初级1-5画/中级6-10画/高级10+画) :cross_mark: :white_check_mark:新增
21 设置中心面板 4滑块(格子大小/每行字数/每页行数/字体大小)+ 4开关(拼音/组词/笔画/笔顺)+ 主题三选 :cross_mark: :white_check_mark:新增
22 新手引导 3步聚光灯引导(输入框→生成按钮→打印按钮),首次自动触发 :cross_mark: :white_check_mark:新增
23 演示模式 一键加载示例并生成字帖,3秒操作提示,脉冲动画 :cross_mark: :white_check_mark:新增
24 难度评估 cnchar笔画数计算,5级星级 + 初级/中级/高级标签,实时评估 :cross_mark: :white_check_mark:新增
25 米字格/回宫格 两种新格子样式(纯CSS实现),含打印友好样式 :cross_mark: :white_check_mark:新增
26 学习报告样式 报告卡片/统计区域/柱状图/进度条样式预留 :cross_mark: :white_check_mark:新增

用户使用路径

访问 GitHub Pages 在线地址
       ↓
[首次使用] 新手引导3步 → 浏览器提示安装PWA → 点击安装到桌面
       ↓
[快速体验] 点击"演示模式"按钮 → 自动加载示例并生成字帖
       ↓
[自主使用] 在文本框输入要练习的汉字 → 难度评估实时显示
       ↓
选择字体(霞鹜文楷/思源宋体/文鼎楷体等)
       ↓
[可选] 从模板库选择预设模板(唐诗/千字文/常用字等)
       ↓
[可选] 打开设置中心调整格子大小/每行字数/显示选项
       ↓
点击「生成字帖」→ 实时预览拼音+组词+笔画 → 自动保存到历史记录
       ↓
[练习反馈] 标记整体难度(轻松/有点难/需要继续)
       ↓
[单字反馈] 悬停字帖格子标记单字状态(掌握/复习/错字)
       ↓
点击右下角打印按钮 → 浏览器打印预览 → 另存为PDF
       ↓
[复习] 次日打开 → 首页显示"今日待复习" → 一键加载复习字帖
       ↓
[离线使用] 关闭网络后刷新页面 → 仍可正常使用

PWA 安装与离线使用

本作品是标准的 PWA(Progressive Web App)应用,支持安装到桌面/手机主屏,安装后完全离线可用(Service Worker 预缓存全部资源含字体)。以下为各浏览器的安装方法:

Microsoft Edge(推荐,开发测试用)

  1. 用 Edge 打开 所附测试地址
  2. 等待页面加载完成(地址栏右侧出现 ⊕ 安装 图标)
  3. 点击 ⊕ 图标 → 弹出安装确认框 → 点击「安装」
  4. 桌面生成"字帖生成器"独立应用图标,点击即开
  5. 安装后断网仍可正常使用

备用入口:如地址栏未出现 ⊕ 图标,点击右上角 →「应用」→「将此站点作为应用安装」

Google Chrome

  1. 用 Chrome 打开上述 URL
  2. 地址栏右侧出现 ⊕ 安装 图标 → 点击 → 「安装」
  3. 或点击右上角 →「保存和分享」→「将页面作为应用安装」
  4. 桌面生成独立应用图标

其他基于 Chromium 的浏览器

浏览器 安装入口
Brave 地址栏 ⊕ 图标 或 菜单 → Install
Opera 地址栏 ⊕ 图标 或 菜单 → Apps → Install
Vivaldi 地址栏 ⊕ 图标
国产浏览器(360/搜狗等) 多数支持 PWA,菜单中搜索"安装应用"

移动端安装

平台 浏览器 安装方法
Android Chrome / Edge / Firefox 打开 URL → 浏览器菜单(⋮)→「添加到主屏幕」或「安装应用」
iOS 16.4+ Safari 打开 URL → 分享按钮(:up_arrow:)→「添加到主屏幕」(需 iOS 16.4+ 才支持 PWA 推送和离线)
iOS < 16.4 Safari 「添加到主屏幕」可创建快捷方式,但离线能力有限

Firefox 说明

  • 桌面版 Firefox 不支持 PWA 安装(Mozilla 已移除相关功能),但可正常在线使用
  • 移动版 Firefox for Android 支持「添加到主屏幕」

离线使用验证

安装 PWA 后,可通过以下方式验证离线可用性:

  1. 打开安装后的"字帖生成器"应用
  2. 断开网络(关闭 Wi-Fi 或拔网线)
  3. 按 F5 刷新页面 → 页面正常加载,所有功能可用(含字体、拼音、笔画渲染)
  4. 或在浏览器开发者工具中模拟:F12 → Network → Online 改为 Offline → 刷新

Service Worker 预缓存约 916 KiB 资源(含 6 款开源字体、JS/CSS 全部模块),安装后首次加载即完成缓存,后续完全离线可用。

相比初赛 Demo 的升级(详细对比)

维度 初赛 Demo 复赛完整作品 升级幅度
代码结构 单 HTML 文件(1.1MB) Vite 工程化(14个JS模块+17个CSS+3个数据文件) :wrench: 工程化
构建工具 无(手动管理) Vite 5.4 + vite-plugin-singlefile + vite-plugin-pwa :wrench: 工程化
部署方式 ZIP 下载解压 GitHub Pages 在线访问 + CI/CD 自动部署 :rocket: 部署
离线能力 双击 HTML 文件 PWA 安装到桌面/主屏,Service Worker 缓存 :mobile_phone: PWA
字体版权 9款含商业字体 6款开源字体(霞鹜文楷/思源宋体/文鼎楷体等) :balance_scale: 合规
UI 框架 原生 CSS Tailwind CSS v4 + Lucide Icons :artist_palette: 现代化
依赖管理 CDN + 内嵌 npm 统一管理版本 :wrench: 工程化
版本控制 Git + GitHub + 备份分支策略 :wrench: 工程化
文档规范 README + CHANGELOG README + CHANGELOG + 参赛文档 + 方案文档 :memo: 规范
学习闭环 历史记录+练习反馈+复习计划(艾宾浩斯规则) :graduation_cap: 教育化
内容辅助 模板库20个+分级字库3级18分类+演示模式+难度评估 :books: 内容化
用户体验 无引导 新手引导3步+设置中心面板 :sparkles: 体验化

3. 产品演示视频

这个是演示包含了Node.js支持和Puppeteer矢量格式PDF导出功能的Desktop上使用方法;我用的Windows,可以从bat或powershell脚本启动,Linux或MacOS则用.sh脚本启动;电脑比较老旧,加上天气热、降温只靠风扇,所以反应比较迟钝

从脚本打开全功能使用视频


4. 产品创作历程

想法诞生

作为一名书法练习者,我在日常练字中遇到几个痛点:

  • 市面上的字帖内容固定、无法定制
  • 在线字帖工具依赖网络且常收费
  • 打印出来的字帖往往是位图、放大后模糊不清
  • 缺少拼音、组词、笔画分解等教学辅助信息

于是想到用前端技术,做一个完全离线、自由定制、高清矢量输出的字帖工具。

我自从用了电脑,打字技术增长,但字却越来越丑;自从练习写字之后,用小楷毛笔在 A4 复印纸上都能写出这个水平的字了:

初赛 Demo(2026-07-05)

初赛阶段采用"最小可行产品"策略:

  • 单 HTML 文件实现核心功能(拼音+组词+笔画+PDF)
  • 双击即可运行,零安装零依赖
  • 9 款字体内置(含商业字体,仅演示用)
  • 极光毛玻璃 UI,日间/夜间双主题
  • Puppeteer 矢量 PDF 双轨方案

初赛成果:成功晋级复赛。

复赛完整作品(2026-07-21 至 2026-07-26)

复赛阶段围绕"从工具到产品"的核心目标,进行了7 大维度升级

升级 1:工程化重构(Vite + ES Module)

将 1.1MB 单 HTML 文件拆分为模块化工程:

  • 14 个 JS 模块:main.js / fontManager.js / settings.js / gridRenderer.js / pdfExport.js / puppeteerClient.js / zuci.js / strokes.js / history.js / feedback.js / review.js / settingsCenter.js / onboarding.js / demoMode.js / difficulty.js
  • 17 个 CSS 文件:base.css / components.css / fab.css / grid.css / main.css / print.css / tailwind.css / theme.css / history.css / feedback.css / review.css / grid-styles.css / report.css / settingsCenter.css / onboarding.css / demoMode.css / difficulty.css
  • 3 个数据文件:customZuCi.js(1719条组词)/ templates.js(20个模板)/ vocabulary.js(3级18分类字库)
  • 构建工具:Vite 5.4 + vite-plugin-singlefile(保留单 HTML 分发能力)
  • 依赖管理:pinyin-pro / cnchar / hanzi-writer 全部 npm 安装

升级 2:PWA 离线支持

  • vite-plugin-pwa 0.20.5:Workbox 预缓存策略
  • Service Worker:字体文件 CacheFirst 策略(40MB 预缓存)
  • manifest.webmanifest:lang=zh-CN,3 个图标含 maskable
  • 可安装到桌面/手机主屏:像原生应用一样独立运行

升级 3:开源字体替换(版权合规)

初赛字体 复赛字体 协议
姜浩硬笔楷书 霞鹜文楷 Regular + Light OFL
华文楷体 思源宋体 SC Regular OFL
方正仿宋 GBK 文鼎楷体 Apache 2.0
田英章楷书 30Light TW-Kai OFL
商业字体 ×6 开源字体 ×6 :balance_scale: 全部合规

追加功能:个人使用时,可以添加电脑上安装或已有个性化字体等。

升级 4:UI 现代化

  • Tailwind CSS v4:渐进集成,保留 CSS 变量主题系统
  • Lucide Icons:主题切换(sun/moon SVG)+ 打印按钮(printer SVG)+ 设置按钮(settings SVG)+ 演示按钮(sparkles SVG)
  • 响应式适配@media max-width:680px 移动端适配

升级 5:CI/CD 自动部署

  • GitHub Actions:push 到 retake 分支自动触发构建部署
  • deploy.yml 工作流:字体下载 → Vite 构建 → Pages 部署
  • download-fonts.sh:CI 环境自动下载开源字体
  • GitHub Pages:https 持续可用,无需续费

升级 6:学习闭环(教育化升级):star: 复赛核心差异化

将"字帖生成工具"升级为"汉字学习闭环平台":

  • 历史记录:每次生成字帖自动保存到 localStorage(最多 20 条),右侧可折叠侧边栏,支持重新生成/删除/清空
  • 练习反馈闭环
    • 整体反馈三按钮(很轻松 / 有点难 / 需要继续)
    • 单字反馈悬停图标(已掌握 :white_check_mark: / 需要复习 :counterclockwise_arrows_button: / 总是写错 :cross_mark:
    • 状态色环显示(绿/黄/红)
    • 数据保存到 localStorage
  • 复习计划生成
    • 基于艾宾浩斯遗忘曲线本地规则
    • 已掌握 → 7天后复习
    • 需要复习 → 3天后复习
    • 总是写错 → 明天复习
    • 首页顶部"今日待复习"区域
    • 一键加载待复习字到输入框并生成字帖
    • 统计信息(已掌握/待复习/错字数)

升级 7:内容辅助与体验优化

  • 内置模板库:20 个预设模板(唐诗宋词 8 + 三字经 2 + 千字文 2 + 常用字 3 + 成语 3 + 节日 2)
  • 分级字库:3 级 18 分类(初级 1-5画 / 中级 6-10画 / 高级 10+画)
  • 设置中心面板:4 滑块 + 4 开关 + 3 主题选项,实时更新预览
  • 新手引导:3 步聚光灯引导,首次自动触发
  • 演示模式:一键加载示例并生成字帖,3 秒操作提示
  • 难度评估:cnchar 笔画数计算,5 级星级,实时评估
  • 米字格/回宫格:两种新格子样式,含打印友好样式

5. TRAE 实践过程

本项目全程使用 TRAE IDE 完成。以下是开发关键步骤、Session ID 和踩坑经验。

技术架构

技术点 方案 版本 说明
构建工具 Vite ^5.4.0 开发服务器(port 3000) + 生产构建(outDir: dist)
模块化 ES Module 14个JS模块 + 17个CSS文件 + 3个数据文件
单文件打包 vite-plugin-singlefile ^2.0.0 生成可离线分发单HTML
PWA vite-plugin-pwa ^0.20.0 Workbox 预缓存 + Service Worker
UI 框架 @tailwindcss/vite + tailwindcss ^4.3.3 Tailwind CSS v4 渐进集成
图标库 lucide-static ^1.25.0 现代化SVG图标(sun/moon/printer/settings/sparkles)
拼音转换 pinyin-pro ^3.0.0 自动标注声调(MIT)
组词查询 cnchar + cnchar-words ^3.0.0 智能组词 + 1719条自定义词典 + 笔画数计算
笔画渲染 hanzi-writer ^3.5.0 SVG 笔画分解(MIT)
PDF 导出 puppeteer ^23.0.0 矢量PDF生成(.cjs脚本)
字体加载 FontFace API 动态注册 + document.fonts.check()验证 + 超时重试
主题切换 CSS 变量 + data-theme 日间/夜间 + Lucide图标切换
跨模块通信 CustomEvent calligraphy:history-updated / char-feedback-updated / settings-updated
数据持久化 localStorage calligraphy_ 前缀(history / char_feedback / settings / onboarded)
CI/CD GitHub Actions deploy.yml 自动构建部署到 Pages
版本控制 Git + GitHub retake分支(默认) + backup备份分支 + tag快照
开发工具 TRAE IDE AI 辅助编码、调试、部署、多Agent并行开发

vite.config.js 关键配置

{
  base: './',                    // 相对路径,支持子目录部署
  plugins: [
    tailwindcss(),               // Tailwind CSS v4
    viteSingleFile(),            // 单HTML打包
    VitePWA({
      registerType: 'autoUpdate',
      manifest: {
        name: '字帖生成器',
        short_name: '字帖',
        lang: 'zh-CN',
        theme_color: '#667eea',
        display: 'standalone',
        icons: [                 // 3个SVG图标(含maskable)
          { src: 'icon-192.svg', purpose: 'any' },
          { src: 'icon-512.svg', purpose: 'any' },
          { src: 'icon-192-maskable.svg', purpose: 'maskable' }
        ]
      },
      workbox: {
        maximumFileSizeToCacheInBytes: 41943040,  // 40MB(字体预缓存)
        runtimeCaching: [{        // 字体CacheFirst策略
          urlPattern: /\.(?:woff2?|ttf|otf)$/,
          handler: 'CacheFirst',
          options: { cacheName: 'fonts-cache', expiration: { maxAgeSeconds: 60*60*24*365 } }
        }]
      }
    })
  ],
  build: { outDir: 'dist', emptyOutDir: true },
  server: { port: 3000, open: true }
}

关键开发步骤

步骤一:Vite 工程化重构

通过 TRAE 的 AI 辅助能力,将 1.1MB 单 HTML 文件拆分为模块化工程:

  • 分析全局变量引用关系,生成检查清单
  • 划分 10 个迁移模块,制定迁移顺序
  • 配置 vite.config.js(singlefile + pwa + tailwind 插件)
  • 验证重构后功能完整性

步骤二:PWA 配置与离线策略

  • 配置 vite-plugin-pwa 0.20.5
  • 设计 Workbox 预缓存策略(字体 CacheFirst,最大 40MB)
  • 生成 PWA 图标(SVG → 192px/512px/maskable)
  • 验证 Service Worker 注册和离线可用性

步骤三:开源字体替换与 CI 集成

  • 评估 6 款开源字体的协议合规性
  • 编写 download-fonts.sh CI 字体下载脚本
  • 处理思源宋体 zip 解压路径问题(硬编码 → find 动态查找)
  • 修复 pdfExport.js 中 14 处字体引用

步骤四:CI/CD 部署与问题排查

  • 配置 GitHub Actions deploy.yml 工作流
  • 排查并修复 4 个 CI 构建阻断问题
  • 通过 gh api CLI 修复部署权限
  • 验证 Pages 部署成功(HTTP 200)

步骤五:UI 现代化与图标替换

  • 集成 Tailwind CSS v4(@import “tailwindcss” 语法)
  • 替换主题切换图标为 Lucide sun/moon SVG
  • 替换打印按钮图标为 Lucide printer SVG
  • 保留 CSS 变量主题系统,渐进迁移

步骤六:学习闭环三件套(多 Agent 并行开发):star:

通过 TRAE IDE 多 Agent 并行执行,完成学习闭环功能:

  • Agent A:历史记录 + 练习反馈 + 复习计划(顺序执行,有依赖关系)
  • Agent B:模板库数据 + 分级字库 + 米字格/回宫格样式 + 学习报告样式(纯新增文件,零冲突)
  • Agent C:设置中心 + 新手引导 + 演示模式 + 难度评估

技术亮点:

  • 跨模块通信:自定义事件 calligraphy:history-updatedcalligraphy:char-feedback-updatedcalligraphy:settings-updated
  • 单字反馈:DOM 事件委托,不修改 gridRenderer.js,悬停显示 Lucide 图标
  • 主题协同:settingsCenter 通过 toggleTheme() 与现有 settings.js 同步
  • 打印友好:所有新 UI 在 @media print 下隐藏,不影响 PDF 导出

关键 Session ID

以下为 TRAE IDE 开发过程中关键任务的对话 Session ID,用于证明作品由 TRAE 开发完成。

# 任务 时间 Session ID
1 Vite 工程化重构 + 模块拆分 2026-07-23 .309409433785034:3987398260dd2c55f46e45830d638dbc_6a60feb9103e2f9262702768.6a611202103e2f9262702b26.6a611202add19038c350563e:Trae CN.T(7/23/2026, 2:54:58 AM)
.309409433785034:99f755f1897fd579b7b2b032a2a4c64a_6a60feb9103e2f9262702768.6a6112c5103e2f9262702b40.6a6112c5add19038c350563f:Trae CN.T(7/23/2026, 2:58:13 AM)
2 PWA 配置 + Service Worker + 图标生成 2026-07-23 .309409433785034:d732eba08e3ece643f08f2a02d1326a3_6a60feb9103e2f9262702768.6a611f21103e2f9262702f49.6a611f20add19038c350564c:Trae CN.T(7/23/2026, 3:50:57 AM)
.309409433785034:ca178f8f8709b9913f6a99fcd3af0988_6a60feb9103e2f9262702768.6a611b2f103e2f9262702d98.6a611b2fadd19038c3505645:Trae CN.T(7/23/2026, 3:34:07 AM)
3 CI/CD 部署问题排查与修复 2026-07-23 .309409433785034:ca178f8f8709b9913f6a99fcd3af0988_6a60feb9103e2f9262702768.6a611b2f103e2f9262702d98.6a611b2fadd19038c3505645:Trae CN.T(7/23/2026, 3:34:07 AM)
4 开源字体替换 + download-fonts.sh 2026-07-23 .309409433785034:5a2e8d058e554d7d40156364ca4dd553_6a60feb9103e2f9262702768.6a611bf4103e2f9262702e12.6a611bf3add19038c3505648:Trae CN.T(7/23/2026, 3:37:24 AM)
5 Tailwind CSS + Lucide Icons 集成 2026-07-23 .309409433785034:686e359a6ebda8afdd28bd2bf1b28cf4_6a60feb9103e2f9262702768.6a610ee4103e2f9262702a4f.6a610ee4add19038c350563a:Trae CN.T(7/23/2026, 2:41:40 AM)
6 学习闭环三件套(历史+反馈+复习)多Agent并行 2026-07-23 .309409433785034:4fea733d3b7183eee00f1ee10b4ba9bf_6a60feb9103e2f9262702768.6a61474f103e2f92627035fa.6a61474eadd19038c3505668:Trae CN.T(7/23/2026, 6:42:23 AM)
7 界面辅助(设置中心+引导+演示+难度评估) 2026-07-23 .309409433785034:6039b174c9754ff1f45af3d0aa41427b_6a60feb9103e2f9262702768.6a614408103e2f926270357b.6a614407add19038c3505662:Trae CN.T(7/23/2026, 6:28:24 AM)

注:复赛阶段 Session ID 格式为 TRAE CN 新版格式 {username}:{hash}_{thread_id}.{message_id}.{agent_id}:Trae CN.T({timestamp}),与初赛阶段的三段式格式略有不同。任务 6-7 的 Session ID 待补充。

复赛开发过程截图

复赛开发过程截图(1)

复赛开发过程截图(2)

复赛开发过程截图(3)

复赛开发过程截图(4)

复赛开发过程截图(5)

复赛Session ID:

.309409433785034:a11c35564a5fba4de8491b2e5be71a35_6a65420875d3caad3f2d96fd.6a65779c75d3caad3f2d9ba4.6a65779b906468fed4eea4b1:Trae CN.T(7/26/2026, 10:57:32 AM)

复赛Session ID:

.309409433785034:9712b3aeee26622146a29e85b4e59e78_6a65420875d3caad3f2d96fd.6a654bda75d3caad3f2d9914.6a654bd9906468fed4eea4a5:Trae CN.T(7/26/2026, 7:50:50 AM)

复赛Session ID:
.309409433785034:534a413834ec6f61284db3dbeeaa6798_6a61fcaebe4273f5764bb50c.6a64c1f675d3caad3f2d947e.6a64c1f3906468fed4eea49c:Trae CN.T(7/25/2026, 10:02:30 PM)

复赛SessionID:
.309409433785034:534a413834ec6f61284db3dbeeaa6798_6a61fcaebe4273f5764bb50c.6a64c1f675d3caad3f2d947e.6a64c1f3906468fed4eea49c:Trae CN.T(7/25/2026, 10:02:30 PM)

初赛阶段 Session ID(已验证,7 条)

以下为初赛阶段的 7 个关键任务 Session ID,已发表于初赛帖子 72722初赛帖子 71664,格式为完整三段式 {thread_id}.{message_id}.{agent_id},双击 TRAE 对话头像即可复制。

1. 独立 HTML 打包、JS 内嵌(2026-07-05 19:48)

6a49f7e8f615ceaf1589607b.6a4a44899a9540f3b14ec753.6a4a4488b75d9ac48d921ab0

2. 模板字符串修复、UI 增强、字体配置(2026-07-05 20:16)

6a49f7e8f615ceaf1589607b.6a4a4b199a9540f3b14eca1a.6a4a4b19b75d9ac48d921ab1

3. PDF 乱码修复、矢量输出、Puppeteer 脚本(2026-07-05 21:04)

6a49f7e8f615ceaf1589607b.6a4a564b9a9540f3b14ecd6a.6a4a564ab75d9ac48d921ab2

4. 开发过程截图(1)(2026-07-06 04:36)

6a49f7e8f615ceaf1589607b.6a4ac0459a9540f3b14ed5c4.6a4ac044b75d9ac48d921ab8

TRAE 开发过程截图(1)

5. JSON 解析、三层防御、keep-alive 去重、编码兼容(2026-07-06 05:01)

6a49f7e8f615ceaf1589607b.6a4ac6429a9540f3b14ed689.6a4ac640b75d9ac48d921aba

TRAE 开发过程截图(2)

6. 开发过程截图(3)(2026-07-06 05:09)

6a49f7e8f615ceaf1589607b.6a4ac81f9a9540f3b14ed6ae.6a4ac81eb75d9ac48d921abb

TRAE 开发过程截图(3)

7. “我连文档都是用 AI 写的”(2026-07-06 05:16)

6a49f7e8f615ceaf1589607b.6a4ac9b99a9540f3b14ed718.6a4ac9b8b75d9ac48d921abc

TRAE 开发过程截图(4)

Session ID 获取方法

以 TraeCN IDE 为例,在一段对话开始的地方,有红圈的 Trae 图标,双击它之后,跳出 “copy success” 一闪即逝,剪贴板就有 session id 了。

开发踩坑与经验

踩坑 1:思源宋体 zip 解压路径不一致

问题:CI 环境下载思源宋体 zip 后,硬编码路径 /tmp/shs/SourceHanSerifSC-Regular.otf 找不到文件。

排查:实际解压路径为 /tmp/shs/OTF/SimplifiedChinese/SourceHanSerifSC-Regular.otf,目录结构因版本而异。

解决:改用 find /tmp/shs -name "SourceHanSerifSC-Regular.otf" | head -1 动态查找。

踩坑 2:PowerShell 重定向导致 UTF-16 编码

问题:从 Git 备份分支恢复 fontManager.js 时,PowerShell > 重定向默认保存为 UTF-16 LE(BOM: FF-FE),Vite 报 “invalid JS syntax”。

排查:检查文件首 4 字节 FF-FE-2F-00 确认为 UTF-16 LE 编码。

解决:改用 .NET [IO.File]::WriteAllText + UTF8Encoding($false) 重写为 UTF-8(457,850 → 228,957 bytes)。

踩坑 3:GitHub Pages 部署权限

问题:CI 构建成功但部署失败,错误 Branch "retake" is not allowed to deploy to github-pages

排查:github-pages environment 的 deployment-branch-policies 仅允许 main 分支。

解决:通过 gh api --method POST .../deployment-branch-policies -f name=retake 添加 retake 到允许列表。

踩坑 4:gh api 与 git push 历史不一致

问题:通过 gh api Contents API 推送的文件创建了不同的 Git 历史,导致 git push 被拒绝。

解决:创建备份分支保护本地提交 → git reset --hard origin/retake 同步到远程最新。

踩坑 5:多 Agent 并行开发的文件冲突

问题:多个 Agent 同时修改 main.js 和 index.html 可能导致冲突。

解决:Agent B 只新增文件不修改现有代码(零冲突);Agent A 和 Agent C 顺序执行(Agent C 基于 Agent A 的结果)。

项目文件结构

calligraphy-sheet-generator/
├── src/                          # 源代码
│   ├── main.js                   # 入口文件(事件绑定+初始化+模块集成)
│   ├── data/                     # 数据文件(3个)
│   │   ├── customZuCi.js         # 自定义组词数据(1719条)
│   │   ├── templates.js          # 内置模板库(20个模板)⭐新增
│   │   └── vocabulary.js         # 分级字库(3级18分类)⭐新增
│   ├── modules/                  # 功能模块(14个)
│   │   ├── fontManager.js        # 字体管理(FONT_LIST+loadFonts+base64拼音字体)
│   │   ├── gridRenderer.js       # 田字格渲染(CSS Grid+笔画SVG)
│   │   ├── pdfExport.js          # PDF导出(window.print+字体加载)
│   │   ├── pinyin.js             # 拼音转换(pinyin-pro)
│   │   ├── puppeteerClient.js    # Puppeteer客户端(side-effect导入)
│   │   ├── settings.js           # 设置管理(主题+页眉页脚+localStorage)
│   │   ├── strokes.js            # 笔画数据(hanzi-writer)
│   │   ├── zuci.js               # 组词查询(cnchar+自定义词典)
│   │   ├── history.js            # 历史记录(localStorage+侧边栏)⭐新增
│   │   ├── feedback.js           # 练习反馈(整体+单字)⭐新增
│   │   ├── review.js             # 复习计划(艾宾浩斯规则)⭐新增
│   │   ├── settingsCenter.js     # 设置中心面板(滑块+开关+主题)⭐新增
│   │   ├── onboarding.js         # 新手引导(3步聚光灯)⭐新增
│   │   ├── demoMode.js           # 演示模式(一键加载示例)⭐新增
│   │   └── difficulty.js         # 难度评估(cnchar笔画数+5级星级)⭐新增
│   └── styles/                   # 样式文件(17个)
│       ├── base.css              # 基础样式
│       ├── components.css        # 组件样式
│       ├── fab.css               # 浮动按钮样式
│       ├── grid.css              # 田字格样式
│       ├── main.css              # 主样式(@import汇总)
│       ├── print.css             # 打印样式(@media print)
│       ├── tailwind.css          # Tailwind CSS入口
│       ├── theme.css             # 主题样式(CSS变量+日间/夜间)
│       ├── grid-styles.css       # 米字格/回宫格样式 ⭐新增
│       ├── report.css            # 学习报告样式 ⭐新增
│       ├── history.css           # 历史记录侧边栏样式 ⭐新增
│       ├── feedback.css          # 练习反馈区域样式 ⭐新增
│       ├── review.css            # 复习计划区域样式 ⭐新增
│       ├── settingsCenter.css    # 设置中心面板样式 ⭐新增
│       ├── onboarding.css        # 新手引导样式 ⭐新增
│       ├── demoMode.css          # 演示模式样式 ⭐新增
│       └── difficulty.css        # 难度评估样式 ⭐新增
├── public/                       # 静态资源
│   ├── icon-192.svg              # PWA图标192px
│   ├── icon-512.svg              # PWA图标512px
│   └── icon-192-maskable.svg     # PWA maskable图标
├── .github/workflows/
│   └── deploy.yml                # GitHub Actions CI/CD工作流
├── scripts/
│   └── download-fonts.sh         # CI字体下载脚本(6款开源字体)
├── index.html                    # HTML入口
├── vite.config.js                # Vite配置
├── package.json                  # 项目配置(MIT协议)
├── puppeteer-pdf.cjs             # Puppeteer PDF生成脚本(CommonJS)
├── README.md                     # 项目文档(中英文)
├── README_contest.md             # 参赛文档
├── README_EN.md                  # 英文文档
├── CHANGELOG.md                  # 更新日志(Keep a Changelog格式)
├── 启动Puppeteer.bat             # Windows启动脚本
├── 启动Puppeteer.ps1             # PowerShell启动脚本
└── 启动Puppeteer.sh              # Linux/macOS启动脚本

package.json 依赖清单

类型 包名 版本 用途
dependencies pinyin-pro ^3.0.0 拼音转换(带声调)
dependencies cnchar ^3.0.0 汉字处理+组词+笔画数
dependencies cnchar-words ^3.0.0 组词扩展
dependencies hanzi-writer ^3.5.0 笔画SVG渲染
dependencies lucide-static ^1.25.0 SVG图标库
dependencies puppeteer ^23.0.0 矢量PDF生成
devDependencies vite ^5.4.0 构建工具
devDependencies vite-plugin-singlefile ^2.0.0 单HTML打包
devDependencies vite-plugin-pwa ^0.20.0 PWA支持
devDependencies @tailwindcss/vite ^4.3.3 Tailwind CSS v4 Vite插件
devDependencies tailwindcss ^4.3.3 Tailwind CSS v4

npm scripts

命令 说明
npm run dev 启动开发服务器(port 3000)
npm run build 生产构建(输出到 dist/)
npm run preview 预览构建结果
npm run pdf Puppeteer生成矢量PDF
npm run pdf:help PDF命令帮助
npm run pdf:test 测试PDF生成(床前明月光)

构建验证

指标
模块数 28
构建时间 1.65s
文件大小 709.47 KB(gzip: 447.18 KB)
错误/警告 0 / 0
PWA precache 9 entries(915.82 KiB)

6. 技术方案分享

纯前端 PWA + 矢量 PDF 双轨方案

核心理念:零后端依赖,保护用户隐私,离线可用。

用户输入汉字
    ↓
pinyin-pro 转换拼音 → cnchar 组词 → hanzi-writer 笔画
    ↓
CSS Grid 渲染田字格(拼音行 + 汉字行 + 笔画行)
    ↓
方案A:window.print() → 浏览器打印预览 → 另存为 PDF(全平台)
方案B:Puppeteer 无头浏览器 → 矢量 PDF(文字可选可复制)
    ↓
PWA Service Worker 缓存所有资源 → 离线可用

技术亮点

  • FontFace API 动态注册字体 + document.fonts.check() 验证加载
  • FontFace 超时重试机制(5秒超时 + 3秒额外等待)
  • JSON 解析三层防御(Connection:close + safeJsonParse + 请求去重)
  • vite-plugin-singlefile 保留单 HTML 离线分发能力

学习闭环技术方案

生成字帖 → 自动保存到历史记录(localStorage, 最多20条)
    ↓
练习反馈 → 整体反馈(3按钮)+ 单字反馈(DOM事件委托+悬停图标)
    ↓
复习计划 → 艾宾浩斯规则(mastered→7天 / review→3天 / error→1天)
    ↓
首页待复习 → 一键加载复习字 → 生成字帖 → 更新练习时间

跨模块通信:自定义事件 calligraphy:history-updatedcalligraphy:char-feedback-updatedcalligraphy:settings-updated


7. 社会价值分析

教育公平

  • 无网络环境可用:农村学校、无网络家庭、教育资源匮乏地区
  • 零成本:无需付费、无需注册、无需账号
  • 隐私保护:所有数据本地处理,不上传儿童学习数据

文化传承

  • 汉字书写教育:拼音+组词+笔画三位一体,辅助正确书写
  • 开源字体推广:使用霞鹜文楷、思源宋体等开源字体,推动字体生态
  • 技术降低门槛:让每个人都能自由定制练字内容

学习科学

  • 艾宾浩斯遗忘曲线:基于科学记忆规律自动生成复习计划
  • 渐进式学习:难度评估帮助用户选择合适内容
  • 反馈驱动:练习反馈数据驱动个性化复习

环保理念

  • 按需打印:只打印需要的练习内容,减少纸张浪费
  • 数字预览:屏幕预览确认后再打印,避免错误打印

8. 产品迭代规划

已完成(复赛版本 v2.9.5)

  • :white_check_mark: Vite 工程化重构(14 JS 模块 + 17 CSS + 3 数据文件)
  • :white_check_mark: PWA 离线支持
  • :white_check_mark: 开源字体替换
  • :white_check_mark: CI/CD 自动部署
  • :white_check_mark: UI 现代化(Tailwind + Lucide)
  • :white_check_mark: 历史记录功能
  • :white_check_mark: 练习反馈闭环(整体 + 单字)
  • :white_check_mark: 复习计划生成(艾宾浩斯规则)
  • :white_check_mark: 内置模板库(20 个模板)
  • :white_check_mark: 分级字库(3 级 18 分类)
  • :white_check_mark: 设置中心面板
  • :white_check_mark: 新手引导(3 步聚光灯)
  • :white_check_mark: 演示模式
  • :white_check_mark: 难度评估(5 级星级)
  • :white_check_mark: 米字格/回宫格/田字格等样式

进行中

  • :hourglass_not_done: 演示视频录制【已经上传,12MB的视频、被以上限20MB为由拒绝上传?】
  • :hourglass_not_done: 移动端深度优化【完成初步优化,如果版本大于2.9.5,则优化进一步更新】
  • :hourglass_not_done: 学习报告功能(样式已预留、取舍平衡之后作了简化处理)

未来规划(MIT开源;任何人可自己定制和深入开发)

  • :clipboard: AI 智能推荐(规则版本,离线可用;引入访问豆包等学习型LLM能解决知识更新问题)
  • :clipboard: 学习报告(本地统计,含柱状图/饼图)
  • :clipboard: 更多格子样式(九宫格等,已经追加了九宫格,但还可以改善)
  • :clipboard: 多语言支持(英文界面:写汉字用,似乎不需要?)
  • :clipboard: 教师批量生成功能(已经添加了“导入文件”、可以批量导入新的生字)
  • :clipboard: 若引入豆包等大模型api key权限,功能可大幅完善扩充,考虑离线免费等,暂未考虑

9. 版权与字体说明

项目 协议
项目代码 MIT 许可证,可自由使用、修改、分发
霞鹜文楷 Regular/Light OFL(SIL Open Font License)
思源宋体 SC Regular OFL(SIL Open Font License)
文鼎楷体 Apache 2.0 License
我逸清晨体楷书 OFL(SIL Open Font License)
TW-Kai OFL(SIL Open Font License)
TeX Gyre Adventor(拼音字体) GUST Font License
pinyin-pro MIT License
cnchar MIT License
hanzi-writer MIT License

分发中的所有字体均为开源协议,无版权风险,可安全商用。用户完全可以通过定制、扩展功能引入可以合法免费个人使用但不能打包分发的优秀字体,如方正楷体等。


10. 致谢

  • TRAE IDE — 提供强大的 AI 辅助开发环境,让非专业开发者也能完成工程化项目,多 Agent 并行开发能力极大提升了开发效率
  • 开源社区 — pinyin-pro、cnchar、hanzi-writer、Vite、Tailwind CSS、Lucide 等优秀开源项目
  • 字体作者 — 霞鹜文楷、思源系列、文鼎楷体等开源字体的创作者
  • 初赛评委与测试用户 — 你们的反馈让作品更完善
  • 所有关注汉字书写教育的人 — 一字一世界,一笔一乾坤

愿这份小小的工具,能为汉字教学与书写传承尽一份力。

作品体验入口、源码包等交付物已通过飞书问卷私密提交,仅供评审查看。


本文为 TRAE AI 创造力大赛复赛作品说明帖
发布日期:2026-07-23,7月26日更新
版本:复赛 V2.9.7(含取舍平衡之后简化了的学习报告 + 界面辅助 + 内容增强 + 5条复赛Session ID + 7条初赛Session ID + 9张TRAE开发截图 + 获取方法说明 + 赛道归属更新)
已发表帖子: 【生活育儿、社会公益赛道】字帖生成器 — 纯前端PWA离线汉字书法练习工具(复赛版)


之前放了Github pages的体验链接,后来看规则似乎不能放,于是就删掉了。如果希望在线体验,可以私信沟通。——我上次看了回放的“部署”有关的直播教程,很受启发。但大模型已经帮我自动免费部署好了,大模型提供的免费部署的途径有三种,github pages只支持public repository的部署,居然还有可以支持private 仓库部署的;此外,其中2种都是无须科学访问都能访问的。其中一种,测试打开后,发现无关的干扰信息比较多,就删了。

进一步的追加,发现如果只用通用大模型,稍微复杂点的任务,自动生产的提示词,效果并不理想,可能需要在大模型微调、提示词改进等方面深入打磨,但看起来已经超过我能力范畴了

我终于把豆包也修改得能用了,太不容易了:

Trae Work 的 Session ID:

309409433785034:aec2b0f4fdf605d26820b1c7e53c6a9c_6a752c4b7d04eb6a59bb373e.6a7538c13bdf2001d16b4c81.6a7538c13bdf2001d16b4c7f:TraeWork CN.0.1.45.no_sid.no_ppe.T(2026/8/7 09:45:37)

界面截图:

你的视频没声儿是正常的不

1 个赞

是的,如果需要,我合成一段语音加进去?

Trae Work 添加语音和字幕

Session ID:
309409433785034:6efdf4af006d0298ff19a9004b1d4976_6a780e4a4ad824cfb65d17ae.6a7812274ad824cfb65d1889.6a7812274ad824cfb65d1887:TraeWork CN.0.1.46.no_sid.no_ppe.T(2026/8/9 13:37:43)

Trae work界面截图:

增加了合成语音和字幕之后(飞书分享):

PWA安装和卸载演示–链接按规则隐藏