Files
1818web-hoduan/docs/course-update-api.md

283 lines
6.7 KiB
Markdown
Raw Normal View History

# 课程更新接口文档
## 接口概述
课程更新接口支持完整的课程信息更新,包括基本信息、章节结构和视频内容的增删改查。
## 接口信息
- **请求方法**: `PUT`
- **请求路径**: `/user/course/{id}`
- **接口描述**: 更新课程信息,包括章节和视频的完整更新
## 请求参数
### 路径参数
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | Long | 是 | 课程ID |
### 请求体 (CourseUpdateDto)
```json
{
"title": "课程标题",
"description": "课程描述",
"coverUrl": "封面图URL",
"price": 29.99,
"level": 1,
"category": "课程分类",
"isFree": true,
"submitForAudit": false,
"deleteMissing": true,
"chapters": [
{
"id": 123,
"title": "章节标题",
"description": "章节描述",
"orderNum": 1,
"videos": [
{
"id": 456,
"title": "视频标题",
"orderNum": 1,
"durationSec": 120,
"videoId": 789,
"vodVideoId": "vod-abc123"
}
]
}
]
}
```
### 字段说明
#### 课程基本信息
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| title | String | 否 | 课程标题最大128字符 |
| description | String | 否 | 课程描述 |
| coverUrl | String | 否 | 封面图URL |
| price | BigDecimal | 否 | 价格,不能为负数 |
| level | Integer | 否 | 访问课程所需的最低用户级别,不能为负数 |
| category | String | 否 | 课程分类最大64字符 |
| isFree | Boolean | 否 | 是否免费 |
| submitForAudit | Boolean | 否 | 是否提交审核默认false |
| deleteMissing | Boolean | 否 | 是否删除未提交的章节和视频默认true |
#### 章节信息 (ChapterUpdateDto)
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | Long | 否 | 章节ID更新时必填新建时不填 |
| title | String | 是 | 章节标题最大128字符 |
| description | String | 否 | 章节描述 |
| orderNum | Integer | 否 | 排序号,未提供则按数组顺序 |
| videos | List<VideoUpdateDto> | 否 | 视频列表 |
#### 视频信息 (VideoUpdateDto)
| 字段名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | Long | 否 | 视频ID更新时必填新建时不填 |
| title | String | 是 | 视频标题最大128字符 |
| orderNum | Integer | 否 | 排序号,未提供则按数组顺序 |
| durationSec | Integer | 是 | 视频时长必须大于0 |
| videoId | Long | 否 | 视频ID与vodVideoId二选一 |
| vodVideoId | String | 否 | 阿里云VOD视频ID与videoId二选一 |
## 响应结果
### 成功响应 (200)
```json
{
"code": 200,
"message": "success",
"data": {
"id": 1,
"title": "更新后的课程标题",
"description": "更新后的课程描述",
"coverUrl": "https://example.com/cover.jpg",
"price": 39.99,
"level": 2,
"category": "机器学习",
"isFree": true,
"createTime": "2024-01-15T10:30:00",
"updateTime": "2024-01-15T15:45:00",
"creator": {
"id": "100",
"username": "creator_user",
"avatarUrl": "https://example.com/avatar.jpg"
},
"chapters": [
{
"id": 10,
"title": "新章节",
"description": "新章节描述",
"orderNum": 1,
"videos": [
{
"id": 20,
"chapterId": 10,
"title": "新视频",
"videoId": "vod-abc123",
"durationSec": 120,
"orderNum": 1
}
]
}
]
}
}
```
### 错误响应
#### 400 - 参数错误
```json
{
"code": 400,
"message": "视频必须提供videoId或vodVideoId"
}
```
#### 401 - 未登录
```json
{
"code": 401,
"message": "用户未登录"
}
```
#### 403 - 无权限
```json
{
"code": 403,
"message": "无权限修改此课程"
}
```
#### 404 - 课程不存在
```json
{
"code": 404,
"message": "课程不存在"
}
```
#### 500 - 服务器错误
```json
{
"code": 500,
"message": "更新课程失败"
}
```
## 业务规则
### 1. 权限控制
- 只有课程创建者可以更新课程
- 用户必须已登录
### 2. 数据验证
- 标题长度不能超过128字符
- 价格不能为负数
- 用户级别不能为负数
- 分类长度不能超过64字符
- 视频必须提供videoId或vodVideoId之一不能同时提供
### 3. 章节和视频处理
- **新建**: 不提供id的章节/视频将被创建
- **更新**: 提供id的章节/视频将被更新
- **删除**: 当deleteMissing=true时未在本次提交中出现的章节/视频将被软删除
### 4. 视频资源绑定
- 提供videoId: 直接绑定到现有的Video记录
- 提供vodVideoId:
- 先查找是否已存在对应的Video记录
- 若存在且属于当前用户,则绑定
- 若不存在则创建新的Video记录并绑定
### 5. 审核状态
- 当发生结构性变更(新增/删除章节或视频、视频资源替换)时,课程审核状态自动重置为"待审核"
- 仅元信息微调如coverUrl不会重置审核状态
### 6. 排序处理
- 章节和视频的orderNum若未提供将按数组顺序自动设置
- 支持自定义排序号
## 使用示例
### 示例1: 更新课程基本信息
```json
{
"title": "AI图像处理进阶课程",
"description": "深入学习AI图像处理的高级技术",
"price": 49.99,
"level": 2,
"isFree": false
}
```
### 示例2: 添加新章节和视频
```json
{
"chapters": [
{
"title": "第三章:高级算法",
"description": "学习高级图像处理算法",
"orderNum": 3,
"videos": [
{
"title": "3.1 卷积神经网络",
"durationSec": 300,
"vodVideoId": "vod-new123"
}
]
}
]
}
```
### 示例3: 替换视频资源
```json
{
"chapters": [
{
"id": 1,
"videos": [
{
"id": 5,
"title": "更新的视频标题",
"durationSec": 180,
"vodVideoId": "vod-replace456"
}
]
}
]
}
```
### 示例4: 删除章节通过不包含在chapters中
```json
{
"deleteMissing": true,
"chapters": [
{
"id": 1,
"title": "保留的章节"
}
// 其他章节不包含,将被删除
]
}
```
## 注意事项
1. **事务性**: 整个更新操作在单一事务内执行,确保数据一致性
2. **幂等性**: 支持重复调用,不会产生副作用
3. **软删除**: 删除操作采用软删除,数据不会物理删除
4. **审核联动**: 结构性变更会自动触发审核流程
5. **资源管理**: 视频资源必须属于当前用户,确保权限安全
## 相关接口
- `GET /user/course/{id}` - 获取课程详情
- `POST /user/course` - 创建课程
- `DELETE /user/course/{id}` - 删除课程