5.4 KiB
5.4 KiB
INBOX
K85 收藏数 / 评论数实时更新
现象
首页 feed 右侧互动栏已经能显示数字,但收藏数、评论数点完不变:
- 收藏(点星标)后数字不动,杀掉 App 重进又回到旧值
- 发表评论后评论数不动
已定位的根因(勘察结论,不要再重复排查)
后端(FruitServer)
drama.favorite_count从建剧时置 0 之后没有任何地方自增/自减:FavoriteService.toggle()只写/删user_favorite,注释写着「计数走异步聚合」, 但仓库里没有这个聚合任务,所以收藏数永远是 0remove()/removeBatch()也不维护计数LikeService是同步维护drama.like_count的(DramaService.adjustLikeCount),收藏应对齐这个做法
- 数据库现状(本机 PG
fruitshorts):drama.favorite_count全为 0, 而user_favorite实际有记录(剧 1 有 4 条、剧 2 有 2 条、剧 5 有 5 条……)→ 需要回填 - 评论数没有单个剧集的计数接口:
GET /app/comments是游标翻页,不返回总数
客户端(ReelShort)
- 首页 feed 的收藏回调(
player_view.dart约 468 行)是内联实现,没有调用已有的_applyFavoriteDelta;只有全屏播放页的_toggleSave(player_view_actions.dart)调了 → 首页收藏后数字不变 - 两处 rail 的
commentCount: drama.commentCount是静态值,评论面板关闭后不刷新 - 详情页
DramaStatsCard用drama.favoriteCount,drama_detail_logic.toggleFavorite()切换后不更新显示
任务
A. FruitServer(后端)
fruitshorts-module-content/.../service/DramaService.java- 新增
adjustFavoriteCount(Long dramaId, int delta):SQL 自增, 参考现有adjustLikeCount,减号用GREATEST(favorite_count - 1, 0)
- 新增
fruitshorts-module-playback/.../service/FavoriteService.java- 类注释里「计数走异步聚合」改成与
LikeService一致的同步维护说明 toggle():插入关系后adjustFavoriteCount(+1);physicalDelete返回行数 > 0 时-1remove():删除成功(返回行数 > 0)时-1removeBatch():按 dramaId 逐个physicalDelete并按其返回值-1(保持与前端「取消收藏」一致的物理删除语义,避免逻辑删除挡住再次收藏)
- 类注释里「计数走异步聚合」改成与
fruitshorts-app-api/.../controller/AppCommentController.java- 新增
GET /app/comments/count?dramaId={id}→Result<Long>, 内部commentService.countByDrama(dramaId)(匿名可访问,与列表一致)
- 新增
sql/下加一次性回填脚本sql/backfill_favorite_count.sqlUPDATE drama d SET favorite_count = (SELECT count(*) FROM user_favorite f WHERE f.drama_id = d.id AND f.deleted = 0);- 只放脚本,不要在应用启动时自动执行
- 测试
FavoriteService单测:收藏 +1、取消 -1、不会减到负数、removeBatch 多剧集各自扣减AppCommentController契约测试:/app/comments/count返回数字
B. ReelShort(客户端)
lib/core/data/remote/comment_api.dart- 新增
Future<int> count(String dramaId),解析data(Long 可能是字符串,用现有jsonToInt)
- 新增
lib/core/data/repositories/comment_repository.dart- 接口与
HttpCommentRepository同步新增count
- 接口与
lib/pages/player/player_view.dart- 首页 feed 的
onSave改为复用_toggleSave(context, drama)(内部已有_applyFavoriteDelta) - 新增
Map<String, int> _commentCounts - 新增
_openComments(context, drama):await openCommentsWithAuth(...), 结束后await commentRepository.count(drama.id)并setState写入_commentCounts; 失败静默(保留旧值,不弹错) - 首页 rail 与播放页 rail 的
commentCount都改成_commentCounts[drama.id] ?? drama.commentCount;onComments都走_openComments
- 首页 feed 的
lib/pages/drama_detail/drama_detail_logic.dart(收藏数同步)- 记录本地收藏增量,把调整后的收藏数提供给
DramaStatsCard(不要改Drama模型;用 getter 或在 view 层叠加 delta) - 只在切换成功且状态确实变化时 ±1,失败回滚
- 记录本地收藏增量,把调整后的收藏数提供给
- 测试
CommentApi.count的解析测试(数字 / 字符串两种返回)- 收藏增量逻辑(可抽纯函数或独立小对象)单测:+1、-1、失败不变
验收
- 后端:
mvn test全过;mvn -pl fruitshorts-app-api -am package -DskipTests出包; 本地执行回填脚本后GET /app/home/feed的favoriteCount与user_favorite实际条数一致 - 客户端:
dart analyze lib test零告警、flutter test全过 - 功能:收藏后 rail 数字立即 ±1;重进 App 数字不回退;发表评论后关闭面板,评论数 +1(重新拉取)
Git
- FruitServer:从
develop拉fix/favorite-comment-count, 提交fix(interaction): 收藏计数同步维护并新增评论数接口,--no-ff合回develop并 push - ReelShort:从
develop拉fix/interaction-count-refresh, 提交fix(player): 收藏与评论数实时刷新,--no-ff合回develop并 push - 作者统一
Zhou Weidong <502333560@qq.com>;各自仓库docs/plans/PROGRESS.md追加 K85 留痕
约束
- 全程中文;禁止
git add -A;不改 specs 仓库;不动pubspec.lock以外的无关文件 - 完成后停住,等待验收