45 lines
2.6 KiB
Markdown
45 lines
2.6 KiB
Markdown
# PROGRESS — C-02 · 工具热榜 + 最近使用
|
||
|
||
- 状态:done
|
||
|
||
> 日期 2026-09-12/13 · 范围:可乐工具(`chunyu_project/tool` + `chunyu_project_react`)
|
||
|
||
## 现状 vs 差距(接手时)
|
||
- 已有:`ToolUsageRecord` 模型+迁移、`ToolTopView`(仅 `period=total|week`)、`increment` 双写、Home 热榜横条(`period=total`)。
|
||
- 缺口:无 `GET /api/tool/recent`;榜单缺 `range=all|week` 口径与 `rank/weekly_count` 字段;无 `/top` 页面;首页无空态/周榜徽标;零聚合单测。
|
||
|
||
## 改动
|
||
后端(`chunyu_project/tool/`):
|
||
1. `views/tool_manage_view.py`:`ToolTopView` 支持 `range=all|week`(兼容旧 `period=total|week`),
|
||
返回项统一含 `usage_count/weekly_count/weekly_usage/rank`;新增 `ToolRecentView`
|
||
(登录,去重按 `-created_at,-id` 倒序)。
|
||
2. `views/__init__.py`、`urls.py`:挂载 `path('recent/', ToolRecentView)`。
|
||
3. `management/commands/seed_tools.py`:新增 `AI 工具` 分类(给 C-04 用)+ `AI 图片放大` /
|
||
`代码在线运行` 两个工具种子。
|
||
4. `tests/test_tool_top.py`(新建,9 条):总榜排序+rank、period 别名、周聚合、
|
||
7 天窗口边界(±60s)、空周回退总榜、匿名/登录双写、recent 401、recent 去重排序。
|
||
|
||
前端(`chunyu_project_react/src/`):
|
||
5. `pages/Top/`(新建 `Top.tsx`+`Top.css`):`/top` 总榜/周榜切换 + 排名 + “本周 XX 人在用”。
|
||
6. `App.tsx`:`Top` 懒加载路由 `/top`。
|
||
7. `utils/request.ts`:`tool.getTop` 沿用 + 新增 `tool.getRecent`。
|
||
8. `pages/Home/Home.tsx`:热榜改 `range=all`,查看全部指向 `/top`,加空态 +
|
||
周榜徽标;`Home.css` 加 `.home-utility-card-weekly`、`.home-top-empty`。
|
||
|
||
## 口径说明
|
||
- 存量 `Tool.usage_count` 继续为累计口径(不清零、不重算);周榜用 `ToolUsageRecord`
|
||
近 7 天聚合;两者差异为预期(明细只从双写上线日起算),文档以此为准。
|
||
|
||
## 验证
|
||
```bash
|
||
DB_ENGINE=django.db.backends.sqlite3 DB_NAME=".../chunyu_project/dev_db.sqlite3" \
|
||
python ".../chunyu_project/manage.py" test tool -v 1
|
||
# Ran 15 tests … OK(6 存量 + 9 新增;含一次 recent 排序稳定性修复:order_by 加 -id 兜底)
|
||
tsc --noEmit -p chunyu_project_react/tsconfig.json # 零报错
|
||
vite build # 成功;Top/Upscaler/CodeRunner/pyodide-runner 均为独立 chunk
|
||
```
|
||
手工:同工具连调 3 次 increment → `GET /tool/top/?range=week` weekly_count=3(单测已覆盖同等价)。
|
||
|
||
## 状态
|
||
done。遗留:`/top` 页 i18n 文案为中文硬编码(多语言 key 后续补)。
|