# 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 环境影响;若失败会记录原始输出,不以开发机接口请求代替设备证据。 - 当前没有待确认的产品问题;若执行中出现契约与实现不一致,按任务书先停并登记。