Files
whale-town-end/docs/api/openapi.yaml
moyin dd5cc48b49 docs:更新代码检查规范和API文档
- 更新AI代码检查规范简洁版
- 完善开发者代码检查规范
- 扩展OpenAPI文档,添加新的接口定义
2026-01-08 23:03:40 +08:00

2814 lines
77 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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: 地图IDlocal范围时需要
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