# 超管端内容管理模块 — 设计方案 > 所属端:超管端 > 状态:P0 已实现并优化 > 创建日期:2026-03-27 > 最后更新:2026-04-09 --- ## 1. 背景 用户端升级为 UGC 绘本创作社区后,超管端需要新增**内容管理**一级菜单,承担内容审核和安全治理职能。 --- ## 2. 菜单结构 ``` 内容管理(新增一级菜单) ├── 作品审核 — P0,审核用户发布的作品 ├── 作品管理 — P0,全平台已发布作品的查看/下架/置顶 ├── 标签管理 — P0,作品标签/分类的维护 ├── 评论审核 — P1,审核用户评论 └── 举报处理 — P1,处理用户举报 ``` --- ## 3. 作品审核(P0) ### 3.1 审核流程 ``` 用户点击"发布" → status 变为 pending_review → 机器预审(敏感词检测 + 图片安全检测)→ 标记预审结果 → 进入人工审核队列 → 审核员操作: 通过 → status 变为 published,通知用户 拒绝 → status 变为 rejected + 拒绝原因,通知用户 ``` ### 3.2 页面设计 ``` ┌─ 标题卡片 ──────────────────────────────────────────────┐ │ 作品审核 │ └─────────────────────────────────────────────────────────┘ ┌─ 统计卡片 ──────────────────────────────────────────────┐ │ [待审核 28] [今日已审 56] [今日通过 50] [今日拒绝 6] │ └─────────────────────────────────────────────────────────┘ ┌─ 筛选栏 ────────────────────────────────────────────────┐ │ 审核状态:[下拉] 提交时间:[日期范围] 作者:[______] │ │ 机器预审:[下拉] [搜索] [重置] │ └─────────────────────────────────────────────────────────┘ ┌─ 审核队列表格 ──────────────────────────────────────────┐ │ 封面 | 作品名称 | 页数 | 作者 | 标签 | 机器预审 | │ │ | 提交时间 | 审核状态 | 操作 │ └─────────────────────────────────────────────────────────┘ ``` ### 3.3 表格列 | 列 | 宽度 | 说明 | |----|------|------| | 封面 | 80 | 缩略图 | | 作品名称 | 180 | 标题,可点击预览 | | 页数 | 60 | 绘本页数 | | 作者 | 120 | 昵称,点击可查看作者信息 | | 标签 | 140 | Tag 列表 | | 机器预审 | 90 | Tag:安全(绿)/ 疑似违规(红)/ 未检测(灰)| | 提交时间 | 150 | YYYY-MM-DD HH:mm | | 审核状态 | 90 | Tag:待审核(橙)/ 已通过(绿)/ 已拒绝(红)| | 操作 | 180 | 快捷通过 / 快捷拒绝 / 查看详情 | ### 3.4 审核详情 Drawer 点击"查看详情"打开右侧 Drawer: ``` 作品信息区 ├── 作品名称 / 标签 / 可见性设置 ├── 作者信息(昵称 / 账号 / 是否子女账号) ├── 提交时间 └── 机器预审结果(安全/疑似违规 + 标记原因) 绘本内容预览区 ├── 封面大图 ├── 内页翻页浏览(每页:插图 + 文字 + 播放配音按钮) └── 页码指示器(1/8) 审核操作区 ├── [通过] 按钮 ├── [拒绝] 按钮 → 展开拒绝原因选择 │ ├── ○ 含不适宜未成年人的内容 │ ├── ○ 含个人隐私信息(姓名/地址/电话) │ ├── ○ 涉嫌抄袭/侵权 │ ├── ○ 内容质量不符合发布标准 │ └── ○ 其他:[自定义填写] └── 审核备注(可选文本框) ``` ### 3.5 快捷操作 - 列表中"快捷通过"按钮:一键通过,无需打开 Drawer - 列表中"快捷拒绝"按钮:弹出拒绝原因选择 Popover,选择后直接拒绝 - 支持键盘快捷键:Drawer 中按 A 通过、按 R 拒绝、按 → 下一个(提升审核效率) ### 3.6 后端 API ``` GET /api/content-review/works — 审核队列列表 参数:page, pageSize, status(pending/approved/rejected), startTime, endTime, keyword, machineResult GET /api/content-review/works/stats — 审核统计(待审核/今日已审/今日通过/今日拒绝) GET /api/content-review/works/:id — 审核详情(含绘本分页内容) POST /api/content-review/works/:id/approve — 通过 POST /api/content-review/works/:id/reject — 拒绝(body: { reason, note? }) GET /api/content-review/logs — 审核操作日志 ``` --- ## 4. 作品管理(P0) 管理全平台已发布的作品,可查看数据、下架违规内容、推荐优质作品。 ### 4.1 页面设计 ``` ┌─ 标题卡片 ──────────────────────────────────────────────┐ │ 作品管理 │ └─────────────────────────────────────────────────────────┘ ┌─ 统计卡片 ──────────────────────────────────────────────┐ │ [总作品数 520] [今日新增 12] [累计浏览 8.5万] [已下架 3] │ └─────────────────────────────────────────────────────────┘ ┌─ 筛选栏 ────────────────────────────────────────────────┐ │ 作品/作者:[______] 标签:[下拉] 发布时间:[日期范围] │ │ 排序:[最新/最热/浏览最多] [搜索] [重置] │ └─────────────────────────────────────────────────────────┘ ┌─ 作品表格 ──────────────────────────────────────────────┐ │ 封面 | 作品名称 | 作者 | 标签 | 浏览 | 点赞 | 收藏 | │ │ | 评论 | 发布时间 | 状态 | 操作 │ └─────────────────────────────────────────────────────────┘ ``` ### 4.2 表格列 | 列 | 宽度 | 说明 | |----|------|------| | 封面 | 80 | 缩略图 | | 作品名称 | 180 | 标题 | | 作者 | 120 | 昵称 | | 标签 | 140 | Tag 列表 | | 浏览 | 70 | viewCount | | 点赞 | 70 | likeCount | | 收藏 | 70 | favoriteCount | | 评论 | 70 | commentCount | | 发布时间 | 150 | | | 状态 | 80 | Tag:正常(绿)/ 已下架(红)| | 操作 | 140 | 查看详情 / 下架 或 恢复 / 置顶推荐 | ### 4.3 操作说明 | 操作 | 说明 | |------|------| | 查看详情 | Drawer 展示绘本内容 + 作者信息 + 互动数据 | | 下架 | 弹窗确认 + 选择下架原因,status 改为 taken_down,通知用户 | | 恢复 | 已下架的作品恢复为 published | | 置顶推荐 | 标记为推荐作品,在广场优先展示(P2 可做推荐配置页面) | ### 4.4 后端 API ``` GET /api/content-management/works — 已发布作品列表 参数:page, pageSize, keyword, tagId, sortBy(latest/hot/views), startTime, endTime, status(published/taken_down) GET /api/content-management/works/stats — 统计(总数/今日新增/累计浏览/已下架) GET /api/content-management/works/:id — 作品详情 POST /api/content-management/works/:id/takedown — 下架(body: { reason }) POST /api/content-management/works/:id/restore — 恢复 POST /api/content-management/works/:id/recommend — 置顶推荐/取消推荐 ``` --- ## 5. 标签管理(P0) 维护作品标签/分类体系,用户发布作品时选择标签。 ### 5.1 页面设计 ``` ┌─ 标题卡片 ──────────────────────────────────────────────┐ │ 标签管理 [新增标签] │ └─────────────────────────────────────────────────────────┘ ┌─ 标签表格 ──────────────────────────────────────────────┐ │ 标签名称 | 分类 | 使用次数 | 排序 | 状态 | 操作 │ └─────────────────────────────────────────────────────────┘ ``` ### 5.2 表格列 | 列 | 宽度 | 说明 | |----|------|------| | 标签名称 | 150 | | | 分类 | 120 | 一级分类(如:主题/风格/情感)| | 使用次数 | 100 | 有多少作品使用了该标签 | | 排序 | 80 | 数字,影响用户端展示顺序 | | 状态 | 80 | Tag:启用 / 禁用 | | 操作 | 150 | 编辑 / 启用或禁用 / 删除 | ### 5.3 新增/编辑弹窗 ``` 标签名称:[______] 所属分类:[下拉选择 / 新建分类] 排序权重:[数字] 状态: [启用/禁用] ``` ### 5.4 后端 API ``` GET /api/tags — 标签列表(超管端,含使用统计) POST /api/tags — 创建标签 PUT /api/tags/:id — 编辑标签 DELETE /api/tags/:id — 删除标签(无作品使用时才可删除) PATCH /api/tags/:id/status — 启用/禁用 GET /api/tags/categories — 标签分类列表 POST /api/tags/categories — 创建分类 ``` --- ## 6. 评论审核(P1) ### 6.1 页面设计 ``` ┌─ 标题卡片 ──────────────────────────────────────────────┐ │ 评论审核 │ └─────────────────────────────────────────────────────────┘ ┌─ 统计卡片 ──────────────────────────────────────────────┐ │ [待审核 15] [今日已审 42] [今日通过 38] [今日拒绝 4] │ └─────────────────────────────────────────────────────────┘ ┌─ 筛选栏 ────────────────────────────────────────────────┐ │ 审核状态:[下拉] 提交时间:[日期范围] 评论者:[______] │ │ [搜索] [重置] │ └─────────────────────────────────────────────────────────┘ ┌─ 审核队列表格 ──────────────────────────────────────────┐ │ 评论内容 | 评论者 | 所属作品 | 机器预审 | │ │ 提交时间 | 审核状态 | 操作 │ └─────────────────────────────────────────────────────────┘ ``` ### 6.2 表格列 | 列 | 宽度 | 说明 | |----|------|------| | 评论内容 | 250 | 评论文本,超长省略 | | 评论者 | 120 | 昵称 | | 所属作品 | 160 | 作品名称,可点击跳转 | | 机器预审 | 90 | Tag:安全/疑似违规 | | 提交时间 | 150 | | | 审核状态 | 90 | Tag | | 操作 | 160 | 通过 / 拒绝 / 查看上下文 | 支持批量操作:勾选多条 → 批量通过 / 批量拒绝 ### 6.3 后端 API ``` GET /api/content-review/comments — 评论审核队列 GET /api/content-review/comments/stats — 统计 POST /api/content-review/comments/:id/approve — 通过 POST /api/content-review/comments/:id/reject — 拒绝 POST /api/content-review/comments/batch — 批量操作(body: { ids, action }) ``` --- ## 7. 举报处理(P1) ### 7.1 页面设计 ``` ┌─ 标题卡片 ──────────────────────────────────────────────┐ │ 举报处理 │ └─────────────────────────────────────────────────────────┘ ┌─ 统计卡片 ──────────────────────────────────────────────┐ │ [待处理 8] [今日已处理 12] [已忽略 3] │ └─────────────────────────────────────────────────────────┘ ┌─ 筛选栏 ────────────────────────────────────────────────┐ │ 举报类型:[下拉] 处理状态:[下拉] 举报时间:[日期范围] │ │ [搜索] [重置] │ └─────────────────────────────────────────────────────────┘ ┌─ 举报队列表格 ──────────────────────────────────────────┐ │ 举报类型 | 举报原因 | 被举报内容摘要 | 举报人 | │ │ 被举报人 | 举报时间 | 处理状态 | 操作 │ └─────────────────────────────────────────────────────────┘ ``` ### 7.2 处理操作 点击"处理"打开 Drawer: ``` 举报信息 ├── 举报类型(作品/评论/用户) ├── 举报原因 ├── 举报人信息 ├── 举报时间 被举报内容 ├── 作品:展示绘本预览 ├── 评论:展示评论内容+上下文 ├── 用户:展示用户主页信息 处理操作 ├── [下架内容] — 将被举报的作品/评论下架 ├── [警告用户] — 向被举报用户发送警告通知 ├── [禁用账号] — 禁用被举报用户的账号 ├── [忽略举报] — 举报不成立,不做处理 └── 处理备注:[文本框] ``` ### 7.3 后端 API ``` GET /api/content-review/reports — 举报队列 GET /api/content-review/reports/stats — 统计 GET /api/content-review/reports/:id — 举报详情 POST /api/content-review/reports/:id/handle — 处理举报 body: { action: 'takedown'|'warn'|'ban'|'ignore', note? } ``` --- ## 8. 实施记录 ### Day5 (2026-03-31) — P0 全面优化 #### 作品审核 - [x] 基础功能:统计卡片、筛选、审核队列表格、拒绝弹窗(预设理由+自定义)、详情 Drawer(绘本翻页预览) - [x] 批量审核:支持勾选待审核作品批量通过/批量拒绝 - [x] 撤销机制:已通过/已拒绝的作品支持撤销恢复为待审核(操作列常驻按钮+二次确认) - [x] 操作日志:详情 Drawer 底部展示审核操作时间线(通过/拒绝/下架/恢复/撤销) - [x] 体验优化:默认筛选待审核、表格加描述预览列+审核时间列、详情加「上一个/下一个」导航(审核完自动跳下一个)、统计卡片点击筛选、筛选下拉自动查询 - [x] 统计 Tab 与列表一致:「今日已审/今日通过/今日拒绝」按当日 `review_time` 区间查询(`reviewStartTime`/`reviewEndTime`);「待审核」仅 `pending_review` #### 作品管理 - [x] 基础功能:统计卡片、筛选(关键词+状态+排序)、作品表格、推荐/下架/恢复操作 - [x] 筛选修复:状态筛选支持 published+taken_down+推荐中,排序参数传后端真正生效 - [x] 下架原因:下架改为弹窗选择原因(4个预设+自定义),取代写死的「管理员下架」 - [x] 详情 Drawer:补全作品描述、标签、绘本预览、操作按钮(推荐/下架/恢复)、操作日志 - [x] 推荐联动:推荐作品在公众端广场顶部「编辑推荐」横栏展示,下架时自动取消推荐 - [x] 体验优化:统计卡片可点击筛选、表格加描述预览列、取消推荐二次确认、筛选自动查询 - [x] 统计 Tab 与列表一致:「今日新增」按当日 `create_time` 区间(`startTime`/`endTime`)且含已上架+已下架;「总作品数」为全量;「累计浏览」列表按浏览量排序;「已下架」仅下架状态 #### 标签管理 - [x] 基础功能:标签 CRUD、启用/禁用、删除保护(已使用不可删) - [x] 分类分组:标签按分类分组展示(每组有颜色标识+计数),未分类单独一组 - [x] 分类下拉:新增/编辑时分类改为下拉选择(支持选已有+创建新分类),杜绝手动输入不一致 - [x] 标签颜色:数据库新增 color 字段,10个预设色+自定义 hex,卡片左侧颜色条+用户端预览 - [x] 排序按钮:每个标签有上/下箭头,点击交换排序值并持久化 - [x] 使用次数可点击:跳转作品管理页带标签名搜索 - [x] 实时预览:新增/编辑弹窗底部实时渲染用户端标签效果 #### 新增后端 API ``` POST /api/content-review/works/batch-approve — 批量通过 POST /api/content-review/works/batch-reject — 批量拒绝 POST /api/content-review/works/:id/revoke — 撤销审核 GET /api/content-review/works (新增参数) — sortBy 排序 + isRecommended 筛选;startTime/endTime 按创建时间;reviewStartTime/reviewEndTime 按审核时间 GET /api/public/gallery/recommended — 推荐作品列表(公众端) POST /api/tags/batch-sort — 标签批量排序 ``` **公众端广场与 `status`(实现约定)**:`t_ugc_work.status` 为整型;管理端筛选参数里的 `published` 语义对应 **`status ∈ {3, 4, 5}`**(生成完成 / 已编目 / 已配音)。公众端 `GET /public/gallery`、`/public/gallery/recommended` 仅查询上述状态且 `visibility=public`、未删除;**不得**复用赛事/作业等模块的 `PublishStatus.PUBLISHED`(字符串 `"published"`)与整型列比较。 **标签筛选**:`GET /public/gallery` 查询参数 **`tagId`**(可选,对应 `t_ugc_tag.id`)表示仅返回在 **`t_ugc_work_tag`** 中与该标签有关联的公开已上架作品;`category` 参数预留,按标签大类筛选可后续与 `t_ugc_tag.category` 对齐。 #### 数据库变更 - `work_tags` 表新增 `color` 字段(VARCHAR(20),标签颜色)