Files
whale-town-end/src/main.ts
moyin 003091494f docs:升级 OpenAPI 文档配置到 v2.0.0
- 版本号从 1.1.1 升级到 2.0.0
- 新增聊天系统 (chat) API 标签和说明
- 完善 API 文档描述,包含 WebSocket 连接指南
- 添加 JWT Token 格式要求说明
- 新增开发环境和生产环境服务器配置
- 包含 Zulip 集成和地图系统说明
2026-01-07 15:07:01 +08:00

148 lines
4.3 KiB
TypeScript
Raw 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.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
/**
* 检查数据库配置是否完整 by angjustinl 2025-12-17
*
* @returns 是否配置了数据库
*/
function isDatabaseConfigured(): boolean {
const requiredEnvVars = ['DB_HOST', 'DB_PORT', 'DB_USERNAME', 'DB_PASSWORD', 'DB_NAME'];
return requiredEnvVars.every(varName => process.env[varName]);
}
/**
* 打印启动横幅
*/
function printBanner() {
const isDatabaseMode = isDatabaseConfigured();
console.log('\n' + '='.repeat(70));
console.log('🎮 Pixel Game Server');
console.log('='.repeat(70));
console.log(`📦 存储模式: ${isDatabaseMode ? '数据库模式 (MySQL)' : '内存模式 (Memory)'}`);
if (!isDatabaseMode) {
console.log('⚠️ 警告: 未检测到数据库配置,使用内存存储');
console.log('💡 提示: 数据将在服务重启后丢失');
console.log('📝 配置: 请在 .env 文件中配置数据库连接信息');
} else {
console.log('✅ 数据库: 已连接到 MySQL 数据库');
}
console.log('='.repeat(70) + '\n');
}
async function bootstrap() {
const app = await NestFactory.create(AppModule, {
logger: ['error', 'warn', 'log'],
});
// 允许前端后台如Vite/React跨域访问包括WebSocket
app.enableCors({
origin: [
'http://localhost:3000',
'http://localhost:5173', // Vite默认端口
'https://whaletownend.xinghangee.icu',
/^https:\/\/.*\.xinghangee\.icu$/
],
credentials: true,
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'],
});
// 全局启用校验管道(核心配置)
app.useGlobalPipes(
new ValidationPipe({
whitelist: true, // 过滤掉 DTO 中未定义的字段(比如传了个 `age` 但 DTO 里没有,会自动忽略)
forbidNonWhitelisted: true, // 若传了未定义的字段,直接报错(防止传多余参数)
transform: true, // 自动把入参转为 DTO 对应的类型(比如前端传的字符串数字 `'1'` 转为数字 `1`
}),
);
// 配置Swagger文档
const config = new DocumentBuilder()
.setTitle('Pixel Game Server API')
.setDescription(`
像素游戏服务器API文档 - 包含用户认证、聊天系统、Zulip集成等功能
## 主要功能模块
### 🔐 用户认证 (auth)
- 用户注册、登录
- JWT Token 管理
- 邮箱验证和密码重置
- 验证码登录
### 💬 聊天系统 (chat)
- WebSocket 实时聊天
- 聊天历史记录
- 系统状态监控
- Zulip 集成状态
### 👑 管理员后台 (admin)
- 用户管理
- 系统监控
- 日志查看
## WebSocket 连接
游戏聊天功能主要通过 WebSocket 实现:
**连接地址**: \`ws://localhost:3000/game\`
**支持的事件**:
- \`login\`: 用户登录(需要 JWT Token
- \`chat\`: 发送聊天消息
- \`position_update\`: 位置更新
**JWT Token 要求**:
- issuer: \`whale-town\`
- audience: \`whale-town-users\`
- type: \`access\`
- 必需字段: \`sub\`, \`username\`, \`email\`, \`role\`
## Zulip 集成
系统集成了 Zulip 聊天服务,实现游戏内聊天与 Zulip 社群的双向同步。
**支持的地图**:
- Whale Port (鲸鱼港)
- Pumpkin Valley (南瓜谷)
- Novice Village (新手村)
`)
.setVersion('2.0.0')
.addTag('auth', '🔐 用户认证相关接口')
.addTag('chat', '💬 聊天系统相关接口')
.addTag('admin', '👑 管理员后台相关接口')
.addBearerAuth(
{
type: 'http',
scheme: 'bearer',
bearerFormat: 'JWT',
name: 'JWT',
description: '请输入JWT token',
in: 'header',
},
'JWT-auth',
)
.addServer('http://localhost:3000', '开发环境')
.addServer('https://whaletownend.xinghangee.icu', '生产环境')
.build();
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api-docs', app, document, {
swaggerOptions: {
persistAuthorization: true,
},
});
await app.listen(3000);
console.log('Pixel Game Server is running on http://localhost:3000');
console.log('API Documentation is available at http://localhost:3000/api-docs');
}
bootstrap();