# Whale Town 像素游戏服务器 API 文档

**版本**: 2.0.0  
**更新时间**: 2026-01-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 进行错误处理

---

**文档维护**: 本文档根据后端代码自动生成，如有疑问请参考源代码或联系开发团队。
