3.2 KiB
3.2 KiB
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)本就不需要登录,只是前端拦住了。后端权限核对是前提。
二、目标(交付物)
- 前端放开匿名访问:首页
/、题库/bank可未登录访问(其余页面维持守卫)。 - 游客答题:游客可完成题目(复用现有答题 UI);答题记录存
localStorage(question_id+ 答案 + 时间 + 对错)。 - 3 题后引导:答完第 3 题弹注册引导——文案"注册后可保存进度",不阻断也不再强制弹(可关闭,还能继续答)。
- 注册迁移:注册/登录成功后,把本地游客记录 POST 到后端迁移接口,写入正式
Attempt数据(统计/错题本立即可见);迁移后清空本地缓存。 - 后端:
POST /api/practice/migrate-guest(认证 + 幂等:重复提交同批次不双写);核对答题接口对匿名请求的返回(未登录答题若需要后端支持则补匿名通道,只存不关联用户)。 - 首页顶部加游客提示条("游客模式 · 记录仅存本机,注册后同步")。
三、执行步骤
1. 权限审计:全部被前端守卫但后端其实放行的接口清单;不放行的列出(答题/题库)
2. 前端路由守卫分层:公开路由 vs 需登录路由
3. 游客答题暂存层(localStorage 结构 + 容量控制)
4. 3 题引导弹层(可关闭)
5. 迁移接口 + 前端注册后调用(含失败重试与本地保留策略)
6. E2E:游客路径全流程用例
四、验收标准
- 未登录访问首页/题库正常渲染,可完成至少 1 道题
- 游客答满 3 题后出现注册引导;关闭后仍可继续答题
- 注册后:游客期间记录迁移进账号——统计页可见、错题本能查到
- 迁移幂等:重复调用不产生重复记录
- 未登录点"下一题"不崩(无 user 上下文兜底)
- 既有 E2E 全绿 + 新增游客路径用例 ≥8 条(含迁移、幂等、关闭引导)
五、验收命令(参考)
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(含游客全流程复现步骤与迁移输出证据)。