初始化v1
This commit is contained in:
647
docs/api-documentation.md
Normal file
647
docs/api-documentation.md
Normal file
@@ -0,0 +1,647 @@
|
||||
# nl-video-api 在线影院后端API接口文档
|
||||
|
||||
## 1. 接口概述
|
||||
|
||||
### 1.1 基本信息
|
||||
- **项目名称**: nl-video-api 在线影院后端系统
|
||||
- **版本**: v1.0.0
|
||||
- **基础URL**: `http://localhost:8000/api/v1`
|
||||
- **认证方式**: JWT Token
|
||||
- **数据格式**: JSON
|
||||
|
||||
### 1.2 通用响应格式
|
||||
```json
|
||||
{
|
||||
"code": 0, // 状态码,0表示成功,非0表示失败
|
||||
"message": "success", // 响应消息
|
||||
"data": {} // 响应数据,可能为对象、数组或null
|
||||
}
|
||||
```
|
||||
|
||||
### 1.3 通用错误码
|
||||
| 错误码 | 说明 |
|
||||
|--------|------|
|
||||
| 0 | 成功 |
|
||||
| 1001 | 参数错误 |
|
||||
| 1002 | 业务逻辑错误 |
|
||||
| 1003 | 认证失败 |
|
||||
| 1004 | 权限不足 |
|
||||
| 1005 | 资源不存在 |
|
||||
| 1006 | 资源已存在 |
|
||||
| 1007 | 服务器内部错误 |
|
||||
|
||||
### 1.4 认证说明
|
||||
- 除了登录接口外,所有接口都需要在请求头中携带JWT Token
|
||||
- Header格式: `Authorization: Bearer {token}`
|
||||
|
||||
## 2. 认证模块
|
||||
|
||||
### 2.1 管理员登录
|
||||
**接口地址**: `POST /auth/admin/login`
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"username": "admin", // 用户名,必填
|
||||
"password": "123456" // 密码,必填
|
||||
}
|
||||
```
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "登录成功",
|
||||
"data": {
|
||||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||||
"admin": {
|
||||
"id": 1,
|
||||
"username": "admin",
|
||||
"nickname": "超级管理员",
|
||||
"email": "admin@example.com",
|
||||
"status": 1,
|
||||
"last_login_time": "2024-01-01 12:00:00"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2.2 管理员注册
|
||||
**接口地址**: `POST /auth/admin/register`
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"username": "newadmin", // 用户名,必填,2-20位
|
||||
"password": "123456", // 密码,必填,6-20位
|
||||
"nickname": "新管理员", // 昵称,必填,2-20位
|
||||
"email": "admin@example.com" // 邮箱,必填
|
||||
}
|
||||
```
|
||||
|
||||
### 2.3 获取当前用户信息
|
||||
**接口地址**: `GET /auth/admin/info`
|
||||
|
||||
**请求头**: `Authorization: Bearer {token}`
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"id": 1,
|
||||
"username": "admin",
|
||||
"nickname": "超级管理员",
|
||||
"email": "admin@example.com",
|
||||
"status": 1,
|
||||
"permissions": ["user:list", "movie:create", "role:assign"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 3. 影片管理模块
|
||||
|
||||
### 3.1 获取影片列表
|
||||
**接口地址**: `GET /movies`
|
||||
|
||||
**请求参数**:
|
||||
| 参数名 | 类型 | 必填 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| page | int | 否 | 页码,默认1 |
|
||||
| page_size | int | 否 | 每页数量,默认20 |
|
||||
| title | string | 否 | 影片标题模糊搜索 |
|
||||
| category_id | int | 否 | 分类ID |
|
||||
| type | int | 否 | 影片类型:1电影,2电视剧 |
|
||||
| status | int | 否 | 状态:0禁用,1启用 |
|
||||
| year | int | 否 | 年份 |
|
||||
| country | string | 否 | 国家/地区 |
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"list": [
|
||||
{
|
||||
"id": 1,
|
||||
"title": "复仇者联盟",
|
||||
"type": 1,
|
||||
"category_id": 1,
|
||||
"category_name": "动作片",
|
||||
"cover": "https://example.com/cover.jpg",
|
||||
"year": 2012,
|
||||
"country": "美国",
|
||||
"director": "乔斯·韦登",
|
||||
"actors": "小罗伯特·唐尼,克里斯·埃文斯",
|
||||
"rating": 8.5,
|
||||
"duration": 143,
|
||||
"status": 1,
|
||||
"created_at": "2024-01-01 12:00:00"
|
||||
}
|
||||
],
|
||||
"total": 100,
|
||||
"page": 1,
|
||||
"page_size": 20
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.2 创建影片
|
||||
**接口地址**: `POST /admin/movies`
|
||||
|
||||
**请求头**: `Authorization: Bearer {token}`
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"title": "新影片", // 影片标题,必填
|
||||
"type": 1, // 影片类型:1电影,2电视剧,必填
|
||||
"category_id": 1, // 分类ID,必填
|
||||
"cover": "cover.jpg", // 封面图片,可选
|
||||
"year": 2024, // 年份,必填
|
||||
"country": "中国", // 国家/地区,必填
|
||||
"director": "导演名", // 导演,可选
|
||||
"actors": "演员1,演员2", // 演员,可选
|
||||
"description": "影片描述", // 描述,可选
|
||||
"duration": 120, // 时长(分钟),电影必填
|
||||
"total_episodes": 24, // 总集数,电视剧必填
|
||||
"status": 1 // 状态:0禁用,1启用
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 更新影片
|
||||
**接口地址**: `PUT /admin/movies/{id}`
|
||||
|
||||
**请求参数**: 同创建影片,所有字段可选
|
||||
|
||||
### 3.4 删除影片
|
||||
**接口地址**: `DELETE /admin/movies/{id}`
|
||||
|
||||
### 3.5 获取影片详情
|
||||
**接口地址**: `GET /movies/{id}`
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"id": 1,
|
||||
"title": "复仇者联盟",
|
||||
"type": 1,
|
||||
"category_id": 1,
|
||||
"category_name": "动作片",
|
||||
"cover": "https://example.com/cover.jpg",
|
||||
"year": 2012,
|
||||
"country": "美国",
|
||||
"director": "乔斯·韦登",
|
||||
"actors": "小罗伯特·唐尼,克里斯·埃文斯",
|
||||
"description": "超级英雄集结拯救世界",
|
||||
"rating": 8.5,
|
||||
"duration": 143,
|
||||
"view_count": 10000,
|
||||
"like_count": 500,
|
||||
"status": 1,
|
||||
"episodes": [ // 如果是电视剧,包含剧集信息
|
||||
{
|
||||
"id": 1,
|
||||
"episode_number": 1,
|
||||
"title": "第1集",
|
||||
"duration": 45,
|
||||
"video_url": "https://example.com/video1.mp4"
|
||||
}
|
||||
],
|
||||
"created_at": "2024-01-01 12:00:00",
|
||||
"updated_at": "2024-01-01 12:00:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 4. 用户管理模块
|
||||
|
||||
### 4.1 获取用户列表
|
||||
**接口地址**: `GET /admin/users`
|
||||
|
||||
**请求头**: `Authorization: Bearer {token}`
|
||||
|
||||
**请求参数**:
|
||||
| 参数名 | 类型 | 必填 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| page | int | 否 | 页码,默认1 |
|
||||
| page_size | int | 否 | 每页数量,默认20 |
|
||||
| username | string | 否 | 用户名模糊搜索 |
|
||||
| phone | string | 否 | 手机号模糊搜索 |
|
||||
| email | string | 否 | 邮箱模糊搜索 |
|
||||
| status | int | 否 | 状态:0禁用,1启用 |
|
||||
| vip_level | int | 否 | VIP等级:0-10 |
|
||||
| gender | int | 否 | 性别:0未知,1男,2女 |
|
||||
| start_time | string | 否 | 注册开始时间 |
|
||||
| end_time | string | 否 | 注册结束时间 |
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"list": [
|
||||
{
|
||||
"id": 1,
|
||||
"username": "user001",
|
||||
"phone": "13800138000",
|
||||
"email": "user@example.com",
|
||||
"nickname": "普通用户",
|
||||
"avatar": "https://example.com/avatar.jpg",
|
||||
"gender": 1,
|
||||
"vip_level": 2,
|
||||
"vip_expire_time": "2024-12-31 23:59:59",
|
||||
"balance": 100.50,
|
||||
"points": 1000,
|
||||
"status": 1,
|
||||
"last_login_time": "2024-01-01 12:00:00",
|
||||
"last_login_ip": "192.168.1.1",
|
||||
"created_at": "2024-01-01 10:00:00"
|
||||
}
|
||||
],
|
||||
"total": 500,
|
||||
"page": 1,
|
||||
"page_size": 20
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4.2 创建用户
|
||||
**接口地址**: `POST /admin/users`
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"username": "newuser", // 用户名,必填,2-20位,唯一
|
||||
"phone": "13800138001", // 手机号,必填,11位,唯一
|
||||
"email": "user@example.com", // 邮箱,必填,唯一
|
||||
"password": "123456", // 密码,必填,6-20位
|
||||
"nickname": "新用户", // 昵称,必填,2-20位
|
||||
"gender": 1, // 性别:0未知,1男,2女
|
||||
"vip_level": 0, // VIP等级,0-10
|
||||
"status": 1 // 状态:0禁用,1启用
|
||||
}
|
||||
```
|
||||
|
||||
### 4.3 更新用户信息
|
||||
**接口地址**: `PUT /admin/users/{id}`
|
||||
|
||||
**请求参数**: 同创建用户,除username外所有字段可选
|
||||
|
||||
### 4.4 删除用户
|
||||
**接口地址**: `DELETE /admin/users/{id}`
|
||||
|
||||
### 4.5 升级用户VIP
|
||||
**接口地址**: `POST /admin/users/{id}/vip`
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"vip_level": 3, // VIP等级,1-10
|
||||
"days": 30 // 有效天数
|
||||
}
|
||||
```
|
||||
|
||||
### 4.6 更新用户余额
|
||||
**接口地址**: `PUT /admin/users/{id}/balance`
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"amount": 100.50, // 金额,正数为增加,负数为减少
|
||||
"type": 1, // 类型:1充值,2消费,3退款,4奖励
|
||||
"remark": "管理员充值" // 备注
|
||||
}
|
||||
```
|
||||
|
||||
### 4.7 更新用户积分
|
||||
**接口地址**: `PUT /admin/users/{id}/points`
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"points": 500, // 积分,正数为增加,负数为减少
|
||||
"type": 1, // 类型:1签到,2消费,3奖励,4兑换
|
||||
"remark": "活动奖励" // 备注
|
||||
}
|
||||
```
|
||||
|
||||
## 5. 权限管理模块
|
||||
|
||||
### 5.1 获取角色列表
|
||||
**接口地址**: `GET /admin/roles`
|
||||
|
||||
**请求头**: `Authorization: Bearer {token}`
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"list": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "超级管理员",
|
||||
"code": "super_admin",
|
||||
"level": 1,
|
||||
"description": "系统最高权限",
|
||||
"sort": 1,
|
||||
"status": 1,
|
||||
"is_system": 1,
|
||||
"created_at": "2024-01-01 10:00:00"
|
||||
}
|
||||
],
|
||||
"total": 5,
|
||||
"page": 1,
|
||||
"page_size": 20
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5.2 创建角色
|
||||
**接口地址**: `POST /admin/roles`
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"name": "内容管理员", // 角色名称,必填,2-50位
|
||||
"code": "content_admin", // 角色编码,必填,2-50位,唯一
|
||||
"level": 3, // 角色等级,1-10
|
||||
"description": "负责内容管理", // 角色描述
|
||||
"sort": 10, // 排序
|
||||
"status": 1 // 状态:0禁用,1启用
|
||||
}
|
||||
```
|
||||
|
||||
### 5.3 为角色分配权限
|
||||
**接口地址**: `POST /admin/roles/{id}/permissions`
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"permission_ids": [1, 2, 3, 4, 5] // 权限ID数组
|
||||
}
|
||||
```
|
||||
|
||||
### 5.4 获取权限列表
|
||||
**接口地址**: `GET /admin/permissions`
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"list": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "用户管理",
|
||||
"code": "user:manage",
|
||||
"type": 1,
|
||||
"parent_id": 0,
|
||||
"path": "/admin/users",
|
||||
"method": "GET",
|
||||
"icon": "user",
|
||||
"sort": 1,
|
||||
"status": 1,
|
||||
"children": [
|
||||
{
|
||||
"id": 2,
|
||||
"name": "用户列表",
|
||||
"code": "user:list",
|
||||
"type": 2,
|
||||
"parent_id": 1,
|
||||
"path": "/admin/users",
|
||||
"method": "GET"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 6. 分类管理模块
|
||||
|
||||
### 6.1 获取分类列表
|
||||
**接口地址**: `GET /categories`
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"list": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "动作片",
|
||||
"parent_id": 0,
|
||||
"sort": 1,
|
||||
"status": 1,
|
||||
"children": [
|
||||
{
|
||||
"id": 2,
|
||||
"name": "科幻动作",
|
||||
"parent_id": 1,
|
||||
"sort": 1,
|
||||
"status": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 6.2 创建分类
|
||||
**接口地址**: `POST /admin/categories`
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"name": "新分类", // 分类名称,必填
|
||||
"parent_id": 0, // 父分类ID,0为顶级分类
|
||||
"sort": 1, // 排序
|
||||
"status": 1 // 状态:0禁用,1启用
|
||||
}
|
||||
```
|
||||
|
||||
## 7. 剧集管理模块
|
||||
|
||||
### 7.1 获取剧集列表
|
||||
**接口地址**: `GET /admin/movies/{movie_id}/episodes`
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"list": [
|
||||
{
|
||||
"id": 1,
|
||||
"movie_id": 1,
|
||||
"episode_number": 1,
|
||||
"title": "第1集",
|
||||
"duration": 45,
|
||||
"video_url": "https://example.com/video1.mp4",
|
||||
"status": 1,
|
||||
"created_at": "2024-01-01 12:00:00"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 7.2 创建剧集
|
||||
**接口地址**: `POST /admin/movies/{movie_id}/episodes`
|
||||
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"episode_number": 1, // 集数,必填
|
||||
"title": "第1集", // 标题,必填
|
||||
"duration": 45, // 时长(分钟),必填
|
||||
"video_url": "video1.mp4", // 视频文件,必填
|
||||
"status": 1 // 状态:0禁用,1启用
|
||||
}
|
||||
```
|
||||
|
||||
## 8. 统计分析模块
|
||||
|
||||
### 8.1 获取系统统计
|
||||
**接口地址**: `GET /admin/stats`
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"users": {
|
||||
"total": 10000,
|
||||
"today_new": 50,
|
||||
"active": 5000,
|
||||
"vip": 1000
|
||||
},
|
||||
"movies": {
|
||||
"total": 500,
|
||||
"today_new": 5,
|
||||
"hot": 100
|
||||
},
|
||||
"views": {
|
||||
"total": 1000000,
|
||||
"today": 10000
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 9. 文件上传模块
|
||||
|
||||
### 9.1 上传文件
|
||||
**接口地址**: `POST /upload`
|
||||
|
||||
**请求方式**: `multipart/form-data`
|
||||
|
||||
**请求参数**:
|
||||
- `file`: 文件,必填
|
||||
- `type`: 文件类型,可选(image/video/document)
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "上传成功",
|
||||
"data": {
|
||||
"url": "https://example.com/uploads/2024/01/01/file.jpg",
|
||||
"filename": "file.jpg",
|
||||
"size": 1024000,
|
||||
"type": "image/jpeg"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 10. 搜索模块
|
||||
|
||||
### 10.1 全局搜索
|
||||
**接口地址**: `GET /search`
|
||||
|
||||
**请求参数**:
|
||||
| 参数名 | 类型 | 必填 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| keyword | string | 是 | 搜索关键词 |
|
||||
| type | string | 否 | 搜索类型:movie/user/all |
|
||||
| page | int | 否 | 页码,默认1 |
|
||||
| page_size | int | 否 | 每页数量,默认20 |
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "搜索成功",
|
||||
"data": {
|
||||
"movies": [
|
||||
{
|
||||
"id": 1,
|
||||
"title": "复仇者联盟",
|
||||
"cover": "https://example.com/cover.jpg",
|
||||
"rating": 8.5,
|
||||
"year": 2012
|
||||
}
|
||||
],
|
||||
"total": 10,
|
||||
"page": 1,
|
||||
"page_size": 20
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 11. 接口测试说明
|
||||
|
||||
### 11.1 测试环境
|
||||
- 服务器地址: `http://localhost:8000`
|
||||
- 测试工具: Postman、ApiPost、VS Code REST Client
|
||||
|
||||
### 11.2 测试流程
|
||||
1. 启动服务器: `go run main.go`
|
||||
2. 初始化数据库: `go run main.go init-db`
|
||||
3. 管理员登录获取Token
|
||||
4. 使用Token测试其他接口
|
||||
|
||||
### 11.3 测试用例
|
||||
项目提供了完整的HTTP测试文件:
|
||||
- `test_movie_api.http` - 影片管理接口测试
|
||||
- `test_user_api.http` - 用户管理接口测试
|
||||
- `test_permission_api.http` - 权限管理接口测试
|
||||
|
||||
## 12. 错误处理
|
||||
|
||||
### 12.1 常见错误
|
||||
| 错误码 | HTTP状态码 | 错误信息 | 解决方案 |
|
||||
|--------|------------|----------|----------|
|
||||
| 1001 | 400 | 参数错误 | 检查请求参数格式和必填项 |
|
||||
| 1003 | 401 | 认证失败 | 检查Token是否有效 |
|
||||
| 1004 | 403 | 权限不足 | 检查用户权限 |
|
||||
| 1005 | 404 | 资源不存在 | 检查资源ID是否正确 |
|
||||
| 1006 | 409 | 资源已存在 | 检查唯一性约束 |
|
||||
|
||||
### 12.2 调试建议
|
||||
1. 检查请求URL和方法是否正确
|
||||
2. 确认请求头包含正确的Token
|
||||
3. 验证请求参数格式和类型
|
||||
4. 查看服务器日志获取详细错误信息
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0.0
|
||||
**最后更新**: 2024-01-01
|
||||
**维护者**: nl-video-api开发团队
|
||||
282
docs/error-codes.md
Normal file
282
docs/error-codes.md
Normal file
@@ -0,0 +1,282 @@
|
||||
# nl-video-api 错误码定义文档
|
||||
|
||||
## 1. 错误码规范
|
||||
|
||||
### 1.1 错误码格式
|
||||
- 错误码采用4位数字格式
|
||||
- 第1位表示错误类型:1-业务错误,2-系统错误,3-第三方错误
|
||||
- 第2-4位表示具体错误编号
|
||||
|
||||
### 1.2 响应格式
|
||||
```json
|
||||
{
|
||||
"code": 1001,
|
||||
"message": "参数错误:用户名不能为空",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
## 2. 通用错误码 (1000-1099)
|
||||
|
||||
| 错误码 | 错误信息 | 说明 | HTTP状态码 |
|
||||
|--------|----------|------|------------|
|
||||
| 0 | 成功 | 请求成功 | 200 |
|
||||
| 1001 | 参数错误 | 请求参数格式错误或缺少必填参数 | 400 |
|
||||
| 1002 | 业务逻辑错误 | 业务规则验证失败 | 400 |
|
||||
| 1003 | 认证失败 | Token无效或已过期 | 401 |
|
||||
| 1004 | 权限不足 | 用户没有访问该资源的权限 | 403 |
|
||||
| 1005 | 资源不存在 | 请求的资源不存在 | 404 |
|
||||
| 1006 | 资源已存在 | 创建的资源已存在(违反唯一性约束) | 409 |
|
||||
| 1007 | 服务器内部错误 | 系统内部错误 | 500 |
|
||||
| 1008 | 请求方法不允许 | HTTP方法不被允许 | 405 |
|
||||
| 1009 | 请求频率过高 | 请求过于频繁,触发限流 | 429 |
|
||||
| 1010 | 文件上传失败 | 文件上传过程中出现错误 | 400 |
|
||||
|
||||
## 3. 认证模块错误码 (1100-1199)
|
||||
|
||||
| 错误码 | 错误信息 | 说明 |
|
||||
|--------|----------|------|
|
||||
| 1101 | 用户名或密码错误 | 登录凭证不正确 |
|
||||
| 1102 | 账户已被禁用 | 用户账户状态为禁用 |
|
||||
| 1103 | 账户已被锁定 | 用户账户被临时锁定 |
|
||||
| 1104 | Token已过期 | JWT Token已过期,需要重新登录 |
|
||||
| 1105 | Token格式错误 | JWT Token格式不正确 |
|
||||
| 1106 | 用户名已存在 | 注册时用户名已被使用 |
|
||||
| 1107 | 邮箱已存在 | 注册时邮箱已被使用 |
|
||||
| 1108 | 手机号已存在 | 注册时手机号已被使用 |
|
||||
| 1109 | 验证码错误 | 短信或邮箱验证码不正确 |
|
||||
| 1110 | 验证码已过期 | 验证码超过有效期 |
|
||||
| 1111 | 原密码错误 | 修改密码时原密码不正确 |
|
||||
| 1112 | 新密码不能与原密码相同 | 密码修改规则限制 |
|
||||
|
||||
## 4. 用户管理模块错误码 (1200-1299)
|
||||
|
||||
| 错误码 | 错误信息 | 说明 |
|
||||
|--------|----------|------|
|
||||
| 1201 | 用户不存在 | 指定的用户ID不存在 |
|
||||
| 1202 | 用户名格式错误 | 用户名长度或格式不符合要求 |
|
||||
| 1203 | 手机号格式错误 | 手机号格式不正确 |
|
||||
| 1204 | 邮箱格式错误 | 邮箱格式不正确 |
|
||||
| 1205 | 密码格式错误 | 密码长度或复杂度不符合要求 |
|
||||
| 1206 | 昵称格式错误 | 昵称长度不符合要求 |
|
||||
| 1207 | 性别参数错误 | 性别参数值不在允许范围内 |
|
||||
| 1208 | VIP等级参数错误 | VIP等级不在允许范围内 |
|
||||
| 1209 | 用户状态参数错误 | 用户状态参数值不正确 |
|
||||
| 1210 | 余额不足 | 用户账户余额不足 |
|
||||
| 1211 | 积分不足 | 用户积分不足 |
|
||||
| 1212 | VIP已过期 | 用户VIP会员已过期 |
|
||||
| 1213 | 不能删除系统用户 | 系统预设用户不允许删除 |
|
||||
| 1214 | 批量操作用户数量超限 | 批量操作的用户数量超过限制 |
|
||||
|
||||
## 5. 影片管理模块错误码 (1300-1399)
|
||||
|
||||
| 错误码 | 错误信息 | 说明 |
|
||||
|--------|----------|------|
|
||||
| 1301 | 影片不存在 | 指定的影片ID不存在 |
|
||||
| 1302 | 影片标题不能为空 | 影片标题为必填项 |
|
||||
| 1303 | 影片类型错误 | 影片类型参数不正确 |
|
||||
| 1304 | 分类不存在 | 指定的分类ID不存在 |
|
||||
| 1305 | 年份格式错误 | 年份参数格式不正确 |
|
||||
| 1306 | 国家地区不能为空 | 国家地区为必填项 |
|
||||
| 1307 | 时长参数错误 | 影片时长参数不正确 |
|
||||
| 1308 | 总集数参数错误 | 电视剧总集数参数不正确 |
|
||||
| 1309 | 影片状态参数错误 | 影片状态参数不正确 |
|
||||
| 1310 | 封面图片格式错误 | 封面图片格式不支持 |
|
||||
| 1311 | 视频文件格式错误 | 视频文件格式不支持 |
|
||||
| 1312 | 影片已存在 | 相同标题和年份的影片已存在 |
|
||||
| 1313 | 不能删除有剧集的影片 | 存在剧集的影片不允许删除 |
|
||||
| 1314 | 评分参数错误 | 评分必须在0-10之间 |
|
||||
|
||||
## 6. 剧集管理模块错误码 (1400-1499)
|
||||
|
||||
| 错误码 | 错误信息 | 说明 |
|
||||
|--------|----------|------|
|
||||
| 1401 | 剧集不存在 | 指定的剧集ID不存在 |
|
||||
| 1402 | 集数参数错误 | 集数必须为正整数 |
|
||||
| 1403 | 剧集标题不能为空 | 剧集标题为必填项 |
|
||||
| 1404 | 剧集时长参数错误 | 剧集时长必须为正数 |
|
||||
| 1405 | 视频文件不能为空 | 视频文件为必填项 |
|
||||
| 1406 | 剧集状态参数错误 | 剧集状态参数不正确 |
|
||||
| 1407 | 剧集已存在 | 相同集数的剧集已存在 |
|
||||
| 1408 | 集数超出范围 | 集数不能超过影片总集数 |
|
||||
| 1409 | 视频文件不存在 | 指定的视频文件不存在 |
|
||||
| 1410 | 不能删除最后一集 | 至少需要保留一集 |
|
||||
|
||||
## 7. 权限管理模块错误码 (1500-1599)
|
||||
|
||||
| 错误码 | 错误信息 | 说明 |
|
||||
|--------|----------|------|
|
||||
| 1501 | 角色不存在 | 指定的角色ID不存在 |
|
||||
| 1502 | 角色名称不能为空 | 角色名称为必填项 |
|
||||
| 1503 | 角色编码不能为空 | 角色编码为必填项 |
|
||||
| 1504 | 角色编码已存在 | 角色编码必须唯一 |
|
||||
| 1505 | 角色等级参数错误 | 角色等级必须在1-10之间 |
|
||||
| 1506 | 不能删除系统角色 | 系统预设角色不允许删除 |
|
||||
| 1507 | 不能修改系统角色 | 系统预设角色不允许修改 |
|
||||
| 1508 | 权限不存在 | 指定的权限ID不存在 |
|
||||
| 1509 | 权限名称不能为空 | 权限名称为必填项 |
|
||||
| 1510 | 权限编码不能为空 | 权限编码为必填项 |
|
||||
| 1511 | 权限编码已存在 | 权限编码必须唯一 |
|
||||
| 1512 | 权限类型参数错误 | 权限类型参数不正确 |
|
||||
| 1513 | 父权限不存在 | 指定的父权限ID不存在 |
|
||||
| 1514 | 不能删除有子权限的权限 | 存在子权限的权限不允许删除 |
|
||||
| 1515 | 角色权限分配失败 | 角色权限关联操作失败 |
|
||||
|
||||
## 8. 分类管理模块错误码 (1600-1699)
|
||||
|
||||
| 错误码 | 错误信息 | 说明 |
|
||||
|--------|----------|------|
|
||||
| 1601 | 分类不存在 | 指定的分类ID不存在 |
|
||||
| 1602 | 分类名称不能为空 | 分类名称为必填项 |
|
||||
| 1603 | 分类名称已存在 | 同级分类名称必须唯一 |
|
||||
| 1604 | 父分类不存在 | 指定的父分类ID不存在 |
|
||||
| 1605 | 不能删除有子分类的分类 | 存在子分类的分类不允许删除 |
|
||||
| 1606 | 不能删除有影片的分类 | 存在影片的分类不允许删除 |
|
||||
| 1607 | 分类层级过深 | 分类层级不能超过3级 |
|
||||
| 1608 | 不能将分类设为自己的子分类 | 分类层级关系错误 |
|
||||
|
||||
## 9. 文件上传模块错误码 (1700-1799)
|
||||
|
||||
| 错误码 | 错误信息 | 说明 |
|
||||
|--------|----------|------|
|
||||
| 1701 | 文件不能为空 | 上传文件为必填项 |
|
||||
| 1702 | 文件格式不支持 | 文件格式不在允许范围内 |
|
||||
| 1703 | 文件大小超限 | 文件大小超过最大限制 |
|
||||
| 1704 | 文件上传失败 | 文件保存过程中出现错误 |
|
||||
| 1705 | 文件不存在 | 指定的文件不存在 |
|
||||
| 1706 | 文件已损坏 | 文件内容不完整或已损坏 |
|
||||
| 1707 | 存储空间不足 | 服务器存储空间不足 |
|
||||
| 1708 | 文件名包含非法字符 | 文件名格式不正确 |
|
||||
|
||||
## 10. 搜索模块错误码 (1800-1899)
|
||||
|
||||
| 错误码 | 错误信息 | 说明 |
|
||||
|--------|----------|------|
|
||||
| 1801 | 搜索关键词不能为空 | 搜索关键词为必填项 |
|
||||
| 1802 | 搜索关键词过短 | 搜索关键词至少2个字符 |
|
||||
| 1803 | 搜索关键词过长 | 搜索关键词不能超过50个字符 |
|
||||
| 1804 | 搜索类型参数错误 | 搜索类型参数不正确 |
|
||||
| 1805 | 搜索结果为空 | 没有找到匹配的结果 |
|
||||
| 1806 | 搜索服务不可用 | 搜索引擎服务异常 |
|
||||
|
||||
## 11. 系统错误码 (2000-2999)
|
||||
|
||||
| 错误码 | 错误信息 | 说明 |
|
||||
|--------|----------|------|
|
||||
| 2001 | 数据库连接失败 | 无法连接到数据库 |
|
||||
| 2002 | 数据库查询失败 | 数据库查询执行失败 |
|
||||
| 2003 | 数据库事务失败 | 数据库事务回滚 |
|
||||
| 2004 | Redis连接失败 | 无法连接到Redis服务 |
|
||||
| 2005 | 缓存操作失败 | Redis缓存操作失败 |
|
||||
| 2006 | 配置文件读取失败 | 系统配置文件不存在或格式错误 |
|
||||
| 2007 | 日志写入失败 | 日志文件写入失败 |
|
||||
| 2008 | 内存不足 | 系统内存不足 |
|
||||
| 2009 | 磁盘空间不足 | 系统磁盘空间不足 |
|
||||
| 2010 | 网络连接超时 | 网络请求超时 |
|
||||
|
||||
## 12. 第三方服务错误码 (3000-3999)
|
||||
|
||||
| 错误码 | 错误信息 | 说明 |
|
||||
|--------|----------|------|
|
||||
| 3001 | 短信发送失败 | 短信服务提供商返回失败 |
|
||||
| 3002 | 邮件发送失败 | 邮件服务提供商返回失败 |
|
||||
| 3003 | 支付接口调用失败 | 支付服务提供商返回失败 |
|
||||
| 3004 | 视频处理失败 | 视频转码服务失败 |
|
||||
| 3005 | 图片处理失败 | 图片处理服务失败 |
|
||||
| 3006 | CDN服务异常 | CDN服务不可用 |
|
||||
| 3007 | 第三方API限流 | 第三方服务请求频率超限 |
|
||||
| 3008 | 第三方服务维护 | 第三方服务正在维护 |
|
||||
|
||||
## 13. 错误处理最佳实践
|
||||
|
||||
### 13.1 错误信息国际化
|
||||
```go
|
||||
// 错误信息支持多语言
|
||||
var ErrorMessages = map[string]map[int]string{
|
||||
"zh-CN": {
|
||||
1001: "参数错误",
|
||||
1002: "业务逻辑错误",
|
||||
// ...
|
||||
},
|
||||
"en-US": {
|
||||
1001: "Parameter error",
|
||||
1002: "Business logic error",
|
||||
// ...
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### 13.2 错误日志记录
|
||||
```go
|
||||
// 记录详细的错误信息用于调试
|
||||
func LogError(code int, message string, err error, context map[string]interface{}) {
|
||||
log.Error().
|
||||
Int("code", code).
|
||||
Str("message", message).
|
||||
Err(err).
|
||||
Interface("context", context).
|
||||
Msg("API Error")
|
||||
}
|
||||
```
|
||||
|
||||
### 13.3 错误响应统一处理
|
||||
```go
|
||||
// 统一的错误响应处理
|
||||
func HandleError(r *ghttp.Request, code int, message string, err error) {
|
||||
// 记录错误日志
|
||||
LogError(code, message, err, map[string]interface{}{
|
||||
"url": r.URL.String(),
|
||||
"method": r.Method,
|
||||
"ip": r.GetClientIp(),
|
||||
})
|
||||
|
||||
// 返回错误响应
|
||||
response.JsonExit(r, code, message)
|
||||
}
|
||||
```
|
||||
|
||||
### 13.4 客户端错误处理建议
|
||||
```javascript
|
||||
// 前端错误处理示例
|
||||
function handleApiError(error) {
|
||||
const { code, message } = error.response.data;
|
||||
|
||||
switch (code) {
|
||||
case 1003:
|
||||
// Token过期,跳转到登录页
|
||||
router.push('/login');
|
||||
break;
|
||||
case 1004:
|
||||
// 权限不足,显示提示
|
||||
showMessage('权限不足', 'error');
|
||||
break;
|
||||
default:
|
||||
// 其他错误,显示具体错误信息
|
||||
showMessage(message, 'error');
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 14. 错误码维护规范
|
||||
|
||||
### 14.1 新增错误码规范
|
||||
1. 按模块分配错误码范围,避免冲突
|
||||
2. 错误码必须有明确的含义和说明
|
||||
3. 错误信息要简洁明了,便于用户理解
|
||||
4. 新增错误码需要更新文档和测试用例
|
||||
|
||||
### 14.2 错误码废弃流程
|
||||
1. 标记为废弃状态,但保留定义
|
||||
2. 在新版本中移除废弃的错误码
|
||||
3. 更新相关文档和代码
|
||||
|
||||
### 14.3 错误码版本管理
|
||||
- 错误码定义纳入版本控制
|
||||
- 重大变更需要版本号升级
|
||||
- 保持向后兼容性
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0.0
|
||||
**最后更新**: 2024-01-01
|
||||
**维护者**: nl-video-api开发团队
|
||||
750
docs/test-cases.md
Normal file
750
docs/test-cases.md
Normal file
@@ -0,0 +1,750 @@
|
||||
# nl-video-api 接口测试用例文档
|
||||
|
||||
## 1. 测试环境配置
|
||||
|
||||
### 1.1 环境信息
|
||||
- **测试服务器**: `http://localhost:8000`
|
||||
- **数据库**: MySQL 8.0
|
||||
- **缓存**: Redis 6.0
|
||||
- **测试工具**: Postman, ApiPost, VS Code REST Client
|
||||
|
||||
### 1.2 测试数据准备
|
||||
```sql
|
||||
-- 初始化测试数据
|
||||
INSERT INTO `admin` (`username`, `password`, `nickname`, `email`, `status`) VALUES
|
||||
('admin', '$2a$10$...', '超级管理员', 'admin@example.com', 1),
|
||||
('test_admin', '$2a$10$...', '测试管理员', 'test@example.com', 1);
|
||||
|
||||
INSERT INTO `user` (`username`, `phone`, `email`, `password`, `nickname`, `status`) VALUES
|
||||
('testuser', '13800138000', 'user@example.com', '$2a$10$...', '测试用户', 1);
|
||||
|
||||
INSERT INTO `category` (`name`, `parent_id`, `sort`, `status`) VALUES
|
||||
('动作片', 0, 1, 1),
|
||||
('科幻片', 0, 2, 1),
|
||||
('喜剧片', 0, 3, 1);
|
||||
```
|
||||
|
||||
## 2. 认证模块测试用例
|
||||
|
||||
### 2.1 管理员登录测试
|
||||
|
||||
#### 测试用例 AUTH-001: 正常登录
|
||||
**测试目的**: 验证管理员正常登录功能
|
||||
**请求方式**: POST
|
||||
**请求URL**: `/api/v1/auth/admin/login`
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"username": "admin",
|
||||
"password": "123456"
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回Token和用户信息
|
||||
|
||||
#### 测试用例 AUTH-002: 用户名错误
|
||||
**测试目的**: 验证用户名错误时的处理
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"username": "wronguser",
|
||||
"password": "123456"
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 400
|
||||
- 响应码: 1101
|
||||
- 错误信息: "用户名或密码错误"
|
||||
|
||||
#### 测试用例 AUTH-003: 密码错误
|
||||
**测试目的**: 验证密码错误时的处理
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"username": "admin",
|
||||
"password": "wrongpassword"
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 400
|
||||
- 响应码: 1101
|
||||
- 错误信息: "用户名或密码错误"
|
||||
|
||||
#### 测试用例 AUTH-004: 参数缺失
|
||||
**测试目的**: 验证必填参数缺失时的处理
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"username": "admin"
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 400
|
||||
- 响应码: 1001
|
||||
- 错误信息: "参数错误"
|
||||
|
||||
### 2.2 Token验证测试
|
||||
|
||||
#### 测试用例 AUTH-005: 有效Token
|
||||
**测试目的**: 验证有效Token的认证
|
||||
**请求方式**: GET
|
||||
**请求URL**: `/api/v1/auth/admin/info`
|
||||
**请求头**: `Authorization: Bearer {valid_token}`
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回用户信息
|
||||
|
||||
#### 测试用例 AUTH-006: 无效Token
|
||||
**测试目的**: 验证无效Token的处理
|
||||
**请求头**: `Authorization: Bearer invalid_token`
|
||||
**预期结果**:
|
||||
- 状态码: 401
|
||||
- 响应码: 1003
|
||||
- 错误信息: "认证失败"
|
||||
|
||||
#### 测试用例 AUTH-007: Token缺失
|
||||
**测试目的**: 验证Token缺失时的处理
|
||||
**请求头**: 无Authorization头
|
||||
**预期结果**:
|
||||
- 状态码: 401
|
||||
- 响应码: 1003
|
||||
- 错误信息: "认证失败"
|
||||
|
||||
## 3. 影片管理模块测试用例
|
||||
|
||||
### 3.1 影片列表测试
|
||||
|
||||
#### 测试用例 MOVIE-001: 获取影片列表
|
||||
**测试目的**: 验证影片列表查询功能
|
||||
**请求方式**: GET
|
||||
**请求URL**: `/api/v1/movies?page=1&page_size=20`
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回影片列表和分页信息
|
||||
|
||||
#### 测试用例 MOVIE-002: 按分类筛选
|
||||
**请求URL**: `/api/v1/movies?category_id=1&page=1&page_size=10`
|
||||
**预期结果**:
|
||||
- 返回指定分类的影片列表
|
||||
- 所有影片的category_id都为1
|
||||
|
||||
#### 测试用例 MOVIE-003: 按标题搜索
|
||||
**请求URL**: `/api/v1/movies?title=复仇者&page=1&page_size=10`
|
||||
**预期结果**:
|
||||
- 返回标题包含"复仇者"的影片列表
|
||||
|
||||
### 3.2 影片创建测试
|
||||
|
||||
#### 测试用例 MOVIE-004: 创建电影
|
||||
**测试目的**: 验证电影创建功能
|
||||
**请求方式**: POST
|
||||
**请求URL**: `/api/v1/admin/movies`
|
||||
**请求头**: `Authorization: Bearer {admin_token}`
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"title": "测试电影",
|
||||
"type": 1,
|
||||
"category_id": 1,
|
||||
"year": 2024,
|
||||
"country": "中国",
|
||||
"director": "测试导演",
|
||||
"actors": "演员1,演员2",
|
||||
"description": "这是一部测试电影",
|
||||
"duration": 120,
|
||||
"status": 1
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回创建的影片ID
|
||||
|
||||
#### 测试用例 MOVIE-005: 创建电视剧
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"title": "测试电视剧",
|
||||
"type": 2,
|
||||
"category_id": 1,
|
||||
"year": 2024,
|
||||
"country": "中国",
|
||||
"total_episodes": 24,
|
||||
"status": 1
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回创建的影片ID
|
||||
|
||||
#### 测试用例 MOVIE-006: 必填参数缺失
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"type": 1,
|
||||
"category_id": 1
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 400
|
||||
- 响应码: 1001
|
||||
- 错误信息: "参数错误"
|
||||
|
||||
### 3.3 影片更新测试
|
||||
|
||||
#### 测试用例 MOVIE-007: 更新影片信息
|
||||
**请求方式**: PUT
|
||||
**请求URL**: `/api/v1/admin/movies/1`
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"title": "更新后的标题",
|
||||
"description": "更新后的描述"
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 影片信息更新成功
|
||||
|
||||
#### 测试用例 MOVIE-008: 更新不存在的影片
|
||||
**请求URL**: `/api/v1/admin/movies/99999`
|
||||
**预期结果**:
|
||||
- 状态码: 404
|
||||
- 响应码: 1005
|
||||
- 错误信息: "资源不存在"
|
||||
|
||||
### 3.4 影片删除测试
|
||||
|
||||
#### 测试用例 MOVIE-009: 删除影片
|
||||
**请求方式**: DELETE
|
||||
**请求URL**: `/api/v1/admin/movies/1`
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 影片删除成功
|
||||
|
||||
## 4. 用户管理模块测试用例
|
||||
|
||||
### 4.1 用户列表测试
|
||||
|
||||
#### 测试用例 USER-001: 获取用户列表
|
||||
**请求方式**: GET
|
||||
**请求URL**: `/api/v1/admin/users?page=1&page_size=20`
|
||||
**请求头**: `Authorization: Bearer {admin_token}`
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回用户列表和分页信息
|
||||
|
||||
#### 测试用例 USER-002: 按用户名搜索
|
||||
**请求URL**: `/api/v1/admin/users?username=test&page=1&page_size=10`
|
||||
**预期结果**:
|
||||
- 返回用户名包含"test"的用户列表
|
||||
|
||||
### 4.2 用户创建测试
|
||||
|
||||
#### 测试用例 USER-003: 创建用户
|
||||
**请求方式**: POST
|
||||
**请求URL**: `/api/v1/admin/users`
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"username": "newuser",
|
||||
"phone": "13800138001",
|
||||
"email": "newuser@example.com",
|
||||
"password": "123456",
|
||||
"nickname": "新用户",
|
||||
"gender": 1,
|
||||
"status": 1
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回创建的用户ID
|
||||
|
||||
#### 测试用例 USER-004: 用户名重复
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"username": "testuser",
|
||||
"phone": "13800138002",
|
||||
"email": "test2@example.com",
|
||||
"password": "123456",
|
||||
"nickname": "重复用户"
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 409
|
||||
- 响应码: 1006
|
||||
- 错误信息: "资源已存在"
|
||||
|
||||
### 4.3 VIP管理测试
|
||||
|
||||
#### 测试用例 USER-005: 升级VIP
|
||||
**请求方式**: POST
|
||||
**请求URL**: `/api/v1/admin/users/1/vip`
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"vip_level": 3,
|
||||
"days": 30
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 用户VIP等级和到期时间更新
|
||||
|
||||
### 4.4 余额管理测试
|
||||
|
||||
#### 测试用例 USER-006: 更新余额
|
||||
**请求方式**: PUT
|
||||
**请求URL**: `/api/v1/admin/users/1/balance`
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"amount": 100.50,
|
||||
"type": 1,
|
||||
"remark": "测试充值"
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 用户余额增加100.50
|
||||
|
||||
## 5. 权限管理模块测试用例
|
||||
|
||||
### 5.1 角色管理测试
|
||||
|
||||
#### 测试用例 ROLE-001: 获取角色列表
|
||||
**测试目的**: 验证角色列表查询功能
|
||||
**请求方式**: GET
|
||||
**请求URL**: `/api/v1/admin/roles?page=1&page_size=20`
|
||||
**请求头**: `Authorization: Bearer {admin_token}`
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回角色列表和分页信息
|
||||
|
||||
#### 测试用例 ROLE-002: 创建角色
|
||||
**请求方式**: POST
|
||||
**请求URL**: `/api/v1/admin/roles`
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"name": "内容管理员",
|
||||
"code": "content_admin",
|
||||
"level": 3,
|
||||
"description": "负责内容管理",
|
||||
"sort": 10,
|
||||
"status": 1
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回创建的角色ID
|
||||
|
||||
#### 测试用例 ROLE-003: 角色编码重复
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"name": "重复角色",
|
||||
"code": "super_admin",
|
||||
"level": 2
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 409
|
||||
- 响应码: 1504
|
||||
- 错误信息: "角色编码已存在"
|
||||
|
||||
### 5.2 权限分配测试
|
||||
|
||||
#### 测试用例 ROLE-004: 为角色分配权限
|
||||
**请求方式**: POST
|
||||
**请求URL**: `/api/v1/admin/roles/1/permissions`
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"permission_ids": [1, 2, 3, 4, 5]
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 权限分配成功
|
||||
|
||||
#### 测试用例 ROLE-005: 获取角色权限
|
||||
**请求方式**: GET
|
||||
**请求URL**: `/api/v1/admin/roles/1/permissions`
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回角色的权限列表
|
||||
|
||||
### 5.3 权限管理测试
|
||||
|
||||
#### 测试用例 PERM-001: 获取权限树
|
||||
**请求方式**: GET
|
||||
**请求URL**: `/api/v1/admin/permissions/tree`
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回树形结构的权限列表
|
||||
|
||||
#### 测试用例 PERM-002: 创建权限
|
||||
**请求方式**: POST
|
||||
**请求URL**: `/api/v1/admin/permissions`
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"name": "新权限",
|
||||
"code": "new:permission",
|
||||
"type": 2,
|
||||
"parent_id": 1,
|
||||
"path": "/admin/new",
|
||||
"method": "GET",
|
||||
"sort": 1,
|
||||
"status": 1
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回创建的权限ID
|
||||
|
||||
## 6. 分类管理模块测试用例
|
||||
|
||||
### 6.1 分类列表测试
|
||||
|
||||
#### 测试用例 CATEGORY-001: 获取分类列表
|
||||
**请求方式**: GET
|
||||
**请求URL**: `/api/v1/categories`
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回分类树形列表
|
||||
|
||||
#### 测试用例 CATEGORY-002: 创建分类
|
||||
**请求方式**: POST
|
||||
**请求URL**: `/api/v1/admin/categories`
|
||||
**请求头**: `Authorization: Bearer {admin_token}`
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"name": "新分类",
|
||||
"parent_id": 0,
|
||||
"sort": 1,
|
||||
"status": 1
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回创建的分类ID
|
||||
|
||||
## 7. 剧集管理模块测试用例
|
||||
|
||||
### 7.1 剧集列表测试
|
||||
|
||||
#### 测试用例 EPISODE-001: 获取剧集列表
|
||||
**请求方式**: GET
|
||||
**请求URL**: `/api/v1/admin/movies/1/episodes`
|
||||
**请求头**: `Authorization: Bearer {admin_token}`
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回指定影片的剧集列表
|
||||
|
||||
#### 测试用例 EPISODE-002: 创建剧集
|
||||
**请求方式**: POST
|
||||
**请求URL**: `/api/v1/admin/movies/1/episodes`
|
||||
**请求参数**:
|
||||
```json
|
||||
{
|
||||
"episode_number": 1,
|
||||
"title": "第1集",
|
||||
"duration": 45,
|
||||
"video_url": "episode1.mp4",
|
||||
"status": 1
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回创建的剧集ID
|
||||
|
||||
## 8. 文件上传模块测试用例
|
||||
|
||||
### 8.1 文件上传测试
|
||||
|
||||
#### 测试用例 UPLOAD-001: 上传图片
|
||||
**请求方式**: POST
|
||||
**请求URL**: `/api/v1/upload`
|
||||
**请求头**: `Authorization: Bearer {admin_token}`
|
||||
**请求参数**: multipart/form-data
|
||||
- file: 图片文件
|
||||
- type: "image"
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回文件URL和相关信息
|
||||
|
||||
#### 测试用例 UPLOAD-002: 上传视频
|
||||
**请求参数**: multipart/form-data
|
||||
- file: 视频文件
|
||||
- type: "video"
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回文件URL和相关信息
|
||||
|
||||
#### 测试用例 UPLOAD-003: 文件格式不支持
|
||||
**请求参数**: multipart/form-data
|
||||
- file: .exe文件
|
||||
**预期结果**:
|
||||
- 状态码: 400
|
||||
- 响应码: 1702
|
||||
- 错误信息: "文件格式不支持"
|
||||
|
||||
## 9. 搜索模块测试用例
|
||||
|
||||
### 9.1 全局搜索测试
|
||||
|
||||
#### 测试用例 SEARCH-001: 搜索影片
|
||||
**请求方式**: GET
|
||||
**请求URL**: `/api/v1/search?keyword=复仇者&type=movie&page=1&page_size=10`
|
||||
**预期结果**:
|
||||
- 状态码: 200
|
||||
- 响应码: 0
|
||||
- 返回匹配的影片列表
|
||||
|
||||
#### 测试用例 SEARCH-002: 搜索关键词为空
|
||||
**请求URL**: `/api/v1/search?keyword=&type=movie`
|
||||
**预期结果**:
|
||||
- 状态码: 400
|
||||
- 响应码: 1801
|
||||
- 错误信息: "搜索关键词不能为空"
|
||||
|
||||
## 10. 性能测试用例
|
||||
|
||||
### 10.1 并发测试
|
||||
|
||||
#### 测试用例 PERF-001: 登录接口并发测试
|
||||
**测试目的**: 验证登录接口在高并发下的性能
|
||||
**测试方法**: 使用JMeter或Artillery进行压力测试
|
||||
**测试参数**:
|
||||
- 并发用户数: 100
|
||||
- 持续时间: 60秒
|
||||
- 请求间隔: 1秒
|
||||
**预期结果**:
|
||||
- 响应时间 < 500ms
|
||||
- 成功率 > 99%
|
||||
- 无内存泄漏
|
||||
|
||||
#### 测试用例 PERF-002: 影片列表接口性能测试
|
||||
**测试参数**:
|
||||
- 并发用户数: 200
|
||||
- 持续时间: 120秒
|
||||
**预期结果**:
|
||||
- 响应时间 < 200ms
|
||||
- 成功率 > 99.5%
|
||||
|
||||
### 10.2 数据库性能测试
|
||||
|
||||
#### 测试用例 PERF-003: 大数据量查询测试
|
||||
**测试目的**: 验证在大数据量情况下的查询性能
|
||||
**测试数据**: 100万条影片记录
|
||||
**测试场景**:
|
||||
- 分页查询
|
||||
- 条件筛选
|
||||
- 模糊搜索
|
||||
**预期结果**:
|
||||
- 查询响应时间 < 1秒
|
||||
- 内存使用稳定
|
||||
|
||||
## 11. 安全测试用例
|
||||
|
||||
### 11.1 认证安全测试
|
||||
|
||||
#### 测试用例 SEC-001: SQL注入测试
|
||||
**测试目的**: 验证系统对SQL注入攻击的防护
|
||||
**测试方法**: 在各个输入参数中注入SQL语句
|
||||
**测试参数**:
|
||||
```json
|
||||
{
|
||||
"username": "admin'; DROP TABLE user; --",
|
||||
"password": "123456"
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 系统正常处理,不执行恶意SQL
|
||||
- 返回参数错误或认证失败
|
||||
|
||||
#### 测试用例 SEC-002: XSS攻击测试
|
||||
**测试参数**:
|
||||
```json
|
||||
{
|
||||
"title": "<script>alert('XSS')</script>",
|
||||
"description": "<img src=x onerror=alert('XSS')>"
|
||||
}
|
||||
```
|
||||
**预期结果**:
|
||||
- 恶意脚本被过滤或转义
|
||||
- 不在页面中执行
|
||||
|
||||
### 11.2 权限安全测试
|
||||
|
||||
#### 测试用例 SEC-003: 越权访问测试
|
||||
**测试目的**: 验证权限控制的有效性
|
||||
**测试方法**: 使用普通用户Token访问管理员接口
|
||||
**请求URL**: `/api/v1/admin/users`
|
||||
**请求头**: `Authorization: Bearer {user_token}`
|
||||
**预期结果**:
|
||||
- 状态码: 403
|
||||
- 响应码: 1004
|
||||
- 错误信息: "权限不足"
|
||||
|
||||
## 12. 兼容性测试用例
|
||||
|
||||
### 12.1 浏览器兼容性测试
|
||||
|
||||
#### 测试用例 COMPAT-001: 不同浏览器测试
|
||||
**测试目的**: 验证API在不同浏览器中的兼容性
|
||||
**测试浏览器**:
|
||||
- Chrome (最新版本)
|
||||
- Firefox (最新版本)
|
||||
- Safari (最新版本)
|
||||
- Edge (最新版本)
|
||||
**预期结果**:
|
||||
- 所有浏览器都能正常调用API
|
||||
- 响应格式一致
|
||||
|
||||
### 12.2 移动端兼容性测试
|
||||
|
||||
#### 测试用例 COMPAT-002: 移动端API测试
|
||||
**测试设备**:
|
||||
- iOS Safari
|
||||
- Android Chrome
|
||||
- 微信内置浏览器
|
||||
**预期结果**:
|
||||
- API调用正常
|
||||
- 响应时间合理
|
||||
|
||||
## 13. 自动化测试脚本
|
||||
|
||||
### 13.1 测试脚本示例
|
||||
|
||||
#### PowerShell测试脚本
|
||||
```powershell
|
||||
# test_api.ps1
|
||||
$baseUrl = "http://localhost:8000/api/v1"
|
||||
$adminToken = ""
|
||||
|
||||
# 登录获取Token
|
||||
function Get-AdminToken {
|
||||
$loginData = @{
|
||||
username = "admin"
|
||||
password = "123456"
|
||||
} | ConvertTo-Json
|
||||
|
||||
$response = Invoke-RestMethod -Uri "$baseUrl/auth/admin/login" -Method POST -Body $loginData -ContentType "application/json"
|
||||
return $response.data.token
|
||||
}
|
||||
|
||||
# 测试影片列表
|
||||
function Test-MovieList {
|
||||
param($token)
|
||||
$headers = @{ Authorization = "Bearer $token" }
|
||||
$response = Invoke-RestMethod -Uri "$baseUrl/movies" -Method GET -Headers $headers
|
||||
Write-Host "影片列表测试: $($response.code -eq 0 ? 'PASS' : 'FAIL')"
|
||||
}
|
||||
|
||||
# 执行测试
|
||||
$adminToken = Get-AdminToken
|
||||
Test-MovieList -token $adminToken
|
||||
```
|
||||
|
||||
### 13.2 持续集成测试
|
||||
|
||||
#### GitHub Actions配置
|
||||
```yaml
|
||||
name: API Tests
|
||||
on: [push, pull_request]
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup Go
|
||||
uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: 1.19
|
||||
- name: Start Services
|
||||
run: |
|
||||
docker-compose up -d mysql redis
|
||||
sleep 30
|
||||
- name: Run Tests
|
||||
run: |
|
||||
go test ./...
|
||||
./test_api.sh
|
||||
```
|
||||
|
||||
## 14. 测试报告模板
|
||||
|
||||
### 14.1 测试执行报告
|
||||
|
||||
#### 测试概要
|
||||
- **测试版本**: v1.0.0
|
||||
- **测试环境**: 测试环境
|
||||
- **测试时间**: 2024-01-01 ~ 2024-01-07
|
||||
- **测试人员**: 测试团队
|
||||
|
||||
#### 测试结果统计
|
||||
| 模块 | 总用例数 | 通过数 | 失败数 | 通过率 |
|
||||
|------|----------|--------|--------|--------|
|
||||
| 认证模块 | 10 | 10 | 0 | 100% |
|
||||
| 影片管理 | 15 | 14 | 1 | 93.3% |
|
||||
| 用户管理 | 12 | 12 | 0 | 100% |
|
||||
| 权限管理 | 8 | 8 | 0 | 100% |
|
||||
| **总计** | **45** | **44** | **1** | **97.8%** |
|
||||
|
||||
#### 缺陷统计
|
||||
| 严重程度 | 数量 | 状态 |
|
||||
|----------|------|------|
|
||||
| 严重 | 0 | - |
|
||||
| 一般 | 1 | 已修复 |
|
||||
| 轻微 | 0 | - |
|
||||
|
||||
#### 性能测试结果
|
||||
- **平均响应时间**: 150ms
|
||||
- **最大并发数**: 500
|
||||
- **系统稳定性**: 良好
|
||||
|
||||
### 14.2 测试建议
|
||||
|
||||
#### 改进建议
|
||||
1. 增加更多的边界值测试用例
|
||||
2. 完善异常场景的测试覆盖
|
||||
3. 加强性能测试的监控指标
|
||||
4. 建立自动化回归测试流程
|
||||
|
||||
#### 风险评估
|
||||
- **高风险**: 无
|
||||
- **中风险**: 大数据量查询性能需要持续关注
|
||||
- **低风险**: 部分边界场景处理可以优化
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v1.0.0
|
||||
**最后更新**: 2024-01-01
|
||||
**维护者**: nl-video-api测试团队
|
||||
Reference in New Issue
Block a user