68 lines
3.1 KiB
Markdown
68 lines
3.1 KiB
Markdown
# C-02 · 工具热榜 + 最近使用
|
||
|
||
| 字段 | 值 |
|
||
|---|---|
|
||
| 项目 | 可乐工具 · `chunyu_project`(tool app)+ `chunyu_project_react` |
|
||
| 优先级 | P0 · M2 |
|
||
| 建议模型 | deepseek-v4.1-flash(主)/ qwen3.8-flash(时间窗边界用例) |
|
||
| 依赖 | C-01(路由基线修好再动页面) |
|
||
| 预估 | 1.5 天 |
|
||
|
||
## 一、背景(为什么做)
|
||
|
||
1. 工具只有 16 个,竞品 100+——先激活存量:`Tool.usage_count` 字段已有,但**没有转化为任何排行榜/热门入口**(数据在睡觉)。
|
||
2. 竞品实证:tool.lu 有 `/top/` 排行榜、掘金有排行榜侧栏——这是低成本高粘性的标准件。
|
||
3. 报告结论:工具页无"最近使用/最热使用"入口是 P0 级发现缺口(`docs/产品问题分析与改造路线.md` P0-1)。
|
||
|
||
## 二、目标(交付物)
|
||
|
||
**后端(tool app)**
|
||
1. 新模型 `ToolUsageRecord`:`tool`(FK)、`user`(nullable,匿名可为空)、`session_key`(匿名归因)、`created_at`,索引 `(tool, created_at)`。
|
||
2. 现有"使用工具"计数逻辑处**双写**:保留 `usage_count` 自增,同时写 `ToolUsageRecord`。
|
||
3. 聚合接口:
|
||
- `GET /api/tool/top?range=all|week&limit=10` → `[{id, name, icon, usage_count, weekly_count, rank}]`
|
||
- `GET /api/tool/recent`(登录,返回本人最近使用工具)
|
||
4. 迁移文件 + 存量 `usage_count` 回填说明(无历史明细则从当前值起算,文档写清楚)。
|
||
|
||
**前端(React)**
|
||
5. 新页面 `Top.tsx`(路由 `/top`):总榜 / 周榜切换 + 完整榜单。
|
||
6. `Home.tsx`:Hero 下方加"🔥 热门工具 Top10"横条(横向滚动卡片)。
|
||
7. 工具卡片展示"本周 XX 人在用"(取 `weekly_count`;为 0 时不显示)。
|
||
|
||
## 三、执行步骤
|
||
|
||
```text
|
||
1. 定位现有 usage_count 自增点(tool app views/ 与前端调用处)
|
||
2. 建模 + 迁移 + 双写 + 聚合接口(异步视图,adrf 风格对齐项目惯例)
|
||
3. 前端 Top 页 + Home 横条 + 卡片徽标
|
||
4. 写测试:聚合正确性(总/周窗口)、匿名归因、recent 权限
|
||
5. 回归既有测试 + 手工验收
|
||
```
|
||
|
||
## 四、验收标准
|
||
|
||
- [ ] 使用任意工具 → `ToolUsageRecord` 新增记录(登录记 user,匿名记 session_key)
|
||
- [ ] 总榜 = 全部记录聚合;**周榜 = 最近 7 天窗口**(用固定时间戳测试用例验证窗口边界:7 天整、7 天+1 秒)
|
||
- [ ] `/top` 页总榜/周榜切换正常,排名序号正确
|
||
- [ ] 首页 Top10 横条渲染,空数据时有优雅空态
|
||
- [ ] `usage_count` 旧数据与新聚合口径一致(或文档说明差异)
|
||
- [ ] 既有测试全绿 + 新增用例 ≥6 条
|
||
|
||
## 五、验收命令(参考)
|
||
|
||
```bash
|
||
cd chunyu_project && python manage.py makemigrations tool && python manage.py migrate
|
||
python manage.py test tool -v 2 # 新增用例全绿
|
||
# 手工:连续调用同一工具 3 次 → GET /api/tool/top?range=week 计数=3
|
||
```
|
||
|
||
## 六、边界(不许做)
|
||
|
||
- 不改 `Tool` 既有字段语义(`usage_count` 继续有效)
|
||
- 不做"工具使用周报"等衍生功能(另一张卡的空间)
|
||
- 不动其他 app
|
||
|
||
## 七、交接
|
||
|
||
写 `PROGRESS_C-02.md`(含聚合用例输出与窗口边界测试证据)。
|