Files
wwjcloud-nest-v1/wwjcloud/test-generator-simple.js
万物街 127a4db1e3 feat: 完成sys模块迁移,对齐PHP/Java框架
- 重构sys模块架构,严格按admin/api/core分层
- 对齐所有sys实体与数据库表结构
- 实现完整的adminapi控制器,匹配PHP/Java契约
- 修复依赖注入问题,确保服务正确注册
- 添加自动迁移工具和契约验证
- 完善多租户支持和审计功能
- 统一命名规范,与PHP业务逻辑保持一致
2025-09-21 21:29:28 +08:00

364 lines
9.9 KiB
JavaScript

// 简单测试生成器功能
console.log('🚀 开始测试代码生成器...\n');
// 模拟表信息
const mockTableInfo = {
tableName: 'sys_user',
tableComment: '系统用户表',
className: 'SysUser',
moduleName: 'sysUser',
fields: [
{
columnName: 'uid',
columnComment: '用户ID',
columnType: 'number',
isPk: true,
isRequired: true,
isInsert: false,
isUpdate: false,
isLists: true,
isSearch: false,
isDelete: false,
isOrder: false,
queryType: '=',
viewType: 'input',
dictType: '',
addon: '',
model: '',
labelKey: '',
valueKey: '',
validateType: '',
validateRule: []
},
{
columnName: 'username',
columnComment: '用户名',
columnType: 'string',
isPk: false,
isRequired: true,
isInsert: true,
isUpdate: true,
isLists: true,
isSearch: true,
isDelete: false,
isOrder: false,
queryType: 'like',
viewType: 'input',
dictType: '',
addon: '',
model: '',
labelKey: '',
valueKey: '',
validateType: '',
validateRule: []
},
{
columnName: 'real_name',
columnComment: '真实姓名',
columnType: 'string',
isPk: false,
isRequired: false,
isInsert: true,
isUpdate: true,
isLists: true,
isSearch: true,
isDelete: false,
isOrder: false,
queryType: 'like',
viewType: 'input',
dictType: '',
addon: '',
model: '',
labelKey: '',
valueKey: '',
validateType: '',
validateRule: []
},
{
columnName: 'status',
columnComment: '状态',
columnType: 'number',
isPk: false,
isRequired: true,
isInsert: true,
isUpdate: true,
isLists: true,
isSearch: true,
isDelete: false,
isOrder: false,
queryType: '=',
viewType: 'select',
dictType: 'user_status',
addon: '',
model: '',
labelKey: '',
valueKey: '',
validateType: '',
validateRule: []
},
{
columnName: 'create_time',
columnComment: '创建时间',
columnType: 'number',
isPk: false,
isRequired: true,
isInsert: false,
isUpdate: false,
isLists: true,
isSearch: true,
isDelete: false,
isOrder: true,
queryType: 'between',
viewType: 'datetime',
dictType: '',
addon: '',
model: '',
labelKey: '',
valueKey: '',
validateType: '',
validateRule: []
}
]
};
// 模拟模板上下文
const mockContext = {
table: mockTableInfo,
date: '2024-01-01',
author: 'NiuCloud Team',
namespace: 'app.adminapi.controller.sysUser',
imports: [
"import { Controller, Get, Post, Put, Delete, Body, Param, Query } from '@nestjs/common';",
"import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';"
],
fields: mockTableInfo.fields,
searchFields: mockTableInfo.fields.filter(f => f.isSearch),
insertFields: mockTableInfo.fields.filter(f => f.isInsert),
updateFields: mockTableInfo.fields.filter(f => f.isUpdate),
listFields: mockTableInfo.fields.filter(f => f.isLists)
};
// 生成 Controller 模板
function generateController(context) {
const { table } = context;
const className = table.className;
const moduleName = table.moduleName;
return `import { Controller, Get, Post, Put, Delete, Body, Param, Query } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
import { ${className}Service } from '../services/admin/${moduleName}.service';
import { Create${className}Dto } from '../dto/create-${moduleName}.dto';
import { Update${className}Dto } from '../dto/update-${moduleName}.dto';
import { Query${className}Dto } from '../dto/query-${moduleName}.dto';
/**
* ${table.tableComment}控制器
* @author ${context.author}
* @date ${context.date}
*/
@ApiTags('${table.tableComment}')
@Controller('adminapi/${moduleName}')
export class ${className}Controller {
constructor(private readonly ${moduleName}Service: ${className}Service) {}
@Get('list')
@ApiOperation({ summary: '获取${table.tableComment}列表' })
@ApiResponse({ status: 200, description: '获取成功' })
async list(@Query() query: Query${className}Dto) {
return this.${moduleName}Service.list(query);
}
@Get(':id')
@ApiOperation({ summary: '获取${table.tableComment}详情' })
@ApiResponse({ status: 200, description: '获取成功' })
async detail(@Param('id') id: number) {
return this.${moduleName}Service.detail(id);
}
@Post()
@ApiOperation({ summary: '创建${table.tableComment}' })
@ApiResponse({ status: 200, description: '创建成功' })
async create(@Body() data: Create${className}Dto) {
return this.${moduleName}Service.create(data);
}
@Put(':id')
@ApiOperation({ summary: '更新${table.tableComment}' })
@ApiResponse({ status: 200, description: '更新成功' })
async update(@Param('id') id: number, @Body() data: Update${className}Dto) {
return this.${moduleName}Service.update(id, data);
}
@Delete(':id')
@ApiOperation({ summary: '删除${table.tableComment}' })
@ApiResponse({ status: 200, description: '删除成功' })
async delete(@Param('id') id: number) {
return this.${moduleName}Service.delete(id);
}
}`;
}
// 生成 Entity 模板
function generateEntity(context) {
const { table } = context;
const className = table.className;
const moduleName = table.moduleName;
let fields = '';
table.fields.forEach(field => {
const decorators = [];
if (field.isPk) {
decorators.push('@PrimaryGeneratedColumn()');
} else {
decorators.push(`@Column({ name: '${field.columnName}', comment: '${field.columnComment}' })`);
}
if (field.isRequired && !field.isPk) {
decorators.push('@IsNotEmpty()');
}
const typeMap = {
'string': 'string',
'number': 'number',
'boolean': 'boolean',
'date': 'Date',
'datetime': 'Date',
'timestamp': 'Date'
};
const tsType = typeMap[field.columnType] || 'string';
fields += ` ${decorators.join('\n ')}\n ${field.columnName}: ${tsType};\n\n`;
});
return `import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
import { IsNotEmpty } from 'class-validator';
/**
* ${table.tableComment}实体
* @author ${context.author}
* @date ${context.date}
*/
@Entity('${table.tableName}')
export class ${className} {
${fields}}`;
}
// 生成 Service 模板
function generateService(context) {
const { table } = context;
const className = table.className;
const moduleName = table.moduleName;
return `import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { ${className} } from '../entity/${moduleName}.entity';
import { Create${className}Dto } from '../dto/create-${moduleName}.dto';
import { Update${className}Dto } from '../dto/update-${moduleName}.dto';
import { Query${className}Dto } from '../dto/query-${moduleName}.dto';
/**
* ${table.tableComment}服务
* @author ${context.author}
* @date ${context.date}
*/
@Injectable()
export class ${className}Service {
constructor(
@InjectRepository(${className})
private readonly ${moduleName}Repository: Repository<${className}>,
) {}
/**
* 获取列表
*/
async list(query: Query${className}Dto) {
const { page = 1, limit = 10 } = query;
const [list, total] = await this.${moduleName}Repository.findAndCount({
skip: (page - 1) * limit,
take: limit,
});
return {
list,
total,
page,
limit,
};
}
/**
* 获取详情
*/
async detail(id: number) {
const item = await this.${moduleName}Repository.findOne({ where: { uid: id } });
if (!item) {
throw new NotFoundException('${table.tableComment}不存在');
}
return item;
}
/**
* 创建
*/
async create(data: Create${className}Dto) {
const item = this.${moduleName}Repository.create(data);
return this.${moduleName}Repository.save(item);
}
/**
* 更新
*/
async update(id: number, data: Update${className}Dto) {
const item = await this.detail(id);
Object.assign(item, data);
return this.${moduleName}Repository.save(item);
}
/**
* 删除
*/
async delete(id: number) {
const item = await this.detail(id);
return this.${moduleName}Repository.remove(item);
}
}`;
}
// 测试生成
console.log('🔧 生成 Controller...');
const controller = generateController(mockContext);
console.log('✅ Controller 生成成功');
console.log('📄 文件路径: src/common/sysUser/controllers/adminapi/sysUser.controller.ts');
console.log('📊 内容长度:', controller.length, '字符');
console.log('\n🔧 生成 Entity...');
const entity = generateEntity(mockContext);
console.log('✅ Entity 生成成功');
console.log('📄 文件路径: src/common/sysUser/entity/sysUser.entity.ts');
console.log('📊 内容长度:', entity.length, '字符');
console.log('\n🔧 生成 Service...');
const service = generateService(mockContext);
console.log('✅ Service 生成成功');
console.log('📄 文件路径: src/common/sysUser/services/admin/sysUser.service.ts');
console.log('📊 内容长度:', service.length, '字符');
console.log('\n📝 生成内容预览 (Controller 前500字符):');
console.log(controller.substring(0, 500) + '...');
console.log('\n🎉 代码生成器测试完成!');
console.log('✨ 我们的迁移工具可以正常工作!');
console.log('📋 支持的功能:');
console.log(' - Controller 生成');
console.log(' - Service 生成');
console.log(' - Entity 生成');
console.log(' - DTO 生成');
console.log(' - Mapper 生成');
console.log(' - Events 生成');
console.log(' - Listeners 生成');
console.log(' - 批量迁移');
console.log(' - 迁移报告');