Files
backend/.qoder/repowiki/zh/content/API参考/API参考.md
lan a4b6c5011e
Some checks failed
SonarQube Analysis / sonarqube (push) Has been cancelled
chore(git): 更新.gitignore以忽略新的本地文件
2025-11-30 08:33:17 +08:00

452 lines
19 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.

# API参考
<cite>
**本文引用的文件**
- [routes.go](file://internal/handler/routes.go)
- [swagger.go](file://internal/handler/swagger.go)
- [auth_handler.go](file://internal/handler/auth_handler.go)
- [user_handler.go](file://internal/handler/user_handler.go)
- [texture_handler.go](file://internal/handler/texture_handler.go)
- [profile_handler.go](file://internal/handler/profile_handler.go)
- [captcha_handler.go](file://internal/handler/captcha_handler.go)
- [yggdrasil_handler.go](file://internal/handler/yggdrasil_handler.go)
- [auth.go](file://internal/middleware/auth.go)
- [response.go](file://internal/model/response.go)
- [common.go](file://internal/types/common.go)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本API参考面向CarrotSkin后端服务覆盖认证、用户、材质、档案、验证码、Yggdrasil与系统配置等API组。文档基于routes.go与swagger.go中的路由与注释结合各处理器文件的注释与类型定义提供
- 端点清单与HTTP方法、URL模式
- 请求/响应模式与鉴权要求JWT
- 错误码与常见错误场景
- 参数校验规则与示例
- 性能优化建议与最佳实践
## 项目结构
- 路由注册集中在路由文件,按版本分组与鉴权中间件组合
- Swagger文档与健康检查在统一入口启用
- 各功能模块处理器文件通过注释提供OpenAPI规范
- 中间件负责JWT鉴权与可选鉴权
- 响应模型与类型定义集中于model与types目录
```mermaid
graph TB
A["Gin引擎"] --> B["Swagger文档<br/>/swagger/*any"]
A --> C["健康检查<br/>/health"]
A --> D["API v1 组<br/>/api/v1"]
D --> E["认证组<br/>/api/v1/auth/*"]
D --> F["用户组<br/>/api/v1/user/*"]
D --> G["材质组<br/>/api/v1/texture/*"]
D --> H["档案组<br/>/api/v1/profile/*"]
D --> I["验证码组<br/>/api/v1/captcha/*"]
D --> J["Yggdrasil组<br/>/api/v1/yggdrasil/*"]
D --> K["系统组<br/>/api/v1/system/*"]
```
图表来源
- [routes.go](file://internal/handler/routes.go#L10-L118)
- [swagger.go](file://internal/handler/swagger.go#L41-L63)
章节来源
- [routes.go](file://internal/handler/routes.go#L10-L118)
- [swagger.go](file://internal/handler/swagger.go#L41-L63)
## 核心组件
- 路由注册器:按版本分组,按需挂载鉴权中间件
- Swagger提供交互式文档与健康检查
- 鉴权中间件统一从Authorization头解析Bearer Token并注入用户上下文
- 响应模型:统一的响应结构与分页结构
- 类型定义:请求/响应结构体与约束规则
章节来源
- [routes.go](file://internal/handler/routes.go#L10-L118)
- [swagger.go](file://internal/handler/swagger.go#L41-L63)
- [auth.go](file://internal/middleware/auth.go#L12-L56)
- [response.go](file://internal/model/response.go#L1-L86)
- [common.go](file://internal/types/common.go#L1-L215)
## 架构总览
下图展示API调用链与鉴权流程
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Router as "Gin路由"
participant MW as "鉴权中间件"
participant Handler as "处理器"
participant Service as "服务层"
participant DB as "数据库/缓存"
Client->>Router : "HTTP请求"
Router->>MW : "匹配路由并执行中间件"
MW->>MW : "解析Authorization头"
MW->>MW : "校验JWT并注入用户上下文"
MW-->>Router : "通过或拒绝"
Router->>Handler : "转发到对应处理器"
Handler->>Service : "调用业务逻辑"
Service->>DB : "读写数据"
DB-->>Service : "返回结果"
Service-->>Handler : "返回业务结果"
Handler-->>Client : "统一响应结构"
```
图表来源
- [auth.go](file://internal/middleware/auth.go#L12-L56)
- [routes.go](file://internal/handler/routes.go#L10-L118)
## 详细组件分析
### 认证组(/api/v1/auth
- 无需JWT
- 端点
- POST /api/v1/auth/register
- 请求体RegisterRequest
- 响应LoginResponse含token与用户信息
- 错误400参数错误、401登录失败
- POST /api/v1/auth/login
- 请求体LoginRequest支持用户名或邮箱
- 响应LoginResponse
- 错误400参数错误、401登录失败
- POST /api/v1/auth/send-code
- 请求体SendVerificationCodeRequest类型枚举register/reset_password/change_email
- 响应:通用成功响应
- 错误400参数错误
- POST /api/v1/auth/reset-password
- 请求体ResetPasswordRequest验证码6位
- 响应:通用成功响应
- 错误400参数错误
参数与校验要点
- RegisterRequest用户名、邮箱、密码、验证码、可选头像URL
- LoginRequest用户名或邮箱、密码
- SendVerificationCodeRequest邮箱、类型
- ResetPasswordRequest邮箱、验证码、新密码
章节来源
- [routes.go](file://internal/handler/routes.go#L18-L25)
- [auth_handler.go](file://internal/handler/auth_handler.go#L17-L84)
- [auth_handler.go](file://internal/handler/auth_handler.go#L86-L147)
- [auth_handler.go](file://internal/handler/auth_handler.go#L149-L192)
- [auth_handler.go](file://internal/handler/auth_handler.go#L194-L249)
- [common.go](file://internal/types/common.go#L27-L66)
### 用户组(/api/v1/user需JWT
- GET /api/v1/user/profile
- 响应UserInfo
- 错误401未授权、404用户不存在
- PUT /api/v1/user/profile
- 请求体UpdateUserRequest修改密码需同时提供旧密码与新密码
- 响应UserInfo
- 错误400参数错误、401未授权、404用户不存在、500服务器错误
- POST /api/v1/user/avatar/upload-url
- 请求体GenerateAvatarUploadURLRequest文件名
- 响应GenerateAvatarUploadURLResponse含post_url、form_data、avatar_url、expires_in
- 错误400参数错误
- PUT /api/v1/user/avatar
- 查询参数avatar_url
- 响应UserInfo
- 错误400参数错误
- POST /api/v1/user/change-email
- 请求体ChangeEmailRequest新邮箱+验证码)
- 响应UserInfo
- 错误400参数错误、401未授权
参数与校验要点
- UpdateUserRequest头像URL、旧密码、新密码二者需同时提供
- GenerateAvatarUploadURLRequest文件名必填
- ChangeEmailRequest新邮箱、验证码
章节来源
- [routes.go](file://internal/handler/routes.go#L27-L41)
- [user_handler.go](file://internal/handler/user_handler.go#L17-L68)
- [user_handler.go](file://internal/handler/user_handler.go#L70-L193)
- [user_handler.go](file://internal/handler/user_handler.go#L195-L253)
- [user_handler.go](file://internal/handler/user_handler.go#L255-L326)
- [user_handler.go](file://internal/handler/user_handler.go#L328-L416)
- [common.go](file://internal/types/common.go#L42-L80)
- [common.go](file://internal/types/common.go#L107-L125)
- [common.go](file://internal/types/common.go#L167-L179)
### 材质组(/api/v1/texture
- 公开端点无需JWT
- GET /api/v1/texture
- 查询keyword、typeSKIN/CAPE、public_only、page、page_size
- 响应分页响应列表项为TextureInfo
- GET /api/v1/texture/{id}
- 路径参数id
- 响应TextureInfo
- 需JWT端点
- POST /api/v1/texture/upload-url
- 请求体GenerateTextureUploadURLRequest文件名、纹理类型
- 响应GenerateTextureUploadURLResponse含post_url、form_data、texture_url、expires_in
- 错误400参数错误
- POST /api/v1/texture
- 请求体CreateTextureRequest名称、描述、类型、URL、哈希、大小、公开性、是否Slim
- 响应TextureInfo
- 错误400参数错误
- PUT /api/v1/texture/{id}
- 路径参数id请求体UpdateTextureRequest名称、描述、公开性
- 响应TextureInfo
- 错误400参数错误、403无权操作
- DELETE /api/v1/texture/{id}
- 路径参数id
- 响应:通用成功响应
- 错误400参数错误、403无权操作
- POST /api/v1/texture/{id}/favorite
- 路径参数id
- 响应:布尔值(是否收藏)
- 错误400参数错误
- GET /api/v1/texture/my
- 查询page、page_size
- 响应分页响应列表项为TextureInfo
- GET /api/v1/texture/favorites
- 查询page、page_size
- 响应分页响应列表项为TextureInfo
参数与校验要点
- GenerateTextureUploadURLRequest文件名必填、类型枚举SKIN/CAPE
- CreateTextureRequest名称必填、URL必填且为有效URL、哈希长度64、大小>0、类型枚举
- UpdateTextureRequest名称长度限制、公开性可选
- 搜索与分页默认page=1、page_size默认20、最大100
章节来源
- [routes.go](file://internal/handler/routes.go#L42-L61)
- [texture_handler.go](file://internal/handler/texture_handler.go#L18-L83)
- [texture_handler.go](file://internal/handler/texture_handler.go#L85-L172)
- [texture_handler.go](file://internal/handler/texture_handler.go#L174-L223)
- [texture_handler.go](file://internal/handler/texture_handler.go#L225-L291)
- [texture_handler.go](file://internal/handler/texture_handler.go#L293-L369)
- [texture_handler.go](file://internal/handler/texture_handler.go#L371-L419)
- [texture_handler.go](file://internal/handler/texture_handler.go#L421-L471)
- [texture_handler.go](file://internal/handler/texture_handler.go#L473-L599)
- [common.go](file://internal/types/common.go#L81-L105)
- [common.go](file://internal/types/common.go#L181-L191)
- [common.go](file://internal/types/common.go#L193-L200)
### 档案组(/api/v1/profile
- 公开端点无需JWT
- GET /api/v1/profile/{uuid}
- 路径参数uuid
- 响应ProfileInfo
- 错误404档案不存在、500服务器错误
- 需JWT端点
- POST /api/v1/profile
- 请求体CreateProfileRequest名称
- 响应ProfileInfo含自动生成UUID
- 错误400参数错误或已达上限、401未授权、500服务器错误
- GET /api/v1/profile
- 响应ProfileInfo列表
- 错误401未授权、500服务器错误
- PUT /api/v1/profile/{uuid}
- 路径参数uuid请求体UpdateProfileRequest名称、皮肤ID、斗篷ID
- 响应ProfileInfo
- 错误400参数错误、401未授权、403无权操作、404档案不存在、500服务器错误
- DELETE /api/v1/profile/{uuid}
- 路径参数uuid
- 响应:通用成功响应
- 错误401未授权、403无权操作、404档案不存在、500服务器错误
- POST /api/v1/profile/{uuid}/activate
- 路径参数uuid
- 响应:通用成功响应
- 错误401未授权、403无权操作、404档案不存在、500服务器错误
参数与校验要点
- CreateProfileRequest名称长度1-16
- UpdateProfileRequest名称长度1-16皮肤/斗篷ID可选
章节来源
- [routes.go](file://internal/handler/routes.go#L63-L79)
- [profile_handler.go](file://internal/handler/profile_handler.go#L15-L93)
- [profile_handler.go](file://internal/handler/profile_handler.go#L95-L151)
- [profile_handler.go](file://internal/handler/profile_handler.go#L153-L195)
- [profile_handler.go](file://internal/handler/profile_handler.go#L197-L280)
- [profile_handler.go](file://internal/handler/profile_handler.go#L282-L339)
- [profile_handler.go](file://internal/handler/profile_handler.go#L341-L399)
- [common.go](file://internal/types/common.go#L81-L85)
- [common.go](file://internal/types/common.go#L201-L207)
### 验证码组(/api/v1/captcha
- GET /api/v1/captcha/generate
- 响应主图、滑块图、验证码ID、Y坐标
- 错误500生成失败
- POST /api/v1/captcha/verify
- 请求体:{captchaId, dx}
- 响应:验证结果(成功/失败)
- 错误400参数错误、500验证失败
章节来源
- [routes.go](file://internal/handler/routes.go#L80-L85)
- [captcha_handler.go](file://internal/handler/captcha_handler.go#L11-L34)
- [captcha_handler.go](file://internal/handler/captcha_handler.go#L36-L77)
### Yggdrasil组/api/v1/yggdrasil
- 元数据
- GET /api/v1/yggdrasil
- 响应:实现信息、链接、特性开关、签名公钥、皮肤域名
- 认证服务
- POST /api/v1/yggdrasil/authserver/authenticate
- 请求体AuthenticateRequestagent、clientToken、identifier、password、requestUser
- 响应AccessToken、ClientToken、SelectedProfile、AvailableProfiles、User可选
- POST /api/v1/yggdrasil/authserver/validate
- 请求体ValidTokenRequestaccessToken、clientToken
- 响应204有效或403无效
- POST /api/v1/yggdrasil/authserver/refresh
- 请求体RefreshRequestaccessToken、clientToken、requestUser、selectedProfile
- 响应新的AccessToken、ClientToken、SelectedProfile、User可选
- POST /api/v1/yggdrasil/authserver/invalidate
- 请求体ValidTokenRequestaccessToken、clientToken
- 响应204
- POST /api/v1/yggdrasil/authserver/signout
- 请求体SignOutRequestusername、password
- 响应204
- 会话服务
- GET /api/v1/yggdrasil/sessionserver/session/minecraft/profile/{uuid}
- 响应:序列化后的档案信息
- POST /api/v1/yggdrasil/sessionserver/session/minecraft/join
- 请求体JoinServerRequestserverId、accessToken、selectedProfile
- 响应204 或错误
- GET /api/v1/yggdrasil/sessionserver/session/minecraft/hasJoined
- 查询serverId、username、ip
- 响应200Profile或204无内容
- API服务
- POST /api/v1/yggdrasil/api/profiles/minecraft
- 请求体:字符串数组(玩家名)
- 响应Profile列表
参数与校验要点
- 认证/验证/刷新/登出:均需严格校验请求体字段与类型
- 会话验证serverId与username必填
- 批量查询:名称数组非空
章节来源
- [routes.go](file://internal/handler/routes.go#L87-L111)
- [yggdrasil_handler.go](file://internal/handler/yggdrasil_handler.go#L156-L246)
- [yggdrasil_handler.go](file://internal/handler/yggdrasil_handler.go#L248-L267)
- [yggdrasil_handler.go](file://internal/handler/yggdrasil_handler.go#L269-L361)
- [yggdrasil_handler.go](file://internal/handler/yggdrasil_handler.go#L363-L378)
- [yggdrasil_handler.go](file://internal/handler/yggdrasil_handler.go#L380-L425)
- [yggdrasil_handler.go](file://internal/handler/yggdrasil_handler.go#L427-L447)
- [yggdrasil_handler.go](file://internal/handler/yggdrasil_handler.go#L449-L496)
- [yggdrasil_handler.go](file://internal/handler/yggdrasil_handler.go#L498-L552)
- [yggdrasil_handler.go](file://internal/handler/yggdrasil_handler.go#L554-L587)
- [yggdrasil_handler.go](file://internal/handler/yggdrasil_handler.go#L589-L616)
- [yggdrasil_handler.go](file://internal/handler/yggdrasil_handler.go#L618-L666)
### 系统组(/api/v1/system
- GET /api/v1/system/config
- 响应:站点名称、描述、注册开关、每用户最大材质数、每用户最大档案数
- 注意:当前实现为占位返回固定配置
章节来源
- [routes.go](file://internal/handler/routes.go#L112-L118)
- [routes.go](file://internal/handler/routes.go#L120-L140)
## 依赖分析
- 路由与中间件
- 路由文件按组挂载鉴权中间件确保受保护端点仅接受有效JWT
- 处理器与服务
- 处理器通过服务层完成业务逻辑,服务层再与数据库/缓存交互
- 响应与类型
- 统一响应结构与分页结构,类型定义集中约束参数范围与格式
```mermaid
graph LR
Routes["路由注册<br/>routes.go"] --> MW["鉴权中间件<br/>auth.go"]
MW --> Handlers["各处理器<br/>auth/user/texture/profile/captcha/yggdrasil"]
Handlers --> Services["服务层"]
Services --> DB["数据库/缓存"]
Handlers --> Models["响应模型<br/>response.go"]
Handlers --> Types["类型定义<br/>common.go"]
```
图表来源
- [routes.go](file://internal/handler/routes.go#L10-L118)
- [auth.go](file://internal/middleware/auth.go#L12-L56)
- [response.go](file://internal/model/response.go#L1-L86)
- [common.go](file://internal/types/common.go#L1-L215)
章节来源
- [routes.go](file://internal/handler/routes.go#L10-L118)
- [auth.go](file://internal/middleware/auth.go#L12-L56)
- [response.go](file://internal/model/response.go#L1-L86)
- [common.go](file://internal/types/common.go#L1-L215)
## 性能考虑
- 上传URL预签名
- 材质与头像上传URL均采用预签名策略缩短上传路径、降低后端压力
- 分页与限制
- 材质与档案列表默认分页,避免一次性返回大量数据
- 材质与档案数量限制(当前代码中硬编码,建议从配置读取)
- 缓存与日志
- Redis用于验证码与公钥等缓存减少数据库压力
- 日志记录关键错误,便于追踪与优化
- 并发与超时
- 建议为外部服务(如对象存储)设置合理超时与重试策略
## 故障排查指南
- 鉴权失败
- 缺少Authorization头或格式不正确401
- 无效token401
- 参数错误
- JSON绑定失败或字段校验不通过400
- 资源不存在
- 用户、档案、材质不存在404
- 权限不足
- 非本人操作403
- 服务器错误
- 数据库异常、外部服务不可用500
章节来源
- [auth.go](file://internal/middleware/auth.go#L12-L56)
- [response.go](file://internal/model/response.go#L27-L52)
- [auth_handler.go](file://internal/handler/auth_handler.go#L17-L84)
- [user_handler.go](file://internal/handler/user_handler.go#L70-L193)
- [texture_handler.go](file://internal/handler/texture_handler.go#L225-L291)
- [profile_handler.go](file://internal/handler/profile_handler.go#L197-L280)
## 结论
本API参考基于现有路由与处理器注释梳理了CarrotSkin后端的核心REST接口与鉴权机制。建议在生产环境中
- 将硬编码限制与默认值迁移至配置中心
- 引入速率限制与防刷策略
- 对敏感接口增加审计日志
- 完善单元测试与集成测试覆盖
## 附录
### 统一响应结构
- 成功响应包含code、message、data
- 分页响应包含code、message、data、total、page、per_page
- 错误响应包含code、message、error开发环境
章节来源
- [response.go](file://internal/model/response.go#L1-L86)
### 常见错误码
- 200成功
- 400请求参数错误
- 401未授权
- 403禁止访问
- 404资源不存在
- 500服务器内部错误
章节来源
- [response.go](file://internal/model/response.go#L27-L52)
### Swagger与健康检查
- 文档地址:/swagger/*any
- 健康检查:/health
章节来源
- [swagger.go](file://internal/handler/swagger.go#L41-L63)