Files
doodle-mini/docs/生成方案/字母描红设计方案.md
T
2026-04-17 17:03:36 +08:00

367 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 字母描红 — 预览、配置与模板引擎设计
> 配套文档:[产品设计文档](../产品设计文档.md) | [技术架构设计文档](../技术架构设计文档.md)
> 版本:v1.0
> 最后更新:2026-04-03
---
## 一、目标与范围
本文档说明「英语字母描红」在小程序内的**预览与配置页**如何设计,以及如何对齐 [技术架构设计文档](../技术架构设计文档.md) 第五章的**模板引擎**`tracing-writing` + `letter-tracing`)。
覆盖四种练习形态:
1. **单字母学习页**:选定一个字母,含书写示意、阅读句(如 _L is for Lion_)、配图,下方四线三格描红行。
2. **整页 26 字母**:26 个字母各占一行(或等价满版排列),四线三格内描红。
3. **上大小写下小写**:上半区展示大写 A–Z,下半区展示小写 a–z。
4. **两列 26 字母**:一页内左列 A–M、右列 N–Z(或同构小写),每行含示范与描红格。
交付形态遵循 [产品设计文档](../产品设计文档.md) §7.3:**客户端动态生成**,不预生成整页 PNG 上云存储。
---
## 二、四种子类型的模板引擎归类
从产品视角是四种题型;从引擎视角可收敛为**同一排版模板 + 同一数据生成器**,通过 `generatorConfig.mode` 区分。
| 用户可见类型 | 排版本质 | 模板 `template` | 生成器 `generator` |
| --------------- | --------------------------------- | ----------------- | ------------------ |
| 单字母学习页 | 教学区 + 描红区(混合型纵向分区) | `tracing-writing` | `letter-tracing` |
| 26 字母整页描红 | 纯描红满版(多行) | `tracing-writing` | `letter-tracing` |
| 上大写 / 下小写 | 纯描红双区块(展示 + 轻描红) | `tracing-writing` | `letter-tracing` |
| 两列 26 字母 | 纯描红双栏 | `tracing-writing` | `letter-tracing` |
**结论**:一个 `TracingWritingRenderer`(扩展四线三格能力)+ 一个 `LetterTracingGenerator`,用 `mode` 参数驱动四种版面,无需四种独立页面类型(除非产品坚持拆入口卡片)。
---
## 三、Mode 定义与版面结构
### 3.1 `single-letter`(单字母学习页)
- **上部(约 40%~45% 内容高)**:教学区
- 配图(与字母绑定的词汇插图,内置 26 组映射 + 资源 key / CDN URL
- 大写 + 小写展示
- 阅读句:`*X* is for *Word`\*
- 书写顺序示意(可用简化箭头/步骤编号,首版可弱化)
- **下部(约 50%**:描红区
- 至少两行四线三格:一行大写、一行小写(或按配置多行)
- 每行:示范格(实线/深色)+ 若干渐淡虚线格 + 可选空白格
### 3.2 `full-alphabet`26 字母整页)
- 26 行(大写或二选一为小写),每行对应一个字母。
- 每行:四线三格横排多个单元格——首格示范,后续为渐淡描红或空白。
- 行高由可用高度 / 26 自动换算,保证打印可读(需与 `fontSize`、DPI 导出策略一致)。
### 3.3 `upper-lower-split`(上大写、下小写)
- 上区块:标题如「大写字母」+ 两行(或紧凑网格)排完 A–Z,每字母一格四线三格,偏**展示**(描红可弱:首格实线 + 空白)。
- 分隔线。
- 下区块:标题如「小写字母」+ 同理排完 a–z。
### 3.4 `two-column`(两列)
- 左列 A–M(或 a–m),右列 N–Z(或 n–z)。
- 每行结构与 `full-alphabet` 类似:示范 + 多格描红。
- 中间留白或细分隔线,避免幼儿视觉混淆。
---
## 四、四线三格绘制约定
用于英文字母书写指导(区别于汉字田字格):
- **顶线**:大写字母上沿参考。
- **中虚线**:小写无升部字母的上沿(x-height 概念)。
- **基线**:字母落笔主参考线。
- **底线**:降部(如 g、p、y)下沿参考。
大写主体落在顶线—基线之间;小写主体多在中虚线—基线之间,降部延伸至底线。渲染器需实现 `drawFourLineGrid(cellRect)`,并与 `fontSize`、基线对齐算法统一。
---
## 五、预览与配置页(产品 UI
### 5.1 页面结构(与通用生成页一致)
对齐产品设计中的生成/预览页:**A4 预览区(Canvas)+ 参数面板 + 底部操作**(换一批 / 保存相册 / 分享等)。
### **预览/配置页面 UI 设计**
所有4种类型**共用一个通用 worksheet 页面**`pages/worksheet/worksheet`),通过 `worksheetId` 加载不同 JSON 配置。但字母描红也可以做成一个**聚合入口页** + 通用 worksheet 页的组合,体验更好:
┌─────────────────────────────────────────┐
│ ← 返回 英语字母描红 ❤️ │
├─────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────┐ │
│ │ │ │
│ │ A4 打印效果预览区 │ │
│ │ (Canvas 实时渲染) │ │
│ │ │ │
│ └─────────────────────────────────┘ │
│ │
│ ⚙️ 参数设置 │
│ ┌─────────────────────────────────┐ │
│ │ │ │
│ │ 练习类型: │ │
│ │ ┌──────┐┌──────┐┌──────┐ │ │
│ │ │ 单字母 ││ 整页 ││大小写│ │ │ ← 核心切换
│ │ │ 学习页 ││ 描红 ││对照 │ │ │
│ │ └──────┘└──────┘└──────┘ │ │
│ │ ┌──────┐ │ │
│ │ │ 两列 │ │ │
│ │ │ 描红 │ │ │
│ │ └──────┘ │ │
│ │ │ │
│ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │
│ │ │ │
│ │ 大小写:[大写 ▼] │ │ ← mode 2/4 时显示
│ │ │ │
│ │ 选择字母:A [选中] B [选中]... │ │ ← mode 1 时显示
│ │ │ │
│ │ 每行描红格数:[5 ▼] │ │ ← mode 1/2/4 时显示
│ │ │ │
│ └─────────────────────────────────┘ │
│ │
│ ┌──────────┐ ┌──────────────┐ │
│ │ 🔄 换一批 │ │ 📥 保存到相册 │ │
│ └──────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────┘
### 5.2 参数项与 Mode 的显隐
| 配置项 | `single-letter` | `full-alphabet` | `upper-lower-split` | `two-column` |
| ---------------- | ---------------- | --------------- | ------------------- | ------------ |
| 练习类型(mode) | 显示 | 显示 | 显示 | 显示 |
| 选择字母 | 显示(单选) | 隐藏 | 隐藏 | 隐藏 |
| 大小写 | 隐藏(默认双写) | 显示 | 隐藏(固定双区) | 显示 |
| 每行描红格数 | 显示 | 显示 | 隐藏或固定为 1 | 显示 |
| 换一批 | 可切换下一字母 | 可不展示或禁用 | 可不展示 | 可不展示 |
参数面板由 `WorksheetConfig.userConfigurable` 描述;前端根据当前 `mode` **过滤**不适用字段(或在 JSON 层拆成 4 条配置,每条只含本 mode 的 `userConfigurable`)。
### 5.3 入口策略
- **推荐**:发现页 / 英语分类下 **4 张卡片**,对应 4 个 `worksheet id`,均进入**同一通用 worksheet 页面**,仅默认 `generatorConfig` 不同。
- **可选**:单页内提供「练习类型」Segment,切换 `mode` 并合并默认参数后重绘(与多卡片二选一或并存)。
---
## 六、生成器设计:`letter-tracing`
### 6.1 配置(建议字段)
```typescript
type LetterTracingMode =
| 'single-letter'
| 'full-alphabet'
| 'upper-lower-split'
| 'two-column';
interface LetterTracingGeneratorConfig {
mode: LetterTracingMode;
/** full-alphabet / two-column 使用 */
letterCase: 'upper' | 'lower';
/** single-letter 使用,如 'L' */
selectedLetter?: string;
/** 每行描红单元数量(示范 + 渐淡 + 空白计在同一行内) */
repetitions: number;
/** 渐淡策略 */
fadePattern: 'gradient' | 'first-only';
}
```
### 6.2 输出数据结构(示意)
生成器产出**与平台无关**的数据,供 `TracingWritingRenderer` 消费:
- `single-letter``{ teaching: { upper, lower, word, sentence, imageRef }, rows: TracingRow[] }`
- `full-alphabet` / `two-column``{ columns?: 1 | 2, rows: TracingRow[] }`
- `upper-lower-split``{ upperBlock: TracingRow[] | GlyphCell[], lowerBlock: ... }`
`TracingRow` 建议包含:`displayChar``cells: { char, opacity, isGuide }[]``gridType: 'four-line'`
### 6.3 词汇与配图数据
- 维护 `Record<'A'..'Z', { word: string; imageKey: string }>`(或云端下发)。
- 图片走内置分包资源或云存储 URL,由 [产品设计文档](../产品设计文档.md) §7.3 中「云素材」规则约束:**插图是设计资产,可 CDN;整页描红仍客户端拼版**。
---
## 七、渲染器设计:`tracing-writing` 扩展
### 7.1 职责
- 沿用现有 `BaseTemplateRenderer` 流程:背景、页眉、说明文案、内容区、页脚。
- 根据 `data.mode` 分支调用 `drawSingleLetterPage` / `drawFullAlphabetPage` / `drawUpperLowerSplitPage` / `drawTwoColumnPage`
- 统一使用 **A4 逻辑坐标**(与技术文档 §7.1 Canvas 管线一致)。
### 7.2 与汉字描红的差异
| 维度 | 汉字练字(`character-tracing` | 字母描红(`letter-tracing` |
| ---- | ------------------------------- | ---------------------------- |
| 格子 | 田字格 | 四线三格 |
| 字形 | SVG 笔画路径 | 优先 `fillText` + 字体轮廓 |
| 版面 | 多字多格排布 | 四种 mode 分区逻辑 |
### 7.3 参考现有实现
- `service/wordDrawService.ts`:布局分区、渐淡格思路可对齐。
- `mathPages/shared/service/numberWriteDraw.ts`:四线三格线型可参考。
---
## 八、WorksheetConfig 示例(四条)
以下可与 `core/data/worksheets.ts` 或云端 `worksheets` 集合对齐;`id` 供路由与统计使用。
**1)单字母学习页**
```json
{
"id": "letter-tracing-single",
"title": "字母学习页",
"category": "english",
"subcategory": "letter-tracing",
"template": "tracing-writing",
"generator": "letter-tracing",
"generatorConfig": {
"mode": "single-letter",
"selectedLetter": "A",
"repetitions": 5,
"fadePattern": "gradient"
},
"layoutConfig": {
"showInstruction": true,
"instructionText": "看一看,读一读,再描一描"
}
}
```
**226 字母整页**
```json
{
"id": "letter-tracing-full",
"title": "26 字母描红",
"category": "english",
"subcategory": "letter-tracing",
"template": "tracing-writing",
"generator": "letter-tracing",
"generatorConfig": {
"mode": "full-alphabet",
"letterCase": "upper",
"repetitions": 8,
"fadePattern": "gradient"
}
}
```
**3)大小写对照**
```json
{
"id": "letter-tracing-upper-lower",
"title": "大小写字母对照",
"category": "english",
"subcategory": "letter-tracing",
"template": "tracing-writing",
"generator": "letter-tracing",
"generatorConfig": {
"mode": "upper-lower-split",
"repetitions": 1,
"fadePattern": "first-only"
},
"layoutConfig": {
"columns": 13
}
}
```
**4)两列描红**
```json
{
"id": "letter-tracing-case-pairing",
"title": "字母描红(两列)",
"category": "english",
"subcategory": "letter-tracing",
"template": "tracing-writing",
"generator": "letter-tracing",
"generatorConfig": {
"mode": "two-column",
"letterCase": "upper",
"repetitions": 4,
"fadePattern": "gradient"
},
"layoutConfig": {
"columns": 2
}
}
```
完整 `userConfigurable` 数组可在实现阶段按 §5.2 补全,并同步云库字段定义。
---
## 九、实现落地清单(工程侧)
| 项 | 说明 |
| ------------------------ | ---------------------------------------------------------------------------------------- |
| `LetterTracingGenerator` | `core/generators/` 或英语分包 `shared/generators/`,注册到 `generatorRegistry` |
| `TracingWritingRenderer` | 扩展四线三格 + 四种 `draw*Page` |
| 字母词汇与配图映射 | `core/data/alphabet.ts` 或云端配置 |
| 通用 worksheet 页 | `pages/worksheet/worksheet`(或过渡期 `englishPages` 专用页再迁) |
| `ALL_WORKSHEETS` | 增加 4 条 `WorksheetDefinition``category` 对齐英语,`legacyPage` 可指向 worksheet 路由 |
| 分包 | 按需新增 `englishPages`,避免主包膨胀 |
---
## 十、修订记录
| 日期 | 版本 | 说明 |
| ---------- | ---- | -------- |
| 2026-04-03 | v1.0 | 初稿入库 |