237 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { isArray } from 'util'
 | |
| 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)
 | |
|       },`,
 | |
|         handelConfirm: `handelConfirm() {
 | |
|         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 = isArray(conf.defaultValue) ? 'type: \'array\',' : ''
 | |
|       let message = 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 && 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
 | |
| }
 | 
