# 过程背诵练习模块 - 需求与实现记录 ## 项目信息 - **创建日期**: 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 // 当前焦点 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) - ✅ 创建本需求记录文档 --- **备注**: 本模块已完成核心功能开发和移动端优化,可以正常使用。后续可根据用户反馈进行功能增强和体验优化。