import { exportDefault, titleCase } from '@/utils/index'; import { trigger } from './config'; const units = { KB: '1024', MB: '1024 / 1024', GB: '1024 / 1024 / 1024', }; let confGlobal; const inheritAttrs = { file: '', dialog: 'inheritAttrs: false,', }; export function makeUpJs(conf, type) { confGlobal = conf = JSON.parse(JSON.stringify(conf)); const dataList = []; const ruleList = []; const optionsList = []; const propsList = []; const methodList = mixinMethod(type); const uploadVarList = []; conf.fields.forEach((el) => { buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList); }); const script = buildexport( conf, type, dataList.join('\n'), ruleList.join('\n'), optionsList.join('\n'), uploadVarList.join('\n'), propsList.join('\n'), methodList.join('\n') ); confGlobal = null; return script; } function buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) { buildData(el, dataList); buildRules(el, ruleList); if (el.options && el.options.length) { buildOptions(el, optionsList); if (el.dataType === 'dynamic') { const model = `${el.vModel}Options`; const options = titleCase(model); buildOptionMethod(`get${options}`, model, methodList); } } if (el.props && el.props.props) { buildProps(el, propsList); } if (el.action && el.tag === 'el-upload') { uploadVarList.push( `${el.vModel}Action: '${el.action}', ${el.vModel}fileList: [],` ); methodList.push(buildBeforeUpload(el)); if (!el['auto-upload']) { methodList.push(buildSubmitUpload(el)); } } if (el.children) { el.children.forEach((el2) => { buildAttributes(el2, dataList, ruleList, optionsList, methodList, propsList, uploadVarList); }); } } function mixinMethod(type) { const list = []; const minxins = { file: confGlobal.formBtns ? { submitForm: `submitForm() { this.$refs['${confGlobal.formRef}'].validate(valid => { if(!valid) return // TODO 提交表单 }) },`, resetForm: `resetForm() { this.$refs['${confGlobal.formRef}'].resetFields() },`, } : null, dialog: { onOpen: 'onOpen() {},', onClose: `onClose() { this.$refs['${confGlobal.formRef}'].resetFields() },`, close: `close() { this.$emit('update:visible', false) },`, handleConfirm: `handleConfirm() { this.$refs['${confGlobal.formRef}'].validate(valid => { if(!valid) return this.close() }) },`, }, }; const methods = minxins[type]; if (methods) { Object.keys(methods).forEach((key) => { list.push(methods[key]); }); } return list; } function buildData(conf, dataList) { if (conf.vModel === undefined) return; let defaultValue; if (typeof conf.defaultValue === 'string' && !conf.multiple) { defaultValue = `'${conf.defaultValue}'`; } else { defaultValue = `${JSON.stringify(conf.defaultValue)}`; } dataList.push(`${conf.vModel}: ${defaultValue},`); } function buildRules(conf, ruleList) { if (conf.vModel === undefined) return; const rules = []; if (trigger[conf.tag]) { if (conf.required) { const type = Array.isArray(conf.defaultValue) ? "type: 'array'," : ''; let message = Array.isArray(conf.defaultValue) ? `请至少选择一个${conf.vModel}` : conf.placeholder; if (message === undefined) message = `${conf.label}不能为空`; rules.push(`{ required: true, ${type} message: '${message}', trigger: '${trigger[conf.tag]}' }`); } if (conf.regList && Array.isArray(conf.regList)) { conf.regList.forEach((item) => { if (item.pattern) { rules.push(`{ pattern: ${eval(item.pattern)}, message: '${item.message}', trigger: '${trigger[conf.tag]}' }`); } }); } ruleList.push(`${conf.vModel}: [${rules.join(',')}],`); } } function buildOptions(conf, optionsList) { if (conf.vModel === undefined) return; if (conf.dataType === 'dynamic') { conf.options = []; } const str = `${conf.vModel}Options: ${JSON.stringify(conf.options)},`; optionsList.push(str); } function buildProps(conf, propsList) { if (conf.dataType === 'dynamic') { conf.valueKey !== 'value' && (conf.props.props.value = conf.valueKey); conf.labelKey !== 'label' && (conf.props.props.label = conf.labelKey); conf.childrenKey !== 'children' && (conf.props.props.children = conf.childrenKey); } const str = `${conf.vModel}Props: ${JSON.stringify(conf.props.props)},`; propsList.push(str); } function buildBeforeUpload(conf) { const unitNum = units[conf.sizeUnit]; let rightSizeCode = ''; let acceptCode = ''; const returnList = []; if (conf.fileSize) { rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${conf.fileSize} if(!isRightSize){ this.$message.error('文件大小超过 ${conf.fileSize}${conf.sizeUnit}') }`; returnList.push('isRightSize'); } if (conf.accept) { acceptCode = `let isAccept = new RegExp('${conf.accept}').test(file.type) if(!isAccept){ this.$message.error('应该选择${conf.accept}类型的文件') }`; returnList.push('isAccept'); } const str = `${conf.vModel}BeforeUpload(file) { ${rightSizeCode} ${acceptCode} return ${returnList.join('&&')} },`; return returnList.length ? str : ''; } function buildSubmitUpload(conf) { const str = `submitUpload() { this.$refs['${conf.vModel}'].submit() },`; return str; } function buildOptionMethod(methodName, model, methodList) { const str = `${methodName}() { // TODO 发起请求获取数据 this.${model} },`; methodList.push(str); } function buildexport(conf, type, data, rules, selectOptions, uploadVar, props, methods) { const str = `${exportDefault}{ ${inheritAttrs[type]} components: {}, props: [], data () { return { ${conf.formModel}: { ${data} }, ${conf.formRules}: { ${rules} }, ${uploadVar} ${selectOptions} ${props} } }, computed: {}, watch: {}, created () {}, mounted () {}, methods: { ${methods} } }`; return str; }