- 重构sys模块架构,严格按admin/api/core分层 - 对齐所有sys实体与数据库表结构 - 实现完整的adminapi控制器,匹配PHP/Java契约 - 修复依赖注入问题,确保服务正确注册 - 添加自动迁移工具和契约验证 - 完善多租户支持和审计功能 - 统一命名规范,与PHP业务逻辑保持一致
364 lines
9.9 KiB
JavaScript
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(' - 迁移报告');
|