优化代码生成模块:1、字典与文件字段添加序列化注解;2、新增 bit-Boolean 类型的映射;新增在create_time与update_time字段上添加自动填充注解。

This commit is contained in:
zhoumingfa
2024-08-04 21:51:40 +08:00
parent 6f183c3366
commit a1043083dc
27 changed files with 255 additions and 224 deletions

View File

@@ -7,10 +7,12 @@ import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import lombok.extern.slf4j.Slf4j;
import net.lab1024.sa.base.common.domain.DataScopePlugin;
import net.lab1024.sa.base.handler.MybatisPlusFillHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
@@ -144,6 +146,8 @@ public class DataSourceConfig {
pluginsList.add(dataScopePlugin);
}
factoryBean.setPlugins(pluginsList.toArray(new Interceptor[pluginsList.size()]));
// 添加字段自动填充处理
factoryBean.setGlobalConfig(new GlobalConfig().setBanner(false).setMetaObjectHandler(new MybatisPlusFillHandler()));
return factoryBean.getObject();
}

View File

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -43,7 +44,8 @@ public class RedisConfig {
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
// enableDefaultTyping 官方已弃用 所以改为 activateDefaultTyping
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);

View File

@@ -0,0 +1,40 @@
package net.lab1024.sa.base.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* Mybatis Plus 插入或者更新时指定字段设置值
*
* @author zhoumingfa
*/
@Component
@Slf4j
public class MybatisPlusFillHandler implements MetaObjectHandler {
public static final String CREATE_TIME = "createTime";
public static final String UPDATE_TIME = "updateTime";
@Override
public void insertFill(MetaObject metaObject) {
if (metaObject.hasSetter(CREATE_TIME)) {
this.fillStrategy(metaObject, CREATE_TIME, LocalDateTime.now());
}
if (metaObject.hasSetter(UPDATE_TIME)) {
this.fillStrategy(metaObject, UPDATE_TIME, LocalDateTime.now());
}
}
@Override
public void updateFill(MetaObject metaObject) {
if (metaObject.hasSetter(UPDATE_TIME)) {
this.fillStrategy(metaObject, UPDATE_TIME, LocalDateTime.now());
}
}
}

View File

