- 注册时Zulip账号创建改为异步,不阻塞注册流程 - 新增带3次重试和递增延迟的createZulipAccountWithRetry方法 - Zulip失败只记录日志,不影响用户注册成功 - 更新API文档,补充80+接口覆盖聊天/通知/位置等模块 - 添加.claude/和test-*.ps1到.gitignore Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2496 lines
41 KiB
Markdown
2496 lines
41 KiB
Markdown
# Whale Town 像素游戏服务器 API 文档
|
||
|
||
**版本**: 2.0.0
|
||
**更新时间**: 2026-01-20
|
||
|
||
## <20> 目录
|
||
|
||
- [概述](#概述)
|
||
- [认证机制](#认证机制)
|
||
- [通用响应格式](#通用响应格式)
|
||
- [错误代码说明](#错误代码说明)
|
||
- [API接口列表](#api接口列表)
|
||
- [应用状态](#应用状态)
|
||
- [用户认证](#用户认证)
|
||
- [管理员接口](#管理员接口)
|
||
- [用户管理](#用户管理)
|
||
- [聊天系统](#聊天系统)
|
||
- [位置广播](#位置广播)
|
||
- [通知系统](#通知系统)
|
||
- [Zulip集成](#zulip集成)
|
||
- [数据库管理](#数据库管理)
|
||
- [操作日志](#操作日志)
|
||
|
||
---
|
||
|
||
## 概述
|
||
|
||
Whale Town 像素游戏服务器提供完整的 RESTful API 和 WebSocket 实时通信接口,支持:
|
||
|
||
- 用户认证与授权(JWT)
|
||
- 实时聊天和位置广播
|
||
- 管理员后台管理
|
||
- Zulip 第三方集成
|
||
- 通知推送系统
|
||
|
||
**基础URL**: `https://whaletownend.xinghangee.icu`
|
||
**WebSocket URL**: `wss://whaletownend.xinghangee.icu/game`
|
||
|
||
---
|
||
|
||
## 认证机制
|
||
|
||
### JWT Token 认证
|
||
|
||
大部分接口需要在请求头中携带 JWT Token:
|
||
|
||
```http
|
||
Authorization: Bearer <your_jwt_token>
|
||
```
|
||
|
||
### Token 获取方式
|
||
|
||
1. 用户登录:`POST /auth/login`
|
||
2. 用户注册:`POST /auth/register`
|
||
3. GitHub OAuth:`POST /auth/github`
|
||
4. 验证码登录:`POST /auth/verification-code-login`
|
||
|
||
### Token 刷新
|
||
|
||
使用刷新令牌获取新的访问令牌:`POST /auth/refresh-token`
|
||
|
||
---
|
||
|
||
## 通用响应格式
|
||
|
||
### 成功响应
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": { ... },
|
||
"message": "操作成功"
|
||
}
|
||
```
|
||
|
||
### 错误响应
|
||
|
||
```json
|
||
{
|
||
"success": false,
|
||
"message": "错误描述",
|
||
"error_code": "ERROR_CODE"
|
||
}
|
||
```
|
||
|
||
|
||
---
|
||
|
||
## 错误代码说明
|
||
|
||
| 错误代码 | HTTP状态码 | 说明 |
|
||
|---------|-----------|------|
|
||
| LOGIN_FAILED | 401 | 登录失败(用户名或密码错误) |
|
||
| REGISTER_FAILED | 400/409 | 注册失败(参数错误或用户已存在) |
|
||
| TOKEN_REFRESH_FAILED | 401 | Token刷新失败 |
|
||
| VERIFICATION_CODE_LOGIN_FAILED | 401 | 验证码登录失败 |
|
||
| SEND_CODE_FAILED | 400/404 | 验证码发送失败 |
|
||
| RESET_PASSWORD_FAILED | 400 | 密码重置失败 |
|
||
| CHANGE_PASSWORD_FAILED | 400/401 | 密码修改失败 |
|
||
| TEST_MODE_ONLY | 206 | 测试模式(验证码未真实发送) |
|
||
| ADMIN_LOGIN_FAILED | 401/403 | 管理员登录失败 |
|
||
| USER_NOT_FOUND | 404 | 用户不存在 |
|
||
| TOO_MANY_REQUESTS | 429 | 请求过于频繁 |
|
||
|
||
---
|
||
|
||
## API接口列表
|
||
|
||
### 应用状态
|
||
|
||
#### 获取应用状态
|
||
|
||
**接口**: `GET /`
|
||
|
||
**描述**: 获取应用的基本运行状态信息,用于健康检查和服务监控
|
||
|
||
**认证**: 不需要
|
||
|
||
**响应示例**:
|
||
|
||
```json
|
||
{
|
||
"service": "Pixel Game Server",
|
||
"version": "2.0.0",
|
||
"status": "running",
|
||
"timestamp": "2026-01-20T10:00:00.000Z",
|
||
"uptime": 86400,
|
||
"environment": "production",
|
||
"storage_mode": "database"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 用户认证
|
||
|
||
#### 1. 用户登录
|
||
|
||
**接口**: `POST /auth/login`
|
||
|
||
**描述**: 支持用户名、邮箱或手机号登录
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"identifier": "testuser",
|
||
"password": "password123"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"user": {
|
||
"id": "1",
|
||
"username": "testuser",
|
||
"nickname": "测试用户",
|
||
"email": "test@example.com",
|
||
"phone": null,
|
||
"avatar_url": null,
|
||
"role": 1,
|
||
"created_at": "2026-01-20T10:00:00.000Z"
|
||
},
|
||
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"is_new_user": false,
|
||
"message": "登录成功"
|
||
},
|
||
"message": "登录成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `401`: 用户名或密码错误
|
||
- `403`: 账户被禁用或锁定
|
||
- `429`: 登录尝试过于频繁
|
||
|
||
---
|
||
|
||
#### 2. 用户注册
|
||
|
||
**接口**: `POST /auth/register`
|
||
|
||
**描述**: 创建新用户账户,支持邮箱验证
|
||
|
||
**请求体(基础注册)**:
|
||
|
||
```json
|
||
{
|
||
"username": "newuser",
|
||
"password": "password123",
|
||
"nickname": "新用户"
|
||
}
|
||
```
|
||
|
||
**请求体(带邮箱验证)**:
|
||
|
||
```json
|
||
{
|
||
"username": "newuser",
|
||
"password": "password123",
|
||
"nickname": "新用户",
|
||
"email": "newuser@example.com",
|
||
"email_verification_code": "123456"
|
||
}
|
||
```
|
||
|
||
**成功响应 (201)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"user": {
|
||
"id": "2",
|
||
"username": "newuser",
|
||
"nickname": "新用户",
|
||
"email": "newuser@example.com",
|
||
"phone": null,
|
||
"avatar_url": null,
|
||
"role": 1,
|
||
"created_at": "2026-01-20T10:00:00.000Z"
|
||
},
|
||
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"is_new_user": true,
|
||
"message": "注册成功"
|
||
},
|
||
"message": "注册成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `400`: 验证码错误或参数错误
|
||
- `409`: 用户名或邮箱已存在
|
||
- `429`: 注册请求过于频繁
|
||
|
||
---
|
||
|
||
#### 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"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"user": {
|
||
"id": "3",
|
||
"username": "octocat",
|
||
"nickname": "The Octocat",
|
||
"email": "octocat@github.com",
|
||
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
|
||
"role": 1,
|
||
"created_at": "2026-01-20T10:00:00.000Z"
|
||
},
|
||
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"is_new_user": false,
|
||
"message": "GitHub登录成功"
|
||
},
|
||
"message": "GitHub登录成功"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 4. 验证码登录
|
||
|
||
**接口**: `POST /auth/verification-code-login`
|
||
|
||
**描述**: 使用邮箱或手机号和验证码进行登录,无需密码
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"identifier": "test@example.com",
|
||
"verification_code": "123456"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"user": { ... },
|
||
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"is_new_user": false,
|
||
"message": "验证码登录成功"
|
||
},
|
||
"message": "验证码登录成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `401`: 验证码错误或已过期
|
||
- `404`: 用户不存在
|
||
|
||
---
|
||
|
||
#### 5. 发送登录验证码
|
||
|
||
**接口**: `POST /auth/send-login-verification-code`
|
||
|
||
**描述**: 向用户邮箱或手机发送登录验证码
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"identifier": "test@example.com"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200) - 生产环境**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"is_test_mode": false
|
||
},
|
||
"message": "验证码已发送,请查收"
|
||
}
|
||
```
|
||
|
||
**测试模式响应 (206) - 开发环境**:
|
||
|
||
```json
|
||
{
|
||
"success": false,
|
||
"data": {
|
||
"verification_code": "654321",
|
||
"is_test_mode": true
|
||
},
|
||
"message": "⚠️ 测试模式:验证码已生成但未真实发送。请在控制台查看验证码。",
|
||
"error_code": "TEST_MODE_ONLY"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `404`: 用户不存在
|
||
- `429`: 发送频率过高
|
||
|
||
---
|
||
|
||
#### 6. 发送邮箱验证码
|
||
|
||
**接口**: `POST /auth/send-email-verification`
|
||
|
||
**描述**: 向指定邮箱发送验证码(用于注册)
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"email": "test@example.com"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"is_test_mode": false
|
||
},
|
||
"message": "验证码已发送,请查收邮件"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `409`: 邮箱已被注册
|
||
- `429`: 验证码发送过于频繁
|
||
|
||
---
|
||
|
||
#### 7. 验证邮箱验证码
|
||
|
||
**接口**: `POST /auth/verify-email`
|
||
|
||
**描述**: 使用验证码验证邮箱
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"email": "test@example.com",
|
||
"verification_code": "123456"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"message": "邮箱验证成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `400`: 验证码错误或已过期
|
||
|
||
---
|
||
|
||
#### 8. 重新发送邮箱验证码
|
||
|
||
**接口**: `POST /auth/resend-email-verification`
|
||
|
||
**描述**: 重新向指定邮箱发送验证码
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"email": "test@example.com"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"is_test_mode": false
|
||
},
|
||
"message": "验证码已重新发送,请查收邮件"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `400`: 邮箱已验证,无需重复验证
|
||
- `429`: 发送频率过高
|
||
|
||
---
|
||
|
||
#### 9. 发送密码重置验证码
|
||
|
||
**接口**: `POST /auth/forgot-password`
|
||
|
||
**描述**: 向用户邮箱或手机发送密码重置验证码
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"identifier": "test@example.com"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"is_test_mode": false
|
||
},
|
||
"message": "验证码已发送,请查收"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `404`: 用户不存在
|
||
- `429`: 发送频率过高
|
||
|
||
---
|
||
|
||
#### 10. 重置密码
|
||
|
||
**接口**: `POST /auth/reset-password`
|
||
|
||
**描述**: 使用验证码重置用户密码
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"identifier": "test@example.com",
|
||
"verification_code": "789012",
|
||
"new_password": "newpassword123"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"message": "密码重置成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `400`: 验证码错误或参数无效
|
||
- `404`: 用户不存在
|
||
- `429`: 重置请求过于频繁
|
||
|
||
---
|
||
|
||
#### 11. 修改密码
|
||
|
||
**接口**: `PUT /auth/change-password`
|
||
|
||
**描述**: 用户修改自己的密码(需要提供旧密码)
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"user_id": "1",
|
||
"old_password": "oldpassword123",
|
||
"new_password": "newpassword123"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"message": "密码修改成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `400`: 请求参数错误
|
||
- `401`: 旧密码不正确
|
||
- `404`: 用户不存在
|
||
|
||
---
|
||
|
||
#### 12. 刷新访问令牌
|
||
|
||
**接口**: `POST /auth/refresh-token`
|
||
|
||
**描述**: 使用有效的刷新令牌生成新的访问令牌
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"expires_in": 3600
|
||
},
|
||
"message": "令牌刷新成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `401`: 刷新令牌无效或已过期
|
||
- `404`: 用户不存在或已被禁用
|
||
- `429`: 刷新请求过于频繁
|
||
|
||
|
||
---
|
||
|
||
### 管理员接口
|
||
|
||
#### 1. 管理员登录
|
||
|
||
**接口**: `POST /admin/auth/login`
|
||
|
||
**描述**: 管理员身份认证,仅允许 role=9 的账户登录
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"identifier": "admin",
|
||
"password": "Admin123456"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"admin": {
|
||
"id": "1",
|
||
"username": "admin",
|
||
"nickname": "管理员",
|
||
"role": 9
|
||
},
|
||
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"expires_in": 28800,
|
||
"message": "管理员登录成功"
|
||
},
|
||
"message": "管理员登录成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `401`: 用户名或密码错误
|
||
- `403`: 权限不足,需要管理员权限
|
||
- `429`: 登录尝试过于频繁
|
||
|
||
---
|
||
|
||
#### 2. 获取用户列表
|
||
|
||
**接口**: `GET /admin/users`
|
||
|
||
**描述**: 分页获取系统中的用户列表
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**查询参数**:
|
||
|
||
- `limit` (可选): 返回数量,默认100
|
||
- `offset` (可选): 偏移量,默认0
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"users": [
|
||
{
|
||
"id": "1",
|
||
"username": "testuser",
|
||
"nickname": "测试用户",
|
||
"email": "test@example.com",
|
||
"phone": null,
|
||
"role": 1,
|
||
"status": "active",
|
||
"email_verified": true,
|
||
"created_at": "2026-01-20T10:00:00.000Z",
|
||
"updated_at": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
],
|
||
"pagination": {
|
||
"limit": 100,
|
||
"offset": 0,
|
||
"total": 1
|
||
}
|
||
},
|
||
"message": "用户列表获取成功"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 3. 获取用户详情
|
||
|
||
**接口**: `GET /admin/users/:id`
|
||
|
||
**描述**: 根据用户ID获取指定用户的详细信息
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**路径参数**:
|
||
|
||
- `id`: 用户ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"user": {
|
||
"id": "1",
|
||
"username": "testuser",
|
||
"nickname": "测试用户",
|
||
"email": "test@example.com",
|
||
"phone": null,
|
||
"role": 1,
|
||
"status": "active",
|
||
"email_verified": true,
|
||
"github_id": null,
|
||
"avatar_url": null,
|
||
"created_at": "2026-01-20T10:00:00.000Z",
|
||
"updated_at": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
},
|
||
"message": "用户详情获取成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `404`: 用户不存在
|
||
|
||
---
|
||
|
||
#### 4. 重置用户密码
|
||
|
||
**接口**: `POST /admin/users/:id/reset-password`
|
||
|
||
**描述**: 管理员直接为指定用户设置新密码
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**路径参数**:
|
||
|
||
- `id`: 用户ID
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"newPassword": "newpassword123"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"message": "用户密码重置成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `400`: 密码不符合强度规则
|
||
- `404`: 用户不存在
|
||
- `429`: 操作过于频繁
|
||
|
||
---
|
||
|
||
#### 5. 获取运行时日志
|
||
|
||
**接口**: `GET /admin/logs/runtime`
|
||
|
||
**描述**: 从 logs/ 目录读取最近的日志行
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**查询参数**:
|
||
|
||
- `lines` (可选): 返回行数,默认200,最大2000
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"logs": [
|
||
"[2026-01-20 18:27:35] LOG [NestApplication] Nest application successfully started",
|
||
"[2026-01-20 18:27:35] LOG [RouterExplorer] Mapped {/, GET} route"
|
||
],
|
||
"total_lines": 2,
|
||
"timestamp": "2026-01-20T10:27:44.352Z"
|
||
},
|
||
"message": "运行时日志获取成功"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 6. 下载全部运行日志
|
||
|
||
**接口**: `GET /admin/logs/archive`
|
||
|
||
**描述**: 将 logs/ 目录打包为 tar.gz 并下载
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**响应**: 二进制流(application/gzip)
|
||
|
||
---
|
||
|
||
### 用户管理
|
||
|
||
#### 1. 修改用户状态
|
||
|
||
**接口**: `PUT /admin/users/:id/status`
|
||
|
||
**描述**: 管理员修改指定用户的账户状态
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**路径参数**:
|
||
|
||
- `id`: 用户ID
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"status": "locked",
|
||
"reason": "违规操作"
|
||
}
|
||
```
|
||
|
||
**支持的状态值**:
|
||
|
||
- `active`: 激活
|
||
- `inactive`: 未激活
|
||
- `locked`: 锁定
|
||
- `banned`: 禁用
|
||
- `deleted`: 已删除
|
||
- `pending`: 待审核
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"user": {
|
||
"id": "1",
|
||
"username": "testuser",
|
||
"status": "locked",
|
||
"updated_at": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
},
|
||
"message": "用户状态修改成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `400`: 状态值无效
|
||
- `403`: 权限不足
|
||
- `404`: 用户不存在
|
||
- `429`: 操作过于频繁
|
||
|
||
---
|
||
|
||
#### 2. 批量修改用户状态
|
||
|
||
**接口**: `POST /admin/users/batch-status`
|
||
|
||
**描述**: 管理员批量修改多个用户的账户状态
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"userIds": ["1", "2", "3"],
|
||
"status": "active",
|
||
"reason": "批量激活"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"updated_count": 3,
|
||
"failed_count": 0,
|
||
"results": [
|
||
{
|
||
"user_id": "1",
|
||
"success": true,
|
||
"new_status": "active"
|
||
},
|
||
{
|
||
"user_id": "2",
|
||
"success": true,
|
||
"new_status": "active"
|
||
},
|
||
{
|
||
"user_id": "3",
|
||
"success": true,
|
||
"new_status": "active"
|
||
}
|
||
]
|
||
},
|
||
"message": "批量状态修改完成"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 3. 获取用户状态统计
|
||
|
||
**接口**: `GET /admin/users/status-stats`
|
||
|
||
**描述**: 获取各种用户状态的数量统计信息
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"stats": {
|
||
"active": 15,
|
||
"inactive": 3,
|
||
"locked": 2,
|
||
"banned": 1,
|
||
"deleted": 0,
|
||
"pending": 5
|
||
},
|
||
"total": 26
|
||
},
|
||
"message": "用户状态统计获取成功"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 聊天系统
|
||
|
||
#### 1. 获取聊天历史记录
|
||
|
||
**接口**: `GET /chat/history`
|
||
|
||
**描述**: 获取指定地图的聊天历史记录
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**查询参数**:
|
||
|
||
- `mapId` (可选): 地图ID
|
||
- `limit` (可选): 消息数量限制
|
||
- `offset` (可选): 偏移量
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"messages": [
|
||
{
|
||
"id": "msg_123",
|
||
"userId": "1",
|
||
"username": "testuser",
|
||
"nickname": "测试用户",
|
||
"content": "Hello World",
|
||
"mapId": "map_001",
|
||
"timestamp": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
],
|
||
"total": 100,
|
||
"limit": 50,
|
||
"offset": 0
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 2. 获取聊天系统状态
|
||
|
||
**接口**: `GET /chat/status`
|
||
|
||
**描述**: 获取聊天系统的运行状态和统计信息
|
||
|
||
**认证**: 不需要
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"websocket": {
|
||
"totalConnections": 150,
|
||
"authenticatedConnections": 120,
|
||
"activeSessions": 120,
|
||
"mapPlayerCounts": {
|
||
"map_001": 45,
|
||
"map_002": 38,
|
||
"map_003": 37
|
||
}
|
||
},
|
||
"zulip": {
|
||
"serverConnected": true,
|
||
"serverVersion": "11.4",
|
||
"botAccountActive": true,
|
||
"availableStreams": 12,
|
||
"gameStreams": ["Whale Port", "Pumpkin Valley", "Novice Village"],
|
||
"recentMessageCount": 156
|
||
},
|
||
"uptime": 86400,
|
||
"memory": {
|
||
"used": "128.5 MB",
|
||
"total": "256.0 MB",
|
||
"percentage": 50.2
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 3. 获取 WebSocket 连接信息
|
||
|
||
**接口**: `GET /chat/websocket/info`
|
||
|
||
**描述**: 获取 WebSocket 连接配置信息
|
||
|
||
**认证**: 不需要
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"websocketUrl": "wss://whaletownend.xinghangee.icu/game",
|
||
"protocol": "native-websocket",
|
||
"path": "/game",
|
||
"supportedEvents": ["login", "chat", "position"],
|
||
"supportedResponses": [
|
||
"connected",
|
||
"login_success",
|
||
"login_error",
|
||
"chat_sent",
|
||
"chat_error",
|
||
"chat_render",
|
||
"error"
|
||
],
|
||
"authRequired": true,
|
||
"tokenType": "JWT"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 位置广播
|
||
|
||
#### 1. 创建新会话
|
||
|
||
**接口**: `POST /location-broadcast/sessions`
|
||
|
||
**描述**: 创建一个新的游戏会话,用于多人位置广播
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"sessionId": "session_12345",
|
||
"name": "测试会话",
|
||
"description": "这是一个测试会话",
|
||
"maxUsers": 50,
|
||
"allowObservers": true,
|
||
"password": "optional_password",
|
||
"allowedMaps": ["map_001", "map_002"],
|
||
"broadcastRange": 100,
|
||
"metadata": {
|
||
"custom_field": "value"
|
||
}
|
||
}
|
||
```
|
||
|
||
**成功响应 (201)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"sessionId": "session_12345",
|
||
"createdAt": 1641024000000,
|
||
"config": {
|
||
"maxUsers": 50,
|
||
"allowObservers": true,
|
||
"broadcastRange": 100
|
||
},
|
||
"metadata": {
|
||
"custom_field": "value"
|
||
}
|
||
},
|
||
"message": "会话创建成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `400`: 请求参数错误
|
||
- `409`: 会话ID已存在
|
||
|
||
---
|
||
|
||
#### 2. 查询会话列表
|
||
|
||
**接口**: `GET /location-broadcast/sessions`
|
||
|
||
**描述**: 根据条件查询游戏会话列表
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**查询参数**:
|
||
|
||
- `status` (可选): 会话状态
|
||
- `minUsers` (可选): 最小用户数
|
||
- `maxUsers` (可选): 最大用户数
|
||
- `publicOnly` (可选): 只显示公开会话
|
||
- `offset` (可选): 分页偏移
|
||
- `limit` (可选): 分页大小
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"sessions": [
|
||
{
|
||
"sessionId": "session_12345",
|
||
"name": "测试会话",
|
||
"status": "active",
|
||
"currentUsers": 15,
|
||
"maxUsers": 50,
|
||
"createdAt": 1641024000000
|
||
}
|
||
],
|
||
"total": 10,
|
||
"page": 1,
|
||
"pageSize": 10
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 3. 获取会话详情
|
||
|
||
**接口**: `GET /location-broadcast/sessions/:sessionId`
|
||
|
||
**描述**: 获取指定会话的详细信息,包括用户列表和位置信息
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `sessionId`: 会话ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"session": {
|
||
"sessionId": "session_12345",
|
||
"name": "测试会话",
|
||
"status": "active",
|
||
"currentUsers": 15,
|
||
"maxUsers": 50
|
||
},
|
||
"users": [
|
||
{
|
||
"userId": "1",
|
||
"username": "testuser",
|
||
"joinedAt": 1641024000000
|
||
}
|
||
],
|
||
"onlineCount": 15,
|
||
"activeMaps": ["map_001", "map_002"]
|
||
}
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `404`: 会话不存在
|
||
|
||
---
|
||
|
||
#### 4. 更新会话配置
|
||
|
||
**接口**: `PUT /location-broadcast/sessions/:sessionId/config`
|
||
|
||
**描述**: 更新指定会话的配置参数(需要管理员权限)
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `sessionId`: 会话ID
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"maxUsers": 100,
|
||
"allowObservers": false,
|
||
"broadcastRange": 150
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"sessionId": "session_12345",
|
||
"config": {
|
||
"maxUsers": 100,
|
||
"allowObservers": false,
|
||
"broadcastRange": 150
|
||
}
|
||
},
|
||
"message": "会话配置更新成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `403`: 权限不足
|
||
- `404`: 会话不存在
|
||
|
||
---
|
||
|
||
#### 5. 结束会话
|
||
|
||
**接口**: `DELETE /location-broadcast/sessions/:sessionId`
|
||
|
||
**描述**: 结束指定的游戏会话(需要管理员权限)
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `sessionId`: 会话ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"message": "会话结束成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `403`: 权限不足
|
||
- `404`: 会话不存在
|
||
|
||
---
|
||
|
||
#### 6. 查询位置信息
|
||
|
||
**接口**: `GET /location-broadcast/positions`
|
||
|
||
**描述**: 根据条件查询用户位置信息
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**查询参数**:
|
||
|
||
- `userIds` (可选): 用户ID列表(逗号分隔)
|
||
- `mapId` (可选): 地图ID
|
||
- `sessionId` (可选): 会话ID
|
||
- `centerX` (可选): 范围查询中心X坐标
|
||
- `centerY` (可选): 范围查询中心Y坐标
|
||
- `radius` (可选): 范围查询半径
|
||
- `offset` (可选): 分页偏移
|
||
- `limit` (可选): 分页大小
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"positions": [
|
||
{
|
||
"userId": "1",
|
||
"username": "testuser",
|
||
"mapId": "map_001",
|
||
"x": 100,
|
||
"y": 200,
|
||
"timestamp": 1641024000000
|
||
}
|
||
],
|
||
"total": 20,
|
||
"timestamp": 1641024000000
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 7. 获取位置统计信息
|
||
|
||
**接口**: `GET /location-broadcast/positions/stats`
|
||
|
||
**描述**: 获取位置数据的统计信息,包括用户分布、活跃地图等
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**查询参数**:
|
||
|
||
- `mapId` (可选): 地图ID
|
||
- `sessionId` (可选): 会话ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"totalUsers": 100,
|
||
"onlineUsers": 85,
|
||
"activeMaps": 5,
|
||
"mapDistribution": {
|
||
"map_001": 35,
|
||
"map_002": 28,
|
||
"map_003": 22
|
||
},
|
||
"updateFrequency": 2.5,
|
||
"timestamp": 1641024000000
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 8. 获取用户位置历史
|
||
|
||
**接口**: `GET /location-broadcast/users/:userId/position-history`
|
||
|
||
**描述**: 获取指定用户的位置历史记录
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `userId`: 用户ID
|
||
|
||
**查询参数**:
|
||
|
||
- `mapId` (可选): 地图ID过滤
|
||
- `limit` (可选): 最大记录数
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": [
|
||
{
|
||
"userId": "1",
|
||
"mapId": "map_001",
|
||
"x": 100,
|
||
"y": 200,
|
||
"timestamp": 1641024000000
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `403`: 权限不足(只能查看自己的历史记录)
|
||
|
||
---
|
||
|
||
#### 9. 清理用户数据
|
||
|
||
**接口**: `DELETE /location-broadcast/users/:userId/data`
|
||
|
||
**描述**: 清理指定用户的位置广播相关数据(需要管理员权限)
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `userId`: 用户ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"message": "用户数据清理成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `403`: 权限不足
|
||
|
||
|
||
---
|
||
|
||
### 通知系统
|
||
|
||
#### 1. 创建通知
|
||
|
||
**接口**: `POST /api/notices`
|
||
|
||
**描述**: 创建新的通知消息
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"title": "系统通知",
|
||
"content": "这是一条系统通知消息",
|
||
"userId": 1,
|
||
"type": "system"
|
||
}
|
||
```
|
||
|
||
**成功响应 (201)**:
|
||
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"title": "系统通知",
|
||
"content": "这是一条系统通知消息",
|
||
"userId": 1,
|
||
"type": "system",
|
||
"isRead": false,
|
||
"createdAt": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 2. 获取通知列表
|
||
|
||
**接口**: `GET /api/notices`
|
||
|
||
**描述**: 获取当前用户的通知列表
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**查询参数**:
|
||
|
||
- `all` (可选): 管理员可设置为 `true` 获取所有通知
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
[
|
||
{
|
||
"id": 1,
|
||
"title": "系统通知",
|
||
"content": "这是一条系统通知消息",
|
||
"userId": 1,
|
||
"type": "system",
|
||
"isRead": false,
|
||
"createdAt": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
]
|
||
```
|
||
|
||
---
|
||
|
||
#### 3. 获取未读通知数量
|
||
|
||
**接口**: `GET /api/notices/unread-count`
|
||
|
||
**描述**: 获取当前用户的未读通知数量
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"count": 5
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 4. 获取通知详情
|
||
|
||
**接口**: `GET /api/notices/:id`
|
||
|
||
**描述**: 获取指定通知的详细信息
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `id`: 通知ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"title": "系统通知",
|
||
"content": "这是一条系统通知消息",
|
||
"userId": 1,
|
||
"type": "system",
|
||
"isRead": false,
|
||
"createdAt": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 5. 标记通知为已读
|
||
|
||
**接口**: `PATCH /api/notices/:id/read`
|
||
|
||
**描述**: 将指定通知标记为已读
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `id`: 通知ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"title": "系统通知",
|
||
"content": "这是一条系统通知消息",
|
||
"userId": 1,
|
||
"type": "system",
|
||
"isRead": true,
|
||
"createdAt": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 6. 发送系统通知
|
||
|
||
**接口**: `POST /api/notices/system`
|
||
|
||
**描述**: 发送系统通知给指定用户或所有用户
|
||
|
||
**认证**: 需要 JWT Token(管理员)
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"title": "系统维护通知",
|
||
"content": "系统将于今晚22:00进行维护",
|
||
"userId": 1
|
||
}
|
||
```
|
||
|
||
**成功响应 (201)**:
|
||
|
||
```json
|
||
{
|
||
"id": 2,
|
||
"title": "系统维护通知",
|
||
"content": "系统将于今晚22:00进行维护",
|
||
"userId": 1,
|
||
"type": "system",
|
||
"isRead": false,
|
||
"createdAt": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 7. 发送广播通知
|
||
|
||
**接口**: `POST /api/notices/broadcast`
|
||
|
||
**描述**: 向所有用户发送广播通知
|
||
|
||
**认证**: 需要 JWT Token(管理员)
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"title": "重要公告",
|
||
"content": "新版本即将上线,敬请期待!"
|
||
}
|
||
```
|
||
|
||
**成功响应 (201)**:
|
||
|
||
```json
|
||
{
|
||
"id": 3,
|
||
"title": "重要公告",
|
||
"content": "新版本即将上线,敬请期待!",
|
||
"type": "broadcast",
|
||
"isRead": false,
|
||
"createdAt": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### Zulip集成
|
||
|
||
#### 1. 创建Zulip账号关联
|
||
|
||
**接口**: `POST /zulip-accounts`
|
||
|
||
**描述**: 为游戏用户创建与Zulip账号的关联关系
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"gameUserId": "12345",
|
||
"zulipUserId": 67890,
|
||
"zulipEmail": "user@example.com",
|
||
"zulipFullName": "Test User",
|
||
"status": "active"
|
||
}
|
||
```
|
||
|
||
**成功响应 (201)**:
|
||
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"gameUserId": "12345",
|
||
"zulipUserId": 67890,
|
||
"zulipEmail": "user@example.com",
|
||
"zulipFullName": "Test User",
|
||
"status": "active",
|
||
"createdAt": "2026-01-20T10:00:00.000Z",
|
||
"updatedAt": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `400`: 请求参数错误
|
||
- `409`: 关联已存在
|
||
|
||
---
|
||
|
||
#### 2. 查询Zulip账号关联列表
|
||
|
||
**接口**: `GET /zulip-accounts`
|
||
|
||
**描述**: 根据条件查询Zulip账号关联列表
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**查询参数**:
|
||
|
||
- `gameUserId` (可选): 游戏用户ID
|
||
- `zulipUserId` (可选): Zulip用户ID
|
||
- `zulipEmail` (可选): Zulip邮箱地址
|
||
- `status` (可选): 账号状态
|
||
- `limit` (可选): 返回数量
|
||
- `offset` (可选): 偏移量
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"data": [
|
||
{
|
||
"id": 1,
|
||
"gameUserId": "12345",
|
||
"zulipUserId": 67890,
|
||
"zulipEmail": "user@example.com",
|
||
"zulipFullName": "Test User",
|
||
"status": "active",
|
||
"createdAt": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
],
|
||
"total": 1,
|
||
"limit": 10,
|
||
"offset": 0
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 3. 根据ID获取Zulip账号关联
|
||
|
||
**接口**: `GET /zulip-accounts/:id`
|
||
|
||
**描述**: 根据关联ID获取Zulip账号关联详情
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `id`: 关联ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"gameUserId": "12345",
|
||
"zulipUserId": 67890,
|
||
"zulipEmail": "user@example.com",
|
||
"zulipFullName": "Test User",
|
||
"status": "active",
|
||
"createdAt": "2026-01-20T10:00:00.000Z",
|
||
"updatedAt": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `404`: 关联不存在
|
||
|
||
---
|
||
|
||
#### 4. 根据游戏用户ID获取关联
|
||
|
||
**接口**: `GET /zulip-accounts/game-user/:gameUserId`
|
||
|
||
**描述**: 根据游戏用户ID获取Zulip账号关联
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `gameUserId`: 游戏用户ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"gameUserId": "12345",
|
||
"zulipUserId": 67890,
|
||
"zulipEmail": "user@example.com",
|
||
"zulipFullName": "Test User",
|
||
"status": "active"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 5. 根据Zulip用户ID获取关联
|
||
|
||
**接口**: `GET /zulip-accounts/zulip-user/:zulipUserId`
|
||
|
||
**描述**: 根据Zulip用户ID获取账号关联
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `zulipUserId`: Zulip用户ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"gameUserId": "12345",
|
||
"zulipUserId": 67890,
|
||
"zulipEmail": "user@example.com",
|
||
"zulipFullName": "Test User",
|
||
"status": "active"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 6. 根据Zulip邮箱获取关联
|
||
|
||
**接口**: `GET /zulip-accounts/zulip-email/:zulipEmail`
|
||
|
||
**描述**: 根据Zulip邮箱获取账号关联
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `zulipEmail`: Zulip邮箱地址
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"gameUserId": "12345",
|
||
"zulipUserId": 67890,
|
||
"zulipEmail": "user@example.com",
|
||
"zulipFullName": "Test User",
|
||
"status": "active"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 7. 更新Zulip账号关联
|
||
|
||
**接口**: `PUT /zulip-accounts/:id`
|
||
|
||
**描述**: 更新指定的Zulip账号关联信息
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `id`: 关联ID
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"zulipFullName": "Updated Name",
|
||
"status": "inactive"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"gameUserId": "12345",
|
||
"zulipUserId": 67890,
|
||
"zulipEmail": "user@example.com",
|
||
"zulipFullName": "Updated Name",
|
||
"status": "inactive",
|
||
"updatedAt": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 8. 根据游戏用户ID更新关联
|
||
|
||
**接口**: `PUT /zulip-accounts/game-user/:gameUserId`
|
||
|
||
**描述**: 根据游戏用户ID更新Zulip账号关联
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `gameUserId`: 游戏用户ID
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"zulipFullName": "Updated Name",
|
||
"status": "active"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"gameUserId": "12345",
|
||
"zulipUserId": 67890,
|
||
"zulipEmail": "user@example.com",
|
||
"zulipFullName": "Updated Name",
|
||
"status": "active",
|
||
"updatedAt": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 9. 删除Zulip账号关联
|
||
|
||
**接口**: `DELETE /zulip-accounts/:id`
|
||
|
||
**描述**: 删除指定的Zulip账号关联
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `id`: 关联ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"message": "Zulip账号关联删除成功"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 10. 根据游戏用户ID删除关联
|
||
|
||
**接口**: `DELETE /zulip-accounts/game-user/:gameUserId`
|
||
|
||
**描述**: 根据游戏用户ID删除Zulip账号关联
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `gameUserId`: 游戏用户ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"message": "Zulip账号关联删除成功"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 11. 获取需要验证的账号列表
|
||
|
||
**接口**: `GET /zulip-accounts/management/verification-needed`
|
||
|
||
**描述**: 获取需要验证的Zulip账号列表
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"data": [
|
||
{
|
||
"id": 1,
|
||
"gameUserId": "12345",
|
||
"zulipEmail": "user@example.com",
|
||
"status": "pending_verification"
|
||
}
|
||
],
|
||
"total": 1
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 12. 获取错误状态的账号列表
|
||
|
||
**接口**: `GET /zulip-accounts/management/error-accounts`
|
||
|
||
**描述**: 获取处于错误状态的Zulip账号列表
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"data": [
|
||
{
|
||
"id": 2,
|
||
"gameUserId": "67890",
|
||
"zulipEmail": "error@example.com",
|
||
"status": "error",
|
||
"errorMessage": "连接失败"
|
||
}
|
||
],
|
||
"total": 1
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 13. 批量更新账号状态
|
||
|
||
**接口**: `PUT /zulip-accounts/management/batch-status`
|
||
|
||
**描述**: 批量更新Zulip账号的状态
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"accountIds": [1, 2, 3],
|
||
"status": "active"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"updated": 3,
|
||
"message": "批量更新成功"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 14. 获取账号状态统计
|
||
|
||
**接口**: `GET /zulip-accounts/management/statistics`
|
||
|
||
**描述**: 获取Zulip账号的状态统计信息
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"total": 100,
|
||
"active": 85,
|
||
"inactive": 10,
|
||
"pending_verification": 3,
|
||
"error": 2
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 15. 验证账号有效性
|
||
|
||
**接口**: `POST /zulip-accounts/management/verify`
|
||
|
||
**描述**: 验证Zulip账号的有效性
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"accountId": 1
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"valid": true,
|
||
"message": "账号验证成功"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 16. 检查邮箱是否已存在
|
||
|
||
**接口**: `GET /zulip-accounts/validation/email-exists/:email`
|
||
|
||
**描述**: 检查指定邮箱是否已在Zulip中存在
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `email`: 邮箱地址
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"exists": true,
|
||
"accountId": 1
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 17. 检查Zulip用户ID是否已存在
|
||
|
||
**接口**: `GET /zulip-accounts/validation/zulip-user-exists/:zulipUserId`
|
||
|
||
**描述**: 检查指定Zulip用户ID是否已关联
|
||
|
||
**认证**: 需要 JWT Token
|
||
|
||
**路径参数**:
|
||
|
||
- `zulipUserId`: Zulip用户ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"exists": true,
|
||
"accountId": 1
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 数据库管理
|
||
|
||
#### 1. 获取用户列表
|
||
|
||
**接口**: `GET /admin/database/users`
|
||
|
||
**描述**: 分页获取用户列表(管理员专用)
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**查询参数**:
|
||
|
||
- `limit` (可选): 返回数量,默认20,最大100
|
||
- `offset` (可选): 偏移量,默认0
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": [
|
||
{
|
||
"id": "1",
|
||
"username": "testuser",
|
||
"nickname": "测试用户",
|
||
"email": "test@example.com",
|
||
"role": 1,
|
||
"status": "active",
|
||
"created_at": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
],
|
||
"total": 100,
|
||
"limit": 20,
|
||
"offset": 0
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 2. 获取用户详情
|
||
|
||
**接口**: `GET /admin/database/users/:id`
|
||
|
||
**描述**: 根据用户ID获取详细的用户信息
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**路径参数**:
|
||
|
||
- `id`: 用户ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"id": "1",
|
||
"username": "testuser",
|
||
"nickname": "测试用户",
|
||
"email": "test@example.com",
|
||
"phone": null,
|
||
"role": 1,
|
||
"status": "active",
|
||
"email_verified": true,
|
||
"created_at": "2026-01-20T10:00:00.000Z",
|
||
"updated_at": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 3. 搜索用户
|
||
|
||
**接口**: `GET /admin/database/users/search`
|
||
|
||
**描述**: 根据关键词搜索用户,支持用户名、邮箱、昵称模糊匹配
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**查询参数**:
|
||
|
||
- `keyword`: 搜索关键词
|
||
- `limit` (可选): 返回数量,默认20,最大50
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": [
|
||
{
|
||
"id": "1",
|
||
"username": "testuser",
|
||
"nickname": "测试用户",
|
||
"email": "test@example.com"
|
||
}
|
||
],
|
||
"total": 5
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 4. 创建用户
|
||
|
||
**接口**: `POST /admin/database/users`
|
||
|
||
**描述**: 创建新用户(管理员专用)
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"username": "newuser",
|
||
"password": "password123",
|
||
"nickname": "新用户",
|
||
"email": "newuser@example.com",
|
||
"role": 1
|
||
}
|
||
```
|
||
|
||
**成功响应 (201)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"id": "2",
|
||
"username": "newuser",
|
||
"nickname": "新用户",
|
||
"email": "newuser@example.com",
|
||
"role": 1,
|
||
"created_at": "2026-01-20T10:00:00.000Z"
|
||
},
|
||
"message": "用户创建成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `400`: 请求参数错误
|
||
- `409`: 用户名或邮箱已存在
|
||
|
||
---
|
||
|
||
#### 5. 更新用户
|
||
|
||
**接口**: `PUT /admin/database/users/:id`
|
||
|
||
**描述**: 根据用户ID更新用户信息
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**路径参数**:
|
||
|
||
- `id`: 用户ID
|
||
|
||
**请求体**:
|
||
|
||
```json
|
||
{
|
||
"nickname": "更新后的昵称",
|
||
"email": "newemail@example.com",
|
||
"status": "active"
|
||
}
|
||
```
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"id": "1",
|
||
"username": "testuser",
|
||
"nickname": "更新后的昵称",
|
||
"email": "newemail@example.com",
|
||
"status": "active",
|
||
"updated_at": "2026-01-20T10:00:00.000Z"
|
||
},
|
||
"message": "用户更新成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `404`: 用户不存在
|
||
|
||
---
|
||
|
||
#### 6. 删除用户
|
||
|
||
**接口**: `DELETE /admin/database/users/:id`
|
||
|
||
**描述**: 根据用户ID删除用户(软删除)
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**路径参数**:
|
||
|
||
- `id`: 用户ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"message": "用户删除成功"
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `404`: 用户不存在
|
||
|
||
---
|
||
|
||
### 操作日志
|
||
|
||
#### 1. 获取操作日志列表
|
||
|
||
**接口**: `GET /admin/operation-logs`
|
||
|
||
**描述**: 分页获取管理员操作日志,支持多种过滤条件
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**查询参数**:
|
||
|
||
- `limit` (可选): 返回数量,默认50,最大200
|
||
- `offset` (可选): 偏移量,默认0
|
||
- `adminUserId` (可选): 管理员用户ID过滤
|
||
- `operationType` (可选): 操作类型过滤(CREATE, UPDATE, DELETE, QUERY)
|
||
- `targetType` (可选): 目标类型过滤(users, admin_logs等)
|
||
- `operationResult` (可选): 操作结果过滤(SUCCESS, FAILURE)
|
||
- `startDate` (可选): 开始日期(ISO格式)
|
||
- `endDate` (可选): 结束日期(ISO格式)
|
||
- `isSensitive` (可选): 是否敏感操作
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": [
|
||
{
|
||
"id": "log_123",
|
||
"adminUserId": "1",
|
||
"operationType": "CREATE",
|
||
"targetType": "users",
|
||
"targetId": "2",
|
||
"operationResult": "SUCCESS",
|
||
"description": "创建用户",
|
||
"isSensitive": true,
|
||
"createdAt": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
],
|
||
"total": 100,
|
||
"limit": 50,
|
||
"offset": 0
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 2. 获取操作日志详情
|
||
|
||
**接口**: `GET /admin/operation-logs/:id`
|
||
|
||
**描述**: 根据日志ID获取操作日志的详细信息
|
||
|
||
**认证**: 需要管理员 Token
|
||
|
||
**路径参数**:
|
||
|
||
- `id`: 日志ID
|
||
|
||
**成功响应 (200)**:
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"id": "log_123",
|
||
"adminUserId": "1",
|
||
"operationType": "CREATE",
|
||
"targetType": "users",
|
||
"targetId": "2",
|
||
"operationResult": "SUCCESS",
|
||
"description": "创建用户",
|
||
"isSensitive": true,
|
||
"metadata": {
|
||
"username": "newuser",
|
||
"email": "newuser@example.com"
|
||
},
|
||
"createdAt": "2026-01-20T10:00:00.000Z"
|
||
}
|
||
}
|
||
```
|
||
|
||
**错误响应**:
|
||
|
||
- `404`: 日志不存在
|
||
|
||
---
|
||
|
||
## 📊 版本更新记录
|
||
|
||
### v2.0.0 (2026-01-20)
|
||
- **架构升级**: 完整的四层架构实现(Gateway、Business、Core、Database)
|
||
- **新增功能**: 位置广播系统、通知系统、Zulip集成
|
||
- **数据库管理**: 完整的管理员数据库管理接口
|
||
- **操作日志**: 管理员操作审计日志系统
|
||
- **Token刷新**: 支持刷新令牌机制
|
||
- **WebSocket**: 完整的实时通信支持
|
||
|
||
### v1.1.2 (2025-12-25)
|
||
- **验证码冷却优化**: 注册、密码重置、验证码登录成功后自动清除验证码冷却时间
|
||
- **用户体验提升**: 成功操作后可立即发送新的验证码
|
||
|
||
### v1.1.1 (2025-12-25)
|
||
- **邮箱冲突检测优化**: 发送邮箱验证码前检查邮箱是否已被注册
|
||
- **错误处理改进**: 返回409 Conflict状态码和明确错误信息
|
||
|
||
### v1.1.0 (2025-12-25)
|
||
- **新增验证码登录功能**: 支持邮箱验证码登录
|
||
- **HTTP状态码修复**: 所有接口返回正确的业务状态码
|
||
- **完善错误处理**: 统一错误响应格式和错误代码
|
||
|
||
---
|
||
|
||
## 🔗 相关资源
|
||
|
||
- [OpenAPI 规范文件](./openapi.yaml)
|
||
- [Postman 测试集合](./postman-collection.json)
|
||
- [项目架构文档](../ARCHITECTURE.md)
|
||
- [开发规范指南](../development/)
|
||
- [WebSocket 文档](./websocket-api.md)
|
||
|
||
---
|
||
|
||
## 📝 注意事项
|
||
|
||
1. **认证机制**: 大部分接口需要 JWT Token 认证
|
||
2. **频率限制**: 已实现 API 频率限制,请注意请求频率
|
||
3. **测试模式**: 开发环境下邮件服务返回206状态码,验证码在响应中返回
|
||
4. **WebSocket**: 实时功能(聊天、位置广播)推荐使用 WebSocket 接口
|
||
5. **管理员权限**: 管理员接口需要 role=9 的账户权限
|
||
6. **数据格式**: 所有日期时间使用 ISO 8601 格式
|
||
7. **错误处理**: 根据 HTTP 状态码和 error_code 进行错误处理
|
||
|
||
---
|
||
|
||
**文档维护**: 本文档根据后端代码自动生成,如有疑问请参考源代码或联系开发团队。
|