418 lines
11 KiB
Markdown
418 lines
11 KiB
Markdown
# 广场审核与排序优化完成总结
|
||
|
||
## ✅ 已完成功能
|
||
|
||
### 一、智能排序算法优化
|
||
|
||
#### 1. 时间衰减热度算法(已实现)
|
||
|
||
**核心公式**:
|
||
```
|
||
热度分 = (10 × 点赞数 + 1 × 浏览数) / (发布小时数 + 2)^1.5
|
||
```
|
||
|
||
**支持的排序方式**:
|
||
- `latest` - 最新排序(按发布时间倒序)
|
||
- `hot` - 热门排序(时间衰减热度算法)
|
||
- `quality` - 高质量排序(按点赞率)
|
||
|
||
**实现位置**:
|
||
- `PlazaWorkMapper.java` - findPublicWorksList() 方法
|
||
|
||
**SQL实现**:
|
||
```sql
|
||
SELECT pw.*, u.nickname, u.avatar_url,
|
||
CASE
|
||
WHEN sortBy = 'hot' THEN
|
||
(10 * pw.like_count + 1 * pw.view_count) /
|
||
POW(TIMESTAMPDIFF(HOUR, pw.create_time, NOW()) + 2, 1.5)
|
||
WHEN sortBy = 'quality' THEN
|
||
CASE WHEN pw.view_count > 0 THEN (pw.like_count * 100.0 / pw.view_count) ELSE 0 END
|
||
ELSE
|
||
UNIX_TIMESTAMP(pw.create_time)
|
||
END as score
|
||
FROM plaza_work pw
|
||
LEFT JOIN user u ON pw.user_id = u.id
|
||
WHERE pw.status = 'published' AND pw.audit_status = 'approved'
|
||
ORDER BY score DESC
|
||
```
|
||
|
||
**优势**:
|
||
- ✅ 新作品有机会获得曝光(时间加权)
|
||
- ✅ 优质内容能长期保持高位(点赞加权)
|
||
- ✅ 避免老作品独霸榜单
|
||
- ✅ 符合用户"看新鲜热辣内容"的心理
|
||
|
||
---
|
||
|
||
### 二、完整审核系统
|
||
|
||
#### 1. 基础审核功能(6个API)
|
||
|
||
| 接口 | 方法 | 路径 | 功能 |
|
||
|------|------|------|------|
|
||
| 查询待审核列表 | GET | `/admin/plaza/audit/pending` | 分页查询待审核作品 |
|
||
| 查询待审核详情 | GET | `/admin/plaza/audit/pending/{workNo}` | 查看单个作品详情 |
|
||
| 审核作品 | POST | `/admin/plaza/audit/audit` | 通过或拒绝作品 |
|
||
| 批量审核 | POST | `/admin/plaza/audit/batch-audit` | 批量处理多个作品 |
|
||
| 审核统计 | GET | `/admin/plaza/audit/stats` | 获取审核数据统计 |
|
||
| 审核历史 | GET | `/admin/plaza/audit/history` | 查询历史记录 |
|
||
|
||
#### 2. 增强审核功能(4个新API)
|
||
|
||
| 接口 | 方法 | 路径 | 功能 |
|
||
|------|------|------|------|
|
||
| **撤销审核** | POST | `/admin/plaza/audit/revoke` | 将已审核作品重新设为待审核 |
|
||
| **快捷审核** | POST | `/admin/plaza/audit/quick-approve` | 一键通过最早的N个待审核作品 |
|
||
| **详细审核信息** | GET | `/admin/plaza/audit/detail/{workNo}` | 含历史记录、作者统计的完整信息 |
|
||
| **审核员统计** | GET | `/admin/plaza/audit/admin-stats` | 统计审核员工作量和效率 |
|
||
|
||
---
|
||
|
||
### 三、审核流程设计
|
||
|
||
```
|
||
用户发布作品
|
||
↓
|
||
设置 audit_status = 'pending'
|
||
↓
|
||
管理员查看待审核列表
|
||
↓
|
||
审核决策
|
||
├─ 通过 → audit_status = 'approved' → 在广场显示
|
||
├─ 拒绝 → audit_status = 'rejected' → 不显示,记录原因
|
||
└─ 撤销 → audit_status = 'pending' → 重新审核
|
||
```
|
||
|
||
**审核日志记录**:
|
||
- 每次审核操作都会记录到 `plaza_work_audit_log` 表
|
||
- 包含:审核人、审核时间、审核结果、审核备注
|
||
- 支持查询完整的审核历史轨迹
|
||
|
||
---
|
||
|
||
### 四、数据库变更
|
||
|
||
#### 1. plaza_work 表新增字段
|
||
|
||
| 字段 | 类型 | 默认值 | 说明 |
|
||
|------|------|--------|------|
|
||
| `audit_status` | VARCHAR(20) | `pending` | 审核状态 |
|
||
| `audit_admin_id` | BIGINT | NULL | 审核管理员ID |
|
||
| `audit_time` | DATETIME | NULL | 审核时间 |
|
||
| `audit_remark` | TEXT | NULL | 审核备注 |
|
||
|
||
#### 2. plaza_work_audit_log 表(新建)
|
||
|
||
审核记录表,记录所有审核操作历史:
|
||
```sql
|
||
CREATE TABLE plaza_work_audit_log (
|
||
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||
work_no VARCHAR(64) NOT NULL,
|
||
work_id BIGINT NOT NULL,
|
||
audit_status VARCHAR(20) NOT NULL,
|
||
audit_admin_id BIGINT NOT NULL,
|
||
audit_admin_name VARCHAR(100),
|
||
audit_remark TEXT,
|
||
audit_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
INDEX idx_work_no (work_no),
|
||
INDEX idx_admin_id (audit_admin_id)
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
### 五、核心业务逻辑
|
||
|
||
#### 1. 发布作品逻辑
|
||
```java
|
||
// PlazaServiceImpl.publishWork()
|
||
work.setStatus("published");
|
||
work.setAuditStatus("pending"); // 默认待审核
|
||
plazaWorkMapper.insert(work);
|
||
```
|
||
|
||
#### 2. 查询广场作品逻辑
|
||
```sql
|
||
-- 只显示审核通过的作品
|
||
WHERE pw.status = 'published'
|
||
AND pw.audit_status = 'approved' -- 关键过滤
|
||
AND pw.is_public = 1
|
||
AND pw.is_deleted = 0
|
||
```
|
||
|
||
#### 3. 审核作品逻辑
|
||
```java
|
||
// AdminPlazaAuditServiceImpl.auditWork()
|
||
1. 更新作品审核状态
|
||
2. 记录审核管理员信息
|
||
3. 保存审核时间和备注
|
||
4. 插入审核日志到 audit_log 表
|
||
```
|
||
|
||
#### 4. 撤销审核逻辑(新增)
|
||
```java
|
||
// AdminPlazaAuditServiceImpl.revokeAudit()
|
||
1. 检查作品是否已审核
|
||
2. 重置 audit_status = 'pending'
|
||
3. 清空 audit_admin_id 和 audit_time
|
||
4. 记录撤销原因和操作人
|
||
5. 插入 'revoked' 类型的审核日志
|
||
```
|
||
|
||
#### 5. 快捷审核逻辑(新增)
|
||
```java
|
||
// AdminPlazaAuditServiceImpl.quickApprove()
|
||
1. 查询最早的N个待审核作品
|
||
2. 批量更新为 approved 状态
|
||
3. 为每个作品记录审核日志
|
||
4. 返回成功数量
|
||
```
|
||
|
||
---
|
||
|
||
### 六、新增统计功能
|
||
|
||
#### 1. 审核基础统计
|
||
```java
|
||
{
|
||
"pendingCount": 50, // 待审核数量
|
||
"todayApprovedCount": 120, // 今日通过数
|
||
"todayRejectedCount": 8, // 今日拒绝数
|
||
"totalAuditedCount": 5000 // 累计审核数
|
||
}
|
||
```
|
||
|
||
#### 2. 审核员工作量统计(新增)
|
||
```java
|
||
{
|
||
"adminId": 1,
|
||
"adminName": "管理员张三",
|
||
"totalAudited": 500, // 总审核数
|
||
"approvedCount": 450, // 通过数
|
||
"rejectedCount": 50, // 拒绝数
|
||
"approvalRate": 90.0, // 通过率 90%
|
||
"avgAuditTimeMinutes": 15.5, // 平均审核时长(分钟)
|
||
"busiestDate": "2025-10-28", // 最忙碌日期
|
||
"busiestDateCount": 120 // 最忙日审核数
|
||
}
|
||
```
|
||
|
||
#### 3. 作者统计(新增)
|
||
```java
|
||
{
|
||
"authorApprovalRate": 85.5, // 作者历史通过率
|
||
"authorTotalWorks": 20 // 作者累计作品数
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 七、API调用示例
|
||
|
||
#### 1. 快捷审核(批量通过前10个)
|
||
```bash
|
||
curl -X POST "http://localhost:8081/admin/plaza/audit/quick-approve?count=10" \
|
||
-H "Authorization: Bearer ADMIN_TOKEN"
|
||
```
|
||
|
||
#### 2. 撤销审核
|
||
```bash
|
||
curl -X POST "http://localhost:8081/admin/plaza/audit/revoke" \
|
||
-H "Authorization: Bearer ADMIN_TOKEN" \
|
||
-d "workNo=WORK-xxx&reason=误操作,需要重新审核"
|
||
```
|
||
|
||
#### 3. 查询作品详细审核信息
|
||
```bash
|
||
curl "http://localhost:8081/admin/plaza/audit/detail/WORK-xxx" \
|
||
-H "Authorization: Bearer ADMIN_TOKEN"
|
||
```
|
||
|
||
**响应示例**:
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"data": {
|
||
"workInfo": {
|
||
"workNo": "WORK-xxx",
|
||
"title": "美丽的风景",
|
||
"author": {
|
||
"userId": 123,
|
||
"username": "user123"
|
||
}
|
||
},
|
||
"auditStatus": "approved",
|
||
"auditTime": "2025-10-28T10:30:00",
|
||
"auditAdminName": "管理员张三",
|
||
"auditHistory": [
|
||
{
|
||
"auditStatus": "approved",
|
||
"auditTime": "2025-10-28T10:30:00",
|
||
"auditAdminName": "管理员张三",
|
||
"auditRemark": "内容优质"
|
||
}
|
||
],
|
||
"authorApprovalRate": 85.5,
|
||
"authorTotalWorks": 20
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 4. 查询审核员工作量
|
||
```bash
|
||
curl "http://localhost:8081/admin/plaza/audit/admin-stats?startTime=2025-10-01&endTime=2025-10-31" \
|
||
-H "Authorization: Bearer ADMIN_TOKEN"
|
||
```
|
||
|
||
#### 5. 使用不同排序查询广场
|
||
```bash
|
||
# 最新排序
|
||
GET /user/plaza/works?sortBy=latest
|
||
|
||
# 热门排序(时间衰减算法)
|
||
GET /user/plaza/works?sortBy=hot
|
||
|
||
# 高质量排序(按点赞率)
|
||
GET /user/plaza/works?sortBy=quality
|
||
```
|
||
|
||
---
|
||
|
||
### 八、技术实现亮点
|
||
|
||
#### 1. 时间衰减算法
|
||
- 使用 `POW()` 函数实现指数衰减
|
||
- 平衡新鲜度和质量的权重
|
||
- 避免"马太效应"
|
||
|
||
#### 2. 审核日志追溯
|
||
- 完整记录所有审核操作
|
||
- 支持审核撤销和重审
|
||
- 便于问题排查和数据分析
|
||
|
||
#### 3. 管理员效率统计
|
||
- 自动计算平均审核时长
|
||
- 识别最忙碌的审核时间
|
||
- 便于管理员绩效考核
|
||
|
||
#### 4. 作者信用评分
|
||
- 统计作者历史通过率
|
||
- 辅助审核决策(高信用作者可快审)
|
||
- 为未来信用体系打基础
|
||
|
||
---
|
||
|
||
### 九、文件清单
|
||
|
||
#### 数据库脚本
|
||
- ✅ `V11__add_plaza_audit_feature.sql` - 审核功能数据库变更
|
||
|
||
#### 实体类
|
||
- ✅ `PlazaWork.java` - 新增审核字段
|
||
- ✅ `PlazaWorkAuditLog.java` - 审核记录实体
|
||
|
||
#### DTO
|
||
- ✅ `AdminPlazaAuditDto.java` - 新增2个DTO:
|
||
- `WorkAuditDetailResponse` - 详细审核信息
|
||
- `AdminWorkloadStatsResponse` - 审核员统计
|
||
|
||
#### Mapper
|
||
- ✅ `PlazaWorkMapper.java` - 优化排序算法,新增作者统计
|
||
- ✅ `PlazaWorkAuditLogMapper.java` - 新增统计查询方法
|
||
|
||
#### Service
|
||
- ✅ `AdminPlazaAuditService.java` - 新增4个方法
|
||
- ✅ `AdminPlazaAuditServiceImpl.java` - 实现新增方法
|
||
|
||
#### Controller
|
||
- ✅ `AdminPlazaAuditController.java` - 新增4个API端点
|
||
|
||
#### Util
|
||
- ✅ `SecurityUtil.java` - 新增 `getUsername()` 方法
|
||
|
||
#### 文档
|
||
- ✅ `广场作品排序推荐算法说明.md` - 排序算法详解
|
||
- ✅ `广场审核功能说明.md` - 审核功能完整说明
|
||
|
||
---
|
||
|
||
### 十、部署检查清单
|
||
|
||
#### 1. 数据库更新
|
||
```bash
|
||
# 执行审核功能SQL脚本
|
||
mysql -u root -p 1818ai < src/main/resources/db/migration/V11__add_plaza_audit_feature.sql
|
||
```
|
||
|
||
#### 2. 验证字段
|
||
```sql
|
||
-- 检查 plaza_work 表
|
||
DESC plaza_work; -- 应包含 audit_status, audit_admin_id, audit_time, audit_remark
|
||
|
||
-- 检查 plaza_work_audit_log 表
|
||
DESC plaza_work_audit_log; -- 应存在此表
|
||
```
|
||
|
||
#### 3. 测试API
|
||
- ✅ 发布作品后,默认为 pending 状态
|
||
- ✅ 广场列表只显示 approved 的作品
|
||
- ✅ 管理员可以查看待审核列表
|
||
- ✅ 审核操作记录到日志表
|
||
- ✅ 排序算法正确计算热度分
|
||
|
||
---
|
||
|
||
### 十一、性能优化建议
|
||
|
||
#### 1. 索引优化
|
||
```sql
|
||
-- 审核状态索引(已在脚本中)
|
||
CREATE INDEX idx_audit_status ON plaza_work(audit_status);
|
||
|
||
-- 复合索引优化查询
|
||
CREATE INDEX idx_status_audit ON plaza_work(status, audit_status, is_public);
|
||
```
|
||
|
||
#### 2. 缓存策略
|
||
- 广场作品列表可以缓存10分钟
|
||
- 热度分计算可以异步更新
|
||
- 审核统计数据可以缓存5分钟
|
||
|
||
#### 3. 分页优化
|
||
- 使用游标分页代替offset(大数据量时)
|
||
- 限制最大页数,避免深分页
|
||
|
||
---
|
||
|
||
### 十二、后续优化方向
|
||
|
||
#### 短期(1-2周)
|
||
- 🔄 AI辅助审核(敏感词检测)
|
||
- 🔄 审核规则配置化
|
||
- 🔄 审核任务分配系统
|
||
|
||
#### 中期(1个月)
|
||
- ⏳ 个性化推荐算法
|
||
- ⏳ 用户举报功能
|
||
- ⏳ 审核优先级队列
|
||
|
||
#### 长期(2-3个月)
|
||
- ⏳ 机器学习推荐模型
|
||
- ⏳ 内容质量评分体系
|
||
- ⏳ A/B测试不同排序算法
|
||
|
||
---
|
||
|
||
## 🎉 总结
|
||
|
||
✅ **排序优化**:实现时间衰减热度算法 + 质量排序
|
||
✅ **审核系统**:10个完整的审核API(基础6个 + 增强4个)
|
||
✅ **统计分析**:审核员工作量统计 + 作者信用评分
|
||
✅ **日志追溯**:完整的审核历史记录
|
||
✅ **代码质量**:清晰的注释 + 完善的异常处理
|
||
|
||
**所有功能已100%实现,可立即上线使用!** 🚀
|
||
|
||
|