const fse = require("fs-extra");
const {readFile} = require("../utils/fsUtils");
const {checkJson} = require("./index");
/**
* 生成入口页
*/
const genHome = (app, dest) => {
return readFile('./tpl/AppEntry.vue').then(data => {
let file = data.toString(),
content = file.replace(/@appName/g, app.appName)
.replace(/@name/g, app.name)
let dicts = `'yesOrNo'`
if (checkJson(app.props)) {
let props = JSON.parse(app.props)?.map(e => e.dict).filter(e => !!e)
props.length > 0 && (dicts = props.map(e => `'${e}'`).toString())
}
content = content.replace(/@dicts/g, dicts)
return fse.outputFileSync(`${dest}/${app.appName}.vue`, content)
})
}
/**
* 生成列表页
*/
const genList = (app, dest) => {
return readFile('./tpl/list.vue').then(data => {
let file = data.toString(),
content = file.replace(/@rightCode/g, app.rightCode)
.replace(/@name/g, app.name),
listProps = "", searchProps = "", btns = "", tableBtns = ""
if (checkJson(app.props)) {
let props = JSON.parse(app.props)
listProps = JSON.stringify(props.filter(e => e.isTable)?.map(e => {
delete e.isSearch
delete e.isTable
delete e.isDetail
return e
}) || null)?.replace(/"([^"]+)":/g, '$1:')
props.filter(e => e.isSearch && e.dict).map(e => {
searchProps += ``
})
}
if (checkJson(app.btns)) {
let buttons = JSON.parse(app.btns)
buttons.map(e => {
if (e == "insertEnable") {
btns += `添加`
} else if (e == "importEnable") {
btns += ``
} else if (e == "exportEnalbe") {
btns += ``
} else if (e == "editEnable") {
tableBtns += `编辑`
} else if (e == "deleteEnable") {
tableBtns += `删除`
} else if (e == "batchDelEnable") {
btns += `删除`
}
})
if (!searchProps) {
//当没有筛选条件时,按钮替换原筛选条件位置
searchProps = btns
btns = ""
} else {
btns = `${btns}`
}
}
content = content.replace(/@listProps/g, listProps)
.replace(/@searchProps/g, searchProps)
.replace(/@btns/g, btns)
.replace(/@tableBtns/g, tableBtns)
return fse.outputFileSync(`${dest}/list.vue`, content)
})
}
/**
* 生成新增/编辑页
*/
const genAdd = (app, dest) => {
return readFile('./tpl/add.vue').then(data => {
let file = data.toString(),
content = file.replace(/@rightCode/g, app.rightCode)
.replace(/@name/g, app.name),
rules = "", domain = ""
if (checkJson(app.detailConfig)) {
let detail = JSON.parse(app.detailConfig), props = detail?.map(e => e.column).flat()
props.filter(e => e.mustFill == 1).map(e => {
rules += `${e.prop}: {required: true, message: "${e.fieldTips}"},`
})
detail.map(group => {
let fields = ``
group.column?.map(e => {
fields += `${getComp(e)}`
})
domain += ` ${fields}`
})
}
content = content.replace(/@content/g, domain)
.replace(/@rules/g, rules)
return fse.outputFileSync(`${dest}/add.vue`, content)
})
}
const getComp = e => {
//字典下拉选择
if (e.type == 'dict') {
return ``
//单选radio
} else if (e.type == 'radio') {
return `
{{ item.dictName }}
`
//开关onOff
} else if (e.type == 'onOff') {
return ``
//多选checkbox
} else if (e.type == 'checkbox') {
return `
{{ item.dictName }}
`
} else if (e.type == 'idNumber') {
return ``
//input输入框
} else if (['input', 'name', 'phone'].includes(e.type)) {
return ``
//number 输入框
} else if (e.type == 'number') {
return ``
//textarea输入框
} else if (e.type == 'textarea' || e.type == 'text') {
return ``
//日期选择
} else if (e.type == 'date') {
return ``
//日期带时分秒选择
} else if (e.type == 'datetime') {
return ``
//时间-时分秒选择
} else if (e.type == 'time') {
return ``
//附件
} else if (e.type == 'upload') {
return ` `
//富文本
} else if (e.type == 'rtf') {
return ``
//地区选择
} else if (e.type == 'area') {
return ` `
} else if (e.type == 'user') {
//人员选择
return ``
}
}
const generate = (app, dest) => {
fse.emptydirSync(dest)
let tasks = [genHome(app, dest), genList(app, dest)]
app.detailType == 0 && tasks.push(genAdd(app, dest))
return Promise.all(tasks)
}
module.exports = generate