openapi: 3.0.3 info: title: Pixel Game Server API description: 像素游戏服务器完整API接口文档 - 包含用户认证、位置广播、聊天系统、管理员后台等功能模块 version: 1.2.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: app description: 应用状态相关接口 - name: auth description: 用户认证相关接口 - name: location-broadcast description: 位置广播系统相关接口 - name: health description: 健康检查相关接口 - name: chat description: 聊天系统相关接口 - name: zulip-accounts description: Zulip账号关联管理相关接口 - name: admin-database description: 管理员数据库管理相关接口 - name: admin-operation-logs description: 管理员操作日志相关接口 paths: /: get: tags: - app summary: 获取应用状态 description: 返回应用的基本运行状态信息,用于健康检查和监控 operationId: getAppStatus responses: '200': description: 应用状态获取成功 content: application/json: schema: $ref: '#/components/schemas/AppStatusResponse' example: service: Pixel Game Server version: 1.0.0 status: running timestamp: "2025-12-25T08:00:00.000Z" uptime: 3600 environment: development storage_mode: database /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' examples: validation_error: summary: 参数验证错误 value: success: false message: "密码必须包含字母和数字,长度8-128字符" error_code: "REGISTER_FAILED" verification_code_error: summary: 验证码错误 value: success: false message: "验证码不存在或已过期" error_code: "REGISTER_FAILED" '409': description: 资源冲突 - 用户名、邮箱或手机号已存在 content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' examples: username_exists: summary: 用户名已存在 value: success: false message: "用户名已存在" error_code: "REGISTER_FAILED" email_exists: summary: 邮箱已存在 value: success: false message: "邮箱已存在" error_code: "REGISTER_FAILED" phone_exists: summary: 手机号已存在 value: success: false message: "手机号已存在" error_code: "REGISTER_FAILED" /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' /auth/send-email-verification: post: tags: - auth summary: 发送邮箱验证码 description: 向指定邮箱发送验证码。如果邮箱已被注册,将返回冲突错误。 operationId: sendEmailVerification requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SendEmailVerificationDto' example: email: test@example.com responses: '200': description: 验证码发送成功(真实发送模式) content: application/json: schema: $ref: '#/components/schemas/EmailVerificationResponse' '206': description: 测试模式:验证码已生成但未真实发送 content: application/json: schema: $ref: '#/components/schemas/TestModeEmailVerificationResponse' '400': description: 请求参数错误 content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '409': description: 邮箱已被注册 content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' example: success: false message: "邮箱已被注册,请使用其他邮箱或直接登录" error_code: "SEND_EMAIL_VERIFICATION_FAILED" '429': description: 发送频率过高 content: application/json: schema: $ref: '#/components/schemas/ThrottleErrorResponse' /auth/verify-email: post: tags: - auth summary: 验证邮箱验证码 description: 使用验证码验证邮箱 operationId: verifyEmail requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EmailVerificationDto' example: email: test@example.com verification_code: "123456" responses: '200': description: 邮箱验证成功 content: application/json: schema: $ref: '#/components/schemas/CommonResponse' '400': description: 验证码错误或已过期 content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /auth/resend-email-verification: post: tags: - auth summary: 重新发送邮箱验证码 description: 重新向指定邮箱发送验证码 operationId: resendEmailVerification requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SendEmailVerificationDto' example: email: test@example.com responses: '200': description: 验证码重新发送成功 content: application/json: schema: $ref: '#/components/schemas/EmailVerificationResponse' '206': description: 测试模式:验证码已生成但未真实发送 content: application/json: schema: $ref: '#/components/schemas/TestModeEmailVerificationResponse' '400': description: 邮箱已验证或用户不存在 content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '429': description: 发送频率过高 content: application/json: schema: $ref: '#/components/schemas/ThrottleErrorResponse' /auth/verification-code-login: post: tags: - auth summary: 验证码登录 description: 使用邮箱或手机号和验证码进行登录,无需密码 operationId: verificationCodeLogin requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VerificationCodeLoginDto' example: identifier: test@example.com verification_code: "123456" responses: '200': description: 验证码登录成功 content: application/json: schema: $ref: '#/components/schemas/LoginResponse' '400': description: 请求参数错误 content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: 验证码错误或已过期 content: application/json: schema: $ref: '#/components/schemas/VerificationCodeLoginErrorResponse' '404': description: 用户不存在 content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /auth/send-login-verification-code: post: tags: - auth summary: 发送登录验证码 description: 向用户邮箱或手机发送登录验证码。邮件内容使用专门的登录验证码模板,标题为"登录验证码",内容说明用于登录验证而非密码重置。 operationId: sendLoginVerificationCode requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SendLoginVerificationCodeDto' example: identifier: test@example.com responses: '200': description: 验证码发送成功 content: application/json: schema: $ref: '#/components/schemas/EmailVerificationResponse' '206': description: 测试模式:验证码已生成但未真实发送 content: application/json: schema: $ref: '#/components/schemas/TestModeEmailVerificationResponse' '400': description: 请求参数错误 content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: 用户不存在 content: application/json: schema: $ref: '#/components/schemas/SendLoginCodeErrorResponse' '429': description: 发送频率过高 content: application/json: schema: $ref: '#/components/schemas/ThrottleErrorResponse' /auth/debug-verification-code: post: tags: - auth summary: 调试验证码信息 description: 获取验证码的详细调试信息(仅开发环境) operationId: debugVerificationCode requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SendEmailVerificationDto' example: email: test@example.com responses: '200': description: 调试信息获取成功 content: application/json: schema: $ref: '#/components/schemas/DebugVerificationCodeResponse' /auth/debug-clear-throttle: post: tags: - auth summary: 清除限流记录 description: 清除所有限流记录(仅开发环境使用) operationId: clearThrottle responses: '200': description: 限流记录已清除 content: application/json: schema: $ref: '#/components/schemas/CommonResponse' /auth/refresh-token: post: tags: - auth summary: 刷新访问令牌 description: 使用有效的刷新令牌生成新的访问令牌,实现无感知的令牌续期 operationId: refreshToken requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RefreshTokenDto' example: refresh_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... responses: '200': description: 令牌刷新成功 content: application/json: schema: $ref: '#/components/schemas/RefreshTokenResponse' '400': description: 请求参数错误 content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: 刷新令牌无效或已过期 content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: 用户不存在或已被禁用 content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '429': description: 刷新请求过于频繁 content: application/json: schema: $ref: '#/components/schemas/ThrottleErrorResponse' # ==================== 位置广播系统接口 ==================== /location-broadcast/sessions: post: tags: - location-broadcast summary: 创建新游戏会话 description: 创建一个新的位置广播会话,支持自定义配置 operationId: createSession security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateSessionDto' example: sessionId: session_12345 name: 测试会话 description: 这是一个测试会话 maxUsers: 100 isPublic: true responses: '201': description: 会话创建成功 content: application/json: schema: type: object properties: success: type: boolean example: true session: type: object message: type: string example: 会话创建成功 '400': description: 请求参数错误 '409': description: 会话ID已存在 get: tags: - location-broadcast summary: 查询会话列表 description: 根据条件查询游戏会话列表,支持分页和过滤 operationId: querySessions security: - bearerAuth: [] parameters: - name: status in: query required: false description: 会话状态 schema: type: string - name: limit in: query required: false description: 分页大小 schema: type: integer default: 20 - name: offset in: query required: false description: 分页偏移 schema: type: integer default: 0 responses: '200': description: 查询成功 content: application/json: schema: type: object properties: success: type: boolean example: true sessions: type: array items: type: object total: type: number example: 10 message: type: string example: 查询成功 /location-broadcast/sessions/{sessionId}: get: tags: - location-broadcast summary: 获取会话详情 description: 获取指定会话的详细信息,包括用户列表和位置信息 operationId: getSessionDetail security: - bearerAuth: [] parameters: - name: sessionId in: path required: true description: 会话ID schema: type: string responses: '200': description: 获取成功 content: application/json: schema: type: object properties: success: type: boolean example: true session: type: object users: type: array items: type: object message: type: string example: 获取成功 '404': description: 会话不存在 /location-broadcast/positions: get: tags: - location-broadcast summary: 查询位置信息 description: 根据条件查询用户位置信息,支持范围查询和地图过滤 operationId: queryPositions security: - bearerAuth: [] parameters: - name: mapId in: query required: false description: 地图ID schema: type: string - name: sessionId in: query required: false description: 会话ID schema: type: string - name: limit in: query required: false description: 分页大小 schema: type: integer default: 20 responses: '200': description: 查询成功 content: application/json: schema: type: object properties: success: type: boolean example: true positions: type: array items: type: object total: type: number example: 5 message: type: string example: 查询成功 /location-broadcast/positions/stats: get: tags: - location-broadcast summary: 获取位置统计信息 description: 获取系统位置数据的统计信息,包括用户分布和活跃度 operationId: getPositionStats security: - bearerAuth: [] responses: '200': description: 获取成功 content: application/json: schema: type: object properties: success: type: boolean example: true stats: type: object message: type: string example: 获取成功 /location-broadcast/users/{userId}/data: delete: tags: - location-broadcast summary: 清理用户数据 description: 清理指定用户的位置数据和会话信息 operationId: cleanupUserData security: - bearerAuth: [] parameters: - name: userId in: path required: true description: 用户ID schema: type: string responses: '200': description: 清理成功 content: application/json: schema: type: object properties: success: type: boolean example: true message: type: string example: 清理成功 # ==================== 健康检查接口 ==================== /health: get: tags: - health summary: 基础健康检查 description: 检查位置广播服务的基本可用性 operationId: healthCheck responses: '200': description: 服务正常 content: application/json: schema: type: object properties: status: type: string example: ok timestamp: type: number example: 1641234567890 service: type: string example: location-broadcast version: type: string example: 1.0.0 '503': description: 服务不可用 /health/detailed: get: tags: - health summary: 详细健康报告 description: 获取位置广播系统各组件的详细健康状态 operationId: detailedHealth responses: '200': description: 健康报告获取成功 content: application/json: schema: type: object properties: status: type: string example: ok timestamp: type: number example: 1641234567890 service: type: string example: location-broadcast components: type: object properties: redis: type: object database: type: object core_services: type: object metrics: type: object /health/ready: get: tags: - health summary: 就绪检查 description: 检查位置广播服务是否准备好接收请求 operationId: readinessCheck responses: '200': description: 服务已就绪 content: application/json: schema: type: object properties: status: type: string example: ready timestamp: type: number example: 1641234567890 checks: type: object /health/live: get: tags: - health summary: 存活检查 description: 检查位置广播服务是否仍在运行 operationId: livenessCheck responses: '200': description: 服务存活 content: application/json: schema: type: object properties: status: type: string example: alive timestamp: type: number example: 1641234567890 uptime: type: number example: 3600000 /health/metrics: get: tags: - health summary: 性能指标 description: 获取位置广播系统的性能指标和资源使用情况 operationId: getMetrics responses: '200': description: 指标获取成功 content: application/json: schema: type: object properties: timestamp: type: number example: 1641234567890 system: type: object application: type: object performance: type: object # ==================== 聊天系统接口 ==================== /chat/send: post: tags: - chat summary: 发送聊天消息 description: 通过 REST API 发送聊天消息到 Zulip。注意:推荐使用 WebSocket 接口以获得更好的实时性 operationId: sendMessage security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SendChatMessageDto' responses: '200': description: 消息发送成功 content: application/json: schema: $ref: '#/components/schemas/ChatMessageResponseDto' '400': description: 请求参数错误 '401': description: 未授权访问 '500': description: 服务器内部错误 /chat/history: get: tags: - chat summary: 获取聊天历史记录 description: 获取指定地图或全局的聊天历史记录 operationId: getChatHistory security: - bearerAuth: [] parameters: - name: mapId in: query required: false description: 地图ID,不指定则获取全局消息 schema: type: string example: whale_port - name: limit in: query required: false description: 消息数量限制 schema: type: integer example: 50 - name: offset in: query required: false description: 偏移量(分页用) schema: type: integer example: 0 responses: '200': description: 获取聊天历史成功 content: application/json: schema: $ref: '#/components/schemas/ChatHistoryResponseDto' '401': description: 未授权访问 '500': description: 服务器内部错误 /chat/status: get: tags: - chat summary: 获取聊天系统状态 description: 获取 WebSocket 连接状态、Zulip 集成状态等系统信息 operationId: getSystemStatus responses: '200': description: 获取系统状态成功 content: application/json: schema: $ref: '#/components/schemas/SystemStatusResponseDto' '500': description: 服务器内部错误 /chat/websocket/info: get: tags: - chat summary: 获取 WebSocket 连接信息 description: 获取 WebSocket 连接的详细信息,包括连接地址、协议等 operationId: getWebSocketInfo responses: '200': description: 获取连接信息成功 content: application/json: schema: type: object properties: websocketUrl: type: string example: ws://localhost:3000/game description: WebSocket 连接地址 namespace: type: string example: /game description: WebSocket 命名空间 supportedEvents: type: array items: type: string example: ['login', 'chat', 'position_update'] description: 支持的事件类型 authRequired: type: boolean example: true description: 是否需要认证 documentation: type: string example: https://docs.example.com/websocket description: 文档链接 # ==================== Zulip账号关联管理接口 ==================== /zulip-accounts: post: tags: - zulip-accounts summary: 创建Zulip账号关联 description: 为游戏用户创建与Zulip账号的关联关系 operationId: createZulipAccount security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateZulipAccountDto' responses: '201': description: 创建成功 content: application/json: schema: $ref: '#/components/schemas/ZulipAccountResponseDto' '400': description: 请求参数错误 '409': description: 关联已存在 get: tags: - zulip-accounts summary: 查询Zulip账号关联列表 description: 根据条件查询Zulip账号关联列表 operationId: findManyZulipAccounts security: - bearerAuth: [] parameters: - name: gameUserId in: query required: false description: 游戏用户ID schema: type: string example: '12345' - name: zulipUserId in: query required: false description: Zulip用户ID schema: type: integer example: 67890 - name: zulipEmail in: query required: false description: Zulip邮箱地址 schema: type: string example: user@example.com - name: status in: query required: false description: 账号状态 schema: type: string enum: [active, inactive, suspended, error] - name: includeGameUser in: query required: false description: 是否包含游戏用户信息 schema: type: boolean example: false responses: '200': description: 查询成功 content: application/json: schema: $ref: '#/components/schemas/ZulipAccountListResponseDto' /zulip-accounts/{id}: get: tags: - zulip-accounts summary: 根据ID获取Zulip账号关联 description: 根据关联记录ID获取详细信息 operationId: findZulipAccountById security: - bearerAuth: [] parameters: - name: id in: path required: true description: 关联记录ID schema: type: string example: '1' - name: includeGameUser in: query required: false description: 是否包含游戏用户信息 schema: type: boolean example: false responses: '200': description: 获取成功 content: application/json: schema: $ref: '#/components/schemas/ZulipAccountResponseDto' '404': description: 记录不存在 put: tags: - zulip-accounts summary: 更新Zulip账号关联 description: 根据ID更新Zulip账号关联信息 operationId: updateZulipAccount security: - bearerAuth: [] parameters: - name: id in: path required: true description: 关联记录ID schema: type: string example: '1' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateZulipAccountDto' responses: '200': description: 更新成功 content: application/json: schema: $ref: '#/components/schemas/ZulipAccountResponseDto' '404': description: 记录不存在 delete: tags: - zulip-accounts summary: 删除Zulip账号关联 description: 根据ID删除Zulip账号关联记录 operationId: deleteZulipAccount security: - bearerAuth: [] parameters: - name: id in: path required: true description: 关联记录ID schema: type: string example: '1' responses: '200': description: 删除成功 content: application/json: schema: type: object properties: success: type: boolean example: true message: type: string example: 删除成功 '404': description: 记录不存在 /zulip-accounts/game-user/{gameUserId}: get: tags: - zulip-accounts summary: 根据游戏用户ID获取Zulip账号关联 description: 根据游戏用户ID获取关联的Zulip账号信息 operationId: findZulipAccountByGameUserId security: - bearerAuth: [] parameters: - name: gameUserId in: path required: true description: 游戏用户ID schema: type: string example: '12345' - name: includeGameUser in: query required: false description: 是否包含游戏用户信息 schema: type: boolean example: false responses: '200': description: 获取成功 content: application/json: schema: $ref: '#/components/schemas/ZulipAccountResponseDto' '404': description: 关联不存在 put: tags: - zulip-accounts summary: 根据游戏用户ID更新关联 description: 根据游戏用户ID更新Zulip账号关联信息 operationId: updateZulipAccountByGameUserId security: - bearerAuth: [] parameters: - name: gameUserId in: path required: true description: 游戏用户ID schema: type: string example: '12345' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateZulipAccountDto' responses: '200': description: 更新成功 content: application/json: schema: $ref: '#/components/schemas/ZulipAccountResponseDto' '404': description: 关联不存在 delete: tags: - zulip-accounts summary: 根据游戏用户ID删除关联 description: 根据游戏用户ID删除Zulip账号关联记录 operationId: deleteZulipAccountByGameUserId security: - bearerAuth: [] parameters: - name: gameUserId in: path required: true description: 游戏用户ID schema: type: string example: '12345' responses: '200': description: 删除成功 content: application/json: schema: type: object properties: success: type: boolean example: true message: type: string example: 删除成功 '404': description: 关联不存在 /zulip-accounts/management/statistics: get: tags: - zulip-accounts summary: 获取账号状态统计 description: 获取各种状态的账号数量统计 operationId: getZulipAccountStatistics security: - bearerAuth: [] responses: '200': description: 获取成功 content: application/json: schema: $ref: '#/components/schemas/ZulipAccountStatsResponseDto' /zulip-accounts/management/batch-status: put: tags: - zulip-accounts summary: 批量更新账号状态 description: 批量更新多个账号的状态 operationId: batchUpdateZulipAccountStatus security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BatchUpdateStatusDto' responses: '200': description: 更新成功 content: application/json: schema: $ref: '#/components/schemas/BatchUpdateResponseDto' # ==================== 管理员数据库管理接口 ==================== /admin/database/users: get: tags: - admin-database summary: 获取用户列表 description: 分页获取用户列表,支持管理员查看所有用户信息 operationId: getUserList security: - bearerAuth: [] parameters: - name: limit in: query required: false description: 返回数量(默认20,最大100) schema: type: integer example: 20 - name: offset in: query required: false description: 偏移量(默认0) schema: type: integer example: 0 responses: '200': description: 获取成功 '401': description: 未授权访问 '403': description: 权限不足 post: tags: - admin-database summary: 创建用户 description: 创建新用户,需要提供用户名和昵称等基本信息 operationId: createUser security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AdminCreateUserDto' responses: '201': description: 创建成功 '400': description: 请求参数错误 '409': description: 用户名或邮箱已存在 /admin/database/users/{id}: get: tags: - admin-database summary: 获取用户详情 description: 根据用户ID获取详细的用户信息 operationId: getUserById security: - bearerAuth: [] parameters: - name: id in: path required: true description: 用户ID schema: type: string example: '1' responses: '200': description: 获取成功 '404': description: 用户不存在 put: tags: - admin-database summary: 更新用户 description: 根据用户ID更新用户信息 operationId: updateUser security: - bearerAuth: [] parameters: - name: id in: path required: true description: 用户ID schema: type: string example: '1' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AdminUpdateUserDto' responses: '200': description: 更新成功 '404': description: 用户不存在 delete: tags: - admin-database summary: 删除用户 description: 根据用户ID删除用户(软删除) operationId: deleteUser security: - bearerAuth: [] parameters: - name: id in: path required: true description: 用户ID schema: type: string example: '1' responses: '200': description: 删除成功 '404': description: 用户不存在 /admin/database/users/search: get: tags: - admin-database summary: 搜索用户 description: 根据关键词搜索用户,支持用户名、邮箱、昵称模糊匹配 operationId: searchUsers security: - bearerAuth: [] parameters: - name: keyword in: query required: true description: 搜索关键词 schema: type: string example: admin - name: limit in: query required: false description: 返回数量(默认20,最大50) schema: type: integer example: 20 responses: '200': description: 搜索成功 /admin/database/health: get: tags: - admin-database summary: 数据库管理系统健康检查 description: 检查数据库管理系统的运行状态和连接情况 operationId: adminDatabaseHealthCheck security: - bearerAuth: [] responses: '200': description: 系统正常 # ==================== 管理员操作日志接口 ==================== /admin/operation-logs: get: tags: - admin-operation-logs summary: 获取操作日志列表 description: 分页获取管理员操作日志,支持多种过滤条件 operationId: getOperationLogs security: - bearerAuth: [] parameters: - name: limit in: query required: false description: 返回数量(默认50,最大200) schema: type: integer example: 50 - name: offset in: query required: false description: 偏移量(默认0) schema: type: integer example: 0 - name: adminUserId in: query required: false description: 管理员用户ID过滤 schema: type: string example: '123' - name: operationType in: query required: false description: 操作类型过滤 schema: type: string example: CREATE - name: targetType in: query required: false description: 目标类型过滤 schema: type: string example: users - name: operationResult in: query required: false description: 操作结果过滤 schema: type: string example: SUCCESS - name: startDate in: query required: false description: 开始日期(ISO格式) schema: type: string example: '2026-01-01T00:00:00.000Z' - name: endDate in: query required: false description: 结束日期(ISO格式) schema: type: string example: '2026-01-08T23:59:59.999Z' - name: isSensitive in: query required: false description: 是否敏感操作 schema: type: boolean example: true responses: '200': description: 获取成功 '401': description: 未授权访问 '403': description: 权限不足 /admin/operation-logs/{id}: get: tags: - admin-operation-logs summary: 获取操作日志详情 description: 根据日志ID获取操作日志的详细信息 operationId: getOperationLogById security: - bearerAuth: [] parameters: - name: id in: path required: true description: 日志ID schema: type: string example: uuid-123 responses: '200': description: 获取成功 '404': description: 日志不存在 /admin/operation-logs/statistics: get: tags: - admin-operation-logs summary: 获取操作统计信息 description: 获取管理员操作的统计信息,包括操作数量、类型分布等 operationId: getOperationStatistics security: - bearerAuth: [] parameters: - name: startDate in: query required: false description: 开始日期(ISO格式) schema: type: string example: '2026-01-01T00:00:00.000Z' - name: endDate in: query required: false description: 结束日期(ISO格式) schema: type: string example: '2026-01-08T23:59:59.999Z' responses: '200': description: 获取成功 /admin/operation-logs/sensitive: get: tags: - admin-operation-logs summary: 获取敏感操作日志 description: 获取标记为敏感的操作日志,用于安全审计 operationId: getSensitiveOperations security: - bearerAuth: [] parameters: - name: limit in: query required: false description: 返回数量(默认50,最大200) schema: type: integer example: 50 - name: offset in: query required: false description: 偏移量(默认0) schema: type: integer example: 0 responses: '200': description: 获取成功 /admin/operation-logs/cleanup: delete: tags: - admin-operation-logs summary: 清理过期日志 description: 清理超过指定天数的操作日志,释放存储空间 operationId: cleanupExpiredLogs security: - bearerAuth: [] parameters: - name: daysToKeep in: query required: false description: 保留天数(默认90,最少7,最多365) schema: type: integer example: 90 responses: '200': description: 清理成功 '400': description: 参数错误 components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT schemas: AppStatusResponse: type: object properties: service: type: string description: 服务名称 example: Pixel Game Server version: type: string description: 版本号 example: 1.0.0 status: type: string description: 运行状态 example: running timestamp: type: string format: date-time description: 当前时间戳 example: "2025-12-25T08:00:00.000Z" uptime: type: integer description: 运行时间(秒) example: 3600 environment: type: string description: 运行环境 example: development storage_mode: type: string description: 存储模式 example: database 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 SendEmailVerificationDto: type: object required: - email properties: email: type: string format: email description: 邮箱地址 example: test@example.com EmailVerificationDto: type: object required: - email - verification_code properties: email: type: string format: email description: 邮箱地址 example: test@example.com verification_code: type: string description: 6位数字验证码 pattern: '^\d{6}$' example: "123456" VerificationCodeLoginDto: type: object required: - identifier - verification_code properties: identifier: type: string description: 登录标识符(邮箱或手机号) minLength: 1 maxLength: 100 example: test@example.com verification_code: type: string description: 6位数字验证码 pattern: '^\d{6}$' example: "123456" SendLoginVerificationCodeDto: type: object required: - identifier properties: identifier: type: string description: 邮箱或手机号 minLength: 1 maxLength: 100 example: test@example.com 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 EmailVerificationResponse: type: object properties: success: type: boolean description: 请求是否成功 example: true data: type: object properties: sent_to: type: string description: 发送目标 example: test@example.com expires_in: type: integer description: 过期时间(秒) example: 300 is_test_mode: type: boolean description: 是否为测试模式 example: false message: type: string description: 响应消息 example: 验证码已发送,请查收邮件 TestModeEmailVerificationResponse: type: object properties: success: type: boolean description: 请求是否成功 example: false data: type: object properties: verification_code: type: string description: 验证码(仅测试模式) example: "123456" sent_to: type: string description: 发送目标 example: test@example.com expires_in: type: integer description: 过期时间(秒) example: 300 is_test_mode: type: boolean description: 是否为测试模式 example: true message: type: string description: 响应消息 example: 测试模式:验证码已生成但未真实发送 error_code: type: string description: 错误代码 example: TEST_MODE_ONLY VerificationCodeLoginErrorResponse: type: object properties: success: type: boolean description: 请求是否成功 example: false message: type: string description: 错误消息 example: 验证码错误或已过期 error_code: type: string description: 错误代码 example: VERIFICATION_CODE_LOGIN_FAILED SendLoginCodeErrorResponse: type: object properties: success: type: boolean description: 请求是否成功 example: false message: type: string description: 错误消息 example: 用户不存在 error_code: type: string description: 错误代码 example: SEND_LOGIN_CODE_FAILED ThrottleErrorResponse: type: object properties: success: type: boolean description: 请求是否成功 example: false message: type: string description: 错误消息 example: 请求过于频繁,请稍后再试 error_code: type: string description: 错误代码 example: TOO_MANY_REQUESTS throttle_info: type: object properties: limit: type: integer description: 限制次数 example: 1 window_seconds: type: integer description: 时间窗口(秒) example: 60 current_requests: type: integer description: 当前请求次数 example: 1 reset_time: type: string format: date-time description: 重置时间 example: "2025-12-25T08:01:00.000Z" DebugVerificationCodeResponse: type: object properties: success: type: boolean description: 请求是否成功 example: true data: type: object properties: key: type: string description: Redis键名 example: verification_code:email_verification:test@example.com exists: type: boolean description: 是否存在 example: true ttl: type: integer description: 剩余生存时间(秒) example: 290 rawData: type: string description: 原始数据 example: '{"code":"123456","createdAt":1766649341250}' parsedData: type: object description: 解析后的数据 properties: code: type: string example: "123456" createdAt: type: integer example: 1766649341250 currentTime: type: integer description: 当前时间戳 example: 1766649341250 # ==================== 新增的DTO定义 ==================== RefreshTokenDto: type: object required: - refresh_token properties: refresh_token: type: string description: 刷新令牌 example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... RefreshTokenResponse: type: object properties: success: type: boolean description: 请求是否成功 example: true data: type: object properties: access_token: type: string description: 新的访问令牌 example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... refresh_token: type: string description: 新的刷新令牌 example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... expires_in: type: integer description: 访问令牌过期时间(秒) example: 3600 message: type: string description: 响应消息 example: 令牌刷新成功 CreateSessionDto: type: object required: - sessionId - name properties: sessionId: type: string description: 会话ID example: session_12345 name: type: string description: 会话名称 example: 测试会话 description: type: string description: 会话描述 example: 这是一个测试会话 maxUsers: type: integer description: 最大用户数 example: 100 isPublic: type: boolean description: 是否公开 example: true SendChatMessageDto: type: object required: - content - scope properties: content: type: string description: 消息内容 example: 大家好! scope: type: string description: 消息范围 enum: [local, global] example: local mapId: type: string description: 地图ID(local范围时需要) example: whale_port ChatMessageResponseDto: type: object properties: success: type: boolean example: true messageId: type: string example: msg_12345 timestamp: type: string format: date-time example: "2026-01-08T10:00:00.000Z" ChatHistoryResponseDto: type: object properties: success: type: boolean example: true messages: type: array items: type: object properties: id: type: integer example: 1 sender: type: string example: Player_123 content: type: string example: 大家好!我刚进入游戏 scope: type: string example: local mapId: type: string example: whale_port timestamp: type: string format: date-time example: "2026-01-08T10:00:00.000Z" streamName: type: string example: Whale Port topicName: type: string example: Game Chat total: type: integer example: 2 count: type: integer example: 2 SystemStatusResponseDto: type: object properties: websocket: type: object properties: totalConnections: type: integer example: 25 authenticatedConnections: type: integer example: 20 activeSessions: type: integer example: 20 mapPlayerCounts: type: object properties: whale_port: type: integer example: 8 pumpkin_valley: type: integer example: 6 novice_village: type: integer example: 6 zulip: type: object properties: serverConnected: type: boolean example: true serverVersion: type: string example: "11.4" botAccountActive: type: boolean example: true availableStreams: type: integer example: 12 gameStreams: type: array items: type: string example: ["Whale Port", "Pumpkin Valley", "Novice Village"] recentMessageCount: type: integer example: 156 uptime: type: integer example: 3600 memory: type: object properties: used: type: string example: "45.2 MB" total: type: string example: "128.0 MB" percentage: type: number example: 35.31 CreateZulipAccountDto: type: object required: - gameUserId - zulipUserId - zulipEmail properties: gameUserId: type: string description: 游戏用户ID example: "12345" zulipUserId: type: integer description: Zulip用户ID example: 67890 zulipEmail: type: string format: email description: Zulip邮箱地址 example: user@example.com zulipFullName: type: string description: Zulip全名 example: John Doe status: type: string description: 账号状态 enum: [active, inactive, suspended, error] default: active UpdateZulipAccountDto: type: object properties: zulipUserId: type: integer description: Zulip用户ID example: 67890 zulipEmail: type: string format: email description: Zulip邮箱地址 example: user@example.com zulipFullName: type: string description: Zulip全名 example: John Doe status: type: string description: 账号状态 enum: [active, inactive, suspended, error] ZulipAccountResponseDto: type: object properties: success: type: boolean example: true data: type: object properties: id: type: string example: "1" gameUserId: type: string example: "12345" zulipUserId: type: integer example: 67890 zulipEmail: type: string example: user@example.com zulipFullName: type: string example: John Doe status: type: string example: active createdAt: type: string format: date-time example: "2026-01-08T10:00:00.000Z" updatedAt: type: string format: date-time example: "2026-01-08T10:00:00.000Z" ZulipAccountListResponseDto: type: object properties: success: type: boolean example: true data: type: array items: $ref: '#/components/schemas/ZulipAccountResponseDto' total: type: integer example: 10 count: type: integer example: 10 ZulipAccountStatsResponseDto: type: object properties: success: type: boolean example: true data: type: object properties: total: type: integer example: 100 active: type: integer example: 85 inactive: type: integer example: 10 suspended: type: integer example: 3 error: type: integer example: 2 BatchUpdateStatusDto: type: object required: - ids - status properties: ids: type: array items: type: string description: 要更新的记录ID列表 example: ["1", "2", "3"] status: type: string description: 新状态 enum: [active, inactive, suspended, error] example: active BatchUpdateResponseDto: type: object properties: success: type: boolean example: true data: type: object properties: updated: type: integer example: 3 failed: type: integer example: 0 message: type: string example: 批量更新完成 AdminCreateUserDto: type: object required: - username - nickname properties: username: type: string description: 用户名 example: newuser nickname: type: string description: 用户昵称 example: 新用户 email: type: string format: email description: 邮箱地址 example: newuser@example.com phone: type: string description: 手机号码 example: "+8613800138000" password: type: string description: 密码 example: password123 role: type: integer description: 用户角色 example: 1 AdminUpdateUserDto: type: object properties: username: type: string description: 用户名 example: updateduser nickname: type: string description: 用户昵称 example: 更新用户 email: type: string format: email description: 邮箱地址 example: updated@example.com phone: type: string description: 手机号码 example: "+8613800138001" role: type: integer description: 用户角色 example: 1 status: type: string description: 用户状态 example: active