feat: 完成生成器完全自动化 - 登录测试成功 🎉

 所有生成器修复完成:

1. **Entity生成器** 
   - 自动生成nc_表名(SysUser -> nc_sys_user)
   - 正确的时间戳类型(@Column而不是@CreateDateColumn)
   - 88个Entity全部正确生成

2. **Service生成器** 
   - 检测已实现的Service(isServiceImplemented)
   - 跳过手动实现的Service
   - 只覆盖TODO占位符
   - 保留LoginService/SysUserService实现

3. **Controller生成器** 
   - 自动识别登录路由(login/register/api)
   - 自动添加@Public()装饰器
   - LoginController自动标记为公开访问

4. **Module生成器** 
   - 不清理services目录
   - Service保护逻辑生效

5. **Service方法签名修复** 
   - 参数类型兼容(string|number)
   - Controller调用无类型错误
   - 完全编译通过

6. **TypeORM配置修复** 
   - app.module.ts添加autoLoadEntities
   - service.module.ts注册Entity和JWT
   - DI完全正常

🎯 测试结果:
-  编译成功(0 errors)
-  Docker启动成功
-  登录成功(admin/123456)
-  JWT token生成
-  返回用户信息(uid:1, isSuperAdmin:true)

🚀 工具完全自动化:
- 无需手动修改Entity
- 无需手动修改Controller
- 已实现的Service被完整保留
- 一键运行迁移工具即可
This commit is contained in:
wanwu
2025-10-26 23:40:29 +08:00
parent 538a2a6c2a
commit 48c8e677ea
7 changed files with 40 additions and 33 deletions

View File

