| @@ -41,8 +41,7 @@ public class DictUtils | ||||
|         Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); | ||||
|         if (StringUtils.isNotNull(cacheObj)) | ||||
|         { | ||||
|             List<SysDictData> dictDatas = StringUtils.cast(cacheObj); | ||||
|             return dictDatas; | ||||
|             return StringUtils.cast(cacheObj); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|   | ||||
| @@ -18,8 +18,7 @@ public class ExceptionUtil | ||||
|     { | ||||
|         StringWriter sw = new StringWriter(); | ||||
|         e.printStackTrace(new PrintWriter(sw, true)); | ||||
|         String str = sw.toString(); | ||||
|         return str; | ||||
|         return sw.toString(); | ||||
|     } | ||||
|  | ||||
|     public static String getRootErrorMessage(Exception e) | ||||
|   | ||||
| @@ -99,9 +99,8 @@ public class ServletUtils | ||||
|      *  | ||||
|      * @param response 渲染对象 | ||||
|      * @param string 待渲染的字符串 | ||||
|      * @return null | ||||
|      */ | ||||
|     public static String renderString(HttpServletResponse response, String string) | ||||
|     public static void renderString(HttpServletResponse response, String string) | ||||
|     { | ||||
|         try | ||||
|         { | ||||
| @@ -114,7 +113,6 @@ public class ServletUtils | ||||
|         { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -125,13 +123,13 @@ public class ServletUtils | ||||
|     public static boolean isAjaxRequest(HttpServletRequest request) | ||||
|     { | ||||
|         String accept = request.getHeader("accept"); | ||||
|         if (accept != null && accept.indexOf("application/json") != -1) | ||||
|         if (accept != null && accept.contains("application/json")) | ||||
|         { | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         String xRequestedWith = request.getHeader("X-Requested-With"); | ||||
|         if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) | ||||
|         if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) | ||||
|         { | ||||
|             return true; | ||||
|         } | ||||
| @@ -143,10 +141,6 @@ public class ServletUtils | ||||
|         } | ||||
|  | ||||
|         String ajax = request.getParameter("__ajax"); | ||||
|         if (StringUtils.inStringIgnoreCase(ajax, "json", "xml")) | ||||
|         { | ||||
|             return true; | ||||
|         } | ||||
|         return false; | ||||
|         return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -208,7 +208,6 @@ public class VerifyCodeUtils | ||||
|  | ||||
|         int period = random.nextInt(40) + 10; // 50; | ||||
|  | ||||
|         boolean borderGap = true; | ||||
|         int frames = 20; | ||||
|         int phase = 7; | ||||
|         for (int i = 0; i < w1; i++) | ||||
| @@ -216,13 +215,9 @@ public class VerifyCodeUtils | ||||
|             double d = (double) (period >> 1) | ||||
|                     * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames); | ||||
|             g.copyArea(i, 0, 1, h1, 0, (int) d); | ||||
|             if (borderGap) | ||||
|             { | ||||
|                 g.setColor(color); | ||||
|                 g.drawLine(i, (int) d, i, 0); | ||||
|                 g.drawLine(i, (int) d + h1, i, h1); | ||||
|             } | ||||
|  | ||||
|             g.setColor(color); | ||||
|             g.drawLine(i, (int) d, i, 0); | ||||
|             g.drawLine(i, (int) d + h1, i, h1); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -2,6 +2,8 @@ package com.ruoyi.common.utils.file; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.util.Objects; | ||||
|  | ||||
| import org.apache.commons.io.FilenameUtils; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| import com.ruoyi.common.config.RuoYiConfig; | ||||
| @@ -100,7 +102,7 @@ public class FileUploadUtils | ||||
|             throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, | ||||
|             InvalidExtensionException | ||||
|     { | ||||
|         int fileNamelength = file.getOriginalFilename().length(); | ||||
|         int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); | ||||
|         if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) | ||||
|         { | ||||
|             throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); | ||||
| @@ -112,8 +114,7 @@ public class FileUploadUtils | ||||
|  | ||||
|         File desc = getAbsoluteFile(baseDir, fileName); | ||||
|         file.transferTo(desc); | ||||
|         String pathFileName = getPathFileName(baseDir, fileName); | ||||
|         return pathFileName; | ||||
|         return getPathFileName(baseDir, fileName); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -145,8 +146,7 @@ public class FileUploadUtils | ||||
|     { | ||||
|         int dirLastIndex = RuoYiConfig.getProfile().length() + 1; | ||||
|         String currentDir = StringUtils.substring(uploadDir, dirLastIndex); | ||||
|         String pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; | ||||
|         return pathFileName; | ||||
|         return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -161,7 +161,7 @@ public class FileUploadUtils | ||||
|             throws FileSizeLimitExceededException, InvalidExtensionException | ||||
|     { | ||||
|         long size = file.getSize(); | ||||
|         if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE) | ||||
|         if (size > DEFAULT_MAX_SIZE) | ||||
|         { | ||||
|             throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); | ||||
|         } | ||||
| @@ -228,7 +228,7 @@ public class FileUploadUtils | ||||
|         String extension = FilenameUtils.getExtension(file.getOriginalFilename()); | ||||
|         if (StringUtils.isEmpty(extension)) | ||||
|         { | ||||
|             extension = MimeTypeUtils.getExtension(file.getContentType()); | ||||
|             extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); | ||||
|         } | ||||
|         return extension; | ||||
|     } | ||||
|   | ||||
| @@ -59,7 +59,7 @@ public class ImageUtils | ||||
|     /** | ||||
|      * 读取文件为字节数据 | ||||
|      *  | ||||
|      * @param key 地址 | ||||
|      * @param url 地址 | ||||
|      * @return 字节数据 | ||||
|      */ | ||||
|     public static byte[] readFile(String url) | ||||
|   | ||||
| @@ -5,6 +5,7 @@ import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.InputStreamReader; | ||||
| import java.nio.charset.Charset; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import javax.servlet.ServletRequest; | ||||
| import org.apache.commons.lang3.exception.ExceptionUtils; | ||||
| import org.slf4j.Logger; | ||||
| @@ -25,7 +26,7 @@ public class HttpHelper | ||||
|         BufferedReader reader = null; | ||||
|         try (InputStream inputStream = request.getInputStream()) | ||||
|         { | ||||
|             reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8"))); | ||||
|             reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); | ||||
|             String line = ""; | ||||
|             while ((line = reader.readLine()) != null) | ||||
|             { | ||||
|   | ||||
| @@ -9,6 +9,7 @@ import java.net.ConnectException; | ||||
| import java.net.SocketTimeoutException; | ||||
| import java.net.URL; | ||||
| import java.net.URLConnection; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.security.cert.X509Certificate; | ||||
| import javax.net.ssl.HostnameVerifier; | ||||
| import javax.net.ssl.HttpsURLConnection; | ||||
| @@ -130,9 +131,8 @@ public class HttpUtils | ||||
|         StringBuilder result = new StringBuilder(); | ||||
|         try | ||||
|         { | ||||
|             String urlNameString = url; | ||||
|             log.info("sendPost - {}", urlNameString); | ||||
|             URL realUrl = new URL(urlNameString); | ||||
|             log.info("sendPost - {}", url); | ||||
|             URL realUrl = new URL(url); | ||||
|             URLConnection conn = realUrl.openConnection(); | ||||
|             conn.setRequestProperty("accept", "*/*"); | ||||
|             conn.setRequestProperty("connection", "Keep-Alive"); | ||||
| @@ -144,7 +144,7 @@ public class HttpUtils | ||||
|             out = new PrintWriter(conn.getOutputStream()); | ||||
|             out.print(param); | ||||
|             out.flush(); | ||||
|             in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8")); | ||||
|             in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); | ||||
|             String line; | ||||
|             while ((line = in.readLine()) != null) | ||||
|             { | ||||
| @@ -218,7 +218,7 @@ public class HttpUtils | ||||
|             { | ||||
|                 if (ret != null && !"".equals(ret.trim())) | ||||
|                 { | ||||
|                     result.append(new String(ret.getBytes("ISO-8859-1"), "utf-8")); | ||||
|                     result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); | ||||
|                 } | ||||
|             } | ||||
|             log.info("recv - {}", result); | ||||
|   | ||||
| @@ -25,7 +25,6 @@ public class AddressUtils | ||||
|  | ||||
|     public static String getRealAddressByIP(String ip) | ||||
|     { | ||||
|         String address = UNKNOWN; | ||||
|         // 内网不查询 | ||||
|         if (IpUtils.internalIp(ip)) | ||||
|         { | ||||
| @@ -51,6 +50,6 @@ public class AddressUtils | ||||
|                 log.error("获取地理位置异常 {}", ip); | ||||
|             } | ||||
|         } | ||||
|         return address; | ||||
|         return UNKNOWN; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1121,7 +1121,7 @@ public class ExcelUtil<T> | ||||
|         if (StringUtils.isNotEmpty(excel.targetAttr())) | ||||
|         { | ||||
|             String target = excel.targetAttr(); | ||||
|             if (target.indexOf(".") > -1) | ||||
|             if (target.contains(".")) | ||||
|             { | ||||
|                 String[] targets = target.split("[.]"); | ||||
|                 for (String name : targets) | ||||
| @@ -1216,7 +1216,7 @@ public class ExcelUtil<T> | ||||
|         for (Object[] os : this.fields) | ||||
|         { | ||||
|             Excel excel = (Excel) os[1]; | ||||
|             maxHeight = maxHeight > excel.height() ? maxHeight : excel.height(); | ||||
|             maxHeight = Math.max(maxHeight, excel.height()); | ||||
|         } | ||||
|         return (short) (maxHeight * 20); | ||||
|     } | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| package com.ruoyi.common.utils.sign; | ||||
|  | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.security.MessageDigest; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| @@ -55,7 +56,7 @@ public class Md5Utils | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             return new String(toHex(md5(s)).getBytes("UTF-8"), "UTF-8"); | ||||
|             return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); | ||||
|         } | ||||
|         catch (Exception e) | ||||
|         { | ||||
|   | ||||
| @@ -50,10 +50,8 @@ public class SqlUtil | ||||
|             return; | ||||
|         } | ||||
|         String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); | ||||
|         for (int i = 0; i < sqlKeywords.length; i++) | ||||
|         { | ||||
|             if (StringUtils.indexOfIgnoreCase(value, sqlKeywords[i]) > -1) | ||||
|             { | ||||
|         for (String sqlKeyword : sqlKeywords) { | ||||
|             if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) { | ||||
|                 throw new UtilException("参数存在SQL注入风险"); | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -151,8 +151,7 @@ public class GenUtils | ||||
|     { | ||||
|         int lastIndex = packageName.lastIndexOf("."); | ||||
|         int nameLength = packageName.length(); | ||||
|         String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength); | ||||
|         return moduleName; | ||||
|         return StringUtils.substring(packageName, lastIndex + 1, nameLength); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -165,8 +164,7 @@ public class GenUtils | ||||
|     { | ||||
|         int lastIndex = tableName.lastIndexOf("_"); | ||||
|         int nameLength = tableName.length(); | ||||
|         String businessName = StringUtils.substring(tableName, lastIndex + 1, nameLength); | ||||
|         return businessName; | ||||
|         return StringUtils.substring(tableName, lastIndex + 1, nameLength); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -228,8 +228,7 @@ public class VelocityUtils | ||||
|     public static String getPackagePrefix(String packageName) | ||||
|     { | ||||
|         int lastIndex = packageName.lastIndexOf("."); | ||||
|         String basePackage = StringUtils.substring(packageName, 0, lastIndex); | ||||
|         return basePackage; | ||||
|         return StringUtils.substring(packageName, 0, lastIndex); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -63,12 +63,9 @@ public class SysDeptServiceImpl implements ISysDeptService | ||||
|         { | ||||
|             tempList.add(dept.getDeptId()); | ||||
|         } | ||||
|         for (Iterator<SysDept> iterator = depts.iterator(); iterator.hasNext();) | ||||
|         { | ||||
|             SysDept dept = (SysDept) iterator.next(); | ||||
|         for (SysDept dept : depts) { | ||||
|             // 如果是顶级节点, 遍历该父节点的所有子节点 | ||||
|             if (!tempList.contains(dept.getParentId())) | ||||
|             { | ||||
|             if (!tempList.contains(dept.getParentId())) { | ||||
|                 recursionFn(depts, dept); | ||||
|                 returnList.add(dept); | ||||
|             } | ||||
|   | ||||
| @@ -498,7 +498,7 @@ public class SysMenuServiceImpl implements ISysMenuService | ||||
|      */ | ||||
|     private boolean hasChild(List<SysMenu> list, SysMenu t) | ||||
|     { | ||||
|         return getChildList(list, t).size() > 0 ? true : false; | ||||
|         return getChildList(list, t).size() > 0; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -1,29 +1,29 @@ | ||||
| export default [ | ||||
|   { | ||||
|     layout: 'colFormItem', | ||||
|     tagIcon: 'input', | ||||
|     label: '手机号', | ||||
|     vModel: 'mobile', | ||||
|     formId: 6, | ||||
|     tag: 'el-input', | ||||
|     placeholder: '请输入手机号', | ||||
|     defaultValue: '', | ||||
|     span: 24, | ||||
|     style: { width: '100%' }, | ||||
|     clearable: true, | ||||
|     prepend: '', | ||||
|     append: '', | ||||
|     'prefix-icon': 'el-icon-mobile', | ||||
|     'suffix-icon': '', | ||||
|     maxlength: 11, | ||||
|     'show-word-limit': true, | ||||
|     readonly: false, | ||||
|     disabled: false, | ||||
|     required: true, | ||||
|     changeTag: true, | ||||
|     regList: [{ | ||||
|       pattern: '/^1(3|4|5|7|8|9)\\d{9}$/', | ||||
|       message: '手机号格式错误' | ||||
|     }] | ||||
|   } | ||||
| ] | ||||
| export default [ | ||||
|   { | ||||
|     layout: 'colFormItem', | ||||
|     tagIcon: 'input', | ||||
|     label: '手机号', | ||||
|     vModel: 'mobile', | ||||
|     formId: 6, | ||||
|     tag: 'el-input', | ||||
|     placeholder: '请输入手机号', | ||||
|     defaultValue: '', | ||||
|     span: 24, | ||||
|     style: { width: '100%' }, | ||||
|     clearable: true, | ||||
|     prepend: '', | ||||
|     append: '', | ||||
|     'prefix-icon': 'el-icon-mobile', | ||||
|     'suffix-icon': '', | ||||
|     maxlength: 11, | ||||
|     'show-word-limit': true, | ||||
|     readonly: false, | ||||
|     disabled: false, | ||||
|     required: true, | ||||
|     changeTag: true, | ||||
|     regList: [{ | ||||
|       pattern: '/^1(3|4|5|7|8|9)\\d{9}$/', | ||||
|       message: '手机号格式错误' | ||||
|     }] | ||||
|   } | ||||
| ] | ||||
| @@ -1,359 +1,359 @@ | ||||
| /* eslint-disable max-len */ | ||||
| import { trigger } from './config' | ||||
|  | ||||
| let confGlobal | ||||
| let someSpanIsNot24 | ||||
|  | ||||
| export function dialogWrapper(str) { | ||||
|   return `<el-dialog v-bind="$attrs" v-on="$listeners" @open="onOpen" @close="onClose" title="Dialog Titile"> | ||||
|     ${str} | ||||
|     <div slot="footer"> | ||||
|       <el-button @click="close">取消</el-button> | ||||
|       <el-button type="primary" @click="handelConfirm">确定</el-button> | ||||
|     </div> | ||||
|   </el-dialog>` | ||||
| } | ||||
|  | ||||
| export function vueTemplate(str) { | ||||
|   return `<template> | ||||
|     <div> | ||||
|       ${str} | ||||
|     </div> | ||||
|   </template>` | ||||
| } | ||||
|  | ||||
| export function vueScript(str) { | ||||
|   return `<script> | ||||
|     ${str} | ||||
|   </script>` | ||||
| } | ||||
|  | ||||
| export function cssStyle(cssStr) { | ||||
|   return `<style> | ||||
|     ${cssStr} | ||||
|   </style>` | ||||
| } | ||||
|  | ||||
| function buildFormTemplate(conf, child, type) { | ||||
|   let labelPosition = '' | ||||
|   if (conf.labelPosition !== 'right') { | ||||
|     labelPosition = `label-position="${conf.labelPosition}"` | ||||
|   } | ||||
|   const disabled = conf.disabled ? `:disabled="${conf.disabled}"` : '' | ||||
|   let str = `<el-form ref="${conf.formRef}" :model="${conf.formModel}" :rules="${conf.formRules}" size="${conf.size}" ${disabled} label-width="${conf.labelWidth}px" ${labelPosition}> | ||||
|       ${child} | ||||
|       ${buildFromBtns(conf, type)} | ||||
|     </el-form>` | ||||
|   if (someSpanIsNot24) { | ||||
|     str = `<el-row :gutter="${conf.gutter}"> | ||||
|         ${str} | ||||
|       </el-row>` | ||||
|   } | ||||
|   return str | ||||
| } | ||||
|  | ||||
| function buildFromBtns(conf, type) { | ||||
|   let str = '' | ||||
|   if (conf.formBtns && type === 'file') { | ||||
|     str = `<el-form-item size="large"> | ||||
|           <el-button type="primary" @click="submitForm">提交</el-button> | ||||
|           <el-button @click="resetForm">重置</el-button> | ||||
|         </el-form-item>` | ||||
|     if (someSpanIsNot24) { | ||||
|       str = `<el-col :span="24"> | ||||
|           ${str} | ||||
|         </el-col>` | ||||
|     } | ||||
|   } | ||||
|   return str | ||||
| } | ||||
|  | ||||
| // span不为24的用el-col包裹 | ||||
| function colWrapper(element, str) { | ||||
|   if (someSpanIsNot24 || element.span !== 24) { | ||||
|     return `<el-col :span="${element.span}"> | ||||
|       ${str} | ||||
|     </el-col>` | ||||
|   } | ||||
|   return str | ||||
| } | ||||
|  | ||||
| const layouts = { | ||||
|   colFormItem(element) { | ||||
|     let labelWidth = '' | ||||
|     if (element.labelWidth && element.labelWidth !== confGlobal.labelWidth) { | ||||
|       labelWidth = `label-width="${element.labelWidth}px"` | ||||
|     } | ||||
|     const required = !trigger[element.tag] && element.required ? 'required' : '' | ||||
|     const tagDom = tags[element.tag] ? tags[element.tag](element) : null | ||||
|     let str = `<el-form-item ${labelWidth} label="${element.label}" prop="${element.vModel}" ${required}> | ||||
|         ${tagDom} | ||||
|       </el-form-item>` | ||||
|     str = colWrapper(element, str) | ||||
|     return str | ||||
|   }, | ||||
|   rowFormItem(element) { | ||||
|     const type = element.type === 'default' ? '' : `type="${element.type}"` | ||||
|     const justify = element.type === 'default' ? '' : `justify="${element.justify}"` | ||||
|     const align = element.type === 'default' ? '' : `align="${element.align}"` | ||||
|     const gutter = element.gutter ? `gutter="${element.gutter}"` : '' | ||||
|     const children = element.children.map(el => layouts[el.layout](el)) | ||||
|     let str = `<el-row ${type} ${justify} ${align} ${gutter}> | ||||
|       ${children.join('\n')} | ||||
|     </el-row>` | ||||
|     str = colWrapper(element, str) | ||||
|     return str | ||||
|   } | ||||
| } | ||||
|  | ||||
| const tags = { | ||||
|   'el-button': el => { | ||||
|     const { | ||||
|       tag, disabled | ||||
|     } = attrBuilder(el) | ||||
|     const type = el.type ? `type="${el.type}"` : '' | ||||
|     const icon = el.icon ? `icon="${el.icon}"` : '' | ||||
|     const size = el.size ? `size="${el.size}"` : '' | ||||
|     let child = buildElButtonChild(el) | ||||
|  | ||||
|     if (child) child = `\n${child}\n` // 换行 | ||||
|     return `<${el.tag} ${type} ${icon} ${size} ${disabled}>${child}</${el.tag}>` | ||||
|   }, | ||||
|   'el-input': el => { | ||||
|     const { | ||||
|       disabled, vModel, clearable, placeholder, width | ||||
|     } = attrBuilder(el) | ||||
|     const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : '' | ||||
|     const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : '' | ||||
|     const readonly = el.readonly ? 'readonly' : '' | ||||
|     const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : '' | ||||
|     const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : '' | ||||
|     const showPassword = el['show-password'] ? 'show-password' : '' | ||||
|     const type = el.type ? `type="${el.type}"` : '' | ||||
|     const autosize = el.autosize && el.autosize.minRows | ||||
|       ? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"` | ||||
|       : '' | ||||
|     let child = buildElInputChild(el) | ||||
|  | ||||
|     if (child) child = `\n${child}\n` // 换行 | ||||
|     return `<${el.tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}</${el.tag}>` | ||||
|   }, | ||||
|   'el-input-number': el => { | ||||
|     const { disabled, vModel, placeholder } = attrBuilder(el) | ||||
|     const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : '' | ||||
|     const min = el.min ? `:min='${el.min}'` : '' | ||||
|     const max = el.max ? `:max='${el.max}'` : '' | ||||
|     const step = el.step ? `:step='${el.step}'` : '' | ||||
|     const stepStrictly = el['step-strictly'] ? 'step-strictly' : '' | ||||
|     const precision = el.precision ? `:precision='${el.precision}'` : '' | ||||
|  | ||||
|     return `<${el.tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-select': el => { | ||||
|     const { | ||||
|       disabled, vModel, clearable, placeholder, width | ||||
|     } = attrBuilder(el) | ||||
|     const filterable = el.filterable ? 'filterable' : '' | ||||
|     const multiple = el.multiple ? 'multiple' : '' | ||||
|     let child = buildElSelectChild(el) | ||||
|  | ||||
|     if (child) child = `\n${child}\n` // 换行 | ||||
|     return `<${el.tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}</${el.tag}>` | ||||
|   }, | ||||
|   'el-radio-group': el => { | ||||
|     const { disabled, vModel } = attrBuilder(el) | ||||
|     const size = `size="${el.size}"` | ||||
|     let child = buildElRadioGroupChild(el) | ||||
|  | ||||
|     if (child) child = `\n${child}\n` // 换行 | ||||
|     return `<${el.tag} ${vModel} ${size} ${disabled}>${child}</${el.tag}>` | ||||
|   }, | ||||
|   'el-checkbox-group': el => { | ||||
|     const { disabled, vModel } = attrBuilder(el) | ||||
|     const size = `size="${el.size}"` | ||||
|     const min = el.min ? `:min="${el.min}"` : '' | ||||
|     const max = el.max ? `:max="${el.max}"` : '' | ||||
|     let child = buildElCheckboxGroupChild(el) | ||||
|  | ||||
|     if (child) child = `\n${child}\n` // 换行 | ||||
|     return `<${el.tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}</${el.tag}>` | ||||
|   }, | ||||
|   'el-switch': el => { | ||||
|     const { disabled, vModel } = attrBuilder(el) | ||||
|     const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : '' | ||||
|     const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : '' | ||||
|     const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : '' | ||||
|     const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : '' | ||||
|     const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : '' | ||||
|     const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : '' | ||||
|  | ||||
|     return `<${el.tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-cascader': el => { | ||||
|     const { | ||||
|       disabled, vModel, clearable, placeholder, width | ||||
|     } = attrBuilder(el) | ||||
|     const options = el.options ? `:options="${el.vModel}Options"` : '' | ||||
|     const props = el.props ? `:props="${el.vModel}Props"` : '' | ||||
|     const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"' | ||||
|     const filterable = el.filterable ? 'filterable' : '' | ||||
|     const separator = el.separator === '/' ? '' : `separator="${el.separator}"` | ||||
|  | ||||
|     return `<${el.tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-slider': el => { | ||||
|     const { disabled, vModel } = attrBuilder(el) | ||||
|     const min = el.min ? `:min='${el.min}'` : '' | ||||
|     const max = el.max ? `:max='${el.max}'` : '' | ||||
|     const step = el.step ? `:step='${el.step}'` : '' | ||||
|     const range = el.range ? 'range' : '' | ||||
|     const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : '' | ||||
|  | ||||
|     return `<${el.tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-time-picker': el => { | ||||
|     const { | ||||
|       disabled, vModel, clearable, placeholder, width | ||||
|     } = attrBuilder(el) | ||||
|     const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' | ||||
|     const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' | ||||
|     const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' | ||||
|     const isRange = el['is-range'] ? 'is-range' : '' | ||||
|     const format = el.format ? `format="${el.format}"` : '' | ||||
|     const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' | ||||
|     const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : '' | ||||
|  | ||||
|     return `<${el.tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-date-picker': el => { | ||||
|     const { | ||||
|       disabled, vModel, clearable, placeholder, width | ||||
|     } = attrBuilder(el) | ||||
|     const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' | ||||
|     const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' | ||||
|     const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' | ||||
|     const format = el.format ? `format="${el.format}"` : '' | ||||
|     const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' | ||||
|     const type = el.type === 'date' ? '' : `type="${el.type}"` | ||||
|     const readonly = el.readonly ? 'readonly' : '' | ||||
|  | ||||
|     return `<${el.tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-rate': el => { | ||||
|     const { disabled, vModel } = attrBuilder(el) | ||||
|     const max = el.max ? `:max='${el.max}'` : '' | ||||
|     const allowHalf = el['allow-half'] ? 'allow-half' : '' | ||||
|     const showText = el['show-text'] ? 'show-text' : '' | ||||
|     const showScore = el['show-score'] ? 'show-score' : '' | ||||
|  | ||||
|     return `<${el.tag} ${vModel} ${allowHalf} ${showText} ${showScore} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-color-picker': el => { | ||||
|     const { disabled, vModel } = attrBuilder(el) | ||||
|     const size = `size="${el.size}"` | ||||
|     const showAlpha = el['show-alpha'] ? 'show-alpha' : '' | ||||
|     const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : '' | ||||
|  | ||||
|     return `<${el.tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-upload': el => { | ||||
|     const disabled = el.disabled ? ':disabled=\'true\'' : '' | ||||
|     const action = el.action ? `:action="${el.vModel}Action"` : '' | ||||
|     const multiple = el.multiple ? 'multiple' : '' | ||||
|     const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : '' | ||||
|     const accept = el.accept ? `accept="${el.accept}"` : '' | ||||
|     const name = el.name !== 'file' ? `name="${el.name}"` : '' | ||||
|     const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : '' | ||||
|     const beforeUpload = `:before-upload="${el.vModel}BeforeUpload"` | ||||
|     const fileList = `:file-list="${el.vModel}fileList"` | ||||
|     const ref = `ref="${el.vModel}"` | ||||
|     let child = buildElUploadChild(el) | ||||
|  | ||||
|     if (child) child = `\n${child}\n` // 换行 | ||||
|     return `<${el.tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}</${el.tag}>` | ||||
|   } | ||||
| } | ||||
|  | ||||
| function attrBuilder(el) { | ||||
|   return { | ||||
|     vModel: `v-model="${confGlobal.formModel}.${el.vModel}"`, | ||||
|     clearable: el.clearable ? 'clearable' : '', | ||||
|     placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '', | ||||
|     width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '', | ||||
|     disabled: el.disabled ? ':disabled=\'true\'' : '' | ||||
|   } | ||||
| } | ||||
|  | ||||
| // el-buttin 子级 | ||||
| function buildElButtonChild(conf) { | ||||
|   const children = [] | ||||
|   if (conf.default) { | ||||
|     children.push(conf.default) | ||||
|   } | ||||
|   return children.join('\n') | ||||
| } | ||||
|  | ||||
| // el-input innerHTML | ||||
| function buildElInputChild(conf) { | ||||
|   const children = [] | ||||
|   if (conf.prepend) { | ||||
|     children.push(`<template slot="prepend">${conf.prepend}</template>`) | ||||
|   } | ||||
|   if (conf.append) { | ||||
|     children.push(`<template slot="append">${conf.append}</template>`) | ||||
|   } | ||||
|   return children.join('\n') | ||||
| } | ||||
|  | ||||
| function buildElSelectChild(conf) { | ||||
|   const children = [] | ||||
|   if (conf.options && conf.options.length) { | ||||
|     children.push(`<el-option v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.label" :value="item.value" :disabled="item.disabled"></el-option>`) | ||||
|   } | ||||
|   return children.join('\n') | ||||
| } | ||||
|  | ||||
| function buildElRadioGroupChild(conf) { | ||||
|   const children = [] | ||||
|   if (conf.options && conf.options.length) { | ||||
|     const tag = conf.optionType === 'button' ? 'el-radio-button' : 'el-radio' | ||||
|     const border = conf.border ? 'border' : '' | ||||
|     children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`) | ||||
|   } | ||||
|   return children.join('\n') | ||||
| } | ||||
|  | ||||
| function buildElCheckboxGroupChild(conf) { | ||||
|   const children = [] | ||||
|   if (conf.options && conf.options.length) { | ||||
|     const tag = conf.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox' | ||||
|     const border = conf.border ? 'border' : '' | ||||
|     children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`) | ||||
|   } | ||||
|   return children.join('\n') | ||||
| } | ||||
|  | ||||
| function buildElUploadChild(conf) { | ||||
|   const list = [] | ||||
|   if (conf['list-type'] === 'picture-card') list.push('<i class="el-icon-plus"></i>') | ||||
|   else list.push(`<el-button size="small" type="primary" icon="el-icon-upload">${conf.buttonText}</el-button>`) | ||||
|   if (conf.showTip) list.push(`<div slot="tip" class="el-upload__tip">只能上传不超过 ${conf.fileSize}${conf.sizeUnit} 的${conf.accept}文件</div>`) | ||||
|   return list.join('\n') | ||||
| } | ||||
|  | ||||
| export function makeUpHtml(conf, type) { | ||||
|   const htmlList = [] | ||||
|   confGlobal = conf | ||||
|   someSpanIsNot24 = conf.fields.some(item => item.span !== 24) | ||||
|   conf.fields.forEach(el => { | ||||
|     htmlList.push(layouts[el.layout](el)) | ||||
|   }) | ||||
|   const htmlStr = htmlList.join('\n') | ||||
|  | ||||
|   let temp = buildFormTemplate(conf, htmlStr, type) | ||||
|   if (type === 'dialog') { | ||||
|     temp = dialogWrapper(temp) | ||||
|   } | ||||
|   confGlobal = null | ||||
|   return temp | ||||
| } | ||||
| /* eslint-disable max-len */ | ||||
| import { trigger } from './config' | ||||
|  | ||||
| let confGlobal | ||||
| let someSpanIsNot24 | ||||
|  | ||||
| export function dialogWrapper(str) { | ||||
|   return `<el-dialog v-bind="$attrs" v-on="$listeners" @open="onOpen" @close="onClose" title="Dialog Title"> | ||||
|     ${str} | ||||
|     <div slot="footer"> | ||||
|       <el-button @click="close">取消</el-button> | ||||
|       <el-button type="primary" @click="handleConfirm">确定</el-button> | ||||
|     </div> | ||||
|   </el-dialog>` | ||||
| } | ||||
|  | ||||
| export function vueTemplate(str) { | ||||
|   return `<template> | ||||
|     <div> | ||||
|       ${str} | ||||
|     </div> | ||||
|   </template>` | ||||
| } | ||||
|  | ||||
| export function vueScript(str) { | ||||
|   return `<script> | ||||
|     ${str} | ||||
|   </script>` | ||||
| } | ||||
|  | ||||
| export function cssStyle(cssStr) { | ||||
|   return `<style> | ||||
|     ${cssStr} | ||||
|   </style>` | ||||
| } | ||||
|  | ||||
| function buildFormTemplate(conf, child, type) { | ||||
|   let labelPosition = '' | ||||
|   if (conf.labelPosition !== 'right') { | ||||
|     labelPosition = `label-position="${conf.labelPosition}"` | ||||
|   } | ||||
|   const disabled = conf.disabled ? `:disabled="${conf.disabled}"` : '' | ||||
|   let str = `<el-form ref="${conf.formRef}" :model="${conf.formModel}" :rules="${conf.formRules}" size="${conf.size}" ${disabled} label-width="${conf.labelWidth}px" ${labelPosition}> | ||||
|       ${child} | ||||
|       ${buildFromBtns(conf, type)} | ||||
|     </el-form>` | ||||
|   if (someSpanIsNot24) { | ||||
|     str = `<el-row :gutter="${conf.gutter}"> | ||||
|         ${str} | ||||
|       </el-row>` | ||||
|   } | ||||
|   return str | ||||
| } | ||||
|  | ||||
| function buildFromBtns(conf, type) { | ||||
|   let str = '' | ||||
|   if (conf.formBtns && type === 'file') { | ||||
|     str = `<el-form-item size="large"> | ||||
|           <el-button type="primary" @click="submitForm">提交</el-button> | ||||
|           <el-button @click="resetForm">重置</el-button> | ||||
|         </el-form-item>` | ||||
|     if (someSpanIsNot24) { | ||||
|       str = `<el-col :span="24"> | ||||
|           ${str} | ||||
|         </el-col>` | ||||
|     } | ||||
|   } | ||||
|   return str | ||||
| } | ||||
|  | ||||
| // span不为24的用el-col包裹 | ||||
| function colWrapper(element, str) { | ||||
|   if (someSpanIsNot24 || element.span !== 24) { | ||||
|     return `<el-col :span="${element.span}"> | ||||
|       ${str} | ||||
|     </el-col>` | ||||
|   } | ||||
|   return str | ||||
| } | ||||
|  | ||||
| const layouts = { | ||||
|   colFormItem(element) { | ||||
|     let labelWidth = '' | ||||
|     if (element.labelWidth && element.labelWidth !== confGlobal.labelWidth) { | ||||
|       labelWidth = `label-width="${element.labelWidth}px"` | ||||
|     } | ||||
|     const required = !trigger[element.tag] && element.required ? 'required' : '' | ||||
|     const tagDom = tags[element.tag] ? tags[element.tag](element) : null | ||||
|     let str = `<el-form-item ${labelWidth} label="${element.label}" prop="${element.vModel}" ${required}> | ||||
|         ${tagDom} | ||||
|       </el-form-item>` | ||||
|     str = colWrapper(element, str) | ||||
|     return str | ||||
|   }, | ||||
|   rowFormItem(element) { | ||||
|     const type = element.type === 'default' ? '' : `type="${element.type}"` | ||||
|     const justify = element.type === 'default' ? '' : `justify="${element.justify}"` | ||||
|     const align = element.type === 'default' ? '' : `align="${element.align}"` | ||||
|     const gutter = element.gutter ? `gutter="${element.gutter}"` : '' | ||||
|     const children = element.children.map(el => layouts[el.layout](el)) | ||||
|     let str = `<el-row ${type} ${justify} ${align} ${gutter}> | ||||
|       ${children.join('\n')} | ||||
|     </el-row>` | ||||
|     str = colWrapper(element, str) | ||||
|     return str | ||||
|   } | ||||
| } | ||||
|  | ||||
| const tags = { | ||||
|   'el-button': el => { | ||||
|     const { | ||||
|       tag, disabled | ||||
|     } = attrBuilder(el) | ||||
|     const type = el.type ? `type="${el.type}"` : '' | ||||
|     const icon = el.icon ? `icon="${el.icon}"` : '' | ||||
|     const size = el.size ? `size="${el.size}"` : '' | ||||
|     let child = buildElButtonChild(el) | ||||
|  | ||||
|     if (child) child = `\n${child}\n` // 换行 | ||||
|     return `<${el.tag} ${type} ${icon} ${size} ${disabled}>${child}</${el.tag}>` | ||||
|   }, | ||||
|   'el-input': el => { | ||||
|     const { | ||||
|       disabled, vModel, clearable, placeholder, width | ||||
|     } = attrBuilder(el) | ||||
|     const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : '' | ||||
|     const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : '' | ||||
|     const readonly = el.readonly ? 'readonly' : '' | ||||
|     const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : '' | ||||
|     const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : '' | ||||
|     const showPassword = el['show-password'] ? 'show-password' : '' | ||||
|     const type = el.type ? `type="${el.type}"` : '' | ||||
|     const autosize = el.autosize && el.autosize.minRows | ||||
|       ? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"` | ||||
|       : '' | ||||
|     let child = buildElInputChild(el) | ||||
|  | ||||
|     if (child) child = `\n${child}\n` // 换行 | ||||
|     return `<${el.tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}</${el.tag}>` | ||||
|   }, | ||||
|   'el-input-number': el => { | ||||
|     const { disabled, vModel, placeholder } = attrBuilder(el) | ||||
|     const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : '' | ||||
|     const min = el.min ? `:min='${el.min}'` : '' | ||||
|     const max = el.max ? `:max='${el.max}'` : '' | ||||
|     const step = el.step ? `:step='${el.step}'` : '' | ||||
|     const stepStrictly = el['step-strictly'] ? 'step-strictly' : '' | ||||
|     const precision = el.precision ? `:precision='${el.precision}'` : '' | ||||
|  | ||||
|     return `<${el.tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-select': el => { | ||||
|     const { | ||||
|       disabled, vModel, clearable, placeholder, width | ||||
|     } = attrBuilder(el) | ||||
|     const filterable = el.filterable ? 'filterable' : '' | ||||
|     const multiple = el.multiple ? 'multiple' : '' | ||||
|     let child = buildElSelectChild(el) | ||||
|  | ||||
|     if (child) child = `\n${child}\n` // 换行 | ||||
|     return `<${el.tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}</${el.tag}>` | ||||
|   }, | ||||
|   'el-radio-group': el => { | ||||
|     const { disabled, vModel } = attrBuilder(el) | ||||
|     const size = `size="${el.size}"` | ||||
|     let child = buildElRadioGroupChild(el) | ||||
|  | ||||
|     if (child) child = `\n${child}\n` // 换行 | ||||
|     return `<${el.tag} ${vModel} ${size} ${disabled}>${child}</${el.tag}>` | ||||
|   }, | ||||
|   'el-checkbox-group': el => { | ||||
|     const { disabled, vModel } = attrBuilder(el) | ||||
|     const size = `size="${el.size}"` | ||||
|     const min = el.min ? `:min="${el.min}"` : '' | ||||
|     const max = el.max ? `:max="${el.max}"` : '' | ||||
|     let child = buildElCheckboxGroupChild(el) | ||||
|  | ||||
|     if (child) child = `\n${child}\n` // 换行 | ||||
|     return `<${el.tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}</${el.tag}>` | ||||
|   }, | ||||
|   'el-switch': el => { | ||||
|     const { disabled, vModel } = attrBuilder(el) | ||||
|     const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : '' | ||||
|     const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : '' | ||||
|     const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : '' | ||||
|     const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : '' | ||||
|     const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : '' | ||||
|     const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : '' | ||||
|  | ||||
|     return `<${el.tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-cascader': el => { | ||||
|     const { | ||||
|       disabled, vModel, clearable, placeholder, width | ||||
|     } = attrBuilder(el) | ||||
|     const options = el.options ? `:options="${el.vModel}Options"` : '' | ||||
|     const props = el.props ? `:props="${el.vModel}Props"` : '' | ||||
|     const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"' | ||||
|     const filterable = el.filterable ? 'filterable' : '' | ||||
|     const separator = el.separator === '/' ? '' : `separator="${el.separator}"` | ||||
|  | ||||
|     return `<${el.tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-slider': el => { | ||||
|     const { disabled, vModel } = attrBuilder(el) | ||||
|     const min = el.min ? `:min='${el.min}'` : '' | ||||
|     const max = el.max ? `:max='${el.max}'` : '' | ||||
|     const step = el.step ? `:step='${el.step}'` : '' | ||||
|     const range = el.range ? 'range' : '' | ||||
|     const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : '' | ||||
|  | ||||
|     return `<${el.tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-time-picker': el => { | ||||
|     const { | ||||
|       disabled, vModel, clearable, placeholder, width | ||||
|     } = attrBuilder(el) | ||||
|     const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' | ||||
|     const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' | ||||
|     const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' | ||||
|     const isRange = el['is-range'] ? 'is-range' : '' | ||||
|     const format = el.format ? `format="${el.format}"` : '' | ||||
|     const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' | ||||
|     const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : '' | ||||
|  | ||||
|     return `<${el.tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-date-picker': el => { | ||||
|     const { | ||||
|       disabled, vModel, clearable, placeholder, width | ||||
|     } = attrBuilder(el) | ||||
|     const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' | ||||
|     const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' | ||||
|     const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' | ||||
|     const format = el.format ? `format="${el.format}"` : '' | ||||
|     const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' | ||||
|     const type = el.type === 'date' ? '' : `type="${el.type}"` | ||||
|     const readonly = el.readonly ? 'readonly' : '' | ||||
|  | ||||
|     return `<${el.tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-rate': el => { | ||||
|     const { disabled, vModel } = attrBuilder(el) | ||||
|     const max = el.max ? `:max='${el.max}'` : '' | ||||
|     const allowHalf = el['allow-half'] ? 'allow-half' : '' | ||||
|     const showText = el['show-text'] ? 'show-text' : '' | ||||
|     const showScore = el['show-score'] ? 'show-score' : '' | ||||
|  | ||||
|     return `<${el.tag} ${vModel} ${allowHalf} ${showText} ${showScore} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-color-picker': el => { | ||||
|     const { disabled, vModel } = attrBuilder(el) | ||||
|     const size = `size="${el.size}"` | ||||
|     const showAlpha = el['show-alpha'] ? 'show-alpha' : '' | ||||
|     const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : '' | ||||
|  | ||||
|     return `<${el.tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}></${el.tag}>` | ||||
|   }, | ||||
|   'el-upload': el => { | ||||
|     const disabled = el.disabled ? ':disabled=\'true\'' : '' | ||||
|     const action = el.action ? `:action="${el.vModel}Action"` : '' | ||||
|     const multiple = el.multiple ? 'multiple' : '' | ||||
|     const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : '' | ||||
|     const accept = el.accept ? `accept="${el.accept}"` : '' | ||||
|     const name = el.name !== 'file' ? `name="${el.name}"` : '' | ||||
|     const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : '' | ||||
|     const beforeUpload = `:before-upload="${el.vModel}BeforeUpload"` | ||||
|     const fileList = `:file-list="${el.vModel}fileList"` | ||||
|     const ref = `ref="${el.vModel}"` | ||||
|     let child = buildElUploadChild(el) | ||||
|  | ||||
|     if (child) child = `\n${child}\n` // 换行 | ||||
|     return `<${el.tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}</${el.tag}>` | ||||
|   } | ||||
| } | ||||
|  | ||||
| function attrBuilder(el) { | ||||
|   return { | ||||
|     vModel: `v-model="${confGlobal.formModel}.${el.vModel}"`, | ||||
|     clearable: el.clearable ? 'clearable' : '', | ||||
|     placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '', | ||||
|     width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '', | ||||
|     disabled: el.disabled ? ':disabled=\'true\'' : '' | ||||
|   } | ||||
| } | ||||
|  | ||||
| // el-buttin 子级 | ||||
| function buildElButtonChild(conf) { | ||||
|   const children = [] | ||||
|   if (conf.default) { | ||||
|     children.push(conf.default) | ||||
|   } | ||||
|   return children.join('\n') | ||||
| } | ||||
|  | ||||
| // el-input innerHTML | ||||
| function buildElInputChild(conf) { | ||||
|   const children = [] | ||||
|   if (conf.prepend) { | ||||
|     children.push(`<template slot="prepend">${conf.prepend}</template>`) | ||||
|   } | ||||
|   if (conf.append) { | ||||
|     children.push(`<template slot="append">${conf.append}</template>`) | ||||
|   } | ||||
|   return children.join('\n') | ||||
| } | ||||
|  | ||||
| function buildElSelectChild(conf) { | ||||
|   const children = [] | ||||
|   if (conf.options && conf.options.length) { | ||||
|     children.push(`<el-option v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.label" :value="item.value" :disabled="item.disabled"></el-option>`) | ||||
|   } | ||||
|   return children.join('\n') | ||||
| } | ||||
|  | ||||
| function buildElRadioGroupChild(conf) { | ||||
|   const children = [] | ||||
|   if (conf.options && conf.options.length) { | ||||
|     const tag = conf.optionType === 'button' ? 'el-radio-button' : 'el-radio' | ||||
|     const border = conf.border ? 'border' : '' | ||||
|     children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`) | ||||
|   } | ||||
|   return children.join('\n') | ||||
| } | ||||
|  | ||||
| function buildElCheckboxGroupChild(conf) { | ||||
|   const children = [] | ||||
|   if (conf.options && conf.options.length) { | ||||
|     const tag = conf.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox' | ||||
|     const border = conf.border ? 'border' : '' | ||||
|     children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}</${tag}>`) | ||||
|   } | ||||
|   return children.join('\n') | ||||
| } | ||||
|  | ||||
| function buildElUploadChild(conf) { | ||||
|   const list = [] | ||||
|   if (conf['list-type'] === 'picture-card') list.push('<i class="el-icon-plus"></i>') | ||||
|   else list.push(`<el-button size="small" type="primary" icon="el-icon-upload">${conf.buttonText}</el-button>`) | ||||
|   if (conf.showTip) list.push(`<div slot="tip" class="el-upload__tip">只能上传不超过 ${conf.fileSize}${conf.sizeUnit} 的${conf.accept}文件</div>`) | ||||
|   return list.join('\n') | ||||
| } | ||||
|  | ||||
| export function makeUpHtml(conf, type) { | ||||
|   const htmlList = [] | ||||
|   confGlobal = conf | ||||
|   someSpanIsNot24 = conf.fields.some(item => item.span !== 24) | ||||
|   conf.fields.forEach(el => { | ||||
|     htmlList.push(layouts[el.layout](el)) | ||||
|   }) | ||||
|   const htmlStr = htmlList.join('\n') | ||||
|  | ||||
|   let temp = buildFormTemplate(conf, htmlStr, type) | ||||
|   if (type === 'dialog') { | ||||
|     temp = dialogWrapper(temp) | ||||
|   } | ||||
|   confGlobal = null | ||||
|   return temp | ||||
| } | ||||
|   | ||||
| @@ -1,236 +1,236 @@ | ||||
| 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 | ||||
| } | ||||
| 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) | ||||
|       },`, | ||||
|         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 = 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 | ||||
| } | ||||
|   | ||||
| @@ -1,106 +1,106 @@ | ||||
| <template> | ||||
|   <div> | ||||
|     <el-dialog | ||||
|       v-bind="$attrs" | ||||
|       width="500px" | ||||
|       :close-on-click-modal="false" | ||||
|       :modal-append-to-body="false" | ||||
|       v-on="$listeners" | ||||
|       @open="onOpen" | ||||
|       @close="onClose" | ||||
|     > | ||||
|       <el-row :gutter="15"> | ||||
|         <el-form | ||||
|           ref="elForm" | ||||
|           :model="formData" | ||||
|           :rules="rules" | ||||
|           size="medium" | ||||
|           label-width="100px" | ||||
|         > | ||||
|           <el-col :span="24"> | ||||
|             <el-form-item label="生成类型" prop="type"> | ||||
|               <el-radio-group v-model="formData.type"> | ||||
|                 <el-radio-button | ||||
|                   v-for="(item, index) in typeOptions" | ||||
|                   :key="index" | ||||
|                   :label="item.value" | ||||
|                   :disabled="item.disabled" | ||||
|                 > | ||||
|                   {{ item.label }} | ||||
|                 </el-radio-button> | ||||
|               </el-radio-group> | ||||
|             </el-form-item> | ||||
|             <el-form-item v-if="showFileName" label="文件名" prop="fileName"> | ||||
|               <el-input v-model="formData.fileName" placeholder="请输入文件名" clearable /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|         </el-form> | ||||
|       </el-row> | ||||
|  | ||||
|       <div slot="footer"> | ||||
|         <el-button @click="close"> | ||||
|           取消 | ||||
|         </el-button> | ||||
|         <el-button type="primary" @click="handelConfirm"> | ||||
|           确定 | ||||
|         </el-button> | ||||
|       </div> | ||||
|     </el-dialog> | ||||
|   </div> | ||||
| </template> | ||||
| <script> | ||||
| export default { | ||||
|   inheritAttrs: false, | ||||
|   props: ['showFileName'], | ||||
|   data() { | ||||
|     return { | ||||
|       formData: { | ||||
|         fileName: undefined, | ||||
|         type: 'file' | ||||
|       }, | ||||
|       rules: { | ||||
|         fileName: [{ | ||||
|           required: true, | ||||
|           message: '请输入文件名', | ||||
|           trigger: 'blur' | ||||
|         }], | ||||
|         type: [{ | ||||
|           required: true, | ||||
|           message: '生成类型不能为空', | ||||
|           trigger: 'change' | ||||
|         }] | ||||
|       }, | ||||
|       typeOptions: [{ | ||||
|         label: '页面', | ||||
|         value: 'file' | ||||
|       }, { | ||||
|         label: '弹窗', | ||||
|         value: 'dialog' | ||||
|       }] | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|   }, | ||||
|   watch: {}, | ||||
|   mounted() {}, | ||||
|   methods: { | ||||
|     onOpen() { | ||||
|       if (this.showFileName) { | ||||
|         this.formData.fileName = `${+new Date()}.vue` | ||||
|       } | ||||
|     }, | ||||
|     onClose() { | ||||
|     }, | ||||
|     close(e) { | ||||
|       this.$emit('update:visible', false) | ||||
|     }, | ||||
|     handelConfirm() { | ||||
|       this.$refs.elForm.validate(valid => { | ||||
|         if (!valid) return | ||||
|         this.$emit('confirm', { ...this.formData }) | ||||
|         this.close() | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
| <template> | ||||
|   <div> | ||||
|     <el-dialog | ||||
|       v-bind="$attrs" | ||||
|       width="500px" | ||||
|       :close-on-click-modal="false" | ||||
|       :modal-append-to-body="false" | ||||
|       v-on="$listeners" | ||||
|       @open="onOpen" | ||||
|       @close="onClose" | ||||
|     > | ||||
|       <el-row :gutter="15"> | ||||
|         <el-form | ||||
|           ref="elForm" | ||||
|           :model="formData" | ||||
|           :rules="rules" | ||||
|           size="medium" | ||||
|           label-width="100px" | ||||
|         > | ||||
|           <el-col :span="24"> | ||||
|             <el-form-item label="生成类型" prop="type"> | ||||
|               <el-radio-group v-model="formData.type"> | ||||
|                 <el-radio-button | ||||
|                   v-for="(item, index) in typeOptions" | ||||
|                   :key="index" | ||||
|                   :label="item.value" | ||||
|                   :disabled="item.disabled" | ||||
|                 > | ||||
|                   {{ item.label }} | ||||
|                 </el-radio-button> | ||||
|               </el-radio-group> | ||||
|             </el-form-item> | ||||
|             <el-form-item v-if="showFileName" label="文件名" prop="fileName"> | ||||
|               <el-input v-model="formData.fileName" placeholder="请输入文件名" clearable /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|         </el-form> | ||||
|       </el-row> | ||||
|  | ||||
|       <div slot="footer"> | ||||
|         <el-button @click="close"> | ||||
|           取消 | ||||
|         </el-button> | ||||
|         <el-button type="primary" @click="handleConfirm"> | ||||
|           确定 | ||||
|         </el-button> | ||||
|       </div> | ||||
|     </el-dialog> | ||||
|   </div> | ||||
| </template> | ||||
| <script> | ||||
| export default { | ||||
|   inheritAttrs: false, | ||||
|   props: ['showFileName'], | ||||
|   data() { | ||||
|     return { | ||||
|       formData: { | ||||
|         fileName: undefined, | ||||
|         type: 'file' | ||||
|       }, | ||||
|       rules: { | ||||
|         fileName: [{ | ||||
|           required: true, | ||||
|           message: '请输入文件名', | ||||
|           trigger: 'blur' | ||||
|         }], | ||||
|         type: [{ | ||||
|           required: true, | ||||
|           message: '生成类型不能为空', | ||||
|           trigger: 'change' | ||||
|         }] | ||||
|       }, | ||||
|       typeOptions: [{ | ||||
|         label: '页面', | ||||
|         value: 'file' | ||||
|       }, { | ||||
|         label: '弹窗', | ||||
|         value: 'dialog' | ||||
|       }] | ||||
|     } | ||||
|   }, | ||||
|   computed: { | ||||
|   }, | ||||
|   watch: {}, | ||||
|   mounted() {}, | ||||
|   methods: { | ||||
|     onOpen() { | ||||
|       if (this.showFileName) { | ||||
|         this.formData.fileName = `${+new Date()}.vue` | ||||
|       } | ||||
|     }, | ||||
|     onClose() { | ||||
|     }, | ||||
|     close(e) { | ||||
|       this.$emit('update:visible', false) | ||||
|     }, | ||||
|     handleConfirm() { | ||||
|       this.$refs.elForm.validate(valid => { | ||||
|         if (!valid) return | ||||
|         this.$emit('confirm', { ...this.formData }) | ||||
|         this.close() | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|   | ||||
| @@ -1,149 +1,149 @@ | ||||
| <template> | ||||
|   <div> | ||||
|     <el-dialog | ||||
|       v-bind="$attrs" | ||||
|       :close-on-click-modal="false" | ||||
|       :modal-append-to-body="false" | ||||
|       v-on="$listeners" | ||||
|       @open="onOpen" | ||||
|       @close="onClose" | ||||
|     > | ||||
|       <el-row :gutter="0"> | ||||
|         <el-form | ||||
|           ref="elForm" | ||||
|           :model="formData" | ||||
|           :rules="rules" | ||||
|           size="small" | ||||
|           label-width="100px" | ||||
|         > | ||||
|           <el-col :span="24"> | ||||
|             <el-form-item | ||||
|               label="选项名" | ||||
|               prop="label" | ||||
|             > | ||||
|               <el-input | ||||
|                 v-model="formData.label" | ||||
|                 placeholder="请输入选项名" | ||||
|                 clearable | ||||
|               /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="24"> | ||||
|             <el-form-item | ||||
|               label="选项值" | ||||
|               prop="value" | ||||
|             > | ||||
|               <el-input | ||||
|                 v-model="formData.value" | ||||
|                 placeholder="请输入选项值" | ||||
|                 clearable | ||||
|               > | ||||
|                 <el-select | ||||
|                   slot="append" | ||||
|                   v-model="dataType" | ||||
|                   :style="{width: '100px'}" | ||||
|                 > | ||||
|                   <el-option | ||||
|                     v-for="(item, index) in dataTypeOptions" | ||||
|                     :key="index" | ||||
|                     :label="item.label" | ||||
|                     :value="item.value" | ||||
|                     :disabled="item.disabled" | ||||
|                   /> | ||||
|                 </el-select> | ||||
|               </el-input> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|         </el-form> | ||||
|       </el-row> | ||||
|       <div slot="footer"> | ||||
|         <el-button | ||||
|           type="primary" | ||||
|           @click="handelConfirm" | ||||
|         > | ||||
|           确定 | ||||
|         </el-button> | ||||
|         <el-button @click="close"> | ||||
|           取消 | ||||
|         </el-button> | ||||
|       </div> | ||||
|     </el-dialog> | ||||
|   </div> | ||||
| </template> | ||||
| <script> | ||||
| import { isNumberStr } from '@/utils/index' | ||||
|  | ||||
| export default { | ||||
|   components: {}, | ||||
|   inheritAttrs: false, | ||||
|   props: [], | ||||
|   data() { | ||||
|     return { | ||||
|       id: 100, | ||||
|       formData: { | ||||
|         label: undefined, | ||||
|         value: undefined | ||||
|       }, | ||||
|       rules: { | ||||
|         label: [ | ||||
|           { | ||||
|             required: true, | ||||
|             message: '请输入选项名', | ||||
|             trigger: 'blur' | ||||
|           } | ||||
|         ], | ||||
|         value: [ | ||||
|           { | ||||
|             required: true, | ||||
|             message: '请输入选项值', | ||||
|             trigger: 'blur' | ||||
|           } | ||||
|         ] | ||||
|       }, | ||||
|       dataType: 'string', | ||||
|       dataTypeOptions: [ | ||||
|         { | ||||
|           label: '字符串', | ||||
|           value: 'string' | ||||
|         }, | ||||
|         { | ||||
|           label: '数字', | ||||
|           value: 'number' | ||||
|         } | ||||
|       ] | ||||
|     } | ||||
|   }, | ||||
|   computed: {}, | ||||
|   watch: { | ||||
|     // eslint-disable-next-line func-names | ||||
|     'formData.value': function (val) { | ||||
|       this.dataType = isNumberStr(val) ? 'number' : 'string' | ||||
|     } | ||||
|   }, | ||||
|   created() {}, | ||||
|   mounted() {}, | ||||
|   methods: { | ||||
|     onOpen() { | ||||
|       this.formData = { | ||||
|         label: undefined, | ||||
|         value: undefined | ||||
|       } | ||||
|     }, | ||||
|     onClose() {}, | ||||
|     close() { | ||||
|       this.$emit('update:visible', false) | ||||
|     }, | ||||
|     handelConfirm() { | ||||
|       this.$refs.elForm.validate(valid => { | ||||
|         if (!valid) return | ||||
|         if (this.dataType === 'number') { | ||||
|           this.formData.value = parseFloat(this.formData.value) | ||||
|         } | ||||
|         this.formData.id = this.id++ | ||||
|         this.$emit('commit', this.formData) | ||||
|         this.close() | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
| <template> | ||||
|   <div> | ||||
|     <el-dialog | ||||
|       v-bind="$attrs" | ||||
|       :close-on-click-modal="false" | ||||
|       :modal-append-to-body="false" | ||||
|       v-on="$listeners" | ||||
|       @open="onOpen" | ||||
|       @close="onClose" | ||||
|     > | ||||
|       <el-row :gutter="0"> | ||||
|         <el-form | ||||
|           ref="elForm" | ||||
|           :model="formData" | ||||
|           :rules="rules" | ||||
|           size="small" | ||||
|           label-width="100px" | ||||
|         > | ||||
|           <el-col :span="24"> | ||||
|             <el-form-item | ||||
|               label="选项名" | ||||
|               prop="label" | ||||
|             > | ||||
|               <el-input | ||||
|                 v-model="formData.label" | ||||
|                 placeholder="请输入选项名" | ||||
|                 clearable | ||||
|               /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="24"> | ||||
|             <el-form-item | ||||
|               label="选项值" | ||||
|               prop="value" | ||||
|             > | ||||
|               <el-input | ||||
|                 v-model="formData.value" | ||||
|                 placeholder="请输入选项值" | ||||
|                 clearable | ||||
|               > | ||||
|                 <el-select | ||||
|                   slot="append" | ||||
|                   v-model="dataType" | ||||
|                   :style="{width: '100px'}" | ||||
|                 > | ||||
|                   <el-option | ||||
|                     v-for="(item, index) in dataTypeOptions" | ||||
|                     :key="index" | ||||
|                     :label="item.label" | ||||
|                     :value="item.value" | ||||
|                     :disabled="item.disabled" | ||||
|                   /> | ||||
|                 </el-select> | ||||
|               </el-input> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|         </el-form> | ||||
|       </el-row> | ||||
|       <div slot="footer"> | ||||
|         <el-button | ||||
|           type="primary" | ||||
|           @click="handleConfirm" | ||||
|         > | ||||
|           确定 | ||||
|         </el-button> | ||||
|         <el-button @click="close"> | ||||
|           取消 | ||||
|         </el-button> | ||||
|       </div> | ||||
|     </el-dialog> | ||||
|   </div> | ||||
| </template> | ||||
| <script> | ||||
| import { isNumberStr } from '@/utils/index' | ||||
|  | ||||
| export default { | ||||
|   components: {}, | ||||
|   inheritAttrs: false, | ||||
|   props: [], | ||||
|   data() { | ||||
|     return { | ||||
|       id: 100, | ||||
|       formData: { | ||||
|         label: undefined, | ||||
|         value: undefined | ||||
|       }, | ||||
|       rules: { | ||||
|         label: [ | ||||
|           { | ||||
|             required: true, | ||||
|             message: '请输入选项名', | ||||
|             trigger: 'blur' | ||||
|           } | ||||
|         ], | ||||
|         value: [ | ||||
|           { | ||||
|             required: true, | ||||
|             message: '请输入选项值', | ||||
|             trigger: 'blur' | ||||
|           } | ||||
|         ] | ||||
|       }, | ||||
|       dataType: 'string', | ||||
|       dataTypeOptions: [ | ||||
|         { | ||||
|           label: '字符串', | ||||
|           value: 'string' | ||||
|         }, | ||||
|         { | ||||
|           label: '数字', | ||||
|           value: 'number' | ||||
|         } | ||||
|       ] | ||||
|     } | ||||
|   }, | ||||
|   computed: {}, | ||||
|   watch: { | ||||
|     // eslint-disable-next-line func-names | ||||
|     'formData.value': function (val) { | ||||
|       this.dataType = isNumberStr(val) ? 'number' : 'string' | ||||
|     } | ||||
|   }, | ||||
|   created() {}, | ||||
|   mounted() {}, | ||||
|   methods: { | ||||
|     onOpen() { | ||||
|       this.formData = { | ||||
|         label: undefined, | ||||
|         value: undefined | ||||
|       } | ||||
|     }, | ||||
|     onClose() {}, | ||||
|     close() { | ||||
|       this.$emit('update:visible', false) | ||||
|     }, | ||||
|     handleConfirm() { | ||||
|       this.$refs.elForm.validate(valid => { | ||||
|         if (!valid) return | ||||
|         if (this.dataType === 'number') { | ||||
|           this.formData.value = parseFloat(this.formData.value) | ||||
|         } | ||||
|         this.formData.id = this.id++ | ||||
|         this.$emit('commit', this.formData) | ||||
|         this.close() | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user