@@ -41,7 +41,7 @@ public enum CodeFrontComponentEnum implements BaseEnum {
}
@Override
public Object getValue() {
public String getValue() {
return value;
}

View File

@@ -32,7 +32,6 @@ public class CodeGeneratorConfigForm {
@Schema(description = "表名")
private String tableName;
@Valid
@NotNull(message = "基础信息不能为空")
@Schema(description = "基础信息")

View File

@@ -39,8 +39,8 @@ public class CodeInsertAndUpdateField {
@Schema(description = "更新标识")
private Boolean updateFlag;
@SchemaEnum(value = CodeGeneratorPageTypeEnum.class)
@CheckEnum(value = CodeFrontComponentEnum.class, message = "3.增加、修改 增加、修改 组件类型 枚举值错误", required = true)
@SchemaEnum(value = CodeFrontComponentEnum.class)
@CheckEnum(value = CodeFrontComponentEnum.class, message = "3.增加、修改 组件类型 枚举值错误", required = true)
private String frontComponent;
}

View File

@@ -94,6 +94,7 @@ public class CodeGeneratorTemplateService {
String fileName = templateFile.startsWith("java") ? upperCamel + templateSplit[templateSplit.length - 1] : lowerHyphen + "-" + templateSplit[templateSplit.length - 1];
String fullPathFileName = templateFile.replaceAll(templateSplit[templateSplit.length - 1], fileName);
fullPathFileName = fullPathFileName.replaceAll("java/", "java/" + basic.getModuleName().toLowerCase() + "/");
fullPathFileName = fullPathFileName.replaceAll("js/", "js/" + basic.getModuleName().toLowerCase() + "/");
String fileContent = generate(tableName, templateFile, codeGeneratorConfigEntity);
File file = new File(uuid + "/" + fullPathFileName);

View File

@@ -2,6 +2,7 @@ package net.lab1024.sa.base.module.support.codegenerator.service.variable;
import com.google.common.base.CaseFormat;
import net.lab1024.sa.base.common.util.SmartStringUtil;
import net.lab1024.sa.base.module.support.codegenerator.constant.CodeFrontComponentEnum;
import net.lab1024.sa.base.module.support.codegenerator.domain.form.CodeGeneratorConfigForm;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeField;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeInsertAndUpdate;
@@ -17,7 +18,7 @@ import java.util.stream.Collectors;
* @Date 2022/9/29 17:20:41
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
public abstract class CodeGenerateBaseVariableService {
@@ -43,13 +44,13 @@ public abstract class CodeGenerateBaseVariableService {
String upperCamelName = CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_CAMEL, form.getBasic().getModuleName());
ArrayList<String> list = new ArrayList<>();
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.entity." + upperCamelName + "Entity;" );
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.entity." + upperCamelName + "Entity;");
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.form." + upperCamelName + "AddForm;" );
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.form." + upperCamelName + "UpdateForm;" );
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.form." + upperCamelName + "QueryForm;" );
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.form." + upperCamelName + "AddForm;");
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.form." + upperCamelName + "UpdateForm;");
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.form." + upperCamelName + "QueryForm;");
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.vo." + upperCamelName + "VO;" );
list.add("import " + form.getBasic().getJavaPackageName() + ".domain.vo." + upperCamelName + "VO;");
return list;
}
@@ -88,43 +89,33 @@ public abstract class CodeGenerateBaseVariableService {
}
CodeInsertAndUpdateField field = first.get();
return SmartStringUtil.contains(field.getFrontComponent(), "Upload" );
return SmartStringUtil.equals(field.getFrontComponent(), CodeFrontComponentEnum.FILE_UPLOAD.getValue());
}
/**
* 是否为 枚举
* 是否为 字典
*/
protected boolean isDict(String columnName, CodeGeneratorConfigForm form) {
List<CodeField> fields = form.getFields();
if (CollectionUtils.isEmpty(fields)) {
return false;
}
Optional<CodeField> first = fields.stream().filter(e -> columnName.equals(e.getColumnName())).findFirst();
if (first.isPresent()) {
return false;
}
CodeField codeField = first.get();
return codeField.getDict() != null;
CodeField codeField = getCodeField(columnName, form);
return codeField != null && codeField.getDict() != null;
}
/**
* 是否为 枚举
*/
protected boolean isEnum(String columnName, CodeGeneratorConfigForm form) {
CodeField codeField = getCodeField(columnName, form);
return codeField != null && codeField.getEnumName() != null;
}
private CodeField getCodeField(String columnName, CodeGeneratorConfigForm form) {
List<CodeField> fields = form.getFields();
if (CollectionUtils.isEmpty(fields)) {
return false;
return null;
}
Optional<CodeField> first = fields.stream().filter(e -> columnName.equals(e.getColumnName())).findFirst();
if (first.isPresent()) {
return false;
}
CodeField codeField = first.get();
return codeField.getEnumName() != null;
return first.orElse(null);
}
/**

View File

@@ -2,6 +2,7 @@ package net.lab1024.sa.base.module.support.codegenerator.service.variable.backen
import cn.hutool.core.bean.BeanUtil;
import net.lab1024.sa.base.common.util.SmartStringUtil;
import net.lab1024.sa.base.module.support.codegenerator.constant.CodeFrontComponentEnum;
import net.lab1024.sa.base.module.support.codegenerator.domain.form.CodeGeneratorConfigForm;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeField;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeInsertAndUpdate;
@@ -100,7 +101,6 @@ public class AddFormVariableService extends CodeGenerateBaseVariableService {
}
}
//字典
if (SmartStringUtil.isNotEmpty(codeField.getDict())) {
finalFieldMap.put("dict", "\n @JsonDeserialize(using = DictValueVoDeserializer.class)");
@@ -109,7 +109,7 @@ public class AddFormVariableService extends CodeGenerateBaseVariableService {
}
//文件上传
if (SmartStringUtil.contains(field.getFrontComponent(), "Upload")) {
if (CodeFrontComponentEnum.FILE_UPLOAD.equalsValue(field.getFrontComponent())) {
finalFieldMap.put("file", "\n @JsonDeserialize(using = FileKeyVoDeserializer.class)");
packageList.add("import com.fasterxml.jackson.databind.annotation.JsonDeserialize;");
packageList.add("import net.lab1024.sa.base.common.json.deserializer.FileKeyVoDeserializer;");

View File

@@ -14,7 +14,7 @@ import java.util.stream.Collectors;
* @Date 2022/9/29 17:20:41
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
public class EntityVariableService extends CodeGenerateBaseVariableService {
@@ -54,14 +54,21 @@ public class EntityVariableService extends CodeGenerateBaseVariableService {
// mybatis plus
result.add("import com.baomidou.mybatisplus.annotation.TableName;");
// 自动填充注解
boolean existCreateAndUpdate = fields.stream().anyMatch(e -> "create_time".equals(e.getColumnName()) || "update_time".equals(e.getColumnName()));
if (existCreateAndUpdate) {
result.add("import com.baomidou.mybatisplus.annotation.FieldFill;");
result.add("import com.baomidou.mybatisplus.annotation.TableField;");
}
//主键
boolean isExistPrimaryKey = fields.stream().filter(e -> e.getPrimaryKeyFlag() != null && e.getPrimaryKeyFlag()).findFirst().isPresent();
boolean isExistPrimaryKey = fields.stream().anyMatch(e -> e.getPrimaryKeyFlag() != null && e.getPrimaryKeyFlag());
if (isExistPrimaryKey) {
result.add("import com.baomidou.mybatisplus.annotation.TableId;");
}
//自增
boolean isExistAutoIncrease = fields.stream().filter(e -> e.getAutoIncreaseFlag() != null && e.getAutoIncreaseFlag()).findFirst().isPresent();
boolean isExistAutoIncrease = fields.stream().anyMatch(e -> e.getAutoIncreaseFlag() != null && e.getAutoIncreaseFlag());
if (isExistAutoIncrease) {
result.add("import com.baomidou.mybatisplus.annotation.IdType;");
}

View File

@@ -3,19 +3,20 @@ package net.lab1024.sa.base.module.support.codegenerator.service.variable.backen
import cn.hutool.core.bean.BeanUtil;
import net.lab1024.sa.base.module.support.codegenerator.constant.CodeQueryFieldQueryTypeEnum;
import net.lab1024.sa.base.module.support.codegenerator.domain.form.CodeGeneratorConfigForm;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeInsertAndUpdateField;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeQueryField;
import net.lab1024.sa.base.module.support.codegenerator.service.variable.CodeGenerateBaseVariableService;
import org.apache.commons.collections4.CollectionUtils;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author 1024创新实验室-主任:卓大
* @Date 2022/9/29 17:20:41
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
public class MapperVariableService extends CodeGenerateBaseVariableService {
@@ -39,55 +40,39 @@ public class MapperVariableService extends CodeGenerateBaseVariableService {
List<String> columnNameList = queryField.getColumnNameList();
if (columnNameList.size() == 1) {
// AND INSTR(t_notice.title,#{query.keywords})
stringBuilder.append(" AND INSTR(" )
.append(form.getTableName()).append("." ).append(queryField.getColumnNameList().get(0))
.append(",#{queryForm." )
stringBuilder.append(" AND INSTR(")
.append(form.getTableName()).append(".").append(queryField.getColumnNameList().get(0))
.append(",#{queryForm.")
.append(queryField.getFieldName())
.append("})" );
.append("})");
} else {
for (int i = 0; i < columnNameList.size(); i++) {
if (i == 0) {
stringBuilder.append("AND ( INSTR(" )
.append(form.getTableName()).append("." ).append(queryField.getColumnNameList().get(i))
.append(",#{queryForm." )
stringBuilder.append("AND ( INSTR(")
.append(form.getTableName()).append(".").append(queryField.getColumnNameList().get(i))
.append(",#{queryForm.")
.append(queryField.getFieldName())
.append("})" );
.append("})");
} else {
// OR INSTR(t_notice.author,#{query.keywords})
stringBuilder.append("\n OR INSTR(" )
.append(form.getTableName()).append("." ).append(queryField.getColumnNameList().get(i))
.append(",#{queryForm." )
stringBuilder.append("\n OR INSTR(")
.append(form.getTableName()).append(".").append(queryField.getColumnNameList().get(i))
.append(",#{queryForm.")
.append(queryField.getFieldName())
.append("})" );
.append("})");
}
}
stringBuilder.append("\n )" );
stringBuilder.append("\n )");
}
fieldMap.put("likeStr", stringBuilder.toString());
}else{
fieldMap.put("columnName",queryField.getColumnNameList().get(0));
} else {
fieldMap.put("columnName", queryField.getColumnNameList().get(0));
}
}
variablesMap.put("queryFields", finalQueryFiledList);
variablesMap.put("daoClassName", form.getBasic().getJavaPackageName() + ".dao." + form.getBasic().getModuleName() + "Dao" );
variablesMap.put("daoClassName", form.getBasic().getJavaPackageName() + ".dao." + form.getBasic().getModuleName() + "Dao");
return variablesMap;
}
public List<String> getPackageList(List<CodeInsertAndUpdateField> fields, CodeGeneratorConfigForm form) {
if (CollectionUtils.isEmpty(fields)) {
return new ArrayList<>();
}
HashSet<String> packageList = new HashSet<>();
//1、javabean相关的包
packageList.addAll(getJavaBeanImportClass(form));
//2、dao
packageList.add("import " + form.getBasic().getJavaPackageName() + ".dao." + form.getBasic().getModuleName() + "Dao;" );
return new ArrayList<>(packageList);
}
}

View File

@@ -18,7 +18,7 @@ import java.util.stream.Collectors;
* @Date 2022/9/29 17:20:41
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
public class QueryFormVariableService extends CodeGenerateBaseVariableService {
@@ -75,9 +75,6 @@ public class QueryFormVariableService extends CodeGenerateBaseVariableService {
CodeField codeField = null;
switch (queryTypeEnum) {
case LIKE:
finalFieldMap.put("javaType", "String");
break;
case EQUAL:
codeField = getCodeFieldByColumnName(field.getColumnNameList().get(0), form);
if (codeField == null) {
@@ -119,6 +116,7 @@ public class QueryFormVariableService extends CodeGenerateBaseVariableService {
// lombok
packageList.add("import lombok.Data;");
packageList.add("import lombok.EqualsAndHashCode;");
List<String> packageNameList = packageList.stream().filter(Objects::nonNull).collect(Collectors.toList());
Collections.sort(packageNameList);

View File

@@ -2,6 +2,7 @@ package net.lab1024.sa.base.module.support.codegenerator.service.variable.backen
import cn.hutool.core.bean.BeanUtil;
import net.lab1024.sa.base.common.util.SmartStringUtil;
import net.lab1024.sa.base.module.support.codegenerator.constant.CodeFrontComponentEnum;
import net.lab1024.sa.base.module.support.codegenerator.domain.form.CodeGeneratorConfigForm;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeField;
import net.lab1024.sa.base.module.support.codegenerator.domain.model.CodeInsertAndUpdate;
@@ -18,7 +19,7 @@ import java.util.stream.Collectors;
* @Date 2022/9/29 17:20:41
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
public class UpdateFormVariableService extends CodeGenerateBaseVariableService {
@@ -42,7 +43,7 @@ public class UpdateFormVariableService extends CodeGenerateBaseVariableService {
return false;
}
if(Boolean.TRUE.equals(codeField.getPrimaryKeyFlag())){
if (Boolean.TRUE.equals(codeField.getPrimaryKeyFlag())) {
e.setRequiredFlag(true);
}
@@ -123,7 +124,7 @@ public class UpdateFormVariableService extends CodeGenerateBaseVariableService {
}
//文件上传
if (SmartStringUtil.contains(field.getFrontComponent(), "Upload")) {
if (CodeFrontComponentEnum.FILE_UPLOAD.equalsValue(field.getFrontComponent())) {
finalFieldMap.put("file", "\n @JsonDeserialize(using = FileKeyVoDeserializer.class)");
packageList.add("import com.fasterxml.jackson.databind.annotation.JsonDeserialize;");
packageList.add("import net.lab1024.sa.base.common.json.deserializer.FileKeyVoDeserializer;");

View File

@@ -17,7 +17,7 @@ import java.util.stream.Collectors;
* @Date 2022/9/29 17:20:41
* @Wechat zhuoda1024
* @Email lab1024@163.com
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
* @Copyright <a href="https://1024lab.net">1024创新实验室</a>
*/
public class VOVariableService extends CodeGenerateBaseVariableService {
@@ -87,16 +87,16 @@ public class VOVariableService extends CodeGenerateBaseVariableService {
//字典
if (isDict(field.getColumnName(), form)) {
finalFieldMap.put("dict", "\n @JsonDeserialize(using = DictValueVoDeserializer.class)");
packageList.add("import com.fasterxml.jackson.databind.annotation.JsonDeserialize;");
packageList.add("import net.lab1024.sa.base.common.json.deserializer.DictValueVoDeserializer;");
finalFieldMap.put("dict", "\n @JsonSerialize(using = DictValueVoSerializer.class)");
packageList.add("import com.fasterxml.jackson.databind.annotation.JsonSerialize;");
packageList.add("import net.lab1024.sa.base.common.json.serializer.DictValueVoSerializer;");
}
//文件上传
if (isFile(field.getColumnName(), form)) {
finalFieldMap.put("file", "\n @JsonDeserialize(using = FileKeyVoDeserializer.class)");
packageList.add("import com.fasterxml.jackson.databind.annotation.JsonDeserialize;");
packageList.add("import net.lab1024.sa.base.common.json.deserializer.FileKeyVoDeserializer;");
finalFieldMap.put("file", "\n @JsonSerialize(using = FileKeyVoSerializer.class)");
packageList.add("import com.fasterxml.jackson.databind.annotation.JsonSerialize;");
packageList.add("import net.lab1024.sa.base.common.json.serializer.FileKeyVoSerializer;");
}
packageList.add(getJavaPackageName(codeField.getJavaType()));