diff --git a/package.json b/package.json index af81d25..d9a152a 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,16 @@ "@nestjs/platform-express": "^10.4.20", "@nestjs/platform-socket.io": "^10.4.20", "@nestjs/schedule": "^4.1.2", + "@nestjs/typeorm": "^11.0.0", "@nestjs/websockets": "^10.4.20", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.3", + "mysql2": "^3.16.0", "nestjs-pino": "^4.5.0", "pino": "^10.1.0", - "reflect-metadata": "^0.1.14", - "rxjs": "^7.8.2" + "rxjs": "^7.8.2", + "typeorm": "^0.3.28" }, "devDependencies": { "@nestjs/cli": "^10.4.9", diff --git a/src/core/db/.gitkeep b/src/core/db/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/core/utils/.gitkeep b/src/core/utils/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main.ts b/src/main.ts index cd3ba5e..1ea34d4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,8 +1,17 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; +import { ValidationPipe } from '@nestjs/common'; async function bootstrap() { const app = await NestFactory.create(AppModule); + // 全局启用校验管道(核心配置) + app.useGlobalPipes( + new ValidationPipe({ + whitelist: true, // 过滤掉 DTO 中未定义的字段(比如传了个 `age` 但 DTO 里没有,会自动忽略) + forbidNonWhitelisted: true, // 若传了未定义的字段,直接报错(防止传多余参数) + transform: true, // 自动把入参转为 DTO 对应的类型(比如前端传的字符串数字 `'1'` 转为数字 `1`) + }), + ); await app.listen(3000); console.log('Pixel Game Server is running on http://localhost:3000'); } diff --git a/test-users-functionality.ts b/test-users-functionality.ts new file mode 100644 index 0000000..ab9c9cd --- /dev/null +++ b/test-users-functionality.ts @@ -0,0 +1,95 @@ +/** + * 用户功能测试脚本 + * + * 使用方法:npx ts-node test-users-functionality.ts + */ + +import 'reflect-metadata'; +import { NestFactory } from '@nestjs/core'; +import { AppModule } from './src/app.module'; +import { UsersService } from './src/core/db/users/users.service'; +import { CreateUserDto } from './src/core/db/users/users.dto'; + +async function testUsersFunctionality() { + console.log('🚀 启动用户功能测试...\n'); + + try { + // 创建NestJS应用 + const app = await NestFactory.createApplicationContext(AppModule, { + logger: false, // 禁用日志以保持输出清洁 + }); + + // 获取用户服务 + const usersService = app.get(UsersService); + console.log('✅ 成功获取UsersService实例'); + + // 测试数据 + const testUserDto: CreateUserDto = { + username: `testuser_${Date.now()}`, + email: `test_${Date.now()}@example.com`, + phone: `+86138${Date.now().toString().slice(-8)}`, + password_hash: 'hashed_password_123', + nickname: '功能测试用户', + github_id: `github_${Date.now()}`, + avatar_url: 'https://example.com/avatar.jpg', + role: 1 + }; + + console.log('\n📝 测试创建用户...'); + const createdUser = await usersService.create(testUserDto); + console.log('✅ 用户创建成功:', { + id: createdUser.id.toString(), + username: createdUser.username, + nickname: createdUser.nickname, + email: createdUser.email + }); + + console.log('\n🔍 测试查询用户...'); + const foundUser = await usersService.findOne(createdUser.id); + console.log('✅ 用户查询成功:', foundUser.username); + + console.log('\n📊 测试用户统计...'); + const userCount = await usersService.count(); + console.log('✅ 当前用户总数:', userCount); + + console.log('\n🔍 测试根据用户名查询...'); + const userByUsername = await usersService.findByUsername(createdUser.username); + console.log('✅ 根据用户名查询成功:', userByUsername?.nickname); + + console.log('\n✏️ 测试更新用户...'); + const updatedUser = await usersService.update(createdUser.id, { + nickname: '更新后的昵称' + }); + console.log('✅ 用户更新成功:', updatedUser.nickname); + + console.log('\n📋 测试查询所有用户...'); + const allUsers = await usersService.findAll(5); // 限制5个 + console.log('✅ 查询到用户数量:', allUsers.length); + + console.log('\n🔍 测试搜索功能...'); + const searchResults = await usersService.search('测试'); + console.log('✅ 搜索结果数量:', searchResults.length); + + console.log('\n🗑️ 测试删除用户...'); + const deleteResult = await usersService.remove(createdUser.id); + console.log('✅ 用户删除成功:', deleteResult.message); + + // 验证删除 + console.log('\n✅ 验证删除结果...'); + try { + await usersService.findOne(createdUser.id); + console.log('❌ 删除验证失败:用户仍然存在'); + } catch (error) { + console.log('✅ 删除验证成功:用户已不存在'); + } + + await app.close(); + console.log('\n🎉 所有功能测试通过!'); + + } catch (error) { + console.error('❌ 测试失败:', error); + process.exit(1); + } +} + +testUsersFunctionality(); \ No newline at end of file diff --git a/src/business/.gitkeep b/test/core/db/users.test.ts similarity index 100% rename from src/business/.gitkeep rename to test/core/db/users.test.ts