Files
vscode-workbench/PLANNING/tasks/E-02-游客模式.md
T

63 lines
3.2 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.
# E-02 · 游客模式(拆登录墙,3 题后引导注册)
| 字段 | 值 |
|---|---|
| 项目 | EnglishDrill · `Desktop/english-drill`(frontend 为主 + backend 迁移接口) |
| 优先级 | P0 · M1 |
| 建议模型 | deepseek-v4.1-flash(主)/ qwen3.8-flash(迁移用例复核) |
| 依赖 | 无 |
| 预估 | 1.5 天 |
## 一、背景(为什么做)
`src/App.tsx:29`:`return user ? <>{children}</> : <Navigate to="/login" replace />`——**第一屏就是登录墙**,刷题类产品的首次体验必须是"先做一道题",不是"先注册"(增长报告 P0-2,业界经验:登录墙前置砍 50-70% 首访)。
后端已有基础:部分接口(如 `/api/practice/plan`)本就不需要登录,只是前端拦住了。**后端权限核对是前提**。
## 二、目标(交付物)
1. **前端放开匿名访问**:首页 `/`、题库 `/bank` 可未登录访问(其余页面维持守卫)。
2. **游客答题**:游客可完成题目(复用现有答题 UI);答题记录存 `localStorage`(`question_id` + 答案 + 时间 + 对错)。
3. **3 题后引导**:答完第 3 题弹注册引导——文案"注册后可保存进度",**不阻断也不再强制弹**(可关闭,还能继续答)。
4. **注册迁移**:注册/登录成功后,把本地游客记录 POST 到后端迁移接口,写入正式 `Attempt` 数据(统计/错题本立即可见);迁移后清空本地缓存。
5. **后端**:`POST /api/practice/migrate-guest`(认证 + 幂等:重复提交同批次不双写);核对答题接口对匿名请求的返回(未登录答题若需要后端支持则补匿名通道,只存不关联用户)。
6. 首页顶部加游客提示条("游客模式 · 记录仅存本机,注册后同步")。
## 三、执行步骤
```text
1. 权限审计:全部被前端守卫但后端其实放行的接口清单;不放行的列出(答题/题库)
2. 前端路由守卫分层:公开路由 vs 需登录路由
3. 游客答题暂存层(localStorage 结构 + 容量控制)
4. 3 题引导弹层(可关闭)
5. 迁移接口 + 前端注册后调用(含失败重试与本地保留策略)
6. E2E:游客路径全流程用例
```
## 四、验收标准
- [ ] 未登录访问首页/题库正常渲染,**可完成至少 1 道题**
- [ ] 游客答满 3 题后出现注册引导;关闭后仍可继续答题
- [ ] 注册后:游客期间记录迁移进账号——统计页可见、错题本能查到
- [ ] 迁移幂等:重复调用不产生重复记录
- [ ] 未登录点"下一题"不崩(无 user 上下文兜底)
- [ ] 既有 E2E 全绿 + 新增游客路径用例 ≥8 条(含迁移、幂等、关闭引导)
## 五、验收命令(参考)
```bash
cd backend && python tests/e2e/run_e2e.py -k guest
python tests/e2e/run_e2e.py --http
# 手工:清 localStorage → 游客答 3 题 → 注册 → 统计页核对
```
## 六、边界(不许做)
- 不做完全匿名账号体系(游客数据只暂存本机 + 一次性迁移,不建影子用户)
- 不动现有登录/注册流程本身
- 不放开的页面绝不放开(wallet/admin/profile 等保持守卫)
## 七、交接
写 `PROGRESS_E-02.md`(含游客全流程复现步骤与迁移输出证据)。