feat(admin): 举报工单返回短剧与分集信息

This commit is contained in:
Zhou Weidong committed 2026-10-21 16:44:46 +08:00
1 parent 6ddddef5ec
commit 9a74876b3f
8 files changed
+727 -4

No files matched your search

+108
View File
@@ -0,0 +1,108 @@
# K92 举报工单展示短剧名称与分集
## 目标
- `/admin/reports/page` 不再只返回 `targetType / targetId`,而是返回举报人、目标短剧与分集的展示信息。
- Web 举报工单列表与处理弹窗使用同一份目标摘要,不再展示裸对象 ID。
- 不改既有举报处理逻辑、评论列表接口、观看记录接口或数据库结构。
## 分支
- FruitServer:`feat/k92-report-target`,从 `origin/develop` 创建。
- ReelShortWeb:`feat/k92-report-target-ui`,从 `origin/develop` 创建。
## A. FruitServer
### A1 返回模型
新增 `com.fruitshorts.admin.vo.AdminReportRespVO`,包含:
- 工单:`id/reasonCode/description/status/handleBy/handleAt/handleNote/createdAt`
- 举报人:`reporterId/reporterNickname/reporterUid`
- 目标:`targetType/targetId/targetSummary`
- 剧集:`dramaId/dramaTitle/episodeId/episodeNo/episodeTitle`
- 评论/用户:`commentContent/targetNickname/targetUid`
### A2 查询和解析
新增 `com.fruitshorts.admin.service.ReportAdminService`:
1. 分页查询 `content_report`,条件与 `ReportService.page` 保持一致:
`status/targetType/reasonCode/reporterId` 均仅在有文本或非空时加入,空值返回全部;
排序保持 `id DESC`。
2. 当前页批量查询:
- COMMENT 目标评论:一次查询,且必须包含逻辑删除记录,用于判断“评论已删除”。
- 评论与 DRAMA 目标剧:一次批量查询 `drama`。
- 评论目标分集:一次批量查询 `drama_episode`。
- USER 目标用户与全部 reporter:合并 id 后一次批量查询 `app_user`。
3. 禁止逐行查询。
`ContentCommentMapper` 增加显式批量查询方法,绕过 `@TableLogic` 的自动过滤;
普通 `selectBatchIds` 仍保持原行为。
### A3 摘要规则
- COMMENT:
- 正常评论且剧存在:`剧名 · 第 N 集`,有集标题时追加 ` · 集标题`。
- 评论删除、逻辑删除、评论不存在或剧不存在:`评论 #targetId`。
- DRAMA:
- 剧存在:剧名。
- 不存在:`短剧 #targetId`。
- USER:
- 用户存在:`昵称(uid)`。
- 不存在:`用户 #targetId`。
### A4 Controller 与文档
- `ReportAdminController.page` 改为返回 `Result<PageResult<AdminReportRespVO>>`。
- `handle` 继续调用原 `ReportService.handle`,不变更业务行为。
- 更新 `docs/api-phase1.md` §2.5。
### A5 测试
新增 `ReportAdminServiceTest`,覆盖:
- COMMENT / DRAMA / USER 三类摘要。
- 评论集标题、举报人昵称/uid、目标用户昵称/uid。
- 空筛选条件表示全部。
- 评论逻辑删除和目标剧不存在时退化文案。
- 验证按页批量查询,不产生 N+1。
门禁:`mvn test` 全模块通过。
## B. ReelShortWeb
### B1 类型
`ReportItem` 补齐后台新增字段,保留原 `targetId` 用于 tooltip 排查。
### B2 治理页
1. 「对象」列:
- 中文类型标签:评论 / 用户 / 短剧。
- 显示 `targetSummary`。
- tooltip 显示原始 `#targetId`,评论类型有内容时追加评论内容。
2. 删除独立「对象ID」列。
3. 「举报人」列显示昵称;无昵称回退 uid;再无回退 `#reporterId`。
4. 处理弹窗「工单对象」显示类型标签 + `targetSummary`。
### B3 门禁
- `pnpm ts:check`
- `pnpm build:dev`
- 对改动文件执行定向 ESLint
## 风险与说明
1. 评论逻辑删除记录默认被 MyBatis-Plus 过滤;本次使用显式 mapper 查询识别,
不改变评论正常查询和删除行为。
2. 已删除评论不展示正文,避免后台误读已删除内容;仍保留 `targetId` tooltip 便于排查。
3. 目标关联数据已物理删除时按任务书使用 `评论 #id / 短剧 #id / 用户 #id` 退化。
4. 本任务无数据库迁移,不改 specs 仓库和 Flutter 客户端。
## Git
- FruitServer:`feat(admin): 举报工单返回短剧与分集信息`
- ReelShortWeb:`feat(admin): 举报列表展示短剧与分集`
- 两仓库均 `--no-ff` 合回 `develop` 并 push。
- 作者:`Zhou Weidong <502333560@qq.com>`;禁止 `git add -A`。
+61
View File
@@ -23868,3 +23868,64 @@ exit 0
- ReelShortWeb 的 Husky pre-commit 依赖不可用的 `npm`,commit-msg 又受当前 pnpm
版本与仓库 8.1 声明不兼容影响;功能与合并提交使用 `--no-verify`,门禁已独立完成。
- 未安装或操作真机,未修改 specs 仓库与 Flutter 客户端,等待用户验收。
## 2026-10-21 K92 举报工单短剧与分集展示
- 已完整读取 K92 `docs/plans/INBOX.md` 及项目协作、编码、Git 规范。
- 已创建 FruitServer `feat/k92-report-target` 与 ReelShortWeb `feat/k92-report-target-ui`,
均基于最新 `origin/develop`。
- 已先写计划 `docs/plans/2026-10-21-K92-report-target.md`,明确三类目标摘要、
批量查询边界、逻辑删除评论识别和退化规则。
- 本任务无数据库迁移,不改 specs、Flutter 客户端、评论列表或观看记录接口。
- 已完成 A 主体代码:新增 `AdminReportRespVO`、`ReportAdminService`,分页按当前页批量装配
评论、剧、集与用户;`ContentCommentMapper` 增加包含逻辑删除记录的批量查询。
- `ReportAdminController.page` 已切换为 `AdminReportRespVO`,`handle` 继续走原 `ReportService`。
- `docs/api-phase1.md` §2.5 已补充举报人、剧名、集号、集标题与目标摘要说明。
- 已新增 `ReportAdminServiceTest`:覆盖三类目标摘要、举报人信息、空筛选、逻辑删除/目标缺失退化,
并通过 `times(1)` 验证按页每类关联只批量查询一次。
- K92 定向后端测试已通过:
```text
$ JAVA_HOME=<jdk21> mvn -pl fruitshorts-admin-api -am \
-Dtest=ReportAdminServiceTest -Dsurefire.failIfNoSpecifiedTests=false test
[INFO] fruitshorts-admin-api ... SUCCESS
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
[INFO] BUILD SUCCESS
```
解读:COMMENT/DRAMA/USER 三类摘要、批量装配、空筛选以及删除/缺失退化均通过。
- 已完成 B 主体代码:`ReportItem` 补齐展示字段;举报工单表格改为中文类型标签 +
`targetSummary`,删除对象 ID 列,tooltip 保留原始 `#targetId` 与评论内容;
举报人按昵称/uid/id 回退,处理弹窗同步展示类型标签与目标摘要。
- FruitServer 全模块门禁已通过:
```text
$ JAVA_HOME=<jdk21> mvn test
[INFO] fruitshorts-admin-api .............................. SUCCESS
[INFO] fruitshorts-app-api ................................ SUCCESS
[INFO] fruitshorts-transcode-worker ....................... SUCCESS
[INFO] BUILD SUCCESS
[INFO] Total time: 20.438 s
```
解读:全部 14 个 Reactor 模块通过;新增举报目标装配测试与既有后端测试均全过。
- ReelShortWeb 门禁已通过:
```text
$ pnpm ts:check
> fruitshorts-admin@1.0.0 ts:check
> pnpm vue-tsc --noEmit --skipLibCheck
exit 0
$ pnpm exec eslint src/api/admin/types.ts \
src/views/governance/ContentGovernanceView.vue
exit 0
$ pnpm build:dev
> fruitshorts-admin@1.0.0 build:dev
> VITE_CJS_IGNORE_WARNING=1 vite build --mode dev
Build successful. Please see dist-dev directory
```
解读:首次定向 ESLint 发现两处 Prettier 换行问题,按既有格式规则修正后零错误;
dev 构建保留既有 `element-plus` circular chunk 警告,不影响成功退出。