Files
ittoview/docs/过程背诵练习-需求与实现.md
2026-03-01 14:38:27 +00:00

294 lines
8.7 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.

# 过程背诵练习模块 - 需求与实现记录
## 项目信息
- **创建日期**: 2026-03-01
- **模块名称**: 过程背诵练习 (Process Practice)
- **路由地址**: `/process-practice`
- **提交记录**:
- 初始实现: `cc8dd1e`
- 移动端优化: `da04583`
## 需求概述
创建一个交互式背诵练习模块,帮助用户记忆 PMP 项目管理的 10 个知识领域和 49 个过程。
### 核心功能需求
#### 1. 矩阵布局
- 显示知识领域 × 过程组的矩阵10行 × 5列
- 表头5个过程组启动、规划、执行、监控、收尾
- 知识领域格子横跨5列
- 过程格子按过程组分列显示
- 空单元格置灰显示(如范围管理-启动过程组)
#### 2. 背诵对象
- **知识领域**10个如"整合管理"(去除"项目"前缀)
- **过程**49个如"制定项目章程"
- 总计59个格子需要背诵
#### 3. 输入交互
- 动态输入框:根据答案长度显示对应数量的横线
- 实时验证:逐字符验证,错误标红,正确显示绿色
- 答对后自动跳转到下一个格子延迟300ms
- 支持中文输入法(监听 compositionStart/End
- 支持批量粘贴(固定长度数组,避免错位)
#### 4. 辅助信息
- **知识领域格子**显示敏捷裁剪因素tailoringFactors
- **过程格子**显示主要作用purpose
- 位置:固定在底部,输入框下方
- 移动端优化限高可滚动只显示前2个裁剪因素
#### 5. 格子切换
- **TAB键**按顺序切换KA01 → P1.1 → P1.2 → ... → KA02 → ...
- **点击格子**:直接切换到目标格子
- **自动跳过**:空单元格不可聚焦
- **允许回顾**:可以点击已答对的格子重新查看
#### 6. 长按显示答案
- 支持触摸、鼠标和键盘(空格键)
- 长按600ms后显示答案
- 松开后隐藏答案
- 3秒后自动隐藏
- 显示答案期间锁定输入区域
#### 7. 进度跟踪
- 顶部显示进度条
- 显示已答对数量 / 总数量
- 进度条动画效果
#### 8. 无障碍支持
- `aria-live` 区域通告答案显示/隐藏
- `tabIndex` 控制键盘导航
- `aria-describedby` 关联辅助信息
- `scrollIntoView` 确保格子可见
- `role="button"``aria-current` 标记
## 技术实现
### 文件结构
```
src/
├── utils/
│ └── practice.ts # 工具函数
├── hooks/
│ └── useLongPress.ts # 长按 Hook
├── components/
│ └── practice/
│ ├── KnowledgeAreaCell.tsx # 知识领域格子
│ ├── ProcessCell.tsx # 过程格子
│ ├── InputArea.tsx # 输入区域
│ ├── HintInfo.tsx # 辅助信息
│ └── PracticeMatrix.tsx # 矩阵组件
├── pages/
│ └── ProcessPracticePage.tsx # 主页面
├── App.tsx # 路由配置
└── components/layout/Sidebar.tsx # 导航菜单
```
### 核心算法
#### 1. 格子顺序生成 (`generateCellSequence`)
```typescript
// 顺序KA01 → P1.1 → P1.2 → ... → P1.7 → KA02 → P2.1 → ...
// 总计10个知识领域 + 49个过程 = 59个格子
```
#### 2. 答案标准化 (`normalizeAnswer`)
```typescript
// 去除空格、标点
// 只对知识领域去除"项目"前缀
// 过程名称保留"项目"字样
```
#### 3. 输入验证逻辑
- 使用原始答案长度渲染横线
- 使用标准化答案进行验证
- 逐字符比对,维护 `charStatuses` 数组
- 完整答案验证后触发跳转或错误提示
#### 4. 长按检测 (`useLongPress`)
- `onPointerDown` 启动600ms定时器
- `onPointerUp/Leave/Cancel` 清理定时器
- 支持键盘空格键长按
- 阻止 `contextMenu` 事件
### 样式设计
#### 桌面端
- 矩阵格子p-4, gap-3, min-h-60px
- 字体大小text-sm, text-base
- 输入框w-10, h-12, text-2xl
#### 移动端优化
- 矩阵格子p-2, gap-2, min-h-40px
- 字体大小text-xs, text-sm
- 输入框:保持原大小(便于输入)
- 底部固定区域:分层显示输入框和辅助信息
- 辅助信息max-h-32, overflow-y-auto
### 状态管理
```typescript
// 格子顺序
cellSequence: CellInfo[]
// 答题记录
answeredCells: Map<string, boolean>
// 当前焦点
currentCellId: string | null
// 输入状态
userInput: string[]
charStatuses: CharStatus[]
isComposing: boolean
lastErrorTimestamp: number | null
// 长按显示答案
showAnswerForCell: { cellId, answer, expiresAt } | null
inputLocked: boolean
```
## 实现进度
### ✅ 已完成功能
1. **基础框架**
- [x] 创建工具函数和类型定义
- [x] 创建长按 Hook
- [x] 创建格子组件
- [x] 创建输入区域组件
- [x] 创建辅助信息组件
- [x] 创建矩阵组件
- [x] 创建主页面组件
2. **核心功能**
- [x] 格子顺序生成59个格子
- [x] 答案标准化(知识领域去除"项目"
- [x] 动态输入框(根据答案长度)
- [x] 实时验证(逐字符验证)
- [x] 自动跳转答对后300ms延迟
- [x] TAB键切换按顺序跳过空格
- [x] 点击格子切换(允许回顾)
- [x] 长按显示答案(支持多端)
- [x] 进度跟踪(顶部进度条)
3. **输入法支持**
- [x] 监听 compositionStart/End
- [x] 输入法期间暂停验证
- [x] 确认后立即验证
4. **批量粘贴**
- [x] 创建固定长度数组
- [x] 不足部分保留空字符串
- [x] 避免输入框数量错位
5. **无障碍支持**
- [x] aria-live 通告
- [x] tabIndex 控制
- [x] aria-describedby 关联
- [x] scrollIntoView 滚动
- [x] role 和 aria-current
6. **移动端优化**
- [x] 压缩间距和内边距
- [x] 减小字体大小
- [x] 底部固定区域分层
- [x] 辅助信息限高可滚动
- [x] 修复吸顶位置冲突
### 🔧 已修复问题
1. **Codex Review 后的改进**
- [x] 修复批量粘贴数组长度问题
- [x] 格子可聚焦(支持键盘长按)
- [x] 允许回顾已答对的格子
- [x] 修复表头吸顶位置冲突
2. **移动端样式问题**
- [x] 底部区域布局重构
- [x] 压缩矩阵格子尺寸
- [x] 辅助信息区域优化
- [x] 主内容区域底部内边距
### 📝 待优化项(可选)
1. **性能优化**
- [ ] 虚拟滚动(如果格子数量增加)
- [ ] 使用 React.memo 优化格子渲染
- [ ] 防抖输入验证(目前已有 requestAnimationFrame
2. **功能增强**
- [ ] 添加"重置"按钮(清空所有答题记录)
- [ ] 添加"跳过"按钮(跳过当前格子)
- [ ] 保存练习进度到 localStorage
- [ ] 统计答题时间和错误次数
- [ ] 提供"只练习知识领域"或"只练习过程"模式
3. **用户体验**
- [ ] 添加音效反馈(答对/答错)
- [ ] 添加震动反馈(移动端)
- [ ] 提供快捷键说明(帮助面板)
- [ ] 添加"提示"按钮(显示首字母)
## 数据依赖
### 知识领域数据
- 文件:`src/data/knowledge-areas.json`
- 字段:`id`, `name`, `order`, `color`, `tailoringFactors`
### 过程数据
- 文件:`src/data/processes.json`
- 字段:`id`, `code`, `name`, `knowledgeAreaId`, `processGroupId`, `order`, `purpose`
### 过程组数据
- 文件:`src/data/process-groups.json`
- 字段:`id`, `name`, `order`, `color`
## 测试要点
### 功能测试
1. 访问 `/process-practice` 页面
2. 验证矩阵初始状态(所有格子空白占位)
3. 输入"整合管理",验证格子显示"1.整合管理"
4. 验证自动跳转到下一个格子
5. 测试 TAB 键切换顺序
6. 测试点击格子切换
7. 测试长按显示答案600ms
8. 测试输入法输入
9. 测试批量粘贴
10. 完成所有59个格子的答题
### 边界测试
- 第一个格子按 Shift+Tab不应有反应
- 最后一个格子按 Tab不应有反应
- 长按空单元格(不应有反应)
- 快速连续输入(验证防抖)
- 输入错误后按 Escape验证清空输入
### 移动端测试
- 验证底部固定区域不遮挡内容
- 验证辅助信息区域可滚动
- 验证格子尺寸适配小屏幕
- 验证触摸长按功能
## 相关文档
- 需求设计文档:`docs/需求设计文档.md`
- 实现计划:`/root/.claude/plans/iridescent-cooking-bee.md`
- CLAUDE.md`/home/ittoview/CLAUDE.md`
## 更新日志
### 2026-03-01
- ✅ 完成初始实现(提交 cc8dd1e
- ✅ 修复 Codex Review 发现的问题
- ✅ 优化移动端布局和样式(提交 da04583
- ✅ 创建本需求记录文档
---
**备注**: 本模块已完成核心功能开发和移动端优化,可以正常使用。后续可根据用户反馈进行功能增强和体验优化。