Files
1818web-hoduan/广场审核功能说明.md
2025-11-14 17:41:15 +08:00

390 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 广场作品审核功能说明
## 📋 功能概述
为广场功能添加了完整的审核流程,所有用户发布的作品都需要经过管理员审核通过后才能在广场展示。
---
## 🔄 审核流程
```
用户发布作品
作品状态: pending (待审核)
管理员审核
├─ 通过 → audit_status: approved → 广场展示
└─ 拒绝 → audit_status: rejected → 不展示,记录拒绝原因
```
---
## 📊 数据库变更
### 1. 新增字段 (plaza_work表)
| 字段名 | 类型 | 默认值 | 说明 |
|-------|------|--------|------|
| `audit_status` | VARCHAR(20) | `pending` | 审核状态pending-待审核, approved-已通过, rejected-已拒绝 |
| `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 COMMENT '作品编号',
`work_id` BIGINT NOT NULL COMMENT '作品ID',
`audit_status` VARCHAR(20) NOT NULL COMMENT '审核结果',
`audit_admin_id` BIGINT NOT NULL COMMENT '审核管理员ID',
`audit_admin_name` VARCHAR(100) NULL COMMENT '审核管理员名称',
`audit_remark` TEXT NULL COMMENT '审核备注',
`audit_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
```
### 3. 更新视图
- `v_plaza_hot_works` - 只显示审核通过的热门作品
- `v_plaza_latest_works` - 只显示审核通过的最新作品
- `v_plaza_pending_works` (新增) - 待审核作品列表(管理端使用)
---
## 🎯 核心功能
### 用户端
#### 1. 发布作品
- **状态**: 发布后自动设置为 `audit_status = 'pending'`
- **可见性**: 不在广场展示,用户可在"我的作品"中看到
- **提示**: 建议前端显示"作品审核中"状态
#### 2. 查询作品列表
- **规则**: 只返回 `audit_status = 'approved'` 的作品
- **影响**: 所有广场列表查询、统计都只包含已审核通过的作品
### 管理端
#### 1. 查询待审核作品
```http
GET /admin/plaza/audit/pending?page=1&size=20&taskType=text_to_image
```
**响应**:
```json
{
"code": 200,
"data": {
"works": [{
"workNo": "WORK-xxx",
"title": "作品标题",
"description": "作品描述",
"coverUrl": "https://...",
"taskType": "text_to_image",
"createTime": "2025-10-28T10:00:00",
"author": {
"userId": 123,
"username": "用户123",
"phone": "138****1234"
}
}],
"total": 100,
"page": 1,
"size": 20,
"totalPages": 5
}
}
```
#### 2. 审核作品(单个)
```http
POST /admin/plaza/audit/audit
Authorization: Bearer ADMIN_TOKEN
{
"workNo": "WORK-xxx",
"auditStatus": "approved", // 或 "rejected"
"auditRemark": "拒绝原因(拒绝时必填)"
}
```
**响应**:
```json
{
"code": 200,
"data": {
"workNo": "WORK-xxx",
"auditStatus": "approved",
"auditTime": "2025-10-28T10:30:00",
"auditAdminId": 1,
"auditRemark": null
}
}
```
#### 3. 批量审核
```http
POST /admin/plaza/audit/batch-audit?auditStatus=approved&auditRemark=批准
Authorization: Bearer ADMIN_TOKEN
workNos: ["WORK-xxx1", "WORK-xxx2", "WORK-xxx3"]
```
#### 4. 审核统计
```http
GET /admin/plaza/audit/stats
```
**响应**:
```json
{
"code": 200,
"data": {
"pendingCount": 50,
"todayApprovedCount": 120,
"todayRejectedCount": 8,
"totalAuditedCount": 5000
}
}
```
#### 5. 审核历史
```http
GET /admin/plaza/audit/history?page=1&size=20&auditStatus=approved&startTime=2025-10-01&endTime=2025-10-31
```
---
## 🔒 权限控制
### 管理端接口
- **要求**: `@PreAuthorize("hasRole('ADMIN')")`
- **认证**: 需要管理员JWT Token
- **记录**: 所有审核操作都记录管理员ID和名称
### 用户端接口
- **发布作品**: 需要登录
- **查看广场**: 无需登录(只能看到审核通过的)
- **查看自己作品**: 需要登录可看到pending状态
---
## 📝 文件清单
### 数据库脚本
-`V11__add_plaza_audit_feature.sql` - 添加审核相关字段和表
### 实体类
-`PlazaWork.java` - 添加审核相关字段
-`PlazaWorkAuditLog.java` (新增) - 审核记录实体
### DTO
-`AdminPlazaAuditDto.java` (新增) - 审核相关请求和响应DTO
- AuditWorkRequest - 审核请求
- PendingWorksQueryRequest - 待审核列表查询
- PendingWorkDetailResponse - 待审核作品详情
- PendingWorksListResponse - 待审核列表响应
- AuditResultResponse - 审核结果
- AuditStatsResponse - 审核统计
- AuditHistoryQueryRequest - 审核历史查询
- AuditHistoryRecord - 审核历史记录
### Mapper
-`PlazaWorkMapper.java` - 添加待审核作品查询方法更新所有查询添加audit_status判断
-`PlazaWorkAuditLogMapper.java` (新增) - 审核记录数据访问层
### Service
-`AdminPlazaAuditService.java` (新增) - 审核服务接口
-`AdminPlazaAuditServiceImpl.java` (新增) - 审核服务实现
-`PlazaServiceImpl.java` - 修改发布逻辑设置audit_status为pending
### Controller
-`AdminPlazaAuditController.java` (新增) - 管理端审核控制器
---
## 🚀 部署步骤
### 1. 执行数据库脚本
```bash
mysql -u root -p 1818ai < src/main/resources/db/migration/V11__add_plaza_audit_feature.sql
```
### 2. 重启服务
```bash
./mvnw spring-boot:run
```
### 3. 测试审核功能
#### 用户发布作品
```bash
curl -X POST "http://localhost:8081/user/plaza/works/publish" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer USER_TOKEN" \
-d '{
"taskNo": "TASK-xxx",
"title": "测试作品",
"description": "测试描述",
"isPublic": true
}'
```
#### 管理员查看待审核
```bash
curl "http://localhost:8081/admin/plaza/audit/pending?page=1&size=20" \
-H "Authorization: Bearer ADMIN_TOKEN"
```
#### 管理员审核通过
```bash
curl -X POST "http://localhost:8081/admin/plaza/audit/audit" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ADMIN_TOKEN" \
-d '{
"workNo": "WORK-xxx",
"auditStatus": "approved"
}'
```
---
## 📊 API 端点汇总
### 管理端审核接口
| 方法 | 路径 | 功能 | 权限 |
|------|------|------|------|
| GET | /admin/plaza/audit/pending | 查询待审核作品列表 | ADMIN |
| GET | /admin/plaza/audit/pending/{workNo} | 查询待审核作品详情 | ADMIN |
| POST | /admin/plaza/audit/audit | 审核作品 | ADMIN |
| POST | /admin/plaza/audit/batch-audit | 批量审核作品 | ADMIN |
| GET | /admin/plaza/audit/stats | 审核统计数据 | ADMIN |
| GET | /admin/plaza/audit/history | 审核历史记录 | ADMIN |
---
## ⚠️ 重要提示
### 1. 已有数据处理
- 脚本会自动将现有的已发布作品标记为 `approved`
- 确保执行脚本前备份数据库
### 2. 前端调整建议
#### 用户端
- 发布成功后提示:"作品已提交,正在审核中"
- "我的作品"中显示审核状态标签
- 待审核作品显示"审核中"标签
- 拒绝作品显示拒绝原因
#### 管理端
- 添加审核管理页面
- 显示待审核数量提醒
- 支持筛选、搜索待审核作品
- 支持批量操作
- 显示审核历史和统计
### 3. 审核规则建议
- 内容违规:色情、暴力、政治敏感等
- 质量不达标:模糊、失败、无意义内容
- 版权问题:侵权内容
- 其他:广告、垃圾信息等
---
## 🎨 前端集成示例
### React 示例 - 显示审核状态
```jsx
const AuditStatusBadge = ({ status, remark }) => {
const statusConfig = {
pending: { text: '审核中', color: 'orange' },
approved: { text: '已通过', color: 'green' },
rejected: { text: '已拒绝', color: 'red' }
};
const config = statusConfig[status] || statusConfig.pending;
return (
<div>
<span style={{ color: config.color }}>
{config.text}
</span>
{status === 'rejected' && remark && (
<div style={{ color: 'red', fontSize: '12px' }}>
拒绝原因{remark}
</div>
)}
</div>
);
};
```
### 管理端审核组件
```jsx
const WorkAuditPanel = ({ work, onAudit }) => {
const [remark, setRemark] = useState('');
const handleAudit = async (status) => {
try {
await axios.post('/admin/plaza/audit/audit', {
workNo: work.workNo,
auditStatus: status,
auditRemark: status === 'rejected' ? remark : null
});
onAudit();
message.success(`审核${status === 'approved' ? '通过' : '拒绝'}成功`);
} catch (error) {
message.error('审核失败');
}
};
return (
<div>
<h3>{work.title}</h3>
<img src={work.coverUrl} alt={work.title} />
<p>{work.description}</p>
<TextArea
placeholder="拒绝时请填写原因"
value={remark}
onChange={(e) => setRemark(e.target.value)}
/>
<Button type="primary" onClick={() => handleAudit('approved')}>
通过
</Button>
<Button danger onClick={() => handleAudit('rejected')}>
拒绝
</Button>
</div>
);
};
```
---
## ✅ 总结
审核功能已100%完成,包括:
- ✅ 数据库表结构更新
- ✅ 审核记录日志系统
- ✅ 完整的管理端审核API
- ✅ 用户端发布流程调整
- ✅ 查询逻辑更新(只显示审核通过的作品)
- ✅ 权限控制和安全机制
- ✅ 审核统计和历史记录
**所有代码可直接使用立即执行SQL脚本并重启服务即可上线**