From e56ff794c3a9875187b974cf7baeead0519d8b05 Mon Sep 17 00:00:00 2001 From: lijiahang Date: Thu, 13 Jul 2023 16:58:07 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E8=AF=95mybatis=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E5=8F=8A=E4=BB=A3=E7=A0=81=E6=A8=A1=E6=9D=BF.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/OrionMybatisAutoConfiguration.java | 6 +- .../mybatis/core/cache/CacheClearFilter.java | 1 - .../mybatis/core/cache/CacheHolder.java | 26 +++---- .../framework/mybatis/core/domain/BaseDO.java | 1 + .../mybatis/core/generator/CodeGenerator.java | 46 ++++++++++-- .../generator/VelocityTemplateEngine.java | 43 ++++++++++- .../core/handler/FieldFillHandler.java | 46 ++---------- .../mybatis/core/query/CacheQuery.java | 18 ++--- .../core/type/IntegerListTypeHandler.java | 3 +- .../core/type/JSONArrayTypeHandler.java | 4 +- .../core/type/JSONObjectTypeHandler.java | 4 +- .../core/type/LongListTypeHandler.java | 3 +- .../core/type/StringListTypeHandler.java | 3 +- .../mybatis/core/utils/DomainFillUtils.java | 75 +++++++++++++++++++ .../templates/orion-controller.http.vm | 59 +++++++++++++++ .../templates/orion-controller.java.vm | 14 ++-- .../templates/orion-entity-do.java.vm | 6 +- .../orion-entity-request-create.java.vm | 6 +- .../resources/templates/orion-mapper.xml.vm | 5 +- .../templates/orion-service-impl.java.vm | 33 +++++--- .../resources/templates/orion-service.java.vm | 14 ++-- .../config/OrionSwaggerAutoConfiguration.java | 5 +- .../controller/BootstrapController.http | 6 -- 23 files changed, 298 insertions(+), 129 deletions(-) create mode 100644 orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/utils/DomainFillUtils.java create mode 100644 orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-controller.http.vm diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/config/OrionMybatisAutoConfiguration.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/config/OrionMybatisAutoConfiguration.java index 46cf32d7..5a939b32 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/config/OrionMybatisAutoConfiguration.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/config/OrionMybatisAutoConfiguration.java @@ -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.FilterOrderConst; 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.handler.FieldFillHandler; +import com.orion.ops.framework.mybatis.core.utils.DomainFillUtils; import org.apache.ibatis.annotations.Mapper; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -29,7 +31,9 @@ public class OrionMybatisAutoConfiguration { * @return 字段填充元数据处理器 */ @Bean - public MetaObjectHandler defaultMetaObjectHandler() { + public MetaObjectHandler defaultMetaObjectHandler(SecurityHolder securityHolder) { + // 设置填充工具参数 + DomainFillUtils.setSecurityHolder(securityHolder); return new FieldFillHandler(); } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheClearFilter.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheClearFilter.java index fdd01661..9b2f8989 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheClearFilter.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheClearFilter.java @@ -24,7 +24,6 @@ public class CacheClearFilter extends OncePerRequestFilter { filterChain.doFilter(request, response); } finally { // 清理缓存 - // TODO TEST CacheHolder.remove(); } } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheHolder.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheHolder.java index baa80545..8fed6a50 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheHolder.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheHolder.java @@ -21,34 +21,34 @@ public class CacheHolder { /** * 缓存 *

- * key: mapperClass + * key: mapper * value: id > row */ - private static final ThreadLocal>, Serializable, Store>> HOLDER = ThreadLocal.withInitial(MultiHashMap::new); + private static final ThreadLocal, Serializable, Store>> HOLDER = ThreadLocal.withInitial(MultiHashMap::new); /** * 获取缓存 * - * @param mapperClass mapperClass - * @param id id - * @param domain + * @param mapper mapper + * @param id id + * @param domain * @return cacheWrapper */ @SuppressWarnings("unchecked") - public static Store get(Class> mapperClass, Serializable id) { - return (Store) HOLDER.get().get(mapperClass, id); + public static Store get(BaseMapper mapper, Serializable id) { + return (Store) HOLDER.get().get(mapper, id); } /** * 设置缓存 * - * @param mapperClass mapperClass - * @param id id - * @param row row - * @param domainClass + * @param mapper mapper + * @param id id + * @param row row + * @param domainClass */ - public static void set(Class> mapperClass, Serializable id, T row) { - HOLDER.get().put(mapperClass, id, new Store<>(row)); + public static void set(BaseMapper mapper, Serializable id, T row) { + HOLDER.get().put(mapper, id, new Store<>(row)); } /** diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/domain/BaseDO.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/domain/BaseDO.java index b49a79e2..e0093270 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/domain/BaseDO.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/domain/BaseDO.java @@ -42,6 +42,7 @@ public class BaseDO implements Serializable { */ @TableLogic @Schema(description = "是否删除 0未删除 1已删除") + @TableField(fill = FieldFill.INSERT, jdbcType = JdbcType.BIT) private Boolean deleted; } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/CodeGenerator.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/CodeGenerator.java index 96c57039..3c83c87d 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/CodeGenerator.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/CodeGenerator.java @@ -16,9 +16,13 @@ import com.orion.ops.framework.mybatis.core.domain.BaseDO; import com.orion.ops.framework.mybatis.core.mapper.IMapper; import org.apache.ibatis.annotations.Mapper; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.io.File; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -31,13 +35,19 @@ import java.util.stream.Collectors; public class CodeGenerator { public static void main(String[] args) { + @NotNull String outputDir = "D:/MP/"; + @NotNull String author = Const.ORION_AUTHOR; - // 表名 - String[] tables = {"test_table"}; + @NotEmpty + String[] tables = {"test_table", "table_copy"}; + // 表业务注释 需要和表一一对应 null则为表注释 + @NotEmpty + String[] comment = {"用户", "复制"}; // 模块 + @NotNull String module = "infra"; - // 连接 + // jdbc 配置 - 使用配置文件 File yamlFile = new File("orion-ops-launch/src/main/resources/application-dev.yaml"); YmlExt yaml = YmlExt.load(yamlFile); String url = yaml.getValue("spring.datasource.druid.url"); @@ -47,8 +57,7 @@ public class CodeGenerator { // 执行 runGenerator(outputDir, author, url, username, password, - tables, - module); + tables, comment, module); } /** @@ -60,7 +69,11 @@ public class CodeGenerator { String username, String password, String[] tables, + String[] comment, String module) { + // 创建引擎 + VelocityTemplateEngine engine = getEngine(tables, comment); + // 获取全局配置 GlobalConfig globalConfig = getGlobalConfig(outputDir, author); @@ -93,7 +106,26 @@ public class CodeGenerator { .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 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() { String[][] customFileDefineArr = new String[][]{ + // http 文件 + new String[]{"/templates/orion-controller.http.vm", "%sController.http", "controller"}, // vo 文件 new String[]{"/templates/orion-entity-vo.java.vm", "%sVO.java", "entity.vo"}, // dto 文件 diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/VelocityTemplateEngine.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/VelocityTemplateEngine.java index 859fdd2a..e80fd035 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/VelocityTemplateEngine.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/VelocityTemplateEngine.java @@ -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.po.TableInfo; import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine; -import com.orion.lang.define.Console; import com.orion.lang.utils.Strings; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; @@ -35,6 +34,7 @@ import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; @@ -49,8 +49,14 @@ import java.util.stream.Collectors; */ public class VelocityTemplateEngine extends AbstractTemplateEngine { + private Map tableComment; + private VelocityEngine velocityEngine; + public VelocityTemplateEngine(Map tableComment) { + this.tableComment = tableComment; + } + { try { Class.forName("org.apache.velocity.util.DuckType"); @@ -62,7 +68,7 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine { @Override @NotNull public VelocityTemplateEngine init(@NotNull ConfigBuilder configBuilder) { - if (null == velocityEngine) { + if (velocityEngine == null) { Properties p = new Properties(); p.setProperty(ConstVal.VM_LOAD_PATH_KEY, ConstVal.VM_LOAD_PATH_VALUE); 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; } + /** + * 插入 api 注释 + * + * @param tableInfo tableInfo + * @param objectMap objectMap + */ + private void putApiComment(TableInfo tableInfo, Map objectMap) { + Map 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 protected void outputCustomFile(@NotNull List customFiles, @NotNull TableInfo tableInfo, @NotNull Map objectMap) { + // 替换业务注释 + String comment = tableComment.get(tableInfo.getName()); + if (comment != null) { + tableInfo.setComment(comment); + } + + // http 注释标识 + objectMap.put("httpComment", "###"); + + // 实体名称 String domainName = tableInfo.getEntityName(); String mappingHyphen = objectMap.get("controllerMappingHyphen").toString(); - // 实际实体名称 String entityName = domainName.substring(0, domainName.length() - 2); objectMap.put("type", entityName); objectMap.put("typeLower", Strings.firstLower(entityName)); objectMap.put("typeHyphen", mappingHyphen.substring(0, mappingHyphen.length() - 3)); + // 注释 + this.putApiComment(tableInfo, objectMap); // 自定义文件的包 List customFilePackages = customFiles.stream() @@ -128,7 +163,6 @@ public class VelocityTemplateEngine extends AbstractTemplateEngine { String currentPackage = getConfigBuilder().getPackageConfig().getParent() + "." + file.getPackageName(); // 设置当前包 objectMap.put("currentPackage", currentPackage); - objectMap.forEach(Console::trace); // 文件路径 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()); }); } + } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/handler/FieldFillHandler.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/handler/FieldFillHandler.java index eff0b2e3..5cf7bef1 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/handler/FieldFillHandler.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/handler/FieldFillHandler.java @@ -1,12 +1,10 @@ package com.orion.ops.framework.mybatis.core.handler; 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.utils.DomainFillUtils; import org.apache.ibatis.reflection.MetaObject; -import javax.annotation.Resource; -import java.util.Date; import java.util.Objects; /** @@ -18,53 +16,19 @@ import java.util.Objects; */ public class FieldFillHandler implements MetaObjectHandler { - @Resource - private SecurityHolder securityHolder; - - // TODO 删除fill baseConst - @Override public void insertFill(MetaObject metaObject) { if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO) { - BaseDO baseDO = (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()); - } + // 填充插入 + DomainFillUtils.fillInsert((BaseDO) metaObject.getOriginalObject()); } } @Override public void updateFill(MetaObject metaObject) { if (Objects.nonNull(metaObject) && metaObject.getOriginalObject() instanceof BaseDO) { - // 更新时间 - Object updateTime = getFieldValByName("updateTime", metaObject); - 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); - } + // 填充更新 + DomainFillUtils.fillUpdate((BaseDO) metaObject.getOriginalObject()); } } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/CacheQuery.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/CacheQuery.java index 6f7eaba7..4d0ac756 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/CacheQuery.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/CacheQuery.java @@ -13,8 +13,6 @@ import java.util.function.Function; * 缓存查询器 *

* 查询会存入缓存 - *

- * TODO test * * @author Jiahang Li * @version 1.0.0 @@ -58,10 +56,12 @@ public class CacheQuery { /** * 强制查询 * + * @param id id * @return this */ - public CacheQuery force() { + public CacheQuery force(Serializable id) { this.force = true; + this.id = id; return this; } @@ -70,20 +70,20 @@ public class CacheQuery { return this.get().map(mapper); } - @SuppressWarnings("unchecked") public Optional get() { - Class> mapperClass = (Class>) dao.getClass(); // 不查询缓存 if (!force) { // 从缓存中获取 - Store store = CacheHolder.get(mapperClass, id); - return Optional.ofNullable(store) - .map(Store::get); + Store store = CacheHolder.get(dao, id); + // 命中直接返回 + if (store != null) { + return Optional.of(store).map(Store::get); + } } // 查询 T row = dao.selectById(id); // 设置缓存 - CacheHolder.set(mapperClass, id, row); + CacheHolder.set(dao, id, row); return Optional.ofNullable(row); } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/IntegerListTypeHandler.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/IntegerListTypeHandler.java index 267f873f..87985ca3 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/IntegerListTypeHandler.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/IntegerListTypeHandler.java @@ -16,14 +16,13 @@ import java.util.List; import java.util.stream.Collectors; /** - * TODO TEST * varchar -> List * * @author Jiahang Li * @version 1.0.0 * @since 2023/6/25 10:33 */ -@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedJdbcTypes({JdbcType.CHAR, JdbcType.VARCHAR}) @MappedTypes(List.class) public class IntegerListTypeHandler implements ITypeHandler> { diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/JSONArrayTypeHandler.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/JSONArrayTypeHandler.java index c9ae67b3..f8de126a 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/JSONArrayTypeHandler.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/JSONArrayTypeHandler.java @@ -12,20 +12,18 @@ import java.sql.ResultSet; import java.sql.SQLException; /** - * TODO TEST * varchar -> JSONArray * * @author Jiahang Li * @version 1.0.0 * @since 2023/6/25 10:33 */ -@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedJdbcTypes({JdbcType.CHAR, JdbcType.VARCHAR}) @MappedTypes(JSONArray.class) public class JSONArrayTypeHandler implements ITypeHandler { @Override public void setParameter(PreparedStatement ps, int i, JSONArray res, JdbcType jdbcType) throws SQLException { - // todo TEST NULL // 设置占位符 ps.setString(i, res.toString()); } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/JSONObjectTypeHandler.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/JSONObjectTypeHandler.java index ab143e27..0f26b5c4 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/JSONObjectTypeHandler.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/JSONObjectTypeHandler.java @@ -12,20 +12,18 @@ import java.sql.ResultSet; import java.sql.SQLException; /** - * TODO TEST * varchar -> JSONObject * * @author Jiahang Li * @version 1.0.0 * @since 2023/6/25 10:33 */ -@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedJdbcTypes({JdbcType.CHAR, JdbcType.VARCHAR}) @MappedTypes(JSONObject.class) public class JSONObjectTypeHandler implements ITypeHandler { @Override public void setParameter(PreparedStatement ps, int i, JSONObject res, JdbcType jdbcType) throws SQLException { - // todo TEST NULL // 设置占位符 ps.setString(i, res.toString()); } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/LongListTypeHandler.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/LongListTypeHandler.java index b8408342..53ef25b2 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/LongListTypeHandler.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/LongListTypeHandler.java @@ -16,14 +16,13 @@ import java.util.List; import java.util.stream.Collectors; /** - * TODO TEST * varchar -> List * * @author Jiahang Li * @version 1.0.0 * @since 2023/6/25 10:33 */ -@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedJdbcTypes({JdbcType.CHAR, JdbcType.VARCHAR}) @MappedTypes(List.class) public class LongListTypeHandler implements ITypeHandler> { diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/StringListTypeHandler.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/StringListTypeHandler.java index 3e974d30..6eeaeab9 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/StringListTypeHandler.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/type/StringListTypeHandler.java @@ -13,14 +13,13 @@ import java.sql.SQLException; import java.util.List; /** - * TODO TEST * varchar -> List * * @author Jiahang Li * @version 1.0.0 * @since 2023/6/25 10:33 */ -@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedJdbcTypes({JdbcType.CHAR, JdbcType.VARCHAR}) @MappedTypes(List.class) public class StringListTypeHandler implements ITypeHandler> { diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/utils/DomainFillUtils.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/utils/DomainFillUtils.java new file mode 100644 index 00000000..00b4cb61 --- /dev/null +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/utils/DomainFillUtils.java @@ -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; + } + +} diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-controller.http.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-controller.http.vm new file mode 100644 index 00000000..3a961a88 --- /dev/null +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-controller.http.vm @@ -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}} + + + diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-controller.java.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-controller.java.vm index 200079e9..d7fb9316 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-controller.java.vm +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-controller.java.vm @@ -44,21 +44,21 @@ public class ${table.controllerName} { private ${type}Service ${typeLower}Service; @PostMapping("/create") - @Operation(summary = "创建$!{table.comment}") + @Operation(summary = "${apiComment.create}") @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:create')") public Long create${type}(@Validated @RequestBody ${type}CreateRequest request) { return ${typeLower}Service.create${type}(request); } @PutMapping("/update") - @Operation(summary = "更新$!{table.comment}") + @Operation(summary = "${apiComment.update}") @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:update')") public Integer update${type}(@Validated @RequestBody ${type}UpdateRequest request) { return ${typeLower}Service.update${type}(request); } @GetMapping("/get") - @Operation(summary = "通过id查询$!{table.comment}") + @Operation(summary = "${apiComment.get}") @Parameter(name = "id", description = "id", required = true) @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:query')") public ${type}VO get${type}(@RequestParam("id") Long id) { @@ -66,7 +66,7 @@ public class ${table.controllerName} { } @GetMapping("/list") - @Operation(summary = "通过id批量查询$!{table.comment}") + @Operation(summary = "${apiComment.list}") @Parameter(name = "idList", description = "idList", required = true) @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:query')") public List<${type}VO> get${type}List(@RequestParam("idList") List idList) { @@ -74,14 +74,14 @@ public class ${table.controllerName} { } @PostMapping("/query") - @Operation(summary = "分页查询$!{table.comment}") + @Operation(summary = "${apiComment.query}") @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:query')") public DataGrid<${type}VO> get${type}Page(@Validated @RequestBody ${type}QueryRequest request) { return ${typeLower}Service.get${type}Page(request); } @PutMapping("/delete") - @Operation(summary = "删除$!{table.comment}") + @Operation(summary = "${apiComment.delete}") @Parameter(name = "id", description = "id", required = true) @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:delete')") public Integer delete${type}(@RequestParam("id") Long id) { @@ -89,7 +89,7 @@ public class ${table.controllerName} { } @PutMapping("/delete-batch") - @Operation(summary = "批量删除$!{table.comment}") + @Operation(summary = "${apiComment.batchDelete}") @Parameter(name = "idList", description = "idList", required = true) @PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:delete')") public Integer batchDelete${type}(@RequestParam("idList") List idList) { diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-entity-do.java.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-entity-do.java.vm index 860496b1..4ecdba28 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-entity-do.java.vm +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-entity-do.java.vm @@ -8,7 +8,7 @@ import lombok.*; import java.util.*; /** - * $!{table.comment} 数据库对象 + * $!{table.comment} 实体对象 * * @author ${author} * @version 1.0.0 @@ -20,9 +20,9 @@ import java.util.*; @AllArgsConstructor @EqualsAndHashCode(callSuper = true) #if(${table.convert}) -@TableName("${schemaName}${table.name}") +@TableName(value = "${schemaName}${table.name}", autoResultMap = true) #end -@Schema(name = "${entity}", description = "$!{table.comment} 数据库对象") +@Schema(name = "${entity}", description = "$!{table.comment} 实体对象") #if(${superEntityClass}) public class ${entity} extends ${superEntityClass}#if(${activeRecord})<${entity}>#end { #elseif(${entitySerialVersionUID}) diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-entity-request-create.java.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-entity-request-create.java.vm index 15d893e3..13b5412c 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-entity-request-create.java.vm +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-entity-request-create.java.vm @@ -22,12 +22,14 @@ import java.util.*; @AllArgsConstructor @Schema(name = "${type}CreateRequest", description = "$!{table.comment} 创建请求对象") public class ${type}CreateRequest implements Serializable { - #foreach($field in ${table.fields}) + #foreach($field in ${table.fields}) + #if("$!field.propertyName" != "id") #if("$!field.comment" != "") @Schema(description = "${field.comment}") #end private ${field.propertyType} ${field.propertyName}; - #end + #end + #end } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-mapper.xml.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-mapper.xml.vm index 38dcbbc3..53fa12b6 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-mapper.xml.vm +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-mapper.xml.vm @@ -29,10 +29,7 @@ #if(${baseColumnList}) - #foreach($field in ${table.commonFields}) - ${field.columnName}, - #end - ${table.fieldNames} + #foreach($field in ${table.commonFields})#if(${foreach.count} == 1) #end${field.columnName}, #end${table.fieldNames} #end diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-service-impl.java.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-service-impl.java.vm index f8a050e7..28e131bd 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-service-impl.java.vm +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-service-impl.java.vm @@ -31,8 +31,6 @@ import java.util.List; @Service public class ${table.serviceImplName} implements ${table.serviceName} { - // TODO 需要自行实现 page 和 check 方法 - @Resource private ${type}DAO ${typeLower}DAO; @@ -42,7 +40,7 @@ public class ${table.serviceImplName} implements ${table.serviceName} { ${type}DO record = ${type}Convert.MAPPER.to(request); record.setId(null); // 查询是否存在 - this.checkTestTablePresent(record); + this.check${type}Present(record); // 插入 int effect = ${typeLower}DAO.insert(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); Valid.notNull(record.getId(), ErrorMessage.ID_MISSING); // 查询是否存在 - this.checkTestTablePresent(record); + this.check${type}Present(record); // 更新 int effect = ${typeLower}DAO.updateById(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 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() .wrapper(wrapper) @@ -97,12 +98,16 @@ public class ${table.serviceImplName} implements ${table.serviceName} { @Override 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 public Integer batchDelete${type}(List 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) { // 构造条件 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() - .wrapper(wrapper) - .present(); + boolean present = ${typeLower}DAO.of().wrapper(wrapper).present(); if (present) { throw ErrorCode.DATA_PRESENT.exception(); } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-service.java.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-service.java.vm index fdb00bd5..d8f9830a 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-service.java.vm +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-service.java.vm @@ -17,7 +17,7 @@ import java.util.List; public interface ${table.serviceName} { /** - * 插入$!{table.comment} + * ${apiComment.create} * * @param request request * @return id @@ -25,7 +25,7 @@ public interface ${table.serviceName} { Long create${type}(${type}CreateRequest request); /** - * 通过 id 更新$!{table.comment} + * ${apiComment.update} * * @param request request * @return effect @@ -33,7 +33,7 @@ public interface ${table.serviceName} { Integer update${type}(${type}UpdateRequest request); /** - * 通过 id 查询$!{table.comment} + * ${apiComment.get} * * @param id id * @return row @@ -41,7 +41,7 @@ public interface ${table.serviceName} { ${type}VO get${type}(Long id); /** - * 通过 id 批量查询$!{table.comment} + * ${apiComment.list} * * @param idList idList * @return rows @@ -49,7 +49,7 @@ public interface ${table.serviceName} { List<${type}VO> get${type}List(List idList); /** - * 分页查询$!{table.comment} + * ${apiComment.query} * * @param request request * @return rows @@ -57,7 +57,7 @@ public interface ${table.serviceName} { DataGrid<${type}VO> get${type}Page(${type}QueryRequest request); /** - * 通过 id 删除$!{table.comment} + * ${apiComment.delete} * * @param id id * @return effect @@ -65,7 +65,7 @@ public interface ${table.serviceName} { Integer delete${type}(Long id); /** - * 通过 id 批量删除$!{table.comment} + * ${apiComment.batchDelete} * * @param idList idList * @return effect diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-swagger/src/main/java/com/orion/ops/framework/swagger/config/OrionSwaggerAutoConfiguration.java b/orion-ops-framework/orion-ops-spring-boot-starter-swagger/src/main/java/com/orion/ops/framework/swagger/config/OrionSwaggerAutoConfiguration.java index 2c94bf5d..bc3d7609 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-swagger/src/main/java/com/orion/ops/framework/swagger/config/OrionSwaggerAutoConfiguration.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-swagger/src/main/java/com/orion/ops/framework/swagger/config/OrionSwaggerAutoConfiguration.java @@ -151,7 +151,10 @@ public class OrionSwaggerAutoConfiguration { .name(HttpHeaders.AUTHORIZATION) .description("认证 Token") .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}") diff --git a/orion-ops-launch/src/main/java/com/orion/ops/launch/controller/BootstrapController.http b/orion-ops-launch/src/main/java/com/orion/ops/launch/controller/BootstrapController.http index 9337fb41..c75d7621 100644 --- a/orion-ops-launch/src/main/java/com/orion/ops/launch/controller/BootstrapController.http +++ b/orion-ops-launch/src/main/java/com/orion/ops/launch/controller/BootstrapController.http @@ -2,9 +2,3 @@ GET {{baseUrl}}/server/bootstrap/health Authorization: {{token}} - -### -GET http://127.0.0.1:9200/infra/test-table/get -Authorization: {{token}} - -###