初始化v1

This commit is contained in:
2025-08-03 00:11:15 +08:00
commit b88c8b8afa
171 changed files with 22353 additions and 0 deletions

647
docs/api-documentation.md Normal file
View 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未知12 |
| 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, // 父分类ID0为顶级分类
"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`
- 测试工具: PostmanApiPostVS 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
View 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
View 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测试团队