const content = `
<%- column %>
`;
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,
};