| import { titleCase } from '@/utils/index' | 
| import { trigger } from './config' | 
| // 文件大小设置 | 
| const units = { | 
|   KB: '1024', | 
|   MB: '1024 / 1024', | 
|   GB: '1024 / 1024 / 1024', | 
| } | 
| /** | 
|  * @name: 生成js需要的数据 | 
|  * @description: 生成js需要的数据 | 
|  * @param {*} conf | 
|  * @param {*} type 弹窗或表单 | 
|  * @return {*} | 
|  */ | 
| export function makeUpJs(conf, type) { | 
|   conf = JSON.parse(JSON.stringify(conf)) | 
|   const dataList = [] | 
|   const ruleList = [] | 
|   const optionsList = [] | 
|   const propsList = [] | 
|   const methodList = [] | 
|   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') | 
|   ) | 
|    | 
|   return script | 
| } | 
| /** | 
|  * @name: 生成参数 | 
|  * @description: 生成参数,包括表单数据表单验证数据,多选选项数据,上传数据等 | 
|  * @return {*} | 
|  */ | 
| 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( | 
|       ` | 
|       // 上传请求路径 | 
|       const ${el.vModel}Action = ref('${el.action}') | 
|       // 上传文件列表 | 
|       const ${el.vModel}fileList =  ref([])` | 
|     ) | 
|     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 | 
|       ) | 
|     }) | 
|   } | 
| } | 
| /** | 
|  * @name: 生成表单数据formData | 
|  * @description: 生成表单数据formData | 
|  * @param {*} conf | 
|  * @param {*} dataList 数据列表 | 
|  * @return {*} | 
|  */ | 
| 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},`) | 
| } | 
| /** | 
|  * @name: 生成表单验证数据rule | 
|  * @description: 生成表单验证数据rule | 
|  * @param {*} conf | 
|  * @param {*} ruleList 验证数据列表 | 
|  * @return {*} | 
|  */ | 
| 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: new RegExp(${item.pattern}), message: '${ | 
|               item.message | 
|             }', trigger: '${trigger[conf.tag]}' }` | 
|           ) | 
|         } | 
|       }) | 
|     } | 
|     ruleList.push(`${conf.vModel}: [${rules.join(',')}],`) | 
|   } | 
| } | 
| /** | 
|  * @name: 生成选项数据 | 
|  * @description: 生成选项数据,单选多选下拉等 | 
|  * @param {*} conf | 
|  * @param {*} optionsList 选项数据列表 | 
|  * @return {*} | 
|  */ | 
| function buildOptions(conf, optionsList) { | 
|   if (conf.vModel === undefined) return | 
|   if (conf.dataType === 'dynamic') { | 
|     conf.options = [] | 
|   } | 
|   const str = `const ${conf.vModel}Options = ref(${JSON.stringify(conf.options)})` | 
|   optionsList.push(str) | 
| } | 
| /** | 
|  * @name: 生成方法 | 
|  * @description: 生成方法 | 
|  * @param {*} methodName 方法名 | 
|  * @param {*} model | 
|  * @param {*} methodList 方法列表 | 
|  * @return {*} | 
|  */ | 
| function buildOptionMethod(methodName, model, methodList) { | 
|   const str = `function ${methodName}() { | 
|     // TODO 发起请求获取数据 | 
|     ${model}.value | 
|   }` | 
|   methodList.push(str) | 
| } | 
| /** | 
|  * @name: 生成表单组件需要的props设置 | 
|  * @description: 生成表单组件需要的props设置,如;级联组件 | 
|  * @param {*} conf | 
|  * @param {*} propsList | 
|  * @return {*} | 
|  */ | 
| 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 = ` | 
|   // props设置 | 
|   const ${conf.vModel}Props = ref(${JSON.stringify(conf.props.props)})` | 
|   propsList.push(str) | 
| } | 
| /** | 
|  * @name: 生成上传组件的相关内容 | 
|  * @description: 生成上传组件的相关内容 | 
|  * @param {*} conf | 
|  * @return {*} | 
|  */ | 
| 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){ | 
|       proxy.$modal.msgError('文件大小超过 ${conf.fileSize}${conf.sizeUnit}') | 
|     }` | 
|     returnList.push('isRightSize') | 
|   } | 
|   if (conf.accept) { | 
|     acceptCode = `let isAccept = new RegExp('${conf.accept}').test(file.type) | 
|     if(!isAccept){ | 
|       proxy.$modal.msgError('应该选择${conf.accept}类型的文件') | 
|     }` | 
|     returnList.push('isAccept') | 
|   } | 
|   const str = ` | 
|   /** | 
|    * @name: 上传之前的文件判断 | 
|    * @description: 上传之前的文件判断,判断文件大小文件类型等 | 
|    * @param {*} file | 
|    * @return {*} | 
|    */   | 
|   function ${conf.vModel}BeforeUpload(file) { | 
|     ${rightSizeCode} | 
|     ${acceptCode} | 
|     return ${returnList.join('&&')} | 
|   }` | 
|   return returnList.length ? str : '' | 
| } | 
| /** | 
|  * @name: 生成提交表单方法 | 
|  * @description: 生成提交表单方法 | 
|  * @param {Object} conf vModel 表单ref | 
|  * @return {*} | 
|  */ | 
| function buildSubmitUpload(conf) { | 
|   const str = `function submitUpload() { | 
|     this.$refs['${conf.vModel}'].submit() | 
|   }` | 
|   return str | 
| } | 
| /** | 
|  * @name: 组装js代码 | 
|  * @description: 组装js代码方法 | 
|  * @return {*} | 
|  */ | 
| function buildexport( | 
|   conf, | 
|   type, | 
|   data, | 
|   rules, | 
|   selectOptions, | 
|   uploadVar, | 
|   props, | 
|   methods | 
| ) { | 
|   let str = ` | 
|     const { proxy } = getCurrentInstance() | 
|     const ${conf.formRef} = ref() | 
|     const data = reactive({ | 
|       ${conf.formModel}: { | 
|         ${data} | 
|       }, | 
|       ${conf.formRules}: { | 
|         ${rules} | 
|       } | 
|     }) | 
|   | 
|     const {${conf.formModel}, ${conf.formRules}} = toRefs(data) | 
|   | 
|     ${selectOptions} | 
|   | 
|     ${uploadVar} | 
|   | 
|     ${props} | 
|   | 
|     ${methods} | 
|   ` | 
|    | 
|   if(type === 'dialog') { | 
|     str += ` | 
|       // 弹窗设置 | 
|       const dialogVisible = defineModel() | 
|       // 弹窗确认回调 | 
|       const emit = defineEmits(['confirm']) | 
|       /** | 
|        * @name: 弹窗打开后执行 | 
|        * @description: 弹窗打开后执行方法 | 
|        * @return {*} | 
|        */ | 
|       function onOpen(){ | 
|   | 
|       } | 
|       /** | 
|        * @name: 弹窗关闭时执行 | 
|        * @description: 弹窗关闭方法,重置表单 | 
|        * @return {*} | 
|        */ | 
|       function onClose(){ | 
|         ${conf.formRef}.value.resetFields() | 
|       } | 
|       /** | 
|        * @name: 弹窗取消 | 
|        * @description: 弹窗取消方法 | 
|        * @return {*} | 
|        */ | 
|       function close(){ | 
|         dialogVisible.value = false | 
|       } | 
|       /** | 
|        * @name: 弹窗表单提交 | 
|        * @description: 弹窗表单提交方法 | 
|        * @return {*} | 
|        */ | 
|       function handelConfirm(){ | 
|         ${conf.formRef}.value.validate((valid) => { | 
|           if (!valid) return | 
|           // TODO 提交表单 | 
|   | 
|           close() | 
|           // 回调父级组件 | 
|           emit('confirm') | 
|         }) | 
|       } | 
|     ` | 
|   } else { | 
|     str += ` | 
|     /** | 
|      * @name: 表单提交 | 
|      * @description: 表单提交方法 | 
|      * @return {*} | 
|      */ | 
|     function submitForm() { | 
|       ${conf.formRef}.value.validate((valid) => { | 
|         if (!valid) return | 
|         // TODO 提交表单 | 
|       }) | 
|     } | 
|     /** | 
|      * @name: 表单重置 | 
|      * @description: 表单重置方法 | 
|      * @return {*} | 
|      */ | 
|     function resetForm() { | 
|       ${conf.formRef}.value.resetFields() | 
|     } | 
|     ` | 
|   } | 
|   return str | 
| } |