const content = ` `; let ejs = require('ejs'); let { toCapitalizeFirstLetter } = require('../utils/index.js'); /** * 上传接口的后缀 例如:/api/business-manage/contract/upload-attachment 后缀为upload-attachment */ const uploadSuffix = 'upload-attachment'; /** * 生成el-form-item数据 * @param {*} barr { label: string, prop: string ,type: string}[] */ function renderColumn(barr, permissionPrefix, requiredArr) { /** * 生成的el-form-item数据 */ let column = ''; /** * 保存附件上传所用到的函数部分代码 */ let uploadFuncStr = ''; /** * 保存附件上传所用到的变量部分代码 */ let uploadVar = ''; /** * 保存附件上传所用到的变量重置部分代码 */ let uploadVarReset = ''; /** * 保存附件上传所用到的变量回显部分代码 */ let uploadEcho = ''; // 遍历过滤后的数组 for (let i = 0; i < barr.length; i++) { let item = barr[i]; let label = item.label ? item.label : ''; // 如果对象标签中包含字典 if (label.indexOf('字典') != -1) { column += renderDictColumn(item, requiredArr); // 如果对象标签中包含是否 } else if (label.indexOf('是否') != -1) { column += renderBooleanColumn(item, requiredArr); } else if (label.indexOf('日期') != -1 || label.indexOf('时间') != -1) { column += renderDateColumn(item, requiredArr); } else if (label.indexOf('备注') != -1 || label.indexOf('描述') != -1) { column += renderTextAreaColumn(item, requiredArr); } else if (label.indexOf('附件') != -1) { let { formItem, formFuncStr } = renderUploadColumn(item, requiredArr); column += formItem; if (!uploadFuncStr) { uploadFuncStr += `//上传 const fileAction = computed(() => { return import.meta.env.VITE_API_URL + '/${permissionPrefix.replaceAll(':', '/')}/upload-attachment' }) const fileHeaders = computed(() => { return { Authorization: 'Bearer ' + storesUserInfo.getToken() } })\n`; } uploadFuncStr += `${formFuncStr}\n`; uploadVar += `${item.prop}: [],\n`; uploadVarReset += `state.upload.${item.prop}= [];\n`; uploadEcho += `if (state.form.${item.prop}) state.upload.${item.prop} = state.form.${item.prop}\n`; } else { // 调用renderDateColumn函数,生成el-descriptions-item数据 column += renderInputColumn(item, requiredArr); } } return { column, uploadVar, uploadVarReset, uploadFuncStr, uploadEcho }; } /** * 生成表单页 * @param {object} obj swagger信息 * @param {string} dirName 文件夹名称 * @param {string} permissionPrefix 权限前缀 */ function renderForm(obj, dirName, permissionPrefix) { // 过滤掉不需要生成的字段 // let filter = ['附件']; let filter = []; let schemas = obj.components.schemas[dirName + 'AddInput']; let properties = schemas.properties; let requiredArr = schemas.required; let arr = []; for (let key in properties) { arr.push({ label: properties[key].description, prop: key, type: properties[key].type }); } // 过滤数组 let barr = arr.filter((item) => { // 声明一个布尔值 let isFlag = true; // 遍历过滤字段 filter.map((filterItem) => { // 如果过滤字段在对象标签中,则将布尔值设置为false if (item.label.indexOf(filterItem) !== -1) { return (isFlag = false); } }); // 如果布尔值为false,则返回false if (!isFlag) { return false; // 如果布尔值为true,则返回true } else { return true; } }); let { column, uploadVar, uploadVarReset, uploadFuncStr, uploadEcho } = renderColumn(barr, permissionPrefix, requiredArr ? requiredArr : []); let lowerCasedirName = dirName.charAt(0).toLowerCase() + dirName.slice(1); let templateStr = ejs.render(content, { permissionPrefix, column, dirName, lowerCasedirName, uploadVar, uploadVarReset, uploadFuncStr, uploadEcho, }); return templateStr; } //生成字典行 function renderDictColumn(item, requiredArr) { let str = ''; for (let item of requiredArr) { if (item.includes(item.prop)) { str = `:rules="[{ required: true, message: '请选择${item.label}', trigger: ['blur', 'change'] }]"`; } } return `${` `}\n`; } //生成 是否 字段的行 function renderBooleanColumn(item, requiredArr) { let str = ''; for (let item of requiredArr) { if (item.includes(item.prop)) { str = `:rules="[{ required: true, message: '请选择${item.label}', trigger: ['blur', 'change'] }]"`; } } return `${` `}\n`; } //生成 日期 字段的行 function renderDateColumn(item, requiredArr) { let str = ''; for (let item of requiredArr) { if (item.includes(item.prop)) { str = `:rules="[{ required: true, message: '请选择${item.label}', trigger: ['blur', 'change'] }]"`; } } return `${` \n`}`; } /** * 生成input输入框 */ function renderInputColumn(item, requiredArr) { let str = ''; for (let item of requiredArr) { if (item.includes(item.prop)) { str = `:rules="[{ required: true, message: '请输入${item.label}', trigger: ['blur', 'change'] }]"`; } } return `${` \n`}`; } /** * 生成多行文本输入框 */ function renderTextAreaColumn(item, requiredArr) { let str = ''; for (let item of requiredArr) { if (item.includes(item.prop)) { str = `:rules="[{ required: true, message: '请输入${item.label}', trigger: ['blur', 'change'] }]"`; } } return `${` \n`}`; } /** * * @param {*} item * @param {*} requiredArr 必填项prop列表 * @returns {*} formItem:表单部分, formFuncStr: 函数部分 */ function renderUploadColumn(item, requiredArr) { let str = ''; for (let item of requiredArr) { if (item.includes(item.prop)) { str = `:rules="[{ required: true, message: '请选择${item.label}', trigger: ['change'] }]"`; } } return { formItem: `${` 选择文件 \n`}`, formFuncStr: `${` const import${toCapitalizeFirstLetter(item.prop)}Loading = ref(false) //上传成功 const onImportSuccess${toCapitalizeFirstLetter(item.prop)} = (res: { data: never; success: any; msg: any }) => { import${toCapitalizeFirstLetter(item.prop)}Loading.value = false } //上传失败 const onFileError${toCapitalizeFirstLetter(item.prop)} = (error: any) => { import${toCapitalizeFirstLetter(item.prop)}Loading.value = false let message = '' if (error.message) { try { message = JSON.parse(error.message)?.msg } catch (err) { message = error.message || '' } } if (message) proxy.$modal.msgError(message) } const handleChange${toCapitalizeFirstLetter(item.prop)} = (uploadFile: any, uploadFiles: any) => { if (uploadFiles) { let arr: any = [] uploadFiles.forEach((item: any, index: number) => { if (item.url && item.status == 'success') { arr.push(item) } else if (item.status == 'success' && item.response && item.response.success) { arr.push(item.response.data) } else if (item.status == 'success' && item.response && !item.response.success) { proxy.$modal.msgError(item.response.msg) state.upload.${item.prop}.pop() } }) state.form.files = arr } }\n`}`, }; } module.exports = { renderForm, };