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:
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"timestamp": "2025-10-26T15:28:37.443Z",
|
||||
"timestamp": "2025-10-26T15:30:51.610Z",
|
||||
"stats": {
|
||||
"startTime": "2025-10-26T15:28:35.556Z",
|
||||
"startTime": "2025-10-26T15:30:49.772Z",
|
||||
"endTime": null,
|
||||
"filesProcessed": 1390,
|
||||
"modulesGenerated": 6,
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"summary": {
|
||||
"totalFiles": 1280,
|
||||
"frameworkImports": {
|
||||
"✅": 514,
|
||||
"❌": 8446
|
||||
"✅": 512,
|
||||
"❌": 8448
|
||||
},
|
||||
"frameworkServices": {
|
||||
"✅": 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",
|
||||
"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",
|
||||
@@ -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",
|
||||
"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",
|
||||
|
||||
@@ -37,7 +37,11 @@ import { JobModule } from './job.module';
|
||||
}),
|
||||
BootModule,
|
||||
TypeOrmModule.forRootAsync({
|
||||
useFactory: (configService) => configService.get('database'),
|
||||
useFactory: (configService) => ({
|
||||
...configService.get('database'),
|
||||
entities: [],
|
||||
autoLoadEntities: true,
|
||||
}),
|
||||
inject: [ConfigService]
|
||||
}),
|
||||
CommonModule,
|
||||
|
||||
@@ -6,7 +6,7 @@ import { ConfigServiceImplService } from '../../../services/admin/auth/impl/conf
|
||||
|
||||
@Controller('adminapi/login')
|
||||
@ApiTags('API')
|
||||
@Public() // 登录接口无需认证
|
||||
@Public()
|
||||
export class LoginController {
|
||||
constructor(
|
||||
private readonly loginServiceImplService: LoginServiceImplService,
|
||||
|
||||
@@ -234,11 +234,7 @@ import { CoreOplatformStaticConfigServiceImplService } from './services/core/wxo
|
||||
@Module({
|
||||
imports: [
|
||||
EntityModule,
|
||||
TypeOrmModule.forFeature([
|
||||
SysUser,
|
||||
SysUserRole,
|
||||
Site,
|
||||
]),
|
||||
TypeOrmModule.forFeature([SysUser, SysUserRole, Site]),
|
||||
JwtModule.register({
|
||||
secret: process.env.JWT_SECRET || 'wwjcloud-secret-key-change-in-production',
|
||||
signOptions: { expiresIn: '7d' },
|
||||
|
||||
@@ -176,7 +176,7 @@ export class LoginServiceImplService {
|
||||
/**
|
||||
* 用户登出
|
||||
*/
|
||||
async logout(): Promise<void> {
|
||||
async logout(...args: any[]): Promise<void> {
|
||||
// JWT是无状态的,登出主要在前端清除token
|
||||
// 如果需要黑名单机制,可以在这里添加
|
||||
this.logger.log('用户登出');
|
||||
|
||||
@@ -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({
|
||||
where: { uid, isDel: 0 },
|
||||
where: { uid: numUid, isDel: 0 },
|
||||
});
|
||||
|
||||
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({
|
||||
where: { uid, isDel: 0 },
|
||||
where: { uid: numUid, isDel: 0 },
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
@@ -177,26 +179,27 @@ export class SysUserServiceImplService {
|
||||
const { realName, headImg, status, mobile, email } = param;
|
||||
|
||||
// 更新用户信息
|
||||
await this.userRepository.update(uid, {
|
||||
await this.userRepository.update(numUid, {
|
||||
realName: realName || user.realName,
|
||||
headImg: headImg !== undefined ? headImg : user.headImg,
|
||||
status: status !== undefined ? status : user.status,
|
||||
updateTime: Math.floor(Date.now() / 1000),
|
||||
});
|
||||
|
||||
this.logger.log(`更新用户成功: ${uid}`);
|
||||
this.logger.log(`更新用户成功: ${numUid}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除后台管理员
|
||||
*/
|
||||
async del(uid: number): Promise<void> {
|
||||
if (uid === 1) {
|
||||
async del(uid: number | string): Promise<void> {
|
||||
const numUid = typeof uid === 'string' ? Number(uid) : uid;
|
||||
if (numUid === 1) {
|
||||
throw new BadRequestException('不能删除超级管理员');
|
||||
}
|
||||
|
||||
const user = await this.userRepository.findOne({
|
||||
where: { uid, isDel: 0 },
|
||||
where: { uid: numUid, isDel: 0 },
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
@@ -204,12 +207,12 @@ export class SysUserServiceImplService {
|
||||
}
|
||||
|
||||
// 软删除
|
||||
await this.userRepository.update(uid, {
|
||||
await this.userRepository.update(numUid, {
|
||||
isDel: 1,
|
||||
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 } });
|
||||
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 };
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户创建站点限制信息
|
||||
*/
|
||||
async getUserCreateSiteLimitInfo(id: number): Promise<any> {
|
||||
return { id, limit: -1, used: 0 };
|
||||
async getUserCreateSiteLimitInfo(id: number | string, query?: any): Promise<any> {
|
||||
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> {
|
||||
this.logger.log(`修改用户创建站点限制: ${id}`);
|
||||
async editUserCreateSiteLimit(param: any, id: number | string): Promise<void> {
|
||||
const numId = typeof id === 'string' ? Number(id) : id;
|
||||
this.logger.log(`修改用户创建站点限制: ${numId}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除用户创建站点限制
|
||||
*/
|
||||
async delUserCreateSiteLimit(id: number): Promise<void> {
|
||||
this.logger.log(`删除用户创建站点限制: ${id}`);
|
||||
async delUserCreateSiteLimit(id: number | string): Promise<void> {
|
||||
const numId = typeof id === 'string' ? Number(id) : id;
|
||||
this.logger.log(`删除用户创建站点限制: ${numId}`);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user