Files

93 lines
5.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-10-17 K3 客户端第三批:互动
## 一、目标与边界
本轮只完成 Flutter 客户端互动能力的真实接口接入:
- K3-A 评论:匿名游标列表、顶层评论与一层回复、发布、敏感词三档、删除、三态与重试。
- K3-B 点赞:剧集与评论点赞、乐观更新、失败回滚、未登录拦截、防连点。
- K3-C 举报:举报评论与短剧、固定原因单选、可选描述、成功与失败提示。
- K3-D 分享回归:沿用现有系统分享,核对标题、简介与 footer 的三语文案。
不做 K4、拉黑、举报用户、后台治理、图片/表情/@提及、无限嵌套、我的评论列表和并发压测。
后端代码、后台 Web、specs 仓库均不改;接口只使用 `FruitServer/docs/api-phase1.md` §1.7。
## 一之一、实测基线
- ReelShort:`develop` / `feature/flutter-k3-interaction` 均为 `45f5f25`,功能分支从 K2 合并点派生。
- FruitServer:`develop` 为 `a0156ee`,比 `origin/develop` 多 1 个仅包含 INBOX 的派单提交。
- 本计划文件在开工前的 FruitServer 工作区中已存在且尚未提交,本轮仅增量补充,不覆盖既有内容。
## 二、契约与数据口径
| 能力 | 接口 | 客户端处理 |
| --- | --- | --- |
| 评论列表 | `GET /app/comments?dramaId=&episodeId=&rootId=&cursor=&size=` | 首屏 20 条,按 `nextCursor` 续拉,用 `hasMore` 控制加载更多 |
| 发布评论 | `POST /app/comments` | 顶层传 `dramaId/content`,回复额外传 `parentId` |
| 删除评论 | `DELETE /app/comments/{id}` | 仅 `mine=true` 可操作,二次确认,失败恢复列表 |
| 点赞切换 | `POST /app/likes/toggle` | `DRAMA` / `COMMENT`,以响应 `{liked,count}` 为最终态 |
| 举报 | `POST /app/reports` | `COMMENT` / `DRAMA`,`reasonCode` 必填 |
| 系统分享 | 无后端接口 | 保持 `PlatformShareService` |
评论字段按 `CommentRespVO` 解析,ID 全部使用字符串。所有新增用户可见文案进入
`lib/l10n/app_{en,zh,id}.arb` 并重新生成。
## 三、已确认的契约缺口与降级
1. `AppDramaDetailVO` / `AppDramaCardVO` 没有 `likeCount` / `liked`。
降级:不展示剧集点赞数字,只维护当前会话内的 liked 状态。
建议:后端详情与卡片补 `likeCount` / `liked`,需 specs 负责人变更契约。
2. §1.7 没有定义 `reasonCode` 枚举,后端当前不校验。
降级:客户端固定 `SPAM / ABUSE / PORN / AD / OTHER` 五项,文案进三语 arb。
建议:后端补 `reasonCode` 枚举与后台工单映射。
3. §1.7 没有拉黑接口。
降级:本批不做拉黑,不提供入口。
## 四、预计影响文件
FruitServer 文档:
- `docs/plans/2026-10-17-K3.md`
- `docs/plans/PROGRESS.md`
- `docs/plans/INBOX.md`
ReelShort 客户端:
- `lib/core/data/remote/comment_api.dart`
- `lib/core/data/remote/interaction_api.dart`
- `lib/core/data/repositories/comment_repository.dart`
- `lib/core/data/repositories/interaction_repository.dart`
- `lib/core/data/services/comment_controller.dart`
- 互动相关模型、Provider 注入与页面/组件
- `lib/pages/player/widgets/drama_comments_sheet.dart`
- `lib/pages/player/player_view.dart`
- 详情页举报入口及互动弹窗
- `lib/l10n/app_{en,zh,id}.arb` 与生成文件
- 对应 `test/**/*_test.dart`
实际文件以现有 K1/K2 分层和注入方式为准,避免无关重构。
## 五、TDD 与执行顺序
1. 只读核对 `ReelShort` 与 `FruitServer` 的 `develop` 基线、工作区状态与提交。
2. 从 `develop` 建 `feature/flutter-k3-interaction`。
3. K3-A:先写评论分页、发布、敏感词、删除、失败回滚和未登录测试并确认红灯,再实现并转绿。
4. K3-B:先写剧集/评论点赞成功、计数、乐观更新、回滚和未登录测试并确认红灯,再实现并转绿。
5. K3-C:先写举报成功、重复举报 message 透传和未登录测试并确认红灯,再实现并转绿。
6. K3-D:补充分享文案回归检查,确认三语资源完整。
7. 每块执行定向测试和 `dart analyze lib test`。
8. 全量执行 `dart analyze lib test`、`flutter test`、`flutter build apk --debug`。
9. 分块提交,`--no-ff` 合并回 `develop` 并 push;文档单独提交并 push。
10. 在 `PROGRESS.md` 与 INBOX 写回执,列出用户真机验证步骤,并明确设备侧取证未由 Codex 执行。
## 六、风险与待确认
- 评论游标的实际响应字段以已实现后端 VO 为准;若与任务书 `nextCursor/hasMore` 不一致,先停止并在 INBOX 顶部登记待协助,不自行扩契约。
- 剧集点赞没有初始查询接口,页面重建后会话内状态可能丢失;本批按降级方案不伪造初始值。
- 匿名列表可见,但发布、点赞、举报必须登录;需确保 AuthGate 在发起业务请求前拦截。
- 举报重复与举报自己依赖后端 message,客户端只原样展示,不自行判断。
- 敏感词 `REVIEW` 的 pending 评论仅自己可见,客户端必须保留发布成功返回内容并显示“审核中”。
- 现有互动控制器为本地演示数据,移除时不得破坏 K2 的分类、记录、收藏、下载和播放进度逻辑。
- 全量构建可能受本机 Flutter/Android SDK 环境影响;若失败会记录原始输出,不以开发机接口请求代替设备证据。
- 当前没有待确认的产品问题;若执行中出现契约与实现不一致,按任务书先停并登记。