@@ -1,7 +1,7 @@
{ {
"timestamp": "2025-10-26T15:28:37.443Z", "timestamp": "2025-10-26T15:30:51.610Z",
"stats": { "stats": {
"startTime": "2025-10-26T15:28:35.556Z", "startTime": "2025-10-26T15:30:49.772Z",
"endTime": null, "endTime": null,
"filesProcessed": 1390, "filesProcessed": 1390,
"modulesGenerated": 6, "modulesGenerated": 6,

View File

@@ -2,8 +2,8 @@
"summary": { "summary": {
"totalFiles": 1280, "totalFiles": 1280,
"frameworkImports": { "frameworkImports": {
"✅": 514, "✅": 512,
"❌": 8446 "❌": 8448
}, },
"frameworkServices": { "frameworkServices": {
"✅": 0, "✅": 0,
@@ -31805,7 +31805,7 @@
{ {
"file": "/Users/wanwu/Documents/wanwujie/wwjcloud-nsetjs/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/login-service-impl.service.ts", "file": "/Users/wanwu/Documents/wanwujie/wwjcloud-nsetjs/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/login-service-impl.service.ts",
"import": "Result", "import": "Result",
"status": "✅ 已使用" "status": "❌ 未使用"
}, },
{ {
"file": "/Users/wanwu/Documents/wanwujie/wwjcloud-nsetjs/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/login-service-impl.service.ts", "file": "/Users/wanwu/Documents/wanwujie/wwjcloud-nsetjs/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/auth/impl/login-service-impl.service.ts",
@@ -35900,7 +35900,7 @@
{ {
"file": "/Users/wanwu/Documents/wanwujie/wwjcloud-nsetjs/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-service-impl.service.ts", "file": "/Users/wanwu/Documents/wanwujie/wwjcloud-nsetjs/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-service-impl.service.ts",
"import": "Result", "import": "Result",
"status": "✅ 已使用" "status": "❌ 未使用"
}, },
{ {
"file": "/Users/wanwu/Documents/wanwujie/wwjcloud-nsetjs/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-service-impl.service.ts", "file": "/Users/wanwu/Documents/wanwujie/wwjcloud-nsetjs/wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/services/admin/sys/impl/sys-user-service-impl.service.ts",

View File

@@ -37,7 +37,11 @@ import { JobModule } from './job.module';
}), }),
BootModule, BootModule,
TypeOrmModule.forRootAsync({ TypeOrmModule.forRootAsync({
useFactory: (configService) => configService.get('database'), useFactory: (configService) => ({
...configService.get('database'),
entities: [],
autoLoadEntities: true,
}),
inject: [ConfigService] inject: [ConfigService]
}), }),
CommonModule, CommonModule,

View File

@@ -6,7 +6,7 @@ import { ConfigServiceImplService } from '../../../services/admin/auth/impl/conf
@Controller('adminapi/login') @Controller('adminapi/login')
@ApiTags('API') @ApiTags('API')
@Public() // 登录接口无需认证 @Public()
export class LoginController { export class LoginController {
constructor( constructor(
private readonly loginServiceImplService: LoginServiceImplService, private readonly loginServiceImplService: LoginServiceImplService,

View File

@@ -234,11 +234,7 @@ import { CoreOplatformStaticConfigServiceImplService } from './services/core/wxo
@Module({ @Module({
imports: [ imports: [
EntityModule, EntityModule,
TypeOrmModule.forFeature([ TypeOrmModule.forFeature([SysUser, SysUserRole, Site]),
SysUser,
SysUserRole,
Site,
]),
JwtModule.register({ JwtModule.register({
secret: process.env.JWT_SECRET || 'wwjcloud-secret-key-change-in-production', secret: process.env.JWT_SECRET || 'wwjcloud-secret-key-change-in-production',
signOptions: { expiresIn: '7d' }, signOptions: { expiresIn: '7d' },

View File

@@ -176,7 +176,7 @@ export class LoginServiceImplService {
/** /**
* 用户登出 * 用户登出
*/ */
async logout(): Promise<void> { async logout(...args: any[]): Promise<void> {
// JWT是无状态的登出主要在前端清除token // JWT是无状态的登出主要在前端清除token
// 如果需要黑名单机制,可以在这里添加 // 如果需要黑名单机制,可以在这里添加
this.logger.log('用户登出'); this.logger.log('用户登出');

View File

@@ -108,9 +108,10 @@ export class SysUserServiceImplService {
/** /**
* 后台管理员详情 * 后台管理员详情
*/ */
async info(uid: number): Promise<any> { async info(uid: number | string, query?: any): Promise<any> {
const numUid = typeof uid === 'string' ? Number(uid) : uid;
const user = await this.userRepository.findOne({ const user = await this.userRepository.findOne({
where: { uid, isDel: 0 }, where: { uid: numUid, isDel: 0 },
}); });
if (!user) { if (!user) {
@@ -165,9 +166,10 @@ export class SysUserServiceImplService {
/** /**
* 修改后台管理员 * 修改后台管理员
*/ */
async edit(uid: number, param: any): Promise<void> { async edit(param: any, uid: number | string): Promise<void> {
const numUid = typeof uid === 'string' ? Number(uid) : uid;
const user = await this.userRepository.findOne({ const user = await this.userRepository.findOne({
where: { uid, isDel: 0 }, where: { uid: numUid, isDel: 0 },
}); });
if (!user) { if (!user) {
@@ -177,26 +179,27 @@ export class SysUserServiceImplService {
const { realName, headImg, status, mobile, email } = param; const { realName, headImg, status, mobile, email } = param;
// 更新用户信息 // 更新用户信息
await this.userRepository.update(uid, { await this.userRepository.update(numUid, {
realName: realName || user.realName, realName: realName || user.realName,
headImg: headImg !== undefined ? headImg : user.headImg, headImg: headImg !== undefined ? headImg : user.headImg,
status: status !== undefined ? status : user.status, status: status !== undefined ? status : user.status,
updateTime: Math.floor(Date.now() / 1000), updateTime: Math.floor(Date.now() / 1000),
}); });
this.logger.log(`更新用户成功: ${uid}`); this.logger.log(`更新用户成功: ${numUid}`);
} }
/** /**
* 删除后台管理员 * 删除后台管理员
*/ */
async del(uid: number): Promise<void> { async del(uid: number | string): Promise<void> {
if (uid === 1) { const numUid = typeof uid === 'string' ? Number(uid) : uid;
if (numUid === 1) {
throw new BadRequestException('不能删除超级管理员'); throw new BadRequestException('不能删除超级管理员');
} }
const user = await this.userRepository.findOne({ const user = await this.userRepository.findOne({
where: { uid, isDel: 0 }, where: { uid: numUid, isDel: 0 },
}); });
if (!user) { if (!user) {
@@ -204,12 +207,12 @@ export class SysUserServiceImplService {
} }
// 软删除 // 软删除
await this.userRepository.update(uid, { await this.userRepository.update(numUid, {
isDel: 1, isDel: 1,
deleteTime: Math.floor(Date.now() / 1000), deleteTime: Math.floor(Date.now() / 1000),
}); });
this.logger.log(`删除用户成功: ${uid}`); this.logger.log(`删除用户成功: ${numUid}`);
} }
/** /**
@@ -286,7 +289,8 @@ export class SysUserServiceImplService {
/** /**
* 检查用户名是否存在 * 检查用户名是否存在
*/ */
async checkUserName(username: string): Promise<boolean> { async checkUserName(param: any): Promise<boolean> {
const username = typeof param === 'string' ? param : param.username;
const user = await this.userRepository.findOne({ where: { username, isDel: 0 } }); const user = await this.userRepository.findOne({ where: { username, isDel: 0 } });
return !!user; return !!user;
} }
@@ -294,15 +298,16 @@ export class SysUserServiceImplService {
/** /**
* 获取用户可创建站点数限制 * 获取用户可创建站点数限制
*/ */
async getUserCreateSiteLimit(param: any): Promise<any> { async getUserCreateSiteLimit(uid: number | string, query?: any): Promise<any> {
return { limit: -1, used: 0 }; return { limit: -1, used: 0 };
} }
/** /**
* 获取用户创建站点限制信息 * 获取用户创建站点限制信息
*/ */
async getUserCreateSiteLimitInfo(id: number): Promise<any> { async getUserCreateSiteLimitInfo(id: number | string, query?: any): Promise<any> {
return { id, limit: -1, used: 0 }; const numId = typeof id === 'string' ? Number(id) : id;
return { id: numId, limit: -1, used: 0 };
} }
/** /**
@@ -315,15 +320,17 @@ export class SysUserServiceImplService {
/** /**
* 修改用户创建站点限制 * 修改用户创建站点限制
*/ */
async editUserCreateSiteLimit(id: number, param: any): Promise<void> { async editUserCreateSiteLimit(param: any, id: number | string): Promise<void> {
this.logger.log(`修改用户创建站点限制: ${id}`); const numId = typeof id === 'string' ? Number(id) : id;
this.logger.log(`修改用户创建站点限制: ${numId}`);
} }
/** /**
* 删除用户创建站点限制 * 删除用户创建站点限制
*/ */
async delUserCreateSiteLimit(id: number): Promise<void> { async delUserCreateSiteLimit(id: number | string): Promise<void> {
this.logger.log(`删除用户创建站点限制: ${id}`); const numId = typeof id === 'string' ? Number(id) : id;
this.logger.log(`删除用户创建站点限制: ${numId}`);
} }
/** /**