diff --git a/blade-starter-develop/src/main/java/org/springblade/develop/CodeGenerator.java b/blade-starter-develop/src/main/java/org/springblade/develop/CodeGenerator.java index 9e7ea8c..67b6594 100644 --- a/blade-starter-develop/src/main/java/org/springblade/develop/CodeGenerator.java +++ b/blade-starter-develop/src/main/java/org/springblade/develop/CodeGenerator.java @@ -60,7 +60,7 @@ public class CodeGenerator { /** * 基础业务字段 */ - public static String[] SUPER_ENTITY_COLUMNS = {"create_time", "create_user", "update_time", "update_user", "status", "is_deleted"}; + public static String[] SUPER_ENTITY_COLUMNS = {"create_time", "create_user", "create_dept", "update_time", "update_user", "status", "is_deleted"}; /** * 是否包含包装器 */ diff --git a/blade-starter-develop/src/main/java/org/springblade/develop/support/BladeCodeGenerator.java b/blade-starter-develop/src/main/java/org/springblade/develop/support/BladeCodeGenerator.java index f236910..e627584 100644 --- a/blade-starter-develop/src/main/java/org/springblade/develop/support/BladeCodeGenerator.java +++ b/blade-starter-develop/src/main/java/org/springblade/develop/support/BladeCodeGenerator.java @@ -15,11 +15,13 @@ */ package org.springblade.develop.support; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.config.builder.CustomFile; +import com.baomidou.mybatisplus.generator.config.builder.Entity; import com.baomidou.mybatisplus.generator.config.po.TableInfo; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; @@ -148,25 +150,33 @@ public class BladeCodeGenerator { customFile.put("wrapper.java", "/templates/api/wrapper.java.vm"); } if (Func.isNotBlank(packageWebDir)) { - customFile.put("api.js", "/templates/saber/api.js.vm"); + customFile.put("api.ts", "/templates/saber/api.ts.vm"); customFile.put("crud.vue", "/templates/saber/crud.vue.vm"); } + // 无基础业务字段时实体不再继承 BaseEntity,服务层须同步降级为 MyBatis-Plus 原生接口(3.5.17 起位于 spring 包) + String superServiceClass = hasSuperEntity ? "org.springblade.core.mp.base.BaseService" : "com.baomidou.mybatisplus.spring.service.IService"; + String superServiceImplClass = hasSuperEntity ? "org.springblade.core.mp.base.BaseServiceImpl" : "com.baomidou.mybatisplus.spring.service.impl.ServiceImpl"; + FastAutoGenerator.create(url, username, password) .globalConfig(builder -> builder.author(props.getProperty("author")).dateType(DateType.TIME_PACK).enableSwagger().outputDir(getOutputDir()).disableOpenDir()) .packageConfig(builder -> builder.parent(packageName).controller("controller").entity("pojo.entity").service("service").serviceImpl("service.impl").mapper("mapper").xml("mapper")) - .strategyConfig(builder -> builder.addTablePrefix(tablePrefix).addInclude(includeTables).addExclude(excludeTables) - .entityBuilder().naming(NamingStrategy.underline_to_camel).columnNaming(NamingStrategy.underline_to_camel).enableLombok().superClass("org.springblade.core.mp.base.BaseEntity").addSuperEntityColumns(superEntityColumns).enableFileOverride() - .javaTemplate("/templates/api/entity.java.vm") - .serviceBuilder().superServiceClass("org.springblade.core.mp.base.BaseService").superServiceImplClass("org.springblade.core.mp.base.BaseServiceImpl").formatServiceFileName("I%sService").formatServiceImplFileName("%sServiceImpl").enableFileOverride() - .serviceTemplate("/templates/api/service.java.vm") - .serviceImplTemplate("/templates/api/serviceImpl.java.vm") - .mapperBuilder().mapperAnnotation(Mapper.class).enableBaseResultMap().enableBaseColumnList().formatMapperFileName("%sMapper").formatXmlFileName("%sMapper").enableFileOverride() - .mapperTemplate("/templates/api/mapper.java.vm") - .mapperXmlTemplate("/templates/api/mapper.xml.vm") - .controllerBuilder().superClass("org.springblade.core.boot.ctrl.BladeController").formatFileName("%sController").enableRestStyle().enableHyphenStyle().enableFileOverride() - .template("/templates/api/controller.java.vm") - ) + .strategyConfig(builder -> { + Entity.Builder entityBuilder = builder.addTablePrefix(tablePrefix).addInclude(includeTables).addExclude(excludeTables) + .entityBuilder().naming(NamingStrategy.underline_to_camel).columnNaming(NamingStrategy.underline_to_camel).enableLombok().idType(IdType.ASSIGN_ID).enableFileOverride() + .javaTemplate("/templates/api/entity.java.vm"); + if (hasSuperEntity) { + entityBuilder.superClass("org.springblade.core.mp.base.BaseEntity").addSuperEntityColumns(superEntityColumns); + } + entityBuilder.serviceBuilder().superServiceClass(superServiceClass).superServiceImplClass(superServiceImplClass).formatServiceFileName("I%sService").formatServiceImplFileName("%sServiceImpl").enableFileOverride() + .serviceTemplate("/templates/api/service.java.vm") + .serviceImplTemplate("/templates/api/serviceImpl.java.vm") + .mapperBuilder().mapperAnnotation(Mapper.class).enableBaseResultMap().enableBaseColumnList().formatMapperFileName("%sMapper").formatXmlFileName("%sMapper").enableFileOverride() + .mapperTemplate("/templates/api/mapper.java.vm") + .mapperXmlTemplate("/templates/api/mapper.xml.vm") + .controllerBuilder().superClass("org.springblade.core.boot.ctrl.BladeController").formatFileName("%sController").enableRestStyle().enableHyphenStyle().enableFileOverride() + .template("/templates/api/controller.java.vm"); + }) .injectionConfig(builder -> builder.beforeOutputFile( (tableInfo, objectMap) -> System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size()) ).customMap(customMap).customFile(customFile) @@ -202,8 +212,8 @@ public class BladeCodeGenerator { outputPath = getOutputDir() + StringPool.SLASH + packageName.replace(StringPool.DOT, StringPool.SLASH) + StringPool.SLASH + "wrapper" + StringPool.SLASH + entityName + "Wrapper" + StringPool.DOT_JAVA; } - if (StringUtil.equals(key, "api.js")) { - outputPath = getOutputWebDir() + StringPool.SLASH + "api" + StringPool.SLASH + servicePackage.toLowerCase() + StringPool.SLASH + entityNameLower + ".js"; + if (StringUtil.equals(key, "api.ts")) { + outputPath = getOutputWebDir() + StringPool.SLASH + "api" + StringPool.SLASH + servicePackage.toLowerCase() + StringPool.SLASH + entityNameLower + ".ts"; } if (StringUtil.equals(key, "crud.vue")) { diff --git a/blade-starter-develop/src/main/resources/templates/api/controller.java.vm b/blade-starter-develop/src/main/resources/templates/api/controller.java.vm index 94b7235..32934fe 100644 --- a/blade-starter-develop/src/main/resources/templates/api/controller.java.vm +++ b/blade-starter-develop/src/main/resources/templates/api/controller.java.vm @@ -1,11 +1,11 @@ /** * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com). *
- * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *
- * http://www.gnu.org/licenses/lgpl.html + * http://www.apache.org/licenses/LICENSE-2.0 *
* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -15,35 +15,30 @@ */ package $!{package.Controller}; +import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import lombok.AllArgsConstructor; -import jakarta.validation.Valid; - +#if($!{superControllerClassPackage}) +import $!{superControllerClassPackage}; +#end import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.swagger.annotation.ApiOrder; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.Func; -import org.springframework.web.bind.annotation.*; -#if($!{superEntityClass}) -import org.springframework.web.bind.annotation.RequestParam; -#end -import com.baomidou.mybatisplus.core.metadata.IPage; import $!{package.Entity}.$!{entity}; #set($voPackage=$package.Entity.replace("entity","vo")) import $!{voPackage}.$!{entity}VO; -#set($wrapperPackage=$package.Entity.replace("pojo.entity","wrapper")) #if($!{hasWrapper}) +#set($wrapperPackage=$package.Entity.replace("pojo.entity","wrapper")) import $!{wrapperPackage}.$!{entity}Wrapper; #end import $!{package.Service}.$!{table.serviceName}; -#if($!{superControllerClassPackage}) -import $!{superControllerClassPackage}; -#end -#if(!$!{superEntityClass}) -#end +import org.springframework.web.bind.annotation.*; + +import jakarta.validation.Valid; /** * $!{table.comment} 控制器 @@ -84,7 +79,6 @@ public class $!{table.controllerName} { IPage<$!{entity}> pages = $!{table.entityPath}Service.page(Condition.getPage(query), Condition.getQueryWrapper($!{table.entityPath})); return R.data($!{entity}Wrapper.build().pageVO(pages)); } - #else /** * 详情 @@ -144,8 +138,7 @@ public class $!{table.controllerName} { return R.status($!{table.entityPath}Service.saveOrUpdate($!{table.entityPath})); } - #if($!{superEntityClass}) - +#if($!{superEntityClass}) /** * 删除 $!{table.comment} */ @@ -155,8 +148,7 @@ public class $!{table.controllerName} { return R.status($!{table.entityPath}Service.deleteLogic(Func.toLongList(ids))); } - #else - +#else /** * 删除 $!{table.comment} */ @@ -166,6 +158,5 @@ public class $!{table.controllerName} { return R.status($!{table.entityPath}Service.removeByIds(Func.toLongList(ids))); } - #end - +#end } diff --git a/blade-starter-develop/src/main/resources/templates/api/entity.java.vm b/blade-starter-develop/src/main/resources/templates/api/entity.java.vm index d349d24..b382d60 100644 --- a/blade-starter-develop/src/main/resources/templates/api/entity.java.vm +++ b/blade-starter-develop/src/main/resources/templates/api/entity.java.vm @@ -1,3 +1,21 @@ +#set($hasTenant = false) +#set($hasKeyField = false) +#set($hasLongKey = false) +#foreach($field in $!{table.fields}) +#if($!{field.name} == $!{tenantColumn}) +#set($hasTenant = true) +#end +#if($!{field.keyFlag}) +#set($hasKeyField = true) +#end +#if($!{field.keyFlag} && $!{field.propertyType} == "Long") +#set($hasLongKey = true) +#end +#end +#set($useTenantEntity = false) +#if($hasTenant && "$!superEntityClass" == "BaseEntity") +#set($useTenantEntity = true) +#end /** * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com). *
@@ -16,8 +34,20 @@
package $!{package.Entity};
#foreach($pkg in $!{table.importPackages})
+#if($useTenantEntity && $!{pkg} == "org.springblade.core.mp.base.BaseEntity")
+import org.springblade.core.mp.base.TenantEntity;
+#elseif($!{pkg} == "java.io.Serializable" && $!{superEntityClass} && !$!{activeRecord})
+## 继承父类时不直接实现 Serializable,跳过强制注入的导入
+#elseif(!$hasKeyField && ($!{pkg} == "com.baomidou.mybatisplus.annotation.IdType" || $!{pkg} == "com.baomidou.mybatisplus.annotation.TableId"))
+## 主键列归入公共字段时实体内不产出主键注解,跳过全局 idType 注入的导入
+#else
import $!{pkg};
#end
+#end
+#if($hasLongKey)
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+#end
#if($!{entityLombokModel})
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -46,7 +76,7 @@ import java.io.Serial;
@Schema(description = #if ("$!{table.comment}"=="")"$!{entity}对象"#else"$!{table.comment}"#end)
#end
#if($!{superEntityClass})
-public class $!{entity} extends $!{superEntityClass}#if($!{activeRecord})<$!{entity}>#end {
+public class $!{entity} extends #if($useTenantEntity)TenantEntity#{else}$!{superEntityClass}#end#if($!{activeRecord})<$!{entity}>#end {
#elseif($!{activeRecord})
@Accessors(chain = true)
public class $!{entity} extends Model<$!{entity}> {
@@ -59,7 +89,7 @@ public class $!{entity} implements Serializable {
## ---------- BEGIN 字段循环遍历 ----------
#foreach($field in $!{table.fields})
-#if($!{field.name}!=$!{tenantColumn})
+#if($!{field.name} != $!{tenantColumn} || !$useTenantEntity)
#if($!{field.keyFlag})
#set($keyPropertyName=$!{field.propertyName})
#end
@@ -80,6 +110,9 @@ public class $!{entity} implements Serializable {
#elseif($!{field.convert})
@TableId("$!{field.name}")
#end
+#if($!{field.propertyType} == "Long")
+ @JsonSerialize(using = ToStringSerializer.class)
+#end
## 普通字段
#elseif($!{field.fill})
## ----- 存在字段填充设置 -----
diff --git a/blade-starter-develop/src/main/resources/templates/api/mapper.java.vm b/blade-starter-develop/src/main/resources/templates/api/mapper.java.vm
index d3f99f9..7b1b89c 100644
--- a/blade-starter-develop/src/main/resources/templates/api/mapper.java.vm
+++ b/blade-starter-develop/src/main/resources/templates/api/mapper.java.vm
@@ -15,11 +15,12 @@
*/
package $!{package.Mapper};
+import $!{superMapperClassPackage};
+import com.baomidou.mybatisplus.core.metadata.IPage;
import $!{package.Entity}.$!{entity};
#set($voPackage=$package.Entity.replace("entity","vo"))
import $!{voPackage}.$!{entity}VO;
-import $!{superMapperClassPackage};
-import com.baomidou.mybatisplus.core.metadata.IPage;
+
import java.util.List;
/**
diff --git a/blade-starter-develop/src/main/resources/templates/api/mapper.xml.vm b/blade-starter-develop/src/main/resources/templates/api/mapper.xml.vm
index e2fae2a..0a6d82b 100644
--- a/blade-starter-develop/src/main/resources/templates/api/mapper.xml.vm
+++ b/blade-starter-develop/src/main/resources/templates/api/mapper.xml.vm
@@ -1,3 +1,13 @@
+#set($hasTenant = false)
+#foreach($field in $!{table.fields})
+#if($!{field.name} == $!{tenantColumn})
+#set($hasTenant = true)
+#end
+#end
+#set($useTenantEntity = false)
+#if($hasTenant && "$!superEntityClass" == "BaseEntity")
+#set($useTenantEntity = true)
+#end