241 lines
6.2 KiB
JavaScript
Raw Normal View History

2025-02-12 06:18:36 +00:00
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;
}