|
| 1 | +--- |
| 2 | +title: '节点单击默认行为配置功能' |
| 3 | +slug: 'node-click-behavior-config' |
| 4 | +created: '2026-02-21T08:01:00Z' |
| 5 | +status: 'draft' |
| 6 | +author: 'BMAD Analyst' |
| 7 | +--- |
| 8 | + |
| 9 | +# PRD: 节点单击默认行为配置功能 |
| 10 | + |
| 11 | +**Version:** 1.0 |
| 12 | +**Status:** Draft |
| 13 | +**Date:** 2026-02-21 |
| 14 | + |
| 15 | +--- |
| 16 | + |
| 17 | +## 1. 问题陈述 (Problem Statement) |
| 18 | + |
| 19 | +### 当前行为 |
| 20 | + |
| 21 | +在多邻国风格的路径视图中,用户单击题目节点时: |
| 22 | +- **有动画的题目**: 直接打开 GitHub Pages 动画演示站点 |
| 23 | +- **无动画的题目**: 直接打开 LeetCode 题目页面 |
| 24 | + |
| 25 | +### 用户痛点 |
| 26 | + |
| 27 | +1. **灵活性不足**: 部分用户可能更倾向于直接跳转 LeetCode 刷题,而非观看动画演示 |
| 28 | +2. **学习场景差异**: |
| 29 | + - 初次学习者:希望看动画理解思路 |
| 30 | + - 复习者:希望直接跳转 LeetCode 刷题 |
| 31 | +3. **无法自定义**: 不同用户有不同的使用习惯,但当前没有配置选项 |
| 32 | + |
| 33 | +### 目标用户 |
| 34 | + |
| 35 | +- 想要自定义单击行为的高级用户 |
| 36 | +- 偏好直接刷题而非观看动画的用户 |
| 37 | +- 教育机构或团队管理者 |
| 38 | + |
| 39 | +--- |
| 40 | + |
| 41 | +## 2. 解决方案 (Solution) |
| 42 | + |
| 43 | +### 核心功能 |
| 44 | + |
| 45 | +添加用户可配置的"节点单击默认行为"设置,允许用户选择单击节点时的目标: |
| 46 | + |
| 47 | +| 选项 | 行为 | |
| 48 | +|------|------| |
| 49 | +| **动画演示** (默认) | 打开 GitHub Pages 动画演示站点 | |
| 50 | +| **LeetCode** | 打开 LeetCode 题目页面 | |
| 51 | +| **无动作** | 单击仅选中节点,不跳转 | |
| 52 | + |
| 53 | +### 附加功能 |
| 54 | + |
| 55 | +- 设置入口:节点右键菜单底部添加"设置"选项 |
| 56 | +- 即时生效:修改设置后立即生效,无需刷新 |
| 57 | +- 持久化:设置保存到 localStorage |
| 58 | + |
| 59 | +--- |
| 60 | + |
| 61 | +## 3. 范围 (Scope) |
| 62 | + |
| 63 | +### In Scope |
| 64 | + |
| 65 | +- 添加节点单击行为配置入口 |
| 66 | +- 实现三种点击行为选项 |
| 67 | +- 设置持久化到 localStorage |
| 68 | +- 动画徽章点击行为保持不变(始终打开动画) |
| 69 | + |
| 70 | +### Out of Scope |
| 71 | + |
| 72 | +- 移动端适配(后续版本) |
| 73 | +- 批量导入/导出设置(后续版本) |
| 74 | +- 云端同步设置(后续版本) |
| 75 | + |
| 76 | +--- |
| 77 | + |
| 78 | +## 4. 功能需求 (Functional Requirements) |
| 79 | + |
| 80 | +### FR-001: 设置入口 |
| 81 | + |
| 82 | +- 复用现有的节点右键菜单 (`onContextMenu`) |
| 83 | +- 在右键菜单底部添加"设置默认行为"选项 |
| 84 | +- 点击后打开设置弹窗/抽屉 |
| 85 | + |
| 86 | +### FR-002: 行为选项 |
| 87 | + |
| 88 | +- 提供单选按钮组,包含三个选项 |
| 89 | +- 默认选中"动画演示" |
| 90 | +- 选项带有简短描述 |
| 91 | + |
| 92 | +### FR-003: 设置持久化 |
| 93 | + |
| 94 | +- 使用 localStorage 保存用户偏好 |
| 95 | +- 存储键名建议: `path_node_click_behavior` |
| 96 | +- 值: `animation` | `leetcode` | `none` |
| 97 | + |
| 98 | +### FR-004: 行为执行 |
| 99 | + |
| 100 | +- 读取用户设置并执行对应行为 |
| 101 | +- 设置变更即时生效 |
| 102 | + |
| 103 | +--- |
| 104 | + |
| 105 | +## 5. 非功能需求 (Non-Functional Requirements) |
| 106 | + |
| 107 | +### 性能 |
| 108 | + |
| 109 | +- 设置读取应在组件渲染时同步完成 |
| 110 | +- 无额外网络请求 |
| 111 | + |
| 112 | +### 兼容性 |
| 113 | + |
| 114 | +- 支持最新 Chrome、Firefox、Safari、Edge |
| 115 | +- 兼容 React 18 |
| 116 | + |
| 117 | +### 可访问性 |
| 118 | + |
| 119 | +- 设置按钮应有 aria-label |
| 120 | +- 选项应可通过键盘选择 |
| 121 | + |
| 122 | +--- |
| 123 | + |
| 124 | +## 6. 技术实现提示 |
| 125 | + |
| 126 | +### 相关文件 |
| 127 | + |
| 128 | +- `src/components/ProblemList/PathView/DuolingoPath.tsx` - 主组件,右键菜单渲染位置(约第672-715行) |
| 129 | +- `src/components/ProblemList/PathView/PathProblemItem.tsx` - 列表视图点击逻辑 |
| 130 | +- `src/components/ProblemList/utils/animationUtils.ts` - 动画点击工具函数 |
| 131 | +- `src/i18n/locales/` - 需要添加新的国际化文本 |
| 132 | + |
| 133 | +### 右键菜单集成 |
| 134 | + |
| 135 | +在 `DuolingoPath.tsx` 的 `node-context-menu` 区域(约第685-714行)添加: |
| 136 | + |
| 137 | +```tsx |
| 138 | +{/* 菜单项分割线 */} |
| 139 | +<div className="context-menu-divider"></div> |
| 140 | + |
| 141 | +{/* 设置入口 */} |
| 142 | +<button |
| 143 | + className="context-menu-btn settings-btn" |
| 144 | + onClick={(e) => openSettingsModal(e)} |
| 145 | +> |
| 146 | + ⚙️ {currentLang === 'zh' ? '设置默认行为' : 'Set Default Behavior'} |
| 147 | +</button> |
| 148 | +``` |
| 149 | + |
| 150 | +### 存储结构 |
| 151 | + |
| 152 | +```typescript |
| 153 | +interface NodeClickBehaviorSettings { |
| 154 | + behavior: 'animation' | 'leetcode' | 'none'; |
| 155 | +} |
| 156 | +``` |
| 157 | + |
| 158 | +--- |
| 159 | + |
| 160 | +## 7. 验收标准 (Acceptance Criteria) |
| 161 | + |
| 162 | +- [ ] AC-001: 用户可以在路径视图找到设置入口 |
| 163 | +- [ ] AC-002: 用户可以选择三种点击行为之一 |
| 164 | +- [ ] AC-003: 设置保存后刷新页面仍然有效 |
| 165 | +- [ ] AC-004: 单击节点时按设置执行对应行为 |
| 166 | +- [ ] AC-005: 动画徽章点击始终打开动画(不受此设置影响) |
| 167 | +- [ ] AC-006: 中英文文本正确显示 |
| 168 | + |
| 169 | +--- |
| 170 | + |
| 171 | +## 8. 优先级 |
| 172 | + |
| 173 | +**Medium** - 增强用户体验的功能,非核心功能 |
| 174 | + |
| 175 | +--- |
| 176 | + |
| 177 | +## 9. 后续迭代 |
| 178 | + |
| 179 | +- 移动端适配 |
| 180 | +- 批量设置导入/导出 |
| 181 | +- 云端设置同步 |
0 commit comments