基于 Go + Gin 框架开发的黄梅戏作品管理系统,支持用户注册、登录、作品上传、点赞、收藏、评论等功能。
go mod tidy
创建配置文件或设置环境变量,包括:
go build -o hmx main.go
./hmx
Base URL: http://localhost:15379/api/v1
发送邮箱验证码用于注册。
接口: POST /auth/send-code
请求体:
{
"email": "user@example.com"
}
成功响应 (200):
{
"message": "Verification code sent (check logs)."
}
使用邮箱验证码注册新用户。
接口: POST /auth/register
请求体:
{
"username": "张三",
"phone": "13800138000",
"email": "user@example.com",
"password": "password123",
"code": "123456"
}
成功响应 (201):
{
"message": "Registration successful"
}
错误响应:
400: 验证码错误或已过期409: 邮箱或手机号已被注册使用邮箱和密码登录,返回 JWT Token。
接口: POST /auth/login
请求体:
{
"email": "user@example.com",
"password": "password123"
}
成功响应 (200):
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
错误响应:
401: 邮箱或密码错误使用邮箱和验证码重置密码。
接口: POST /auth/forget
请求体:
{
"email": "email@example.com",
"code": "123456",
"new_password": "new_password"
}
成功响应 (200):
{
"code": 200,
"msg": "success",
"data": {
"message": "Password reset successful"
}
}
以下接口需要在请求头中携带 JWT Token:
Authorization: Bearer <your_jwt_token>
获取当前登录用户的详细信息。
接口: GET /users/me
成功响应 (200):
{
"user_id": 1,
"username": "张三",
"phone": "13800138000",
"email": "user@example.com",
"sex": "Other",
"icon": "https://s3.amazonaws.com/bucket/avatars/user1.jpg",
"role": "User",
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-01-01T00:00:00Z"
}
获取当前用户点赞的所有作品。
接口: GET /users/me/likes
查询参数:
page (int, 可选): 页码,默认 1page_size (int, 可选): 每页数量,默认 10成功响应 (200):
{
"list": [
{
"opera_id": 1,
"opera_title": "天仙配",
"release_date": "2025-01-01",
"duration": "02:30:00",
"music_path": "https://s3.amazonaws.com/bucket/music/opera1.mp3",
"video_path": "https://s3.amazonaws.com/bucket/videos/opera1.mp4",
"description": "经典黄梅戏作品",
"avatar": "https://s3.amazonaws.com/bucket/avatars/opera1.jpg",
"ai_summary": "这是一部...",
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-01-01T00:00:00Z"
}
],
"pagination": {
"total": 25,
"page": 1,
"page_size": 10
}
}
获取当前用户收藏的所有作品。
接口: GET /users/me/favorites
查询参数:
page (int, 可选): 页码,默认 1page_size (int, 可选): 每页数量,默认 10响应格式: 同"获取用户点赞的作品列表"
获取 S3 预签名上传 URL,用于客户端直接上传文件到 S3。
接口: POST /uploads/presign
请求头: 需要 JWT Token
请求体:
{
"filename": "my_video.mp4",
"content_type": "video/mp4",
"upload_type": "videos"
}
upload_type 可选值:
videos: 视频文件avatars: 头像/封面图片成功响应 (200):
{
"upload_url": "https://s3.amazonaws.com/bucket/videos/uuid-my_video.mp4?X-Amz-...",
"object_key": "videos/uuid-my_video.mp4"
}
使用方式:
upload_url 和 object_keyupload_url 直接 PUT 上传文件到 S3object_key 创建作品获取所有已发布的作品列表,支持分页。
接口: GET /operas/
查询参数:
page (int, 可选): 页码,默认 1page_size (int, 可选): 每页数量,默认 10成功响应 (200):
{
"list": [
{
"opera_id": 1,
"opera_title": "天仙配",
"release_date": "2025-01-01",
"duration": "02:30:00",
"music_path": "https://s3.amazonaws.com/bucket/music/opera1.mp3",
"video_path": "https://s3.amazonaws.com/bucket/videos/opera1.mp4",
"description": "经典黄梅戏作品",
"avatar": "https://s3.amazonaws.com/bucket/avatars/opera1.jpg",
"ai_summary": "这是一部...",
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-01-01T00:00:00Z"
}
],
"pagination": {
"total": 100,
"page": 1,
"page_size": 10
}
}
根据作品 ID 获取作品详细信息。
接口: GET /operas/:id
路径参数:
id (int): 作品 ID成功响应 (200):
{
"opera_id": 1,
"opera_title": "天仙配",
"release_date": "2025-01-01",
"duration": "02:30:00",
"music_path": "https://s3.amazonaws.com/bucket/music/opera1.mp3",
"video_path": "https://s3.amazonaws.com/bucket/videos/opera1.mp4",
"description": "经典黄梅戏作品",
"avatar": "https://s3.amazonaws.com/bucket/avatars/opera1.jpg",
"ai_summary": "这是一部...",
"created_at": "2025-01-01T00:00:00Z",
"updated_at": "2025-01-01T00:00:00Z"
}
错误响应:
404: 作品不存在用户上传新作品(需要先通过预签名上传文件)。
接口: POST /operas/
请求头: 需要 JWT Token
请求体:
{
"title": "女驸马",
"description": "黄梅戏经典剧目",
"video_path": "videos/uuid-video.mp4",
"avatar_path": "avatars/uuid-cover.jpg",
"artist_ids": [1, 2, 3]
}
字段说明:
video_path: 必填,从预签名接口获取的 object_keyavatar_path: 可选,作品封面图的 object_keyartist_ids: 可选,关联的艺术家 ID 数组成功响应 (201):
{
"message": "Opera created successfully",
"opera_id": 123
}
对指定作品进行点赞或取消点赞。
接口: POST /operas/:id/like
请求头: 需要 JWT Token
路径参数:
id (int): 作品 ID成功响应 (200):
{
"message": "Liked"
}
或
{
"message": "Unliked"
}
对指定作品进行收藏或取消收藏。
接口: POST /operas/:id/favorite
请求头: 需要 JWT Token
路径参数:
id (int): 作品 ID成功响应 (200):
{
"message": "Favorited"
}
或
{
"message": "Unfavorited"
}
对指定作品发表评论。
接口: POST /operas/:id/comments
请求头: 需要 JWT Token
路径参数:
id (int): 作品 ID请求体:
{
"content": "这部作品太精彩了!",
"parent_id": 0
}
字段说明:
content: 必填,评论内容parent_id: 可选,如果是回复某条评论,填写父评论 ID;顶级评论填 0 或不填成功响应 (201):
{
"message": "Comment created successfully",
"comment_id": 456
}
删除指定的评论(仅评论作者或管理员可删除)。
接口: DELETE /comments/:id
请求头: 需要 JWT Token
路径参数:
id (int): 评论 ID成功响应 (200):
{
"message": "Comment deleted successfully"
}
错误响应:
403: 无权删除此评论404: 评论不存在以下接口需要管理员权限(role = "Administrator")。
管理员删除指定作品。
接口: DELETE /admin/operas/:id
请求头: 需要 JWT Token (管理员)
路径参数:
id (int): 作品 ID成功响应 (200):
{
"message": "Opera deleted successfully"
}
错误响应:
403: 无管理员权限404: 作品不存在| 状态码 | 说明 |
|---|---|
| 200 | 请求成功 |
| 201 | 创建成功 |
| 400 | 请求参数错误 |
| 401 | 未授权(未登录或 Token 无效) |
| 403 | 禁止访问(权限不足) |
| 404 | 资源不存在 |
| 409 | 资源冲突(如邮箱已注册) |
| 500 | 服务器内部错误 |
Authorization: Bearer <your_jwt_token>
User): 可以上传作品、点赞、收藏、评论Administrator): 拥有所有权限,可以删除任何作品和评论客户端请求预签名 URL:
POST /api/v1/uploads/presign { "filename": "video.mp4", "content_type": "video/mp4", "upload_type": "videos" }
服务器返回上传信息:
{
"upload_url": "https://s3.amazonaws.com/...",
"object_key": "videos/uuid-video.mp4"
}
客户端直接上传到 S3:
curl -X PUT "<upload_url>" \
-H "Content-Type: video/mp4" \
--data-binary @video.mp4
上传成功后创建作品:
POST /api/v1/operas/ { "title": "作品标题", "video_path": "videos/uuid-video.mp4", "description": "..." }