--- sidebar_position: 7 title: 运营后台 sidebar_label: 运营后台 description: 运营后台功能规范、权限设计、内容审核流程、精选管理和数据看板 --- # 运营后台 ## 定位 运营后台(`ui/ops/`)是广场内容治理的专用工具,面向运营人员,不面向普通用户。 与现有管理后台(`/admin`)的分工: | 功能 | 现有 /admin | 运营后台 /ops | | --- | --- | --- | | 用户管理(冻结、套餐) | ✅ | ❌ | | LLM 密钥和系统配置 | ✅ | ❌ | | 广场内容审核 | ❌ | ✅ | | 精选和推广管理 | ❌ | ✅ | | 广场数据看板 | ❌ | ✅ | | 违规帖子处理 | ❌ | ✅ | | 创作者认证 | ❌ | ✅ | **关键原则**:运营人员看不到 LLM 密钥、系统配置和付费记录,系统管理员看不到广场审核队列。 --- ## 访问控制 运营后台通过 Nginx 限制只允许内网 IP 访问: ```nginx location /ops { allow 10.0.0.0/8; deny all; proxy_pass http://127.0.0.1:3002; } ``` 后端 API `/api/ops/v1/*` 通过独立中间件验证 `ops_role`: ```text ops_role = reviewer 内容审核人员,可审核帖子和评论 ops_role = editor 编辑,可设置精选和标签 ops_role = ops_admin 运营管理员,所有运营权限 + 查看数据看板 ``` `users` 表新增 `ops_role ENUM('none', 'reviewer', 'editor', 'ops_admin') DEFAULT 'none'`,由系统管理员分配。 --- ## 功能模块 ### 1. 审核队列 **入口**:`/ops/review` **页面布局**: ```text ┌────────────────────────────────────────────────────────┐ │ 审核队列 [待审核 234] [已审核 1,892] [已拒绝 45] │ ├────────────────────────────────────────────────────────┤ │ 筛选:分类 ▼ 时间范围 ▼ 关键词搜索 │ ├────────────────────────────────────────────────────────┤ │ ┌──────────────────────────────────────────────────┐ │ │ │ [封面缩略图] 标题 │ │ │ │ 作者 @slug 发布时间 分类 │ │ │ │ 摘要预览 │ │ │ │ [通过] [拒绝] [预览] │ │ │ └──────────────────────────────────────────────────┘ │ │ ... 更多帖子 ... │ └────────────────────────────────────────────────────────┘ ``` **操作流程**: ```text 审核人员点击 [通过] → plaza_posts.status = published → 写入 ops_audit_log(操作人、时间、原状态、新状态) → 刷新队列 审核人员点击 [拒绝] → 弹出原因选择:违规内容 / 低质内容 / 重复内容 / 广告推广 / 其他(自填) → plaza_posts.status = rejected → 发送站内通知给创作者(内容:拒绝原因) → 写入 ops_audit_log 审核人员点击 [预览] → 新标签页打开 /plaza/p/{id}(不改变状态,仅预览) ``` **批量操作**:选中多条 → 批量通过(仅通过,拒绝需要逐条填写原因)。 **SLA 要求**:审核队列中 `pending_review` 超过 2 小时的帖子,展示橙色警告标记。 --- ### 2. 举报处理 **入口**:`/ops/reports` 用户可以对帖子和评论发起举报。后端新增 `plaza_reports` 表: ```sql CREATE TABLE plaza_reports ( id CHAR(36) NOT NULL, target_type ENUM('post', 'comment') NOT NULL, target_id CHAR(36) NOT NULL, reporter_id CHAR(36) NOT NULL, -- → users.id reason ENUM( 'spam', 'violence', 'porn', 'political', 'privacy', 'other' ) NOT NULL, detail VARCHAR(500) NOT NULL DEFAULT '', status ENUM('pending', 'processed', 'dismissed') NOT NULL DEFAULT 'pending', processed_by CHAR(36) NULL, -- → users.id(运营) processed_at DATETIME NULL, action_taken VARCHAR(200) NOT NULL DEFAULT '', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_status_type (status, target_type, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 举报队列展示:同一帖子的举报数量 > 3 时,红色标记。运营可以直接从举报队列跳转隐藏帖子。 --- ### 3. 精选管理 **入口**:`/ops/featured` 运营可以将优质帖子设置为精选,精选内容在广场首页置顶展示。 **精选位类型**: | 类型 | 说明 | 最大数量 | | --- | --- | --- | | `homepage_banner` | 首页顶部轮播(大图) | 5 条 | | `category_top` | 分类页置顶 | 每个分类 3 条 | | `trending` | 热门趋势区 | 10 条 | **精选配置表**: ```sql CREATE TABLE plaza_featured ( id CHAR(36) NOT NULL, post_id CHAR(36) NOT NULL, -- → plaza_posts.id position VARCHAR(50) NOT NULL, sort_order INT NOT NULL DEFAULT 0, starts_at DATETIME NOT NULL, expires_at DATETIME NULL, -- NULL 表示永不过期 created_by CHAR(36) NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_position_active (position, starts_at, expires_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 过期的精选自动从展示列表移除(查询时加 `expires_at > NOW() OR expires_at IS NULL` 条件)。 --- ### 4. 创作者管理 **入口**:`/ops/creators` 运营可以: - 搜索创作者(按用户名、帖子数、粉丝数排序)。 - 为创作者添加认证标记(`verified_badge`)。 - 限制创作者发帖权限(`post_banned`)或评论权限(`comment_banned`)。 - 查看创作者的所有帖子。 `users` 表新增字段见 [02-data-model](./02-data-model)(`ops_role`、`plaza_verified` 等在同一迁移中定义)。 --- ### 5. 数据看板 **入口**:`/ops/analytics`(仅 `ops_admin` 可访问) **概览指标(今日 vs 昨日)**: ```text 新帖数 发布转化率 日活用户 新注册来自广场 ↑12% 32.4% ↑8% ↑23% ``` **图表**: - 近 14 天每日新帖数折线图 - 分类帖子分布饼图 - TOP 10 创作者(按帖子数 / 点赞数 / 粉丝增长) - 违规比率趋势折线图 - 广场带来的 MindSpace 新注册数(通过 UTM 参数追踪) **数据来源**:后端 `/api/ops/v1/analytics/*` 接口,数据每小时预聚合写入统计表,不实时查询明细表。 --- ## 运营日志 所有运营操作写入 `ops_audit_log` 表: ```sql CREATE TABLE ops_audit_log ( id CHAR(36) NOT NULL, operator_id CHAR(36) NOT NULL, -- → users.id(运营人员) action VARCHAR(100) NOT NULL, -- approve_post, reject_post, hide_post, set_featured... target_type VARCHAR(50) NOT NULL, target_id CHAR(36) NOT NULL, detail JSON NOT NULL, -- 操作前后的状态快照 created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_operator (operator_id, created_at DESC), KEY idx_target (target_type, target_id, created_at DESC) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 日志只追加,不允许修改或删除,保留 180 天。 --- ## 运营后台启动顺序 初期可以使用现有 `/admin` 后台临时管理内容审核(扩展一个"广场管理"菜单),等广场日活超过 1000 后,再独立启动 `ui/ops/` 项目: ```bash # Sprint 1:在 /admin 下新增简单的帖子审核入口(最小可用) # Sprint 3:独立 ui/ops/ 项目上线完整审核队列 # Sprint 5:精选管理和数据看板 ```