50 lines
2.2 KiB
Markdown
50 lines
2.2 KiB
Markdown
# E-06 · PWA + 推送提醒
|
||
|
||
| 字段 | 值 |
|
||
|---|---|
|
||
| 项目 | EnglishDrill · `Desktop/english-drill`(frontend + backend 定时任务) |
|
||
| 优先级 | P1 · M3 |
|
||
| 建议模型 | deepseek-v4.1-flash(主)/ gemini-3.8-flash(PWA 视觉验收) |
|
||
| 依赖 | 无 |
|
||
| 预估 | 2.5 天 |
|
||
|
||
## 一、背景(为什么做)
|
||
|
||
增长报告 P1 双项(`docs/AGI增长点分析-2026-09-11.md` #7 + #8):
|
||
- `UserProfile.notify_email` 字段存在但**从未被读取**(死字段)——提醒通道是空的;
|
||
- 让网站装到主屏(PWA)打开率显著高于"再开浏览器输网址";两者共用 Service Worker 基建,**一起做成本最低**。
|
||
- 提醒钩子:连续天数将断 —— "你的 7 天连续记录今天就要断了"比"快回来学习"有效 10 倍。
|
||
|
||
## 二、目标(交付物)
|
||
|
||
**A. PWA 基建**
|
||
1. `manifest.json`(名称/图标/主题色/display: standalone)+ Service Worker 注册
|
||
2. 离线能力:预缓存题库 JSON + 首页壳 → 无网络可刷已缓存题,联网后同步
|
||
3. 安装引导(可选提示条)
|
||
|
||
**B. 推送提醒(Web Push)**
|
||
4. VAPID 密钥对生成脚本 + 订阅管理接口(`POST/DELETE /api/accounts/push-subscription`)
|
||
5. 订阅存储(新表或扩展 profile:endpoint/keys/created_at)
|
||
6. 定时任务:每日扫"今天未学 + 连续天数≥3 将断"用户 → 发提醒(**每用户每天最多 1 条**,硬上限)
|
||
7. 关闭开关(尊重用户设置,一键退订真生效)
|
||
|
||
## 三、验收标准
|
||
|
||
- [ ] PWA 可安装(Lighthouse PWA 项通过或手动安装验证)
|
||
- [ ] 离线打开可答已缓存题;联网后记录不丢
|
||
- [ ] 推送订阅成功 → 测试推送可达(浏览器实测)
|
||
- [ ] 提醒任务:构造"将断签"用户 → 收到且**当天仅 1 条**
|
||
- [ ] 退订后不再收到
|
||
- [ ] 不滥用验证:普通用户连续多日仍只发 1 条/天
|
||
- [ ] 既有 E2E 全绿(SW 不干扰既有测试)
|
||
|
||
## 四、边界(不许做)
|
||
|
||
- 不做原生 App 推送(PWA 路线,成本优先)
|
||
- 不发营销内容(只发学习状态提醒)
|
||
- 不改动现有登录/学习主流程(SW 只做缓存层)
|
||
|
||
## 五、交接
|
||
|
||
写 `PROGRESS_E-06.md`(含 PWA 安装验证、推送实测记录、频率限制用例)。
|