调试mybatis策略及代码模板.

This commit is contained in:
lijiahang
2023-07-13 16:58:07 +08:00
parent aaccc03b82
commit e56ff794c3
23 changed files with 298 additions and 129 deletions

View File

@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.orion.ops.framework.common.constant.AutoConfigureOrderConst; import com.orion.ops.framework.common.constant.AutoConfigureOrderConst;
import com.orion.ops.framework.common.constant.FilterOrderConst; import com.orion.ops.framework.common.constant.FilterOrderConst;
import com.orion.ops.framework.common.filter.FilterCreator; import com.orion.ops.framework.common.filter.FilterCreator;
import com.orion.ops.framework.common.security.SecurityHolder;
import com.orion.ops.framework.mybatis.core.cache.CacheClearFilter; import com.orion.ops.framework.mybatis.core.cache.CacheClearFilter;
import com.orion.ops.framework.mybatis.core.handler.FieldFillHandler; import com.orion.ops.framework.mybatis.core.handler.FieldFillHandler;
import com.orion.ops.framework.mybatis.core.utils.DomainFillUtils;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfiguration;
@@ -29,7 +31,9 @@ public class OrionMybatisAutoConfiguration {
* @return 字段填充元数据处理器 * @return 字段填充元数据处理器
*/ */
@Bean @Bean
public MetaObjectHandler defaultMetaObjectHandler() { public MetaObjectHandler defaultMetaObjectHandler(SecurityHolder securityHolder) {
// 设置填充工具参数
DomainFillUtils.setSecurityHolder(securityHolder);
return new FieldFillHandler(); return new FieldFillHandler();
} }

View File

@@ -24,7 +24,6 @@ public class CacheClearFilter extends OncePerRequestFilter {
filterChain.doFilter(request, response); filterChain.doFilter(request, response);
} finally { } finally {
// 清理缓存 // 清理缓存
// TODO TEST
CacheHolder.remove(); CacheHolder.remove();
} }
} }

View File

@@ -21,34 +21,34 @@ public class CacheHolder {
/** /**
* 缓存 * 缓存
* <p> * <p>
* key: mapperClass * key: mapper
* value: id > row * value: id > row
*/ */
private static final ThreadLocal<MultiHashMap<Class<? extends BaseMapper<?>>, Serializable, Store<?>>> HOLDER = ThreadLocal.withInitial(MultiHashMap::new); private static final ThreadLocal<MultiHashMap<BaseMapper<?>, Serializable, Store<?>>> HOLDER = ThreadLocal.withInitial(MultiHashMap::new);
/** /**
* 获取缓存 * 获取缓存
* *
* @param mapperClass mapperClass * @param mapper mapper
* @param id id * @param id id
* @param <T> domain * @param <T> domain
* @return cacheWrapper * @return cacheWrapper
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T> Store<T> get(Class<? extends BaseMapper<?>> mapperClass, Serializable id) { public static <T> Store<T> get(BaseMapper<?> mapper, Serializable id) {
return (Store<T>) HOLDER.get().get(mapperClass, id); return (Store<T>) HOLDER.get().get(mapper, id);
} }
/** /**
* 设置缓存 * 设置缓存
* *
* @param mapperClass mapperClass * @param mapper mapper
* @param id id * @param id id
* @param row row * @param row row
* @param <T> domainClass * @param <T> domainClass
*/ */
public static <T> void set(Class<? extends BaseMapper<T>> mapperClass, Serializable id, T row) { public static <T> void set(BaseMapper<T> mapper, Serializable id, T row) {
HOLDER.get().put(mapperClass, id, new Store<>(row)); HOLDER.get().put(mapper, id, new Store<>(row));
} }
/** /**

View File

@@ -42,6 +42,7 @@ public class BaseDO implements Serializable {
*/ */
@TableLogic @TableLogic
@Schema(description = "是否删除 0未删除 1已删除") @Schema(description = "是否删除 0未删除 1已删除")
@TableField(fill = FieldFill.INSERT, jdbcType = JdbcType.BIT)
private Boolean deleted; private Boolean deleted;
} }

View File

