perf: 代码生成器优化

1. 生成文件 和 模板替换 自动化
v1.4.1
Carina 4 years ago
parent d12e7c216e
commit 72981621ed

@ -32,6 +32,12 @@ public final class DefPatternPool {
*/ */
public final static Pattern SECURITY_PASSWORD = Pattern.compile("^\\S*(?=\\S{6,})(?=\\S*\\d)(?=\\S*[A-Z])(?=\\S*[a-z])(?=\\S*[!@#$%^&*?.])\\S*$"); public final static Pattern SECURITY_PASSWORD = Pattern.compile("^\\S*(?=\\S{6,})(?=\\S*\\d)(?=\\S*[A-Z])(?=\\S*[a-z])(?=\\S*[!@#$%^&*?.])\\S*$");
/**
* /\$\{(\w+)\}/g
* ${xxxx}
*/
public final static Pattern PLACEHOLDER = Pattern.compile("\\$\\{([\\w\\.\\-\\/\\+\\$\\#\\@\\!\\^\\&\\(\\)]+)\\}");
// ------------------------------------------------------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------------------------------------------------------

@ -0,0 +1,74 @@
package org.opsli.common.utils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
*
* @author Parker
* @date 20216215:41:36
*/
public class MessUtil {
/**
*
* ${xxxx}
*
* @param soap
* @return List
*/
public static List<String> getPlaceholderList(String soap) {
// 使用 正则池
Matcher matcher = DefPatternPool.PLACEHOLDER.matcher(soap);
List<String> list = new ArrayList<>();
int i = 1;
while (matcher.find()) {
list.add(matcher.group(i));
}
return list;
}
/**
*
* @param soap
* @param regex
* @param startStr
* @param endStr
* @param map key,
* @return String
*/
public static String getMes(String soap, String regex, String startStr, String endStr, Map<String, Object> map) {
List<String> subUtil = getSubList(soap, regex);
for (String s : subUtil) {
if (map.containsKey(s) && null != map.get(s)) {
soap = soap.replace(startStr + s + endStr, map.get(s).toString());
}
}
return soap;
}
/**
*
* @param soap
* @param regex
* @return List
*/
public static List<String> getSubList(String soap, String regex) {
// 使用 正则池
Pattern pattern = DefPatternPool.get(regex);
Matcher matcher = pattern.matcher(soap);
List<String> list = new ArrayList<>();
int i = 1;
while (matcher.find()) {
list.add(matcher.group(i));
}
return list;
}
}

@ -16,15 +16,16 @@
package org.opsli.core.utils; package org.opsli.core.utils;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.ReflectUtil;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.opsli.common.enums.ValidatorType;
import org.opsli.common.utils.DefPatternPool; import org.opsli.common.utils.DefPatternPool;
import org.opsli.common.msg.ValidatorMsg; import org.opsli.common.msg.ValidatorMsg;
import org.opsli.api.wrapper.system.dict.DictModel; import org.opsli.api.wrapper.system.dict.DictModel;
import org.opsli.common.annotation.validator.Validator;
import org.opsli.common.annotation.validator.ValidatorLenMax; import org.opsli.common.annotation.validator.ValidatorLenMax;
import org.opsli.common.annotation.validator.ValidatorLenMin; import org.opsli.common.annotation.validator.ValidatorLenMin;
import org.opsli.common.exception.ServiceException; import org.opsli.common.exception.ServiceException;
@ -52,10 +53,11 @@ public final class ValidatorUtil {
Field[] fields = ReflectUtil.getFields(obj.getClass()); Field[] fields = ReflectUtil.getFields(obj.getClass());
for (Field field : fields) { for (Field field : fields) {
// 获得 统一验证 注解 // 获得 统一验证 注解 (起码冲突了)
Validator validator = field.getAnnotation(Validator.class); org.opsli.common.annotation.validator.Validator validator =
field.getAnnotation(org.opsli.common.annotation.validator.Validator.class);
if (validator != null) { if (validator != null) {
org.opsli.common.enums.ValidatorType[] types = validator.value(); ValidatorType[] types = validator.value();
Object fieldValue = ReflectUtil.getFieldValue(obj, field); Object fieldValue = ReflectUtil.getFieldValue(obj, field);
ValidatorUtil.check(field, types, fieldValue); ValidatorUtil.check(field, types, fieldValue);
} }
@ -84,7 +86,7 @@ public final class ValidatorUtil {
* @param types * @param types
* @param fieldValue * @param fieldValue
*/ */
private static void check(Field field, org.opsli.common.enums.ValidatorType[] types, Object fieldValue){ private static void check(Field field, ValidatorType[] types, Object fieldValue){
// 获得字段名 // 获得字段名
String fieldName = field.getName(); String fieldName = field.getName();
ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class); ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
@ -95,13 +97,13 @@ public final class ValidatorUtil {
String value = Convert.toStr(fieldValue); String value = Convert.toStr(fieldValue);
// 循环验证 // 循环验证
for (org.opsli.common.enums.ValidatorType type : types) { for (ValidatorType type : types) {
try { try {
boolean verifyRet; boolean verifyRet;
switch (type) { switch (type) {
// 不能为空 // 不能为空
case IS_NOT_NULL: { case IS_NOT_NULL: {
verifyRet = cn.hutool.core.lang.Validator.isNotEmpty(fieldValue); verifyRet = Validator.isNotEmpty(fieldValue);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_NOT_NULL; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_NOT_NULL;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -114,7 +116,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isGeneral(value); verifyRet = Validator.isGeneral(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_GENERAL; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_GENERAL;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -168,7 +170,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isLetter(value); verifyRet = Validator.isLetter(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_LETTER; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_LETTER;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -181,7 +183,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isUpperCase(value); verifyRet = Validator.isUpperCase(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_UPPER_CASE; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_UPPER_CASE;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -194,7 +196,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isLowerCase(value); verifyRet = Validator.isLowerCase(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_LOWER_CASE; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_LOWER_CASE;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -207,7 +209,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isIpv4(value) || cn.hutool.core.lang.Validator.isIpv6(value) ; verifyRet = Validator.isIpv4(value) || Validator.isIpv6(value) ;
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_IP; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_IP;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -220,7 +222,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isIpv4(value); verifyRet = Validator.isIpv4(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_IPV4; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_IPV4;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -233,7 +235,7 @@ public final class ValidatorUtil {
if(StringUtils.isEmpty(value)){ if(StringUtils.isEmpty(value)){
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isIpv6(value); verifyRet = Validator.isIpv6(value);
if(!verifyRet){ if(!verifyRet){
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_IPV6; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_IPV6;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -246,7 +248,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isMoney(value); verifyRet = Validator.isMoney(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MONEY; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MONEY;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -259,7 +261,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isEmail(value); verifyRet = Validator.isEmail(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_EMAIL; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_EMAIL;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -272,7 +274,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isMobile(value); verifyRet = Validator.isMobile(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MOBILE; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MOBILE;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -285,7 +287,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isCitizenId(value); verifyRet = Validator.isCitizenId(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_CITIZENID; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_CITIZENID;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -298,7 +300,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isZipCode(value); verifyRet = Validator.isZipCode(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_ZIPCODE; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_ZIPCODE;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -311,7 +313,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isUrl(value); verifyRet = Validator.isUrl(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_URL; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_URL;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -324,7 +326,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isChinese(value); verifyRet = Validator.isChinese(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_CHINESE; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_CHINESE;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -337,7 +339,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isGeneralWithChinese(value); verifyRet = Validator.isGeneralWithChinese(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_GENERAL_WITH_CHINESE; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_GENERAL_WITH_CHINESE;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -350,7 +352,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isMac(value); verifyRet = Validator.isMac(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MAC; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_MAC;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -363,7 +365,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isPlateNumber(value); verifyRet = Validator.isPlateNumber(value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_PLATE_NUMBER; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_PLATE_NUMBER;
msg.setFieldName(fieldName); msg.setFieldName(fieldName);
@ -376,7 +378,7 @@ public final class ValidatorUtil {
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
break; break;
} }
verifyRet = cn.hutool.core.lang.Validator.isMatchRegex( verifyRet = Validator.isMatchRegex(
DefPatternPool.SECURITY_PASSWORD, value); DefPatternPool.SECURITY_PASSWORD, value);
if (!verifyRet) { if (!verifyRet) {
ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_SECURITY_PASSWORD; ValidatorMsg msg = ValidatorMsg.EXCEPTION_IS_SECURITY_PASSWORD;

@ -15,9 +15,14 @@
*/ */
package org.opsli.plugins.generator.strategy.create; package org.opsli.plugins.generator.strategy.create;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
@ -25,6 +30,7 @@ import com.jfinal.kit.Kv;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.opsli.api.ApiFlag; import org.opsli.api.ApiFlag;
import org.opsli.common.enums.DictType; import org.opsli.common.enums.DictType;
import org.opsli.common.utils.MessUtil;
import org.opsli.common.utils.Props; import org.opsli.common.utils.Props;
import org.opsli.common.utils.ZipUtils; import org.opsli.common.utils.ZipUtils;
import org.opsli.modulars.generator.logs.wrapper.GenBuilderModel; import org.opsli.modulars.generator.logs.wrapper.GenBuilderModel;
@ -138,23 +144,13 @@ public enum CodeBuilder {
CodeType codeType = CodeType.getCodeType(templateModel.getType()); CodeType codeType = CodeType.getCodeType(templateModel.getType());
String typeName = codeType.getDesc(); String typeName = codeType.getDesc();
// 包名
String packageName = builderModel.getPackageName();
// 模块名
String moduleName = builderModel.getModuleName();
// 子模块名
String subModuleName = builderModel.getSubModuleName();
// 基础路径 // 基础路径
String basePath = CodeBuilder.BASE_PATH + dataStr + FOLDER_PREFIX + typeName; String basePath = CodeBuilder.BASE_PATH + dataStr + FOLDER_PREFIX + typeName;
// Path路径 // Path路径
String path = templateModel.getPath(); String path = templateModel.getPath();
if(StrUtil.isNotEmpty(path)){ if(StrUtil.isNotEmpty(path)){
path = StrUtil.replace(path, "${packageName}", packageName); // 替换占位符
path = StrUtil.replace(path, "${moduleName}", moduleName); path = handleReplace(path, builderModel);
path = StrUtil.replace(path, "${subModuleName}", subModuleName);
// 处理路径 前后加 [/] // 处理路径 前后加 [/]
path = this.handlePath(path); path = this.handlePath(path);
} }
@ -164,31 +160,23 @@ public enum CodeBuilder {
this.createKv(builderModel) this.createKv(builderModel)
); );
// 获得模板文件名称
String templateFileName = templateModel.getFileName();
String[] templateFileNameArr = StrUtil.split(templateFileName, ".");
// 模板文件前缀
String templateFilePrefix = templateFileNameArr[0];
// 模板文件后缀 // 模板文件后缀
String templateFileSuffix = templateFileNameArr[templateFileNameArr.length-1]; String templateFileSuffix = FileUtil.getSuffix(templateModel.getFileName());
// 判断是否是Java 文件 // 判断是否是Java 文件
if(JAVA_SUFFIX.equals(templateFileNameArr[templateFileNameArr.length-1])){ if(JAVA_SUFFIX.equals(templateFileSuffix)){
codeStr = GeneratorFactory.getJavaHeadAnnotation() + codeStr; codeStr = GeneratorFactory.getJavaHeadAnnotation() + codeStr;
} }
// 生成文件名 // 生成文件名
String fileName = builderModel.getModel().getTableHumpName(); String fileName = builderModel.getModel().getTableHumpName();
if(DictType.NO_YES_NO.getValue().equals(templateModel.getIgnoreFileName()) ||
StrUtil.isEmpty(templateModel.getIgnoreFileName()) // 判断是否忽略文件名 (忽略默认采用 表名+后缀名)
){ if(DictType.NO_YES_YES.getValue().equals(templateModel.getIgnoreFileName())){
if(templateFileNameArr.length > 1){ fileName += StrUtil.prependIfMissing(templateFileSuffix, POINT_PREFIX);
// 判断是否忽略模板文件名 }else {
fileName += templateFilePrefix; fileName = handleReplace(templateModel.getFileName(), builderModel);
}
} }
fileName += StrUtil.prependIfMissing(templateFileSuffix, POINT_PREFIX);
Map<String,String> entityMap = Maps.newHashMapWithExpectedSize(3); Map<String,String> entityMap = Maps.newHashMapWithExpectedSize(3);
entityMap.put(ZipUtils.FILE_PATH, basePath + path); entityMap.put(ZipUtils.FILE_PATH, basePath + path);
@ -214,7 +202,7 @@ public enum CodeBuilder {
* @param path * @param path
* @return String * @return String
*/ */
protected String handlePath(String path) { private String handlePath(String path) {
if(StrUtil.isEmpty(path)){ if(StrUtil.isEmpty(path)){
return path; return path;
} }
@ -232,6 +220,30 @@ public enum CodeBuilder {
return StrUtil.replace(path, "//", FOLDER_PREFIX); return StrUtil.replace(path, "//", FOLDER_PREFIX);
} }
/**
*
* @param str
* @param builderModel
* @return String
*/
private String handleReplace(String str, GenBuilderModel builderModel){
// 非法处理
if(StrUtil.isEmpty(str) || builderModel == null){
return str;
}
String prefix = "${";
String suffix = "}";
List<String> placeholderList = MessUtil.getPlaceholderList(str);
for (String placeholderField : placeholderList) {
Object property = BeanUtil.getProperty(builderModel, placeholderField);
str = StrUtil.replace(str,
prefix + placeholderField + suffix,
Convert.toStr(property));
}
return str;
}
/** /**
* WriterOutputStream * WriterOutputStream
*/ */
@ -246,4 +258,13 @@ public enum CodeBuilder {
return null; return null;
} }
public static void main(String[] args) {
String aaa = "aaaaaaaaab${bb}bbbbbbbb${bbaa}bbbbbbbccccccccccccc";
List<String> placeholderList = MessUtil.getPlaceholderList(aaa);
for (String s : placeholderList) {
System.out.println(s);
}
}
} }

Loading…
Cancel
Save