3.7 KiB
PROGRESS — C-06 · 关注 feed + 首页签到卡 + 学习数据钩子
- 状态:done
日期 2026-09-13 · 范围:
chunyu_project/article+learn+user(后端只加字段/修bug/加用例,不改契约)+chunyu_project_react
现状 vs 差距(接手时)
- 已有:
Follow模型 +POST /user/follow/<id>/+GET /api/article/list?feed=following(后端)+ 详情页关注按钮(ArticleDetail.handleFollow)+ 桌面端Home签到卡(含未登录引导态)+ 课程students_count(ChapterRead 去重)双端显示。 - 缺口:article/learn 零用例;列表接口缺
author_user_id/is_following(卡上无法关注); 列表无关注空态;HomeMobile无签到条;无total_minutes字段;get_author_name在 ASGI 下同步碰obj.author外键 → 课程列表 500(本轮真抓到的 bug)。
改动
后端(chunyu_project/):
article/serializers.py:ArticleListSerializer加author_user_id+is_following(登录态关注判定)。learn/serializers.py:get_author_name改sync_to_async线程取数(修课程列表 500 真 bug,list/detail 双处);- 新增
parse_duration_minutes(中文“30分钟”/纯数字解析,不可解析返回 None 不伪造)+total_minutes字段(list/detail 双序列化器,可解析章节求和)。
article/tests/(新建包 +test_following_feed.py7 条):仅关注作者可见/未关注空态/ 双关注全可见/取关移除/匿名空态/普通列表不受影响/草稿不进 feed。learn/tests/(新建包 +test_c06_hooks.py8 条):签到双签 400+积分不变+单记录/ status 已签/匿名 401;聚合 2 用户交叉去重=2/零阅读=0/detail 对齐; total_minutes 求和 75/全不可解析 null。
前端(chunyu_project_react/src/):
5. pages/Articles/Articles.tsx:Article 接口加 author_user_id/is_following;
handleToggleFollow(关注切换 + feed=5 下取关即时移除);grid/list 双卡作者行加关注按钮;
空态(关注态 vs 普通态两套文案)。
6. pages/Articles/Articles.css:.articles-follow-btn + .articles-empty(含 dark)。
7. locales/{en,zh,zh-TW,ja,ko,ru}.json:articles.empty.{title,hint,followingTitle,followingHint}。
8. pages/Home/HomeMobile.tsx + .css:移动签到条(状态/周进度/一键签到/未登录引导,与桌面同口径)。
9. pages/Learn/Learn.tsx + LearnMobile.tsx:total_minutes 映射 + 有值才显示时长徽标;
locales 六语言加 learn.minutes;Learn 加缺失的 ClockCircleOutlined 引入。
口径说明
total_minutes只对可解析 duration 求和;存量中文字符串解析不出 → null → 前端不显示。- 签到幂等:第二次 400(
今日已签到),积分不变(单测锁定)。 - 未动:推荐算法(无)、Follow/签到字段与契约(无)、弹窗动画(无)。
验证
DB_ENGINE=django.db.backends.sqlite3 DB_NAME=".../dev_db.sqlite3" python manage.py test article learn tool -v 1
# Ran 30 tests … OK(15 存量 + 15 新增;中途一次 sqlite 锁表抖动,重跑即绿)
tsc --noEmit -p chunyu_project_react/tsconfig.json # 零报错
pnpm build # ✓ built in 14.99s
手工等价:A 关注 B → feed=following 只见 B 文(单测同等价 7 条);连签两次 → 第二次 400
积分不变(单测锁定)。
状态
done。遗留:user 滑块验证码既有红(3 失败+9 错误,与本任务无关,未动);
dev_db.sqlite3 曾缺 aitool 表已补迁移(migrate aitool),验证残留已清零。