zc-project
Version:
项目模板
436 lines (435 loc) • 19.4 kB
JavaScript
const fs = require('fs') // 文件读写
const chalk = require('chalk')
const download = require('download-git-repo');
const ora = require('ora');
const spinner = ora('Loading undead unicorns');
const javaUrl='http://gitee.com/micro_3/zcii-cloud-ems.git'
const vueUrl='https://gitee.com/micro_3/zcii-cloud-web-ems.git'
const h5Url='https://gitee.com/micro_3/zcii-cloud-h5-ems.git'
var tool={
down(url,dest){
return new Promise((resolve, reject) => {
spinner.start('开始下载');
download('direct:'+url,dest, { clone: true }, (err) => {
if (err) {
spinner.fail(chalk.red('下载失败 \n' + err));
process.exit();
}
else {
spinner.succeed(chalk.green(`下载成功`));
resolve();
}
});
});
},
createJava:function(answers){
// console.log(answers)
this.clearDir(answers.dir)
this.down(javaUrl,answers.dir).then(res=>{
this.updateDirectSync(answers);
try{
this.updatePackageSync({...answers,path:answers.dir});
console.log(chalk.green('包名修改成功'));
}catch(ex){
console.error("包名修改失败",ex)
throw ex;
}
console.log(chalk.green("项目初始化成功"))
})
},
createVue3:function(answers){
// console.log(answers)
this.clearDir(answers.dir)
this.down(vueUrl,answers.dir).then(res=>{
this.updatePkgSync(answers);
this.updateEnvSync(answers,'.env');
this.updateEnvSync(answers,'.env.prod');
this.updateEnvSync(answers,'.env.test');
this.updateYamlSync(answers,'zcii-cloud-web-ems-k8s-dev.yaml');
this.updateYamlSync(answers,'zcii-cloud-web-ems-k8s-pro.yaml');
console.log(chalk.green("项目初始化成功"))
})
},
createH5:function(answers){
// console.log(answers)
this.clearDir(answers.dir)
this.down(h5Url,answers.dir).then(res=>{
this.updateFileSync(answers,'dist/dev.sh');
this.updateFileSync(answers,'dist/prod.sh');
this.updateFileSync(answers,'config.js');
this.updateFileSync(answers,'manifest.json');
this.updateFileSync(answers,'app.vue');
this.updateFileSync(answers,'components/task/task.vue');
this.updateYamlSync(answers,'dist/zcii-cloud-k8s-h5-ems.yaml');
})
},
add:function(answers){
//1.修改rush.json
//this.rushAdd(answers)
//2.apps/master/src/router/modules/remaining.ts修改
//this.routeAdd(answers)
//3.apps/master/src/permission.ts修改
this.permissionAdd(answers)
//4.nginx.template修改
this.nginxAdd(answers)
},
delete:function(answers){},
updatePkg:function(answers){
// 修改package.json
fs.readFile(`${answers.dir}/package.json`, 'utf8', (err, data) => {
if (err) throw err;
const packageJson = JSON.parse(data);
packageJson.name = answers.name;
packageJson.version = answers.version;
packageJson.description = answers.description;
packageJson.author = answers.author;
packageJson.route = answers.name+"Ms"
fs.writeFile(`${answers.dir}/package.json`, JSON.stringify(packageJson, null, 2), (err) => {
if (err) throw err;
console.log(chalk.green('package.json修改成功'));
});
});
},
updateEnv:function(answers){
// 修改.env
fs.readFile(`${answers.dir}/.env`, 'utf8', (err, data) => {
if (err) throw err;
let env = data.replace(/VITE_PORT=.*/g, `VITE_PORT=${answers.port}`);
env = env.replace(/VITE_ACTIVE_RULE=.*/g, `VITE_ACTIVE_RULE='/${answers.name}'`);
env = env.replace(/VITE_APP_TITLE=.*/g, `VITE_APP_TITLE=${answers.title}`);
fs.writeFile(`${answers.dir}/.env`, env, (err) => {
if (err) throw err;
console.log(chalk.green('.env修改成功'));
});
});
},
updatePkgSync:function(answers){
try{
data=fs.readFileSync(`${answers.dir}/package.json`, 'utf8')
const packageJson = JSON.parse(data);
packageJson.name = answers.name;
packageJson.version = answers.version;
packageJson.description = answers.description;
packageJson.author = answers.author;
packageJson.route = answers.name+"Ms"
fs.writeFileSync(`${answers.dir}/package.json`, JSON.stringify(packageJson, null, 2));
console.log(chalk.green('package.json修改成功'));
}catch(ex){
console.error("package.json修改失败",ex)
throw ex;
}
},
updateEnvSync:function(answers,file){
try{
data=fs.readFileSync(`${answers.dir}/${file}`, 'utf8')
let env = data.replace(/VITE_PORT=.*/g, `VITE_PORT=${answers.port}`);
env = env.replace(/VITE_ACTIVE_RULE=.*/g, `VITE_ACTIVE_RULE='/${answers.name}'`);
env = env.replace(/VITE_APP_TITLE=.*/g, `VITE_APP_TITLE=${answers.title}`);
env = env.replace(/energy/g,answers.name)
fs.writeFileSync(`${answers.dir}/${file}`, env);
console.log(chalk.green(`${file}修改成功`));
}catch(ex){
console.error(".env修改失败",ex)
throw ex;
}
},
updateYamlSync:function(answers,file){
try{
const path=answers.dir
const filePath=`${path}/${file}`
data=fs.readFileSync(filePath, 'utf8')
data=data.replace(/ems/g,answers.name)
data=data.replace(/49002/g,answers.port)
newFile=file.replace(/ems/g, answers.name)
newFilePath=`${path}/${newFile}`
fs.renameSync(filePath, newFilePath);
fs.writeFileSync(newFilePath, data);
console.log(chalk.green(`${file}修改成功`));
}catch(ex){
console.error(`${file}修改失败`,ex)
throw ex;
}
},
updateFileSync:function(answers,file){
try{
const path=answers.dir
const filePath=`${path}/${file}`
data=fs.readFileSync(filePath, 'utf8')
data=data.replace(/ems/g,answers.name)
data=data.replace(/株齿云EMS/g,answers.title)
data=data.replace(/49002/g,answers.port)
fs.writeFileSync(filePath, data);
console.log(chalk.green(`${file}修改成功`));
}catch(ex){
console.error(`${file}修改失败`,ex)
throw ex;
}
},
updateDirectSync:function(answers){
try{
moduleName=answers.name.split('-').pop()
oldPkg="/src/main/java/com/zhuchi/zcii/module/ems"
group='com/zhuchi/zcii/module/'+answers.name
if(answers.group){
group=answers.group.replaceAll('\.','//')
}
newPkg=`/src/main/java/${group}`
newName=moduleName.charAt(0).toUpperCase()+answers.name.slice(1)//首字母大写项目名称
gIndex=newName.indexOf("-")
if(gIndex>0){
newName=newName.substring(0,gIndex)+newName.charAt(gIndex+1).toUpperCase()+newName.slice(gIndex+2)
}
//运行程序修改
fs.renameSync(answers.dir+"/zcii-cloud-ems-biz"+oldPkg+"/EmsServerApplication.java",answers.dir+"/zcii-cloud-ems-biz"+oldPkg+"/"+newName+"ServerApplication.java")
fs.renameSync(answers.dir+"/zcii-cloud-ems-api",answers.dir+`/${answers.dir}-api`)
fs.renameSync(answers.dir+"/zcii-cloud-ems-biz",answers.dir+`/${answers.dir}-biz`)
if(answers.group){
fs.cpSync(answers.dir+`/${answers.dir}-api`+oldPkg,answers.dir+`/${answers.dir}-api`+newPkg,{recursive: true})
fs.cpSync(answers.dir+`/${answers.dir}-biz`+oldPkg,answers.dir+`/${answers.dir}-biz`+newPkg,{recursive: true})
//删除旧目录
//判别newPkg与oldPkg什么时候开始不同
// 按路径分隔符拆分文件夹列表
old_folders = 'com/zhuchi/zcii/module/ems'.split('/')
new_folders = group.split('/')
// 获取最小深度,避免越界
min_depth = Math.min(old_folders.length, new_folders.length)
var ind=0;
for(var i=0;i<min_depth;i++){
if(old_folders[i]!=new_folders[i]){
ind=i;
break
}
}
const oldPath='/src/main/java/'+old_folders.slice(0,ind+1).join('/')
fs.rmSync(answers.dir+`/${answers.dir}-api`+oldPath,{force: true,recursive: true})
fs.rmSync(answers.dir+`/${answers.dir}-biz`+oldPath,{force: true,recursive: true})
console.log(chalk.green('目录修改成功'));
}else{
fs.cpSync(answers.dir+`/${answers.dir}-api`+oldPkg,answers.dir+`/${answers.dir}-api`+newPkg,{recursive: true})
fs.cpSync(answers.dir+`/${answers.dir}-biz`+oldPkg,answers.dir+`/${answers.dir}-biz`+newPkg,{recursive: true})
//删除旧目录
//判别newPkg与oldPkg什么时候开始不同
// 按路径分隔符拆分文件夹列表
old_folders = 'com/zhuchi/zcii/module/ems'.split('/')
new_folders = group.split('/')
// 获取最小深度,避免越界
min_depth = Math.min(old_folders.length, new_folders.length)
var ind=0;
for(var i=0;i<min_depth;i++){
if(old_folders[i]!=new_folders[i]){
ind=i;
break
}
}
const oldPath='/src/main/java/'+old_folders.join('/')
fs.rmSync(answers.dir+`/${answers.dir}-api`+oldPath,{force: true,recursive: true})
fs.rmSync(answers.dir+`/${answers.dir}-biz`+oldPath,{force: true,recursive: true})
console.log(chalk.green('目录修改成功'));
}
}catch(ex){
console.error("目录修改失败",ex)
throw ex;
}
},
updatePackageSync:function(answers){
//读取所有文件
const path=answers.path
const files = fs.readdirSync(path);
files.forEach(file => {
// console.log("文件:",file)
const filePath = `${path}/${file}`;
const stats = fs.statSync(filePath);
if (!stats.isDirectory()) {
moduleName=answers.name.split('-').pop()
newName=moduleName.charAt(0).toUpperCase()+answers.name.slice(1)//首字母大写项目名称
gIndex=newName.indexOf("-")
if(gIndex>0){
newName=newName.substring(0,gIndex)+newName.charAt(gIndex+1).toUpperCase()+newName.slice(gIndex+2)
}
let data=fs.readFileSync(filePath, 'utf8')
if(file=='bootstrap.yaml'){
data=data.replace(/zcii-ems-server/g,answers.dir)
data=data.replace(/ port:.*/g, ` port: ${answers.port}`)
fs.writeFileSync(filePath, data);
}else if(file=='zcii-ems-server.yaml'){
if(answers.group){
data=data.replace(/com\.zhuchi\.zcii\.module\.ems/g, answers.group)
}
data=data.replace(/ems/g,answers.name)
newFile=file.replace(/zcii-ems-server/g, answers.dir)
newFilePath=`${path}/${newFile}`
fs.renameSync(filePath, newFilePath);
fs.writeFileSync(newFilePath, data);
}else if(file=='zcii-cloud-ems-k8s-pro.yaml'||file=='zcii-cloud-ems-k8s-dev.yaml'){
data=data.replace(/zcii-cloud-ems/g,answers.dir)
data=data.replace(/48088/g,answers.port)
newFile=file.replace(/zcii-cloud-ems/g, answers.dir)
newFilePath=`${path}/${newFile}`
fs.renameSync(filePath, newFilePath);
fs.writeFileSync(newFilePath, data);
}else if(file=='Dockerfile'){
data=data.replace(/zcii-cloud-ems/g,answers.dir)
data=data.replace(/EXPOSE .*/g, `EXPOSE ${answers.port}`)
fs.writeFileSync(filePath, data);
}else{
//zcii-cloud-ems替换为answers.dir
data=data.replace(/zcii-cloud-ems/g, answers.dir)
//标题替换
data=data.replace(/能源管理/g, `${answers.title}`)
//package名修改
if(answers.group){
data=data.replace(/com\.zhuchi\.zcii\.module\.ems/g, answers.group)
}
//Ems内容修改
data=data.replace(/Ems/g,newName)
data=data.replace(/ems/g,answers.name)
data=data.replace(/EMS/g,answers.name.toUpperCase())
//文件名修改
if(file.indexOf("Ems")>-1){
newFile=file.replace(/Ems/g, newName)
newFilePath=`${path}/${newFile}`
fs.renameSync(filePath, newFilePath);
fs.writeFileSync(newFilePath, data);
}else{
fs.writeFileSync(filePath, data);
}
}
}else{
this.updatePackageSync({...answers,path:filePath})
}
});
},
/**
* 清空指定路径下的所有文件及文件夹
* @param {*} path
*/
clearDir:function(path){
if(fs.existsSync(path)){
this.emptyDir(path);
this.rmEmptyDir(path,1);
}
},
/**
* 删除文件夹下所有问价及将文件夹下所有文件清空
* @param {*} path
*/
emptyDir:function(path){
const files = fs.readdirSync(path);
files.forEach(file => {
const filePath = `${path}/${file}`;
const stats = fs.statSync(filePath);
if (stats.isDirectory()) {
this.emptyDir(filePath);
} else {
fs.unlinkSync(filePath);
// console.log(`删除${file}文件成功`);
}
});
},
/**
* 删除指定路径下的所有空文件夹
* @param {*} path
*/
rmEmptyDir:function(path,level=0){
const files = fs.readdirSync(path);
if (files.length > 0) {
let tempFile = 0;
files.forEach(file => {
tempFile++;
this.rmEmptyDir(`${path}/${file}`, 1);
});
if (tempFile === files.length && level !== 0) {
fs.rmdirSync(path);
}
}
else {
level !==0 && fs.rmdirSync(path);
}
},
rushAdd:function(answers){
try{
let filePath='rush.json'
let rush=fs.readFileSync(filePath,"utf-8")
let json=JSON.parse(rush)
json.projects.push({
"packageName":answers.name,
"projectFolder":"apps/"+answers.dir,
"reviewCategory": "project",
"tags":[answers.name]
})
fs.writeFileSync(filePath,JSON.stringify(json,null,2))
}catch(ex){
console.error("rush.json新增失败",ex)
throw ex;
}
},
rushDel:function(answers){
try{
let filePath='rush.json'
let rush=fs.readFileSync(filePath,"utf-8")
let json=JSON.parse(rush)
json.projects=json.projects.filter(item=>item.packageName!=answers.name)
fs.writeFileSync(filePath,JSON.stringify(json))
}catch(ex){
console.error("rush.json删除失败",ex)
throw ex;
}
},
routeAdd:function(answers){
try{
let filePath='apps/master/src/router/modules/remaining.ts'
let route=fs.readFileSync(filePath,"utf-8")
const newName=answers.name.charAt(0).toUpperCase()+answers.name.slice(1)
let routeStr=`,{path:'/${answers.name}/:pathMatch(.*)*',name:'${answers.name}',meta:{hidden:true,},component:()=>import('@/components/SubContainer/index.vue')}`
let ssoStr=`,{path:'/${answers.name}-sso',component:()=>import('@/views/Login/ZciiLogin.vue'),name:'${newName}Login',meta:{hidden:true,title:t('router.zciiLogin'),noTagsView:true}}`
let tag='//tag'
let result=route.replace(tag,routeStr+'\n '+ssoStr+'\n '+tag)
fs.writeFileSync(filePath,JSON.stringify(result))
}catch(ex){
console.error("route新增失败",ex);
throw ex;
}
},
routeDel:function(answers){
try{
let route=fs.readFileSync('apps/master/src/router/modules/remaining.ts',"utf-8")
const newName=answers.name.charAt(0).toUpperCase()+answers.name.slice(1)
let routeStr=`,{path:'/${answers.name}/:pathMatch(.*)*',name:'${answers.name}',meta:{hidden:true,},component:()=>import('@/components/SubContainer/index.vue')}`
let ssoStr=`,{path:'/${answers.name}-sso',component:()=>import('@/views/Login/ZciiLogin.vue'),name:'${newName}Login',meta:{hidden:true,title:t('router.zciiLogin'),noTagsView:true}}`
let result=route.replace(' '+routeStr,'').replace(' '+ssoStr,'')
fs.writeFileSync(filePath,JSON.stringify(result))
}catch(ex){
console.error("route删除失败",ex)
throw ex;
}
},
permissionAdd:function(answers){
try{
}catch(ex){
console.error("permission新增失败",ex)
throw ex;
}
},
permissionDel:function(answers){
try{
}catch(ex){
console.error("permission删除失败",ex)
throw ex;
}
},
nginxAdd:function(answers){
try{
}catch(ex){
console.error("nginx新增失败",ex)
throw ex;
}
},
nginxDel:function(answers){
try{
}catch(ex){
console.error("nginx删除失败",ex)
throw ex;
}
},
}
module.exports=tool