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 = `` } } 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 += `` }) } 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