172 lines
5.2 KiB
JavaScript
172 lines
5.2 KiB
JavaScript
|
#!/usr/bin/env node
|
|||
|
|
|||
|
/**
|
|||
|
* 数据库模型生成脚本
|
|||
|
* 功能等同于gen_models.ps1
|
|||
|
*/
|
|||
|
|
|||
|
const { execSync } = require('child_process');
|
|||
|
const fs = require('fs');
|
|||
|
const path = require('path');
|
|||
|
|
|||
|
// 配置信息
|
|||
|
const config = {
|
|||
|
// 数据库连接信息
|
|||
|
dbUrl: 'qnc:5vg67b3UNHu8@tcp(127.0.0.1:21001)/qnc',
|
|||
|
// 输出目录
|
|||
|
outputDir: './model',
|
|||
|
// 模板目录
|
|||
|
templateDir: '../template',
|
|||
|
// 目标目录
|
|||
|
targetDir: '../../app/user/model',
|
|||
|
// 表名列表
|
|||
|
tables: [
|
|||
|
'agent',
|
|||
|
// 'agent_active_stat',
|
|||
|
'agent_audit',
|
|||
|
'agent_real_name'
|
|||
|
// 'agent_closure',
|
|||
|
// 'agent_commission',
|
|||
|
// 'agent_commission_deduction',
|
|||
|
// 'agent_link',
|
|||
|
// 'agent_membership_config',
|
|||
|
// 'agent_membership_recharge_order',
|
|||
|
// 'agent_membership_user_config',
|
|||
|
// 'agent_order',
|
|||
|
// 'agent_platform_deduction',
|
|||
|
// 'agent_product_config',
|
|||
|
// 'agent_rewards',
|
|||
|
// 'agent_wallet',
|
|||
|
// 'agent_withdrawal',
|
|||
|
// 'feature',
|
|||
|
// 'global_notifications',
|
|||
|
// 'order',
|
|||
|
// 'product',
|
|||
|
// 'product_feature',
|
|||
|
// 'query',
|
|||
|
// 'user',
|
|||
|
// 'user_auth',
|
|||
|
// 'example',
|
|||
|
// 'authorization',
|
|||
|
// 'authorization_face'
|
|||
|
]
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
* 将表名转换为驼峰命名法
|
|||
|
* @param {string} tableName 表名
|
|||
|
* @returns {string} 驼峰命名的表名
|
|||
|
*/
|
|||
|
function convertToCamelCase(tableName) {
|
|||
|
try {
|
|||
|
// 将表名按_分割,并将每个部分首字母大写
|
|||
|
const parts = tableName.split('_');
|
|||
|
let camelCase = '';
|
|||
|
for (const part of parts) {
|
|||
|
if (part.length > 0) {
|
|||
|
camelCase += part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();
|
|||
|
}
|
|||
|
}
|
|||
|
return camelCase;
|
|||
|
} catch (error) {
|
|||
|
console.error(`Error in convertToCamelCase for table: ${tableName}`);
|
|||
|
console.error(error.message);
|
|||
|
return tableName; // 出错时返回原表名
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 确保目录存在
|
|||
|
* @param {string} dirPath 目录路径
|
|||
|
*/
|
|||
|
function ensureDirectoryExists(dirPath) {
|
|||
|
if (!fs.existsSync(dirPath)) {
|
|||
|
console.log(`Creating directory: ${dirPath}`);
|
|||
|
fs.mkdirSync(dirPath, { recursive: true });
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 为单个表生成模型
|
|||
|
* @param {string} table 表名
|
|||
|
*/
|
|||
|
function generateModelForTable(table) {
|
|||
|
try {
|
|||
|
console.log('=========================================');
|
|||
|
console.log(`Processing table: ${table}`);
|
|||
|
|
|||
|
// 生成模型
|
|||
|
console.log('Generating model...');
|
|||
|
const command = `goctl model mysql datasource -url="${config.dbUrl}" -table="${table}" -dir="${config.outputDir}" --home="${config.templateDir}" -cache=true --style=goZero`;
|
|||
|
console.log(`Running command: ${command}`);
|
|||
|
|
|||
|
execSync(command, { stdio: 'inherit' });
|
|||
|
|
|||
|
// 将表名转换为驼峰命名法
|
|||
|
const camelCaseName = convertToCamelCase(table);
|
|||
|
console.log(`Table name converted to: ${camelCaseName}`);
|
|||
|
|
|||
|
// 定义源文件和目标文件路径
|
|||
|
const sourceModelFile = path.join(config.outputDir, `${camelCaseName}Model.go`);
|
|||
|
const sourceModelGenFile = path.join(config.outputDir, `${camelCaseName}Model_gen.go`);
|
|||
|
const targetModelFile = path.join(config.targetDir, `${camelCaseName}Model.go`);
|
|||
|
const targetModelGenFile = path.join(config.targetDir, `${camelCaseName}Model_gen.go`);
|
|||
|
|
|||
|
console.log('Source files:');
|
|||
|
console.log(` - ${sourceModelFile}`);
|
|||
|
console.log(` - ${sourceModelGenFile}`);
|
|||
|
console.log('Target files:');
|
|||
|
console.log(` - ${targetModelFile}`);
|
|||
|
console.log(` - ${targetModelGenFile}`);
|
|||
|
|
|||
|
// 检查源文件是否存在并移动
|
|||
|
if (fs.existsSync(sourceModelFile)) {
|
|||
|
console.log(`Moving ${sourceModelFile} to ${targetModelFile}`);
|
|||
|
fs.copyFileSync(sourceModelFile, targetModelFile);
|
|||
|
fs.unlinkSync(sourceModelFile);
|
|||
|
} else {
|
|||
|
console.log(`WARNING: Source file not found: ${sourceModelFile}`);
|
|||
|
}
|
|||
|
|
|||
|
if (fs.existsSync(sourceModelGenFile)) {
|
|||
|
console.log(`Moving ${sourceModelGenFile} to ${targetModelGenFile}`);
|
|||
|
fs.copyFileSync(sourceModelGenFile, targetModelGenFile);
|
|||
|
fs.unlinkSync(sourceModelGenFile);
|
|||
|
} else {
|
|||
|
console.log(`WARNING: Source file not found: ${sourceModelGenFile}`);
|
|||
|
}
|
|||
|
|
|||
|
console.log(`Processing completed for table: ${table}`);
|
|||
|
} catch (error) {
|
|||
|
console.error(`ERROR processing table: ${table}`);
|
|||
|
console.error(error.message);
|
|||
|
console.error(error.stack);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 主函数
|
|||
|
*/
|
|||
|
function main() {
|
|||
|
try {
|
|||
|
// 确保目录存在
|
|||
|
ensureDirectoryExists(config.outputDir);
|
|||
|
ensureDirectoryExists(config.targetDir);
|
|||
|
|
|||
|
// 为每个表生成模型
|
|||
|
for (const table of config.tables) {
|
|||
|
generateModelForTable(table);
|
|||
|
}
|
|||
|
|
|||
|
console.log('=========================================');
|
|||
|
console.log('Script execution completed.');
|
|||
|
} catch (error) {
|
|||
|
console.error('ERROR in main execution:');
|
|||
|
console.error(error.message);
|
|||
|
console.error(error.stack);
|
|||
|
process.exit(1);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 执行主函数
|
|||
|
main();
|