# 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} : `——**第一屏就是登录墙**,刷题类产品的首次体验必须是"先做一道题",不是"先注册"(增长报告 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`(含游客全流程复现步骤与迁移输出证据)。