@@ -16,9 +16,13 @@ import com.orion.ops.framework.mybatis.core.domain.BaseDO;
import com.orion.ops.framework.mybatis.core.mapper.IMapper; import com.orion.ops.framework.mybatis.core.mapper.IMapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.File; import java.io.File;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -31,13 +35,19 @@ import java.util.stream.Collectors;
public class CodeGenerator { public class CodeGenerator {
public static void main(String[] args) { public static void main(String[] args) {
@NotNull
String outputDir = "D:/MP/"; String outputDir = "D:/MP/";
@NotNull
String author = Const.ORION_AUTHOR; String author = Const.ORION_AUTHOR;
// 表名 @NotEmpty
String[] tables = {"test_table"}; String[] tables = {"test_table", "table_copy"};
// 表业务注释 需要和表一一对应 null则为表注释
@NotEmpty
String[] comment = {"用户", "复制"};
// 模块 // 模块
@NotNull
String module = "infra"; String module = "infra";
// 连接 // jdbc 配置 - 使用配置文件
File yamlFile = new File("orion-ops-launch/src/main/resources/application-dev.yaml"); File yamlFile = new File("orion-ops-launch/src/main/resources/application-dev.yaml");
YmlExt yaml = YmlExt.load(yamlFile); YmlExt yaml = YmlExt.load(yamlFile);
String url = yaml.getValue("spring.datasource.druid.url"); String url = yaml.getValue("spring.datasource.druid.url");
@@ -47,8 +57,7 @@ public class CodeGenerator {
// 执行 // 执行
runGenerator(outputDir, author, runGenerator(outputDir, author,
url, username, password, url, username, password,
tables, tables, comment, module);
module);
} }
/** /**
@@ -60,7 +69,11 @@ public class CodeGenerator {
String username, String username,
String password, String password,
String[] tables, String[] tables,
String[] comment,
String module) { String module) {
// 创建引擎
VelocityTemplateEngine engine = getEngine(tables, comment);
// 获取全局配置 // 获取全局配置
GlobalConfig globalConfig = getGlobalConfig(outputDir, author); GlobalConfig globalConfig = getGlobalConfig(outputDir, author);
@@ -93,7 +106,26 @@ public class CodeGenerator {
.injection(injectionConfig); .injection(injectionConfig);
// 执行 // 执行
ag.execute(new VelocityTemplateEngine()); ag.execute(engine);
}
/**
* 获取渲染引擎
*
* @param tables 表
* @param comment 表注释
* @return
*/
private static VelocityTemplateEngine getEngine(String[] tables, String[] comment) {
if (tables.length != comment.length) {
throw new IllegalArgumentException("表称与业务注释长度不匹配");
}
// 业务注释
Map<String, String> tableComment = new HashMap<>();
for (int i = 0; i < tables.length; i++) {
tableComment.put(tables[i], comment[i]);
}
return new VelocityTemplateEngine(tableComment);
} }
/** /**
@@ -273,6 +305,8 @@ public class CodeGenerator {
*/ */
private static InjectionConfig getInjectionConfig() { private static InjectionConfig getInjectionConfig() {
String[][] customFileDefineArr = new String[][]{ String[][] customFileDefineArr = new String[][]{
// http 文件
new String[]{"/templates/orion-controller.http.vm", "%sController.http", "controller"},
// vo 文件 // vo 文件
new String[]{"/templates/orion-entity-vo.java.vm", "%sVO.java", "entity.vo"}, new String[]{"/templates/orion-entity-vo.java.vm", "%sVO.java", "entity.vo"},
// dto 文件 // dto 文件

View File

@@ -23,7 +23,6 @@ import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
import com.baomidou.mybatisplus.generator.config.builder.CustomFile; import com.baomidou.mybatisplus.generator.config.builder.CustomFile;
import com.baomidou.mybatisplus.generator.config.po.TableInfo; import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine; import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine;
import com.orion.lang.define.Console;
import com.orion.lang.utils.Strings; import com.orion.lang.utils.Strings;
import org.apache.velocity.Template; import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext; import org.apache.velocity.VelocityContext;
@@ -35,6 +34,7 @@ import java.io.BufferedWriter;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
@@ -49,8 +49,14 @@ import java.util.stream.Collectors;
*/ */
public class VelocityTemplateEngine extends AbstractTemplateEngine { public class VelocityTemplateEngine extends AbstractTemplateEngine {
private Map<String, String> tableComment;
private VelocityEngine velocityEngine; private VelocityEngine velocityEngine;
public VelocityTemplateEngine(Map<String, String> tableComment) {
this.tableComment = tableComment;
}
{ {
try { try {
Class.forName("org.apache.velocity.util.DuckType"); Class.forName("org.apache.velocity.util.DuckType");
@@ -62,7 +68,7 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
@Override @Override
@NotNull @NotNull
public VelocityTemplateEngine init(@NotNull ConfigBuilder configBuilder) { public VelocityTemplateEngine init(@NotNull ConfigBuilder configBuilder) {
if (null == velocityEngine) { if (velocityEngine == null) {
Properties p = new Properties(); Properties p = new Properties();
p.setProperty(ConstVal.VM_LOAD_PATH_KEY, ConstVal.VM_LOAD_PATH_VALUE); p.setProperty(ConstVal.VM_LOAD_PATH_KEY, ConstVal.VM_LOAD_PATH_VALUE);
p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, StringPool.EMPTY); p.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, StringPool.EMPTY);
@@ -92,6 +98,24 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
return filePath.endsWith(dotVm) ? filePath : filePath + dotVm; return filePath.endsWith(dotVm) ? filePath : filePath + dotVm;
} }
/**
* 插入 api 注释
*
* @param tableInfo tableInfo
* @param objectMap objectMap
*/
private void putApiComment(TableInfo tableInfo, Map<String, Object> objectMap) {
Map<String, String> map = new HashMap<>();
objectMap.put("apiComment", map);
String comment = tableInfo.getComment();
map.put("create", "创建" + comment);
map.put("update", "通过 id 更新" + comment);
map.put("get", "通过 id 查询" + comment);
map.put("list", "通过 id 批量查询" + comment);
map.put("query", "分页查询" + comment);
map.put("delete", "通过 id 删除" + comment);
map.put("batchDelete", "通过 id 批量删除" + comment);
}
/** /**
* 输出自定义模板文件 * 输出自定义模板文件
@@ -103,13 +127,24 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
*/ */
@Override @Override
protected void outputCustomFile(@NotNull List<CustomFile> customFiles, @NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) { protected void outputCustomFile(@NotNull List<CustomFile> customFiles, @NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
// 替换业务注释
String comment = tableComment.get(tableInfo.getName());
if (comment != null) {
tableInfo.setComment(comment);
}
// http 注释标识
objectMap.put("httpComment", "###");
// 实体名称
String domainName = tableInfo.getEntityName(); String domainName = tableInfo.getEntityName();
String mappingHyphen = objectMap.get("controllerMappingHyphen").toString(); String mappingHyphen = objectMap.get("controllerMappingHyphen").toString();
// 实际实体名称
String entityName = domainName.substring(0, domainName.length() - 2); String entityName = domainName.substring(0, domainName.length() - 2);
objectMap.put("type", entityName); objectMap.put("type", entityName);
objectMap.put("typeLower", Strings.firstLower(entityName)); objectMap.put("typeLower", Strings.firstLower(entityName));
objectMap.put("typeHyphen", mappingHyphen.substring(0, mappingHyphen.length() - 3)); objectMap.put("typeHyphen", mappingHyphen.substring(0, mappingHyphen.length() - 3));
// 注释
this.putApiComment(tableInfo, objectMap);
// 自定义文件的包 // 自定义文件的包
List<String> customFilePackages = customFiles.stream() List<String> customFilePackages = customFiles.stream()
@@ -128,7 +163,6 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
String currentPackage = getConfigBuilder().getPackageConfig().getParent() + "." + file.getPackageName(); String currentPackage = getConfigBuilder().getPackageConfig().getParent() + "." + file.getPackageName();
// 设置当前包 // 设置当前包
objectMap.put("currentPackage", currentPackage); objectMap.put("currentPackage", currentPackage);
objectMap.forEach(Console::trace);
// 文件路径 // 文件路径
String filePath = StringUtils.isNotBlank(file.getFilePath()) ? file.getFilePath() : parentPath; String filePath = StringUtils.isNotBlank(file.getFilePath()) ? file.getFilePath() : parentPath;
@@ -140,4 +174,5 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine {
outputFile(new File(fileName), objectMap, file.getTemplatePath(), file.isFileOverride()); outputFile(new File(fileName), objectMap, file.getTemplatePath(), file.isFileOverride());
}); });
} }
} }

View File

@@ -1,12 +1,10 @@
package com.orion.ops.framework.mybatis.core.handler; package com.orion.ops.framework.mybatis.core.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.orion.ops.framework.common.security.SecurityHolder;
import com.orion.ops.framework.mybatis.core.domain.BaseDO; import com.orion.ops.framework.mybatis.core.domain.BaseDO;
import com.orion.ops.framework.mybatis.core.utils.DomainFillUtils;
import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.MetaObject;
import javax.annotation.Resource;
import java.util.Date;
import java.util.Objects; import java.util.Objects;
/** /**
@@ -18,53 +16,19 @@ import java.util.Objects;
*/ */
public class FieldFillHandler implements MetaObjectHandler { public class FieldFillHandler implements MetaObjectHandler {
@Resource
private SecurityHolder securityHolder;
// TODO 删除fill baseConst
@Override @Override
public void insertFill(MetaObject metaObject) { public void insertFill(MetaObject metaObject) {
if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO) { if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO) {
BaseDO baseDO = (BaseDO) metaObject.getOriginalObject(); // 填充插入
DomainFillUtils.fillInsert((BaseDO) metaObject.getOriginalObject());
Date now = new Date();
// 创建时间
if (Objects.isNull(baseDO.getCreateTime())) {
baseDO.setCreateTime(now);
}
// 更新时间
if (Objects.isNull(baseDO.getUpdateTime())) {
baseDO.setUpdateTime(now);
}
Long userId = securityHolder.getLoginUserId();
// 创建人
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreator())) {
baseDO.setCreator(userId.toString());
}
// 更新人
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) {
baseDO.setUpdater(userId.toString());
}
} }
} }
@Override @Override
public void updateFill(MetaObject metaObject) { public void updateFill(MetaObject metaObject) {
if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO) { if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO) {
// 更新时间 // 填充更新
Object updateTime = getFieldValByName("updateTime", metaObject); DomainFillUtils.fillUpdate((BaseDO) metaObject.getOriginalObject());
if (Objects.isNull(updateTime)) {
setFieldValByName("updateTime", new Date(), metaObject);
}
// 更新人
Object updater = getFieldValByName("updater", metaObject);
Long userId = securityHolder.getLoginUserId();
if (Objects.nonNull(userId) && Objects.isNull(updater)) {
setFieldValByName("updater", userId.toString(), metaObject);
}
} }
} }

View File

@@ -13,8 +13,6 @@ import java.util.function.Function;
* 缓存查询器 * 缓存查询器
* <p> * <p>
* 查询会存入缓存 * 查询会存入缓存
* <p>
* TODO test
* *
* @author Jiahang Li * @author Jiahang Li
* @version 1.0.0 * @version 1.0.0
@@ -58,10 +56,12 @@ public class CacheQuery<T> {
/** /**
* 强制查询 * 强制查询
* *
* @param id id
* @return this * @return this
*/ */
public CacheQuery<T> force() { public CacheQuery<T> force(Serializable id) {
this.force = true; this.force = true;
this.id = id;
return this; return this;
} }
@@ -70,20 +70,20 @@ public class CacheQuery<T> {
return this.get().map(mapper); return this.get().map(mapper);
} }
@SuppressWarnings("unchecked")
public Optional<T> get() { public Optional<T> get() {
Class<? extends BaseMapper<T>> mapperClass = (Class<? extends BaseMapper<T>>) dao.getClass();
// 不查询缓存 // 不查询缓存
if (!force) { if (!force) {
// 从缓存中获取 // 从缓存中获取
Store<T> store = CacheHolder.get(mapperClass, id); Store<T> store = CacheHolder.get(dao, id);
return Optional.ofNullable(store) // 命中直接返回
.map(Store::get); if (store != null) {
return Optional.of(store).map(Store::get);
}
} }
// 查询 // 查询
T row = dao.selectById(id); T row = dao.selectById(id);
// 设置缓存 // 设置缓存
CacheHolder.set(mapperClass, id, row); CacheHolder.set(dao, id, row);
return Optional.ofNullable(row); return Optional.ofNullable(row);
} }

View File

@@ -16,14 +16,13 @@ import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* TODO TEST
* varchar -> List<Integer> * varchar -> List<Integer>
* *
* @author Jiahang Li * @author Jiahang Li
* @version 1.0.0 * @version 1.0.0
* @since 2023/6/25 10:33 * @since 2023/6/25 10:33
*/ */
@MappedJdbcTypes(JdbcType.VARCHAR) @MappedJdbcTypes({JdbcType.CHAR, JdbcType.VARCHAR})
@MappedTypes(List.class) @MappedTypes(List.class)
public class IntegerListTypeHandler implements ITypeHandler<String, List<Integer>> { public class IntegerListTypeHandler implements ITypeHandler<String, List<Integer>> {

View File

@@ -12,20 +12,18 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
/** /**
* TODO TEST
* varchar -> JSONArray * varchar -> JSONArray
* *
* @author Jiahang Li * @author Jiahang Li
* @version 1.0.0 * @version 1.0.0
* @since 2023/6/25 10:33 * @since 2023/6/25 10:33
*/ */
@MappedJdbcTypes(JdbcType.VARCHAR) @MappedJdbcTypes({JdbcType.CHAR, JdbcType.VARCHAR})
@MappedTypes(JSONArray.class) @MappedTypes(JSONArray.class)
public class JSONArrayTypeHandler implements ITypeHandler<String, JSONArray> { public class JSONArrayTypeHandler implements ITypeHandler<String, JSONArray> {
@Override @Override
public void setParameter(PreparedStatement ps, int i, JSONArray res, JdbcType jdbcType) throws SQLException { public void setParameter(PreparedStatement ps, int i, JSONArray res, JdbcType jdbcType) throws SQLException {
// todo TEST NULL
// 设置占位符 // 设置占位符
ps.setString(i, res.toString()); ps.setString(i, res.toString());
} }

View File

@@ -12,20 +12,18 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
/** /**
* TODO TEST
* varchar -> JSONObject * varchar -> JSONObject
* *
* @author Jiahang Li * @author Jiahang Li
* @version 1.0.0 * @version 1.0.0
* @since 2023/6/25 10:33 * @since 2023/6/25 10:33
*/ */
@MappedJdbcTypes(JdbcType.VARCHAR) @MappedJdbcTypes({JdbcType.CHAR, JdbcType.VARCHAR})
@MappedTypes(JSONObject.class) @MappedTypes(JSONObject.class)
public class JSONObjectTypeHandler implements ITypeHandler<String, JSONObject> { public class JSONObjectTypeHandler implements ITypeHandler<String, JSONObject> {
@Override @Override
public void setParameter(PreparedStatement ps, int i, JSONObject res, JdbcType jdbcType) throws SQLException { public void setParameter(PreparedStatement ps, int i, JSONObject res, JdbcType jdbcType) throws SQLException {
// todo TEST NULL
// 设置占位符 // 设置占位符
ps.setString(i, res.toString()); ps.setString(i, res.toString());
} }

View File

@@ -16,14 +16,13 @@ import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* TODO TEST
* varchar -> List<Long> * varchar -> List<Long>
* *
* @author Jiahang Li * @author Jiahang Li
* @version 1.0.0 * @version 1.0.0
* @since 2023/6/25 10:33 * @since 2023/6/25 10:33
*/ */
@MappedJdbcTypes(JdbcType.VARCHAR) @MappedJdbcTypes({JdbcType.CHAR, JdbcType.VARCHAR})
@MappedTypes(List.class) @MappedTypes(List.class)
public class LongListTypeHandler implements ITypeHandler<String, List<Long>> { public class LongListTypeHandler implements ITypeHandler<String, List<Long>> {

View File

@@ -13,14 +13,13 @@ import java.sql.SQLException;
import java.util.List; import java.util.List;
/** /**
* TODO TEST
* varchar -> List<String> * varchar -> List<String>
* *
* @author Jiahang Li * @author Jiahang Li
* @version 1.0.0 * @version 1.0.0
* @since 2023/6/25 10:33 * @since 2023/6/25 10:33
*/ */
@MappedJdbcTypes(JdbcType.VARCHAR) @MappedJdbcTypes({JdbcType.CHAR, JdbcType.VARCHAR})
@MappedTypes(List.class) @MappedTypes(List.class)
public class StringListTypeHandler implements ITypeHandler<String, List<String>> { public class StringListTypeHandler implements ITypeHandler<String, List<String>> {

View File

@@ -0,0 +1,75 @@
package com.orion.ops.framework.mybatis.core.utils;
import com.orion.ops.framework.common.security.SecurityHolder;
import com.orion.ops.framework.mybatis.core.domain.BaseDO;
import java.util.Date;
import java.util.Objects;
/**
* 对象填充器
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/7/13 10:54
*/
public class DomainFillUtils {
/**
* 安全信息持有者
*/
private static SecurityHolder securityHolder;
/**
* 填充插入
*
* @param baseDO baseDO
*/
public static void fillInsert(BaseDO baseDO) {
Date now = new Date();
// 创建时间
if (Objects.isNull(baseDO.getCreateTime())) {
baseDO.setCreateTime(now);
}
// 更新时间
if (Objects.isNull(baseDO.getUpdateTime())) {
baseDO.setUpdateTime(now);
}
Long userId = securityHolder.getLoginUserId();
// 创建人
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreator())) {
baseDO.setCreator(userId.toString());
}
// 更新人
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) {
baseDO.setUpdater(userId.toString());
}
// 逻辑删除字段
if (Objects.isNull(baseDO.getDeleted())) {
baseDO.setDeleted(false);
}
}
/**
* 填充更新
*
* @param baseDO baseDO
*/
public static void fillUpdate(BaseDO baseDO) {
// 更新时间
if (Objects.isNull(baseDO.getUpdateTime())) {
baseDO.setUpdateTime(new Date());
}
// 更新人
Long userId = securityHolder.getLoginUserId();
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) {
baseDO.setUpdater(userId.toString());
}
}
public static void setSecurityHolder(SecurityHolder securityHolder) {
DomainFillUtils.securityHolder = securityHolder;
}
}

View File

@@ -0,0 +1,59 @@
${httpComment} ${apiComment.create}
POST {{baseUrl}}/${package.ModuleName}/${typeHyphen}/create
Content-Type: application/json
Authorization: {{token}}
{
#foreach($field in ${table.fields})
#if("$!field.propertyName" != "id")
"${field.propertyName}": ""#if($foreach.hasNext),#end
#end
#end
}
${httpComment} ${apiComment.update}
PUT {{baseUrl}}/${package.ModuleName}/${typeHyphen}/update
Content-Type: application/json
Authorization: {{token}}
{
#foreach($field in ${table.fields})
"${field.propertyName}": ""#if($foreach.hasNext),#end
#end
}
${httpComment} ${apiComment.get}
GET {{baseUrl}}/${package.ModuleName}/${typeHyphen}/get?id=1
Authorization: {{token}}
${httpComment} ${apiComment.list}
GET {{baseUrl}}/${package.ModuleName}/${typeHyphen}/list?idList=1,2,3
Authorization: {{token}}
${httpComment} ${apiComment.query}
POST {{baseUrl}}/${package.ModuleName}/${typeHyphen}/query
Content-Type: application/json
Authorization: {{token}}
{
#foreach($field in ${table.fields})
"${field.propertyName}": ""#if($foreach.hasNext),#end
#end
}
${httpComment} ${apiComment.delete}
DELETE {{baseUrl}}/${package.ModuleName}/${typeHyphen}/delete?id=1
Authorization: {{token}}
${httpComment} ${apiComment.batchDelete}
DELETE {{baseUrl}}/${package.ModuleName}/${typeHyphen}/delete-batch?idList=1,2,3
Authorization: {{token}}

View File

@@ -44,21 +44,21 @@ public class ${table.controllerName} {
private ${type}Service ${typeLower}Service; private ${type}Service ${typeLower}Service;
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建$!{table.comment}") @Operation(summary = "${apiComment.create}")
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:create')") @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:create')")
public Long create${type}(@Validated @RequestBody ${type}CreateRequest request) { public Long create${type}(@Validated @RequestBody ${type}CreateRequest request) {
return ${typeLower}Service.create${type}(request); return ${typeLower}Service.create${type}(request);
} }
@PutMapping("/update") @PutMapping("/update")
@Operation(summary = "更新$!{table.comment}") @Operation(summary = "${apiComment.update}")
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:update')") @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:update')")
public Integer update${type}(@Validated @RequestBody ${type}UpdateRequest request) { public Integer update${type}(@Validated @RequestBody ${type}UpdateRequest request) {
return ${typeLower}Service.update${type}(request); return ${typeLower}Service.update${type}(request);
} }
@GetMapping("/get") @GetMapping("/get")
@Operation(summary = "通过id查询$!{table.comment}") @Operation(summary = "${apiComment.get}")
@Parameter(name = "id", description = "id", required = true) @Parameter(name = "id", description = "id", required = true)
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:query')") @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:query')")
public ${type}VO get${type}(@RequestParam("id") Long id) { public ${type}VO get${type}(@RequestParam("id") Long id) {
@@ -66,7 +66,7 @@ public class ${table.controllerName} {
} }
@GetMapping("/list") @GetMapping("/list")
@Operation(summary = "通过id批量查询$!{table.comment}") @Operation(summary = "${apiComment.list}")
@Parameter(name = "idList", description = "idList", required = true) @Parameter(name = "idList", description = "idList", required = true)
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:query')") @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:query')")
public List<${type}VO> get${type}List(@RequestParam("idList") List<Long> idList) { public List<${type}VO> get${type}List(@RequestParam("idList") List<Long> idList) {
@@ -74,14 +74,14 @@ public class ${table.controllerName} {
} }
@PostMapping("/query") @PostMapping("/query")
@Operation(summary = "分页查询$!{table.comment}") @Operation(summary = "${apiComment.query}")
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:query')") @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:query')")
public DataGrid<${type}VO> get${type}Page(@Validated @RequestBody ${type}QueryRequest request) { public DataGrid<${type}VO> get${type}Page(@Validated @RequestBody ${type}QueryRequest request) {
return ${typeLower}Service.get${type}Page(request); return ${typeLower}Service.get${type}Page(request);
} }
@PutMapping("/delete") @PutMapping("/delete")
@Operation(summary = "删除$!{table.comment}") @Operation(summary = "${apiComment.delete}")
@Parameter(name = "id", description = "id", required = true) @Parameter(name = "id", description = "id", required = true)
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:delete')") @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:delete')")
public Integer delete${type}(@RequestParam("id") Long id) { public Integer delete${type}(@RequestParam("id") Long id) {
@@ -89,7 +89,7 @@ public class ${table.controllerName} {
} }
@PutMapping("/delete-batch") @PutMapping("/delete-batch")
@Operation(summary = "批量删除$!{table.comment}") @Operation(summary = "${apiComment.batchDelete}")
@Parameter(name = "idList", description = "idList", required = true) @Parameter(name = "idList", description = "idList", required = true)
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:delete')") @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:delete')")
public Integer batchDelete${type}(@RequestParam("idList") List<Long> idList) { public Integer batchDelete${type}(@RequestParam("idList") List<Long> idList) {

View File

@@ -8,7 +8,7 @@ import lombok.*;
import java.util.*; import java.util.*;
/** /**
* $!{table.comment} 数据库对象 * $!{table.comment} 实体对象
* *
* @author ${author} * @author ${author}
* @version 1.0.0 * @version 1.0.0
@@ -20,9 +20,9 @@ import java.util.*;
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
#if(${table.convert}) #if(${table.convert})
@TableName("${schemaName}${table.name}") @TableName(value = "${schemaName}${table.name}", autoResultMap = true)
#end #end
@Schema(name = "${entity}", description = "$!{table.comment} 数据库对象") @Schema(name = "${entity}", description = "$!{table.comment} 实体对象")
#if(${superEntityClass}) #if(${superEntityClass})
public class ${entity} extends ${superEntityClass}#if(${activeRecord})<${entity}>#end { public class ${entity} extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
#elseif(${entitySerialVersionUID}) #elseif(${entitySerialVersionUID})

View File

@@ -22,12 +22,14 @@ import java.util.*;
@AllArgsConstructor @AllArgsConstructor
@Schema(name = "${type}CreateRequest", description = "$!{table.comment} 创建请求对象") @Schema(name = "${type}CreateRequest", description = "$!{table.comment} 创建请求对象")
public class ${type}CreateRequest implements Serializable { public class ${type}CreateRequest implements Serializable {
#foreach($field in ${table.fields})
#foreach($field in ${table.fields})
#if("$!field.propertyName" != "id")
#if("$!field.comment" != "") #if("$!field.comment" != "")
@Schema(description = "${field.comment}") @Schema(description = "${field.comment}")
#end #end
private ${field.propertyType} ${field.propertyName}; private ${field.propertyType} ${field.propertyName};
#end
#end
#end
} }

View File

@@ -29,10 +29,7 @@
#if(${baseColumnList}) #if(${baseColumnList})
<!-- 通用查询结果列 --> <!-- 通用查询结果列 -->
<sql id="Base_Column_List"> <sql id="Base_Column_List">
#foreach($field in ${table.commonFields}) #foreach($field in ${table.commonFields})#if(${foreach.count} == 1) #end${field.columnName}, #end${table.fieldNames}
${field.columnName},
#end
${table.fieldNames}
</sql> </sql>
#end #end

View File

@@ -31,8 +31,6 @@ import java.util.List;
@Service @Service
public class ${table.serviceImplName} implements ${table.serviceName} { public class ${table.serviceImplName} implements ${table.serviceName} {
// TODO 需要自行实现 page 和 check 方法
@Resource @Resource
private ${type}DAO ${typeLower}DAO; private ${type}DAO ${typeLower}DAO;
@@ -42,7 +40,7 @@ public class ${table.serviceImplName} implements ${table.serviceName} {
${type}DO record = ${type}Convert.MAPPER.to(request); ${type}DO record = ${type}Convert.MAPPER.to(request);
record.setId(null); record.setId(null);
// 查询是否存在 // 查询是否存在
this.checkTestTablePresent(record); this.check${type}Present(record);
// 插入 // 插入
int effect = ${typeLower}DAO.insert(record); int effect = ${typeLower}DAO.insert(record);
log.info("${type}Service-add${type} effect: {}, domain: {}", effect, JSON.toJSONString(record)); log.info("${type}Service-add${type} effect: {}, domain: {}", effect, JSON.toJSONString(record));
@@ -55,7 +53,7 @@ public class ${table.serviceImplName} implements ${table.serviceName} {
${type}DO record = ${type}Convert.MAPPER.to(request); ${type}DO record = ${type}Convert.MAPPER.to(request);
Valid.notNull(record.getId(), ErrorMessage.ID_MISSING); Valid.notNull(record.getId(), ErrorMessage.ID_MISSING);
// 查询是否存在 // 查询是否存在
this.checkTestTablePresent(record); this.check${type}Present(record);
// 更新 // 更新
int effect = ${typeLower}DAO.updateById(record); int effect = ${typeLower}DAO.updateById(record);
log.info("${type}Service-update${type} effect: {}, domain: {}", effect, JSON.toJSONString(record)); log.info("${type}Service-update${type} effect: {}, domain: {}", effect, JSON.toJSONString(record));
@@ -87,7 +85,10 @@ public class ${table.serviceImplName} implements ${table.serviceName} {
@Override @Override
public DataGrid<${type}VO> get${type}Page(${type}QueryRequest request) { public DataGrid<${type}VO> get${type}Page(${type}QueryRequest request) {
// 构造条件 // 构造条件
LambdaQueryWrapper<${type}DO> wrapper = Conditions.wrapper(${type}DO.class); LambdaQueryWrapper<${type}DO> wrapper = Conditions.wrapper(${type}DO.class)
#foreach($field in ${table.fields})
.eq(${type}DO::get${field.capitalName}, request.get${field.capitalName}())#if(!$foreach.hasNext);#end
#end
// 查询 // 查询
return ${typeLower}DAO.of() return ${typeLower}DAO.of()
.wrapper(wrapper) .wrapper(wrapper)
@@ -97,12 +98,16 @@ public class ${table.serviceImplName} implements ${table.serviceName} {
@Override @Override
public Integer delete${type}(Long id) { public Integer delete${type}(Long id) {
return ${typeLower}DAO.deleteById(id); int effect = ${typeLower}DAO.deleteById(id);
log.info("${type}Service-delete${type} id: {}, effect: {}", id, effect);
return effect;
} }
@Override @Override
public Integer batchDelete${type}(List<Long> idList) { public Integer batchDelete${type}(List<Long> idList) {
return ${typeLower}DAO.deleteBatchIds(idList); int effect = ${typeLower}DAO.deleteBatchIds(idList);
log.info("${type}Service-batchDelete${type} idList: {}, effect: {}", JSON.toJSONString(idList), effect);
return effect;
} }
/** /**
@@ -113,12 +118,16 @@ public class ${table.serviceImplName} implements ${table.serviceName} {
private void check${type}Present(${type}DO domain) { private void check${type}Present(${type}DO domain) {
// 构造条件 // 构造条件
LambdaQueryWrapper<${type}DO> wrapper = Conditions.wrapper(${type}DO.class) LambdaQueryWrapper<${type}DO> wrapper = Conditions.wrapper(${type}DO.class)
.eq(${type}DO::getId, domain.getId()); // 更新时忽略当前记录
// .eq(XXXDO::getXXX, domain.getXXX()); .ne(${type}DO::getId, domain.getId())
// 用其他字段做重复校验
#foreach($field in ${table.fields})
#if("$!field.propertyName" != "id")
.eq(${type}DO::get${field.capitalName}, domain.get${field.capitalName}())#if(!$foreach.hasNext);#end
#end
#end
// 检查是否存在 // 检查是否存在
boolean present = testTableDAO.of() boolean present = ${typeLower}DAO.of().wrapper(wrapper).present();
.wrapper(wrapper)
.present();
if (present) { if (present) {
throw ErrorCode.DATA_PRESENT.exception(); throw ErrorCode.DATA_PRESENT.exception();
} }

View File

@@ -17,7 +17,7 @@ import java.util.List;
public interface ${table.serviceName} { public interface ${table.serviceName} {
/** /**
* 插入$!{table.comment} * ${apiComment.create}
* *
* @param request request * @param request request
* @return id * @return id
@@ -25,7 +25,7 @@ public interface ${table.serviceName} {
Long create${type}(${type}CreateRequest request); Long create${type}(${type}CreateRequest request);
/** /**
* 通过 id 更新$!{table.comment} * ${apiComment.update}
* *
* @param request request * @param request request
* @return effect * @return effect
@@ -33,7 +33,7 @@ public interface ${table.serviceName} {
Integer update${type}(${type}UpdateRequest request); Integer update${type}(${type}UpdateRequest request);
/** /**
* 通过 id 查询$!{table.comment} * ${apiComment.get}
* *
* @param id id * @param id id
* @return row * @return row
@@ -41,7 +41,7 @@ public interface ${table.serviceName} {
${type}VO get${type}(Long id); ${type}VO get${type}(Long id);
/** /**
* 通过 id 批量查询$!{table.comment} * ${apiComment.list}
* *
* @param idList idList * @param idList idList
* @return rows * @return rows
@@ -49,7 +49,7 @@ public interface ${table.serviceName} {
List<${type}VO> get${type}List(List<Long> idList); List<${type}VO> get${type}List(List<Long> idList);
/** /**
* 分页查询$!{table.comment} * ${apiComment.query}
* *
* @param request request * @param request request
* @return rows * @return rows
@@ -57,7 +57,7 @@ public interface ${table.serviceName} {
DataGrid<${type}VO> get${type}Page(${type}QueryRequest request); DataGrid<${type}VO> get${type}Page(${type}QueryRequest request);
/** /**
* 通过 id 删除$!{table.comment} * ${apiComment.delete}
* *
* @param id id * @param id id
* @return effect * @return effect
@@ -65,7 +65,7 @@ public interface ${table.serviceName} {
Integer delete${type}(Long id); Integer delete${type}(Long id);
/** /**
* 通过 id 批量删除$!{table.comment} * ${apiComment.batchDelete}
* *
* @param idList idList * @param idList idList
* @return effect * @return effect

View File

@@ -151,7 +151,10 @@ public class OrionSwaggerAutoConfiguration {
.name(HttpHeaders.AUTHORIZATION) .name(HttpHeaders.AUTHORIZATION)
.description("认证 Token") .description("认证 Token")
.in(String.valueOf(SecurityScheme.In.HEADER)) .in(String.valueOf(SecurityScheme.In.HEADER))
.schema(new StringSchema()._default("Bearer ").name("NAME").description("认证 Token")); .schema(new StringSchema()
._default("Bearer 1")
.name(HttpHeaders.AUTHORIZATION)
.description("认证 Token"));
} }
@Value("${orion.api.prefix}") @Value("${orion.api.prefix}")

View File

@@ -2,9 +2,3 @@
GET {{baseUrl}}/server/bootstrap/health GET {{baseUrl}}/server/bootstrap/health
Authorization: {{token}} Authorization: {{token}}
###
GET http://127.0.0.1:9200/infra/test-table/get
Authorization: {{token}}
###