forked from datawhale/whale-town-end
docs:创建完整的API接口文档
- 创建详细的API接口说明文档 - 提供OpenAPI 3.0规范文件 - 创建Postman测试集合 - 添加API文档使用指南
This commit is contained in:
141
docs/api/README.md
Normal file
141
docs/api/README.md
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
# API接口文档
|
||||||
|
|
||||||
|
本目录包含了像素游戏服务器用户认证API的完整文档。
|
||||||
|
|
||||||
|
## 📋 文档文件说明
|
||||||
|
|
||||||
|
### 1. api-documentation.md
|
||||||
|
详细的API接口文档,包含:
|
||||||
|
- 接口概述和通用响应格式
|
||||||
|
- 每个接口的详细说明、参数、响应示例
|
||||||
|
- 错误代码说明
|
||||||
|
- 数据验证规则
|
||||||
|
- 使用示例(JavaScript/TypeScript 和 cURL)
|
||||||
|
|
||||||
|
### 2. openapi.yaml
|
||||||
|
OpenAPI 3.0规范文件,可以用于:
|
||||||
|
- 导入到Swagger Editor查看和编辑
|
||||||
|
- 生成客户端SDK
|
||||||
|
- 集成到API网关
|
||||||
|
- 自动化测试
|
||||||
|
|
||||||
|
### 3. postman-collection.json
|
||||||
|
Postman集合文件,包含:
|
||||||
|
- 所有API接口的请求示例
|
||||||
|
- 预设的请求参数
|
||||||
|
- 响应示例
|
||||||
|
- 可直接导入Postman进行测试
|
||||||
|
|
||||||
|
## 🚀 快速开始
|
||||||
|
|
||||||
|
### 1. 启动服务器并查看Swagger文档
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 启动开发服务器
|
||||||
|
pnpm run dev
|
||||||
|
|
||||||
|
# 访问Swagger UI
|
||||||
|
# 浏览器打开: http://localhost:3000/api-docs
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 使用Postman测试API
|
||||||
|
|
||||||
|
1. 打开Postman
|
||||||
|
2. 点击 Import 按钮
|
||||||
|
3. 选择 `docs/api/postman-collection.json` 文件
|
||||||
|
4. 导入后即可看到所有API接口
|
||||||
|
5. 修改环境变量 `baseUrl` 为你的服务器地址(默认:http://localhost:3000)
|
||||||
|
|
||||||
|
### 3. 使用OpenAPI规范
|
||||||
|
|
||||||
|
#### 在Swagger Editor中查看
|
||||||
|
1. 访问 [Swagger Editor](https://editor.swagger.io/)
|
||||||
|
2. 将 `docs/api/openapi.yaml` 的内容复制粘贴到编辑器中
|
||||||
|
3. 即可查看可视化的API文档
|
||||||
|
|
||||||
|
#### 生成客户端SDK
|
||||||
|
```bash
|
||||||
|
# 使用swagger-codegen生成JavaScript客户端
|
||||||
|
swagger-codegen generate -i docs/api/openapi.yaml -l javascript -o ./client-sdk
|
||||||
|
|
||||||
|
# 使用openapi-generator生成TypeScript客户端
|
||||||
|
openapi-generator generate -i docs/api/openapi.yaml -g typescript-axios -o ./client-sdk
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 API接口概览
|
||||||
|
|
||||||
|
| 接口 | 方法 | 路径 | 描述 |
|
||||||
|
|------|------|------|------|
|
||||||
|
| 用户登录 | POST | /auth/login | 支持用户名、邮箱或手机号登录 |
|
||||||
|
| 用户注册 | POST | /auth/register | 创建新用户账户 |
|
||||||
|
| GitHub OAuth | POST | /auth/github | 使用GitHub账户登录或注册 |
|
||||||
|
| 发送验证码 | POST | /auth/forgot-password | 发送密码重置验证码 |
|
||||||
|
| 重置密码 | POST | /auth/reset-password | 使用验证码重置密码 |
|
||||||
|
| 修改密码 | PUT | /auth/change-password | 修改用户密码 |
|
||||||
|
|
||||||
|
## 🧪 快速测试
|
||||||
|
|
||||||
|
### 使用cURL测试登录接口
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 测试用户登录
|
||||||
|
curl -X POST http://localhost:3000/auth/login \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"identifier": "testuser",
|
||||||
|
"password": "password123"
|
||||||
|
}'
|
||||||
|
|
||||||
|
# 测试用户注册
|
||||||
|
curl -X POST http://localhost:3000/auth/register \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"username": "newuser",
|
||||||
|
"password": "password123",
|
||||||
|
"nickname": "新用户",
|
||||||
|
"email": "newuser@example.com"
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 使用JavaScript测试
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// 用户登录
|
||||||
|
const response = await fetch('http://localhost:3000/auth/login', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
identifier: 'testuser',
|
||||||
|
password: 'password123'
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
console.log(data);
|
||||||
|
```
|
||||||
|
|
||||||
|
## ⚠️ 注意事项
|
||||||
|
|
||||||
|
1. **开发环境**: 当前配置适用于开发环境,生产环境需要使用HTTPS
|
||||||
|
2. **认证**: 实际应用中应实现JWT认证机制
|
||||||
|
3. **限流**: 建议对认证接口实施限流策略
|
||||||
|
4. **验证码**: 示例中返回验证码仅用于演示,生产环境不应返回
|
||||||
|
5. **错误处理**: 建议实现统一的错误处理机制
|
||||||
|
|
||||||
|
## 🔄 更新文档
|
||||||
|
|
||||||
|
当API接口发生变化时,请同步更新以下文件:
|
||||||
|
1. 更新DTO类的Swagger装饰器
|
||||||
|
2. 更新 `api-documentation.md`
|
||||||
|
3. 更新 `openapi.yaml`
|
||||||
|
4. 更新 `postman-collection.json`
|
||||||
|
5. 重新生成Swagger文档
|
||||||
|
|
||||||
|
## 🔗 相关链接
|
||||||
|
|
||||||
|
- [NestJS Swagger文档](https://docs.nestjs.com/openapi/introduction)
|
||||||
|
- [OpenAPI规范](https://swagger.io/specification/)
|
||||||
|
- [Postman文档](https://learning.postman.com/docs/getting-started/introduction/)
|
||||||
|
- [Swagger Editor](https://editor.swagger.io/)
|
||||||
412
docs/api/api-documentation.md
Normal file
412
docs/api/api-documentation.md
Normal file
@@ -0,0 +1,412 @@
|
|||||||
|
# 用户认证API接口文档
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
本文档描述了像素游戏服务器的用户认证相关API接口,包括登录、注册、密码找回等功能。
|
||||||
|
|
||||||
|
**基础URL**: `http://localhost:3000`
|
||||||
|
**API文档地址**: `http://localhost:3000/api-docs`
|
||||||
|
|
||||||
|
## 通用响应格式
|
||||||
|
|
||||||
|
所有API接口都遵循统一的响应格式:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": boolean,
|
||||||
|
"data": object | null,
|
||||||
|
"message": string,
|
||||||
|
"error_code": string | null
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 字段说明
|
||||||
|
|
||||||
|
- `success`: 请求是否成功
|
||||||
|
- `data`: 响应数据(成功时返回)
|
||||||
|
- `message`: 响应消息
|
||||||
|
- `error_code`: 错误代码(失败时返回)
|
||||||
|
|
||||||
|
## 接口列表
|
||||||
|
|
||||||
|
### 1. 用户登录
|
||||||
|
|
||||||
|
**接口地址**: `POST /auth/login`
|
||||||
|
|
||||||
|
**功能描述**: 用户登录,支持用户名、邮箱或手机号登录
|
||||||
|
|
||||||
|
#### 请求参数
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"identifier": "testuser",
|
||||||
|
"password": "password123"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数名 | 类型 | 必填 | 说明 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| identifier | string | 是 | 登录标识符,支持用户名、邮箱或手机号 |
|
||||||
|
| password | string | 是 | 用户密码 |
|
||||||
|
|
||||||
|
#### 响应示例
|
||||||
|
|
||||||
|
**成功响应** (200):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"user": {
|
||||||
|
"id": "1",
|
||||||
|
"username": "testuser",
|
||||||
|
"nickname": "测试用户",
|
||||||
|
"email": "test@example.com",
|
||||||
|
"phone": "+8613800138000",
|
||||||
|
"avatar_url": "https://example.com/avatar.jpg",
|
||||||
|
"role": 1,
|
||||||
|
"created_at": "2025-12-17T10:00:00.000Z"
|
||||||
|
},
|
||||||
|
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||||||
|
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||||||
|
"is_new_user": false,
|
||||||
|
"message": "登录成功"
|
||||||
|
},
|
||||||
|
"message": "登录成功"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**失败响应** (401):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": false,
|
||||||
|
"message": "用户名或密码错误",
|
||||||
|
"error_code": "LOGIN_FAILED"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 用户注册
|
||||||
|
|
||||||
|
**接口地址**: `POST /auth/register`
|
||||||
|
|
||||||
|
**功能描述**: 创建新用户账户
|
||||||
|
|
||||||
|
#### 请求参数
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"username": "testuser",
|
||||||
|
"password": "password123",
|
||||||
|
"nickname": "测试用户",
|
||||||
|
"email": "test@example.com",
|
||||||
|
"phone": "+8613800138000"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数名 | 类型 | 必填 | 说明 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| username | string | 是 | 用户名,只能包含字母、数字和下划线,长度1-50字符 |
|
||||||
|
| password | string | 是 | 密码,必须包含字母和数字,长度8-128字符 |
|
||||||
|
| nickname | string | 是 | 用户昵称,长度1-50字符 |
|
||||||
|
| email | string | 否 | 邮箱地址 |
|
||||||
|
| phone | string | 否 | 手机号码 |
|
||||||
|
|
||||||
|
#### 响应示例
|
||||||
|
|
||||||
|
**成功响应** (201):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"user": {
|
||||||
|
"id": "2",
|
||||||
|
"username": "testuser",
|
||||||
|
"nickname": "测试用户",
|
||||||
|
"email": "test@example.com",
|
||||||
|
"phone": "+8613800138000",
|
||||||
|
"avatar_url": null,
|
||||||
|
"role": 1,
|
||||||
|
"created_at": "2025-12-17T10:00:00.000Z"
|
||||||
|
},
|
||||||
|
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||||||
|
"is_new_user": true,
|
||||||
|
"message": "注册成功"
|
||||||
|
},
|
||||||
|
"message": "注册成功"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**失败响应** (409):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": false,
|
||||||
|
"message": "用户名已存在",
|
||||||
|
"error_code": "REGISTER_FAILED"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. GitHub OAuth登录
|
||||||
|
|
||||||
|
**接口地址**: `POST /auth/github`
|
||||||
|
|
||||||
|
**功能描述**: 使用GitHub账户登录或注册
|
||||||
|
|
||||||
|
#### 请求参数
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"github_id": "12345678",
|
||||||
|
"username": "octocat",
|
||||||
|
"nickname": "The Octocat",
|
||||||
|
"email": "octocat@github.com",
|
||||||
|
"avatar_url": "https://github.com/images/error/octocat_happy.gif"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数名 | 类型 | 必填 | 说明 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| github_id | string | 是 | GitHub用户ID |
|
||||||
|
| username | string | 是 | GitHub用户名 |
|
||||||
|
| nickname | string | 是 | GitHub显示名称 |
|
||||||
|
| email | string | 否 | GitHub邮箱地址 |
|
||||||
|
| avatar_url | string | 否 | GitHub头像URL |
|
||||||
|
|
||||||
|
#### 响应示例
|
||||||
|
|
||||||
|
**成功响应** (200):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"user": {
|
||||||
|
"id": "3",
|
||||||
|
"username": "octocat",
|
||||||
|
"nickname": "The Octocat",
|
||||||
|
"email": "octocat@github.com",
|
||||||
|
"phone": null,
|
||||||
|
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
|
||||||
|
"role": 1,
|
||||||
|
"created_at": "2025-12-17T10:00:00.000Z"
|
||||||
|
},
|
||||||
|
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||||||
|
"is_new_user": true,
|
||||||
|
"message": "GitHub账户绑定成功"
|
||||||
|
},
|
||||||
|
"message": "GitHub账户绑定成功"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 发送密码重置验证码
|
||||||
|
|
||||||
|
**接口地址**: `POST /auth/forgot-password`
|
||||||
|
|
||||||
|
**功能描述**: 向用户邮箱或手机发送密码重置验证码
|
||||||
|
|
||||||
|
#### 请求参数
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"identifier": "test@example.com"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数名 | 类型 | 必填 | 说明 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| identifier | string | 是 | 邮箱或手机号 |
|
||||||
|
|
||||||
|
#### 响应示例
|
||||||
|
|
||||||
|
**成功响应** (200):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"data": {
|
||||||
|
"verification_code": "123456"
|
||||||
|
},
|
||||||
|
"message": "验证码已发送,请查收"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**注意**: 实际应用中不应返回验证码,这里仅用于演示。
|
||||||
|
|
||||||
|
### 5. 重置密码
|
||||||
|
|
||||||
|
**接口地址**: `POST /auth/reset-password`
|
||||||
|
|
||||||
|
**功能描述**: 使用验证码重置用户密码
|
||||||
|
|
||||||
|
#### 请求参数
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"identifier": "test@example.com",
|
||||||
|
"verification_code": "123456",
|
||||||
|
"new_password": "newpassword123"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数名 | 类型 | 必填 | 说明 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| identifier | string | 是 | 邮箱或手机号 |
|
||||||
|
| verification_code | string | 是 | 6位数字验证码 |
|
||||||
|
| new_password | string | 是 | 新密码,必须包含字母和数字,长度8-128字符 |
|
||||||
|
|
||||||
|
#### 响应示例
|
||||||
|
|
||||||
|
**成功响应** (200):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"message": "密码重置成功"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. 修改密码
|
||||||
|
|
||||||
|
**接口地址**: `PUT /auth/change-password`
|
||||||
|
|
||||||
|
**功能描述**: 用户修改自己的密码(需要提供旧密码)
|
||||||
|
|
||||||
|
#### 请求参数
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"user_id": "1",
|
||||||
|
"old_password": "oldpassword123",
|
||||||
|
"new_password": "newpassword123"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
| 参数名 | 类型 | 必填 | 说明 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| user_id | string | 是 | 用户ID(实际应用中应从JWT令牌中获取) |
|
||||||
|
| old_password | string | 是 | 当前密码 |
|
||||||
|
| new_password | string | 是 | 新密码,必须包含字母和数字,长度8-128字符 |
|
||||||
|
|
||||||
|
#### 响应示例
|
||||||
|
|
||||||
|
**成功响应** (200):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"message": "密码修改成功"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 错误代码说明
|
||||||
|
|
||||||
|
| 错误代码 | 说明 |
|
||||||
|
|----------|------|
|
||||||
|
| LOGIN_FAILED | 登录失败 |
|
||||||
|
| REGISTER_FAILED | 注册失败 |
|
||||||
|
| GITHUB_OAUTH_FAILED | GitHub OAuth失败 |
|
||||||
|
| SEND_CODE_FAILED | 发送验证码失败 |
|
||||||
|
| RESET_PASSWORD_FAILED | 重置密码失败 |
|
||||||
|
| CHANGE_PASSWORD_FAILED | 修改密码失败 |
|
||||||
|
|
||||||
|
## 数据验证规则
|
||||||
|
|
||||||
|
### 用户名规则
|
||||||
|
- 长度:1-50字符
|
||||||
|
- 格式:只能包含字母、数字和下划线
|
||||||
|
- 正则表达式:`^[a-zA-Z0-9_]+$`
|
||||||
|
|
||||||
|
### 密码规则
|
||||||
|
- 长度:8-128字符
|
||||||
|
- 格式:必须包含字母和数字
|
||||||
|
- 正则表达式:`^(?=.*[a-zA-Z])(?=.*\d)`
|
||||||
|
|
||||||
|
### 验证码规则
|
||||||
|
- 长度:6位数字
|
||||||
|
- 正则表达式:`^\d{6}$`
|
||||||
|
|
||||||
|
## 使用示例
|
||||||
|
|
||||||
|
### JavaScript/TypeScript 示例
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// 用户登录
|
||||||
|
const loginResponse = await fetch('http://localhost:3000/auth/login', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
identifier: 'testuser',
|
||||||
|
password: 'password123'
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
const loginData = await loginResponse.json();
|
||||||
|
if (loginData.success) {
|
||||||
|
const token = loginData.data.access_token;
|
||||||
|
// 保存token用于后续请求
|
||||||
|
localStorage.setItem('token', token);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用户注册
|
||||||
|
const registerResponse = await fetch('http://localhost:3000/auth/register', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
username: 'newuser',
|
||||||
|
password: 'password123',
|
||||||
|
nickname: '新用户',
|
||||||
|
email: 'newuser@example.com'
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
const registerData = await registerResponse.json();
|
||||||
|
```
|
||||||
|
|
||||||
|
### cURL 示例
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 用户登录
|
||||||
|
curl -X POST http://localhost:3000/auth/login \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"identifier": "testuser",
|
||||||
|
"password": "password123"
|
||||||
|
}'
|
||||||
|
|
||||||
|
# 用户注册
|
||||||
|
curl -X POST http://localhost:3000/auth/register \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"username": "newuser",
|
||||||
|
"password": "password123",
|
||||||
|
"nickname": "新用户",
|
||||||
|
"email": "newuser@example.com"
|
||||||
|
}'
|
||||||
|
|
||||||
|
# 发送密码重置验证码
|
||||||
|
curl -X POST http://localhost:3000/auth/forgot-password \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"identifier": "test@example.com"
|
||||||
|
}'
|
||||||
|
|
||||||
|
# 重置密码
|
||||||
|
curl -X POST http://localhost:3000/auth/reset-password \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"identifier": "test@example.com",
|
||||||
|
"verification_code": "123456",
|
||||||
|
"new_password": "newpassword123"
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **安全性**: 实际应用中应使用HTTPS协议
|
||||||
|
2. **令牌**: 示例中的access_token是简单的Base64编码,实际应用中应使用JWT
|
||||||
|
3. **验证码**: 实际应用中不应在响应中返回验证码
|
||||||
|
4. **用户ID**: 修改密码接口中的user_id应从JWT令牌中获取,而不是从请求体中传递
|
||||||
|
5. **错误处理**: 建议在客户端实现适当的错误处理和用户提示
|
||||||
|
6. **限流**: 建议对登录、注册等接口实施限流策略
|
||||||
|
|
||||||
|
## 更新日志
|
||||||
|
|
||||||
|
- **v1.0.0** (2025-12-17): 初始版本,包含基础的用户认证功能
|
||||||
568
docs/api/openapi.yaml
Normal file
568
docs/api/openapi.yaml
Normal file
@@ -0,0 +1,568 @@
|
|||||||
|
openapi: 3.0.3
|
||||||
|
info:
|
||||||
|
title: Pixel Game Server - Auth API
|
||||||
|
description: 像素游戏服务器用户认证API接口文档
|
||||||
|
version: 1.0.0
|
||||||
|
contact:
|
||||||
|
name: API Support
|
||||||
|
email: support@example.com
|
||||||
|
license:
|
||||||
|
name: MIT
|
||||||
|
url: https://opensource.org/licenses/MIT
|
||||||
|
|
||||||
|
servers:
|
||||||
|
- url: http://localhost:3000
|
||||||
|
description: 开发环境
|
||||||
|
|
||||||
|
tags:
|
||||||
|
- name: auth
|
||||||
|
description: 用户认证相关接口
|
||||||
|
|
||||||
|
paths:
|
||||||
|
/auth/login:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- auth
|
||||||
|
summary: 用户登录
|
||||||
|
description: 支持用户名、邮箱或手机号登录
|
||||||
|
operationId: login
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/LoginDto'
|
||||||
|
example:
|
||||||
|
identifier: testuser
|
||||||
|
password: password123
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 登录成功
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/LoginResponse'
|
||||||
|
example:
|
||||||
|
success: true
|
||||||
|
data:
|
||||||
|
user:
|
||||||
|
id: "1"
|
||||||
|
username: testuser
|
||||||
|
nickname: 测试用户
|
||||||
|
email: test@example.com
|
||||||
|
phone: "+8613800138000"
|
||||||
|
avatar_url: https://example.com/avatar.jpg
|
||||||
|
role: 1
|
||||||
|
created_at: "2025-12-17T10:00:00.000Z"
|
||||||
|
access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
||||||
|
refresh_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
||||||
|
is_new_user: false
|
||||||
|
message: 登录成功
|
||||||
|
message: 登录成功
|
||||||
|
'400':
|
||||||
|
description: 请求参数错误
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ErrorResponse'
|
||||||
|
'401':
|
||||||
|
description: 用户名或密码错误
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ErrorResponse'
|
||||||
|
|
||||||
|
/auth/register:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- auth
|
||||||
|
summary: 用户注册
|
||||||
|
description: 创建新用户账户
|
||||||
|
operationId: register
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/RegisterDto'
|
||||||
|
example:
|
||||||
|
username: newuser
|
||||||
|
password: password123
|
||||||
|
nickname: 新用户
|
||||||
|
email: newuser@example.com
|
||||||
|
phone: "+8613800138001"
|
||||||
|
responses:
|
||||||
|
'201':
|
||||||
|
description: 注册成功
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/RegisterResponse'
|
||||||
|
'400':
|
||||||
|
description: 请求参数错误
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ErrorResponse'
|
||||||
|
'409':
|
||||||
|
description: 用户名或邮箱已存在
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ErrorResponse'
|
||||||
|
|
||||||
|
/auth/github:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- auth
|
||||||
|
summary: GitHub OAuth登录
|
||||||
|
description: 使用GitHub账户登录或注册
|
||||||
|
operationId: githubOAuth
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/GitHubOAuthDto'
|
||||||
|
example:
|
||||||
|
github_id: "12345678"
|
||||||
|
username: octocat
|
||||||
|
nickname: The Octocat
|
||||||
|
email: octocat@github.com
|
||||||
|
avatar_url: https://github.com/images/error/octocat_happy.gif
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: GitHub登录成功
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/GitHubOAuthResponse'
|
||||||
|
'400':
|
||||||
|
description: 请求参数错误
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ErrorResponse'
|
||||||
|
'401':
|
||||||
|
description: GitHub认证失败
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ErrorResponse'
|
||||||
|
|
||||||
|
/auth/forgot-password:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- auth
|
||||||
|
summary: 发送密码重置验证码
|
||||||
|
description: 向用户邮箱或手机发送密码重置验证码
|
||||||
|
operationId: forgotPassword
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ForgotPasswordDto'
|
||||||
|
example:
|
||||||
|
identifier: test@example.com
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 验证码发送成功
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ForgotPasswordResponse'
|
||||||
|
'400':
|
||||||
|
description: 请求参数错误
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ErrorResponse'
|
||||||
|
'404':
|
||||||
|
description: 用户不存在
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ErrorResponse'
|
||||||
|
|
||||||
|
/auth/reset-password:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- auth
|
||||||
|
summary: 重置密码
|
||||||
|
description: 使用验证码重置用户密码
|
||||||
|
operationId: resetPassword
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ResetPasswordDto'
|
||||||
|
example:
|
||||||
|
identifier: test@example.com
|
||||||
|
verification_code: "123456"
|
||||||
|
new_password: newpassword123
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 密码重置成功
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/CommonResponse'
|
||||||
|
'400':
|
||||||
|
description: 请求参数错误或验证码无效
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ErrorResponse'
|
||||||
|
'404':
|
||||||
|
description: 用户不存在
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ErrorResponse'
|
||||||
|
|
||||||
|
/auth/change-password:
|
||||||
|
put:
|
||||||
|
tags:
|
||||||
|
- auth
|
||||||
|
summary: 修改密码
|
||||||
|
description: 用户修改自己的密码(需要提供旧密码)
|
||||||
|
operationId: changePassword
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ChangePasswordDto'
|
||||||
|
example:
|
||||||
|
user_id: "1"
|
||||||
|
old_password: oldpassword123
|
||||||
|
new_password: newpassword123
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 密码修改成功
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/CommonResponse'
|
||||||
|
'400':
|
||||||
|
description: 请求参数错误或旧密码不正确
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ErrorResponse'
|
||||||
|
'404':
|
||||||
|
description: 用户不存在
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/ErrorResponse'
|
||||||
|
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
LoginDto:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- identifier
|
||||||
|
- password
|
||||||
|
properties:
|
||||||
|
identifier:
|
||||||
|
type: string
|
||||||
|
description: 登录标识符,支持用户名、邮箱或手机号
|
||||||
|
minLength: 1
|
||||||
|
maxLength: 100
|
||||||
|
example: testuser
|
||||||
|
password:
|
||||||
|
type: string
|
||||||
|
description: 用户密码
|
||||||
|
minLength: 1
|
||||||
|
maxLength: 128
|
||||||
|
example: password123
|
||||||
|
|
||||||
|
RegisterDto:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- username
|
||||||
|
- password
|
||||||
|
- nickname
|
||||||
|
properties:
|
||||||
|
username:
|
||||||
|
type: string
|
||||||
|
description: 用户名,只能包含字母、数字和下划线
|
||||||
|
minLength: 1
|
||||||
|
maxLength: 50
|
||||||
|
pattern: '^[a-zA-Z0-9_]+$'
|
||||||
|
example: testuser
|
||||||
|
password:
|
||||||
|
type: string
|
||||||
|
description: 密码,必须包含字母和数字,长度8-128字符
|
||||||
|
minLength: 8
|
||||||
|
maxLength: 128
|
||||||
|
pattern: '^(?=.*[a-zA-Z])(?=.*\d)'
|
||||||
|
example: password123
|
||||||
|
nickname:
|
||||||
|
type: string
|
||||||
|
description: 用户昵称
|
||||||
|
minLength: 1
|
||||||
|
maxLength: 50
|
||||||
|
example: 测试用户
|
||||||
|
email:
|
||||||
|
type: string
|
||||||
|
format: email
|
||||||
|
description: 邮箱地址(可选)
|
||||||
|
example: test@example.com
|
||||||
|
phone:
|
||||||
|
type: string
|
||||||
|
description: 手机号码(可选)
|
||||||
|
example: "+8613800138000"
|
||||||
|
|
||||||
|
GitHubOAuthDto:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- github_id
|
||||||
|
- username
|
||||||
|
- nickname
|
||||||
|
properties:
|
||||||
|
github_id:
|
||||||
|
type: string
|
||||||
|
description: GitHub用户ID
|
||||||
|
minLength: 1
|
||||||
|
maxLength: 100
|
||||||
|
example: "12345678"
|
||||||
|
username:
|
||||||
|
type: string
|
||||||
|
description: GitHub用户名
|
||||||
|
minLength: 1
|
||||||
|
maxLength: 50
|
||||||
|
example: octocat
|
||||||
|
nickname:
|
||||||
|
type: string
|
||||||
|
description: GitHub显示名称
|
||||||
|
minLength: 1
|
||||||
|
maxLength: 50
|
||||||
|
example: The Octocat
|
||||||
|
email:
|
||||||
|
type: string
|
||||||
|
format: email
|
||||||
|
description: GitHub邮箱地址(可选)
|
||||||
|
example: octocat@github.com
|
||||||
|
avatar_url:
|
||||||
|
type: string
|
||||||
|
description: GitHub头像URL(可选)
|
||||||
|
example: https://github.com/images/error/octocat_happy.gif
|
||||||
|
|
||||||
|
ForgotPasswordDto:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- identifier
|
||||||
|
properties:
|
||||||
|
identifier:
|
||||||
|
type: string
|
||||||
|
description: 邮箱或手机号
|
||||||
|
minLength: 1
|
||||||
|
maxLength: 100
|
||||||
|
example: test@example.com
|
||||||
|
|
||||||
|
ResetPasswordDto:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- identifier
|
||||||
|
- verification_code
|
||||||
|
- new_password
|
||||||
|
properties:
|
||||||
|
identifier:
|
||||||
|
type: string
|
||||||
|
description: 邮箱或手机号
|
||||||
|
minLength: 1
|
||||||
|
maxLength: 100
|
||||||
|
example: test@example.com
|
||||||
|
verification_code:
|
||||||
|
type: string
|
||||||
|
description: 6位数字验证码
|
||||||
|
pattern: '^\d{6}$'
|
||||||
|
example: "123456"
|
||||||
|
new_password:
|
||||||
|
type: string
|
||||||
|
description: 新密码,必须包含字母和数字,长度8-128字符
|
||||||
|
minLength: 8
|
||||||
|
maxLength: 128
|
||||||
|
pattern: '^(?=.*[a-zA-Z])(?=.*\d)'
|
||||||
|
example: newpassword123
|
||||||
|
|
||||||
|
ChangePasswordDto:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- user_id
|
||||||
|
- old_password
|
||||||
|
- new_password
|
||||||
|
properties:
|
||||||
|
user_id:
|
||||||
|
type: string
|
||||||
|
description: 用户ID(实际应用中应从JWT令牌中获取)
|
||||||
|
example: "1"
|
||||||
|
old_password:
|
||||||
|
type: string
|
||||||
|
description: 当前密码
|
||||||
|
minLength: 1
|
||||||
|
maxLength: 128
|
||||||
|
example: oldpassword123
|
||||||
|
new_password:
|
||||||
|
type: string
|
||||||
|
description: 新密码,必须包含字母和数字,长度8-128字符
|
||||||
|
minLength: 8
|
||||||
|
maxLength: 128
|
||||||
|
pattern: '^(?=.*[a-zA-Z])(?=.*\d)'
|
||||||
|
example: newpassword123
|
||||||
|
|
||||||
|
UserInfo:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: string
|
||||||
|
description: 用户ID
|
||||||
|
example: "1"
|
||||||
|
username:
|
||||||
|
type: string
|
||||||
|
description: 用户名
|
||||||
|
example: testuser
|
||||||
|
nickname:
|
||||||
|
type: string
|
||||||
|
description: 用户昵称
|
||||||
|
example: 测试用户
|
||||||
|
email:
|
||||||
|
type: string
|
||||||
|
format: email
|
||||||
|
description: 邮箱地址
|
||||||
|
example: test@example.com
|
||||||
|
phone:
|
||||||
|
type: string
|
||||||
|
description: 手机号码
|
||||||
|
example: "+8613800138000"
|
||||||
|
avatar_url:
|
||||||
|
type: string
|
||||||
|
description: 头像URL
|
||||||
|
example: https://example.com/avatar.jpg
|
||||||
|
role:
|
||||||
|
type: integer
|
||||||
|
description: 用户角色
|
||||||
|
example: 1
|
||||||
|
created_at:
|
||||||
|
type: string
|
||||||
|
format: date-time
|
||||||
|
description: 创建时间
|
||||||
|
example: "2025-12-17T10:00:00.000Z"
|
||||||
|
|
||||||
|
LoginResponseData:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
user:
|
||||||
|
$ref: '#/components/schemas/UserInfo'
|
||||||
|
access_token:
|
||||||
|
type: string
|
||||||
|
description: 访问令牌
|
||||||
|
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
||||||
|
refresh_token:
|
||||||
|
type: string
|
||||||
|
description: 刷新令牌
|
||||||
|
example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
||||||
|
is_new_user:
|
||||||
|
type: boolean
|
||||||
|
description: 是否为新用户
|
||||||
|
example: false
|
||||||
|
message:
|
||||||
|
type: string
|
||||||
|
description: 响应消息
|
||||||
|
example: 登录成功
|
||||||
|
|
||||||
|
LoginResponse:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
success:
|
||||||
|
type: boolean
|
||||||
|
description: 请求是否成功
|
||||||
|
example: true
|
||||||
|
data:
|
||||||
|
$ref: '#/components/schemas/LoginResponseData'
|
||||||
|
message:
|
||||||
|
type: string
|
||||||
|
description: 响应消息
|
||||||
|
example: 登录成功
|
||||||
|
|
||||||
|
RegisterResponse:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
success:
|
||||||
|
type: boolean
|
||||||
|
description: 请求是否成功
|
||||||
|
example: true
|
||||||
|
data:
|
||||||
|
$ref: '#/components/schemas/LoginResponseData'
|
||||||
|
message:
|
||||||
|
type: string
|
||||||
|
description: 响应消息
|
||||||
|
example: 注册成功
|
||||||
|
|
||||||
|
GitHubOAuthResponse:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
success:
|
||||||
|
type: boolean
|
||||||
|
description: 请求是否成功
|
||||||
|
example: true
|
||||||
|
data:
|
||||||
|
$ref: '#/components/schemas/LoginResponseData'
|
||||||
|
message:
|
||||||
|
type: string
|
||||||
|
description: 响应消息
|
||||||
|
example: GitHub登录成功
|
||||||
|
|
||||||
|
ForgotPasswordResponseData:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
verification_code:
|
||||||
|
type: string
|
||||||
|
description: 验证码(仅用于演示,实际应用中不应返回)
|
||||||
|
example: "123456"
|
||||||
|
|
||||||
|
ForgotPasswordResponse:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
success:
|
||||||
|
type: boolean
|
||||||
|
description: 请求是否成功
|
||||||
|
example: true
|
||||||
|
data:
|
||||||
|
$ref: '#/components/schemas/ForgotPasswordResponseData'
|
||||||
|
message:
|
||||||
|
type: string
|
||||||
|
description: 响应消息
|
||||||
|
example: 验证码已发送,请查收
|
||||||
|
|
||||||
|
CommonResponse:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
success:
|
||||||
|
type: boolean
|
||||||
|
description: 请求是否成功
|
||||||
|
example: true
|
||||||
|
message:
|
||||||
|
type: string
|
||||||
|
description: 响应消息
|
||||||
|
example: 操作成功
|
||||||
|
|
||||||
|
ErrorResponse:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
success:
|
||||||
|
type: boolean
|
||||||
|
description: 请求是否成功
|
||||||
|
example: false
|
||||||
|
message:
|
||||||
|
type: string
|
||||||
|
description: 错误消息
|
||||||
|
example: 操作失败
|
||||||
|
error_code:
|
||||||
|
type: string
|
||||||
|
description: 错误代码
|
||||||
|
example: OPERATION_FAILED
|
||||||
347
docs/api/postman-collection.json
Normal file
347
docs/api/postman-collection.json
Normal file
@@ -0,0 +1,347 @@
|
|||||||
|
{
|
||||||
|
"info": {
|
||||||
|
"name": "Pixel Game Server - Auth API",
|
||||||
|
"description": "像素游戏服务器用户认证API接口集合",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
|
||||||
|
},
|
||||||
|
"variable": [
|
||||||
|
{
|
||||||
|
"key": "baseUrl",
|
||||||
|
"value": "http://localhost:3000",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"item": [
|
||||||
|
{
|
||||||
|
"name": "用户登录",
|
||||||
|
"request": {
|
||||||
|
"method": "POST",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"identifier\": \"testuser\",\n \"password\": \"password123\"\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/auth/login",
|
||||||
|
"host": ["{{baseUrl}}"],
|
||||||
|
"path": ["auth", "login"]
|
||||||
|
},
|
||||||
|
"description": "用户登录接口,支持用户名、邮箱或手机号登录"
|
||||||
|
},
|
||||||
|
"response": [
|
||||||
|
{
|
||||||
|
"name": "登录成功",
|
||||||
|
"originalRequest": {
|
||||||
|
"method": "POST",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"identifier\": \"testuser\",\n \"password\": \"password123\"\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/auth/login",
|
||||||
|
"host": ["{{baseUrl}}"],
|
||||||
|
"path": ["auth", "login"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"status": "OK",
|
||||||
|
"code": 200,
|
||||||
|
"_postman_previewlanguage": "json",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": "{\n \"success\": true,\n \"data\": {\n \"user\": {\n \"id\": \"1\",\n \"username\": \"testuser\",\n \"nickname\": \"测试用户\",\n \"email\": \"test@example.com\",\n \"phone\": \"+8613800138000\",\n \"avatar_url\": \"https://example.com/avatar.jpg\",\n \"role\": 1,\n \"created_at\": \"2025-12-17T10:00:00.000Z\"\n },\n \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n \"refresh_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n \"is_new_user\": false,\n \"message\": \"登录成功\"\n },\n \"message\": \"登录成功\"\n}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "用户注册",
|
||||||
|
"request": {
|
||||||
|
"method": "POST",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"username\": \"newuser\",\n \"password\": \"password123\",\n \"nickname\": \"新用户\",\n \"email\": \"newuser@example.com\",\n \"phone\": \"+8613800138001\"\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/auth/register",
|
||||||
|
"host": ["{{baseUrl}}"],
|
||||||
|
"path": ["auth", "register"]
|
||||||
|
},
|
||||||
|
"description": "用户注册接口,创建新用户账户"
|
||||||
|
},
|
||||||
|
"response": [
|
||||||
|
{
|
||||||
|
"name": "注册成功",
|
||||||
|
"originalRequest": {
|
||||||
|
"method": "POST",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"username\": \"newuser\",\n \"password\": \"password123\",\n \"nickname\": \"新用户\",\n \"email\": \"newuser@example.com\",\n \"phone\": \"+8613800138001\"\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/auth/register",
|
||||||
|
"host": ["{{baseUrl}}"],
|
||||||
|
"path": ["auth", "register"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"status": "Created",
|
||||||
|
"code": 201,
|
||||||
|
"_postman_previewlanguage": "json",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": "{\n \"success\": true,\n \"data\": {\n \"user\": {\n \"id\": \"2\",\n \"username\": \"newuser\",\n \"nickname\": \"新用户\",\n \"email\": \"newuser@example.com\",\n \"phone\": \"+8613800138001\",\n \"avatar_url\": null,\n \"role\": 1,\n \"created_at\": \"2025-12-17T10:00:00.000Z\"\n },\n \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n \"is_new_user\": true,\n \"message\": \"注册成功\"\n },\n \"message\": \"注册成功\"\n}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "GitHub OAuth登录",
|
||||||
|
"request": {
|
||||||
|
"method": "POST",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"github_id\": \"12345678\",\n \"username\": \"octocat\",\n \"nickname\": \"The Octocat\",\n \"email\": \"octocat@github.com\",\n \"avatar_url\": \"https://github.com/images/error/octocat_happy.gif\"\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/auth/github",
|
||||||
|
"host": ["{{baseUrl}}"],
|
||||||
|
"path": ["auth", "github"]
|
||||||
|
},
|
||||||
|
"description": "GitHub OAuth登录接口,使用GitHub账户登录或注册"
|
||||||
|
},
|
||||||
|
"response": [
|
||||||
|
{
|
||||||
|
"name": "GitHub登录成功",
|
||||||
|
"originalRequest": {
|
||||||
|
"method": "POST",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"github_id\": \"12345678\",\n \"username\": \"octocat\",\n \"nickname\": \"The Octocat\",\n \"email\": \"octocat@github.com\",\n \"avatar_url\": \"https://github.com/images/error/octocat_happy.gif\"\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/auth/github",
|
||||||
|
"host": ["{{baseUrl}}"],
|
||||||
|
"path": ["auth", "github"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"status": "OK",
|
||||||
|
"code": 200,
|
||||||
|
"_postman_previewlanguage": "json",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": "{\n \"success\": true,\n \"data\": {\n \"user\": {\n \"id\": \"3\",\n \"username\": \"octocat\",\n \"nickname\": \"The Octocat\",\n \"email\": \"octocat@github.com\",\n \"phone\": null,\n \"avatar_url\": \"https://github.com/images/error/octocat_happy.gif\",\n \"role\": 1,\n \"created_at\": \"2025-12-17T10:00:00.000Z\"\n },\n \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n \"is_new_user\": true,\n \"message\": \"GitHub账户绑定成功\"\n },\n \"message\": \"GitHub账户绑定成功\"\n}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "发送密码重置验证码",
|
||||||
|
"request": {
|
||||||
|
"method": "POST",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"identifier\": \"test@example.com\"\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/auth/forgot-password",
|
||||||
|
"host": ["{{baseUrl}}"],
|
||||||
|
"path": ["auth", "forgot-password"]
|
||||||
|
},
|
||||||
|
"description": "发送密码重置验证码到用户邮箱或手机"
|
||||||
|
},
|
||||||
|
"response": [
|
||||||
|
{
|
||||||
|
"name": "验证码发送成功",
|
||||||
|
"originalRequest": {
|
||||||
|
"method": "POST",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"identifier\": \"test@example.com\"\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/auth/forgot-password",
|
||||||
|
"host": ["{{baseUrl}}"],
|
||||||
|
"path": ["auth", "forgot-password"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"status": "OK",
|
||||||
|
"code": 200,
|
||||||
|
"_postman_previewlanguage": "json",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": "{\n \"success\": true,\n \"data\": {\n \"verification_code\": \"123456\"\n },\n \"message\": \"验证码已发送,请查收\"\n}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "重置密码",
|
||||||
|
"request": {
|
||||||
|
"method": "POST",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"identifier\": \"test@example.com\",\n \"verification_code\": \"123456\",\n \"new_password\": \"newpassword123\"\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/auth/reset-password",
|
||||||
|
"host": ["{{baseUrl}}"],
|
||||||
|
"path": ["auth", "reset-password"]
|
||||||
|
},
|
||||||
|
"description": "使用验证码重置用户密码"
|
||||||
|
},
|
||||||
|
"response": [
|
||||||
|
{
|
||||||
|
"name": "密码重置成功",
|
||||||
|
"originalRequest": {
|
||||||
|
"method": "POST",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"identifier\": \"test@example.com\",\n \"verification_code\": \"123456\",\n \"new_password\": \"newpassword123\"\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/auth/reset-password",
|
||||||
|
"host": ["{{baseUrl}}"],
|
||||||
|
"path": ["auth", "reset-password"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"status": "OK",
|
||||||
|
"code": 200,
|
||||||
|
"_postman_previewlanguage": "json",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": "{\n \"success\": true,\n \"message\": \"密码重置成功\"\n}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "修改密码",
|
||||||
|
"request": {
|
||||||
|
"method": "PUT",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"user_id\": \"1\",\n \"old_password\": \"oldpassword123\",\n \"new_password\": \"newpassword123\"\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/auth/change-password",
|
||||||
|
"host": ["{{baseUrl}}"],
|
||||||
|
"path": ["auth", "change-password"]
|
||||||
|
},
|
||||||
|
"description": "用户修改自己的密码(需要提供旧密码)"
|
||||||
|
},
|
||||||
|
"response": [
|
||||||
|
{
|
||||||
|
"name": "密码修改成功",
|
||||||
|
"originalRequest": {
|
||||||
|
"method": "PUT",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"user_id\": \"1\",\n \"old_password\": \"oldpassword123\",\n \"new_password\": \"newpassword123\"\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/auth/change-password",
|
||||||
|
"host": ["{{baseUrl}}"],
|
||||||
|
"path": ["auth", "change-password"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"status": "OK",
|
||||||
|
"code": 200,
|
||||||
|
"_postman_previewlanguage": "json",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": "{\n \"success\": true,\n \"message\": \"密码修改成功\"\n}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user