63 lines
3.2 KiB
Markdown
63 lines
3.2 KiB
Markdown
# 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`(含游客全流程复现步骤与迁移输出证据)。
|