题目节点无法标记为已完成
completionStorage.ts和experienceStorage.ts各自独立管理同一个数据库- 两个服务在各自的
onupgradeneeded中只创建自己需要的 Object Stores - 导致后初始化的服务覆盖前一个的数据库结构,造成 Object Store 缺失
- 错误信息:
NotFoundError: One of the specified object stores was not found
- 菜单显示/隐藏的延迟时间太短(150ms)
- 鼠标在节点和菜单之间移动时触发快速切换,导致"闪烁"
创建统一的数据库管理服务:
- 单例模式管理数据库连接
- 统一创建所有 Object Stores
- 统一版本管理(版本 5)
- 提供 getDatabase() 方法供其他服务使用- 移除独立的数据库初始化逻辑
- 通过 dbService.getDatabase() 获取数据库连接
- 专注于题目完成状态和用户偏好的业务逻辑- 移除独立的数据库初始化逻辑
- 通过 dbService.getDatabase() 获取数据库连接
- 专注于经验值和宝箱的业务逻辑// 从 150ms 增加到 300ms
hideTimeoutRef.current = setTimeout(() => {
setExpandedNodeId(null);
}, 300);// 防止重复点击
const [isTogglingCompletion, setIsTogglingCompletion] = useState(false);
if (isTogglingCompletion) {
return; // 忽略重复点击
}✅ 单一职责:每个服务只负责自己的业务逻辑
✅ 统一管理:数据库结构在一个地方定义
✅ 易于维护:添加新的 Object Store 只需修改 dbService.ts
✅ 避免冲突:不会出现 Object Store 缺失的问题
✅ 更好的用户体验:菜单交互更流畅
数据库名称:leetcode-hot-100-progress
版本:5
Object Stores:
completions- 题目完成状态preferences- 用户偏好设置experience- 经验值记录treasures- 宝箱开启记录
- 清除旧数据库(F12 → Application → IndexedDB → 删除数据库)
- 刷新页面(Ctrl+Shift+R)
- 进入学习路径
- 悬停在题目节点上
- 点击"标记为已完成"
- 验证节点状态变化和经验值增加
src/services/dbService.ts- 新增src/services/completionStorage.ts- 重构src/services/experienceStorage.ts- 重构src/services/README.md- 新增(架构文档)src/components/ProblemList/PathView/DuolingoPath.tsx- 优化src/components/ProblemList/hooks/useCompletionStatus.ts- 清理日志
onupgradeneeded
dbService.ts 中统一创建