123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- 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
- }
|