Skip to content

Commit 73b7461

Browse files
author
Gauge Developer
committed
feat: 添加节点点击默认行为配置功能
- 创建 settings.ts 工具函数,支持 localStorage 持久化 - 添加中英文国际化文本 - 创建 ClickBehaviorSettings 弹窗组件 - 修改 DuolingoPath.tsx 集成设置功能 - 右键菜单添加设置入口(带分割线样式) - 节点点击行为根据用户设置执行
1 parent 0ef70af commit 73b7461

9 files changed

Lines changed: 797 additions & 9 deletions

File tree

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
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

Comments
 (0)