From 3d93b3d58731a9ab85196ec14f9d5b0f8efad561 Mon Sep 17 00:00:00 2001 From: smallchill Date: Fri, 7 Aug 2026 16:24:46 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E4=BB=A3=E7=A0=81=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=99=A8=E5=89=8D=E7=AB=AF=E6=A8=A1=E6=9D=BF=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=20TS=20+=20Composition=20API=20=E4=BA=A7=E5=87=BA?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=BC=BA=E5=AE=9E=E4=BD=93=E7=A7=9F=E6=88=B7?= =?UTF-8?q?=E4=B8=8E=E4=B8=BB=E9=94=AE=E5=BA=8F=E5=88=97=E5=8C=96=E5=88=A4?= =?UTF-8?q?=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../springblade/develop/CodeGenerator.java | 2 +- .../develop/support/BladeCodeGenerator.java | 40 +++++++----- .../templates/api/controller.java.vm | 35 ++++------ .../resources/templates/api/entity.java.vm | 37 ++++++++++- .../resources/templates/api/mapper.java.vm | 5 +- .../resources/templates/api/mapper.xml.vm | 16 ++++- .../resources/templates/api/service.java.vm | 4 +- .../templates/api/serviceImpl.java.vm | 4 +- .../resources/templates/api/wrapper.java.vm | 7 +- .../templates/saber/{api.js.vm => api.ts.vm} | 0 .../resources/templates/saber/crud.vue.vm | 64 ++++++++++++------- doc/guide/blade-tool-5.0升级适配指南.md | 4 +- 12 files changed, 141 insertions(+), 77 deletions(-) rename blade-starter-develop/src/main/resources/templates/saber/{api.js.vm => api.ts.vm} (100%) 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 @@ -19,7 +29,7 @@ #end #foreach($field in $!{table.fields}) -#if(!$!{field.keyFlag} && $!{field.name} != $!{tenantColumn})##生成普通字段 +#if(!$!{field.keyFlag} && ($!{field.name} != $!{tenantColumn} || !$useTenantEntity))##生成普通字段 #end #end @@ -28,7 +38,11 @@ #end diff --git a/blade-starter-develop/src/main/resources/templates/api/service.java.vm b/blade-starter-develop/src/main/resources/templates/api/service.java.vm index c7784e4..05ee01b 100644 --- a/blade-starter-develop/src/main/resources/templates/api/service.java.vm +++ b/blade-starter-develop/src/main/resources/templates/api/service.java.vm @@ -15,11 +15,11 @@ */ package $!{package.Service}; +import com.baomidou.mybatisplus.core.metadata.IPage; +import $!{superServiceClassPackage}; import $!{package.Entity}.$!{entity}; #set($voPackage=$package.Entity.replace("entity","vo")) import $!{voPackage}.$!{entity}VO; -import $!{superServiceClassPackage}; -import com.baomidou.mybatisplus.core.metadata.IPage; /** * $!{table.comment} 服务类 diff --git a/blade-starter-develop/src/main/resources/templates/api/serviceImpl.java.vm b/blade-starter-develop/src/main/resources/templates/api/serviceImpl.java.vm index 1c557d6..ec8f37b 100644 --- a/blade-starter-develop/src/main/resources/templates/api/serviceImpl.java.vm +++ b/blade-starter-develop/src/main/resources/templates/api/serviceImpl.java.vm @@ -15,14 +15,14 @@ */ package $!{package.ServiceImpl}; +import com.baomidou.mybatisplus.core.metadata.IPage; +import $!{superServiceImplClassPackage}; import $!{package.Entity}.$!{entity}; #set($voPackage=$package.Entity.replace("entity","vo")) import $!{voPackage}.$!{entity}VO; import $!{package.Mapper}.$!{table.mapperName}; import $!{package.Service}.$!{table.serviceName}; -import $!{superServiceImplClassPackage}; import org.springframework.stereotype.Service; -import com.baomidou.mybatisplus.core.metadata.IPage; /** * $!{table.comment} 服务实现类 diff --git a/blade-starter-develop/src/main/resources/templates/api/wrapper.java.vm b/blade-starter-develop/src/main/resources/templates/api/wrapper.java.vm index dc8422d..ad0090d 100644 --- a/blade-starter-develop/src/main/resources/templates/api/wrapper.java.vm +++ b/blade-starter-develop/src/main/resources/templates/api/wrapper.java.vm @@ -16,7 +16,6 @@ #set($wrapperPackage=$package.Entity.replace("pojo.entity","wrapper")) package $!{wrapperPackage}; -import lombok.AllArgsConstructor; import org.springblade.core.mp.support.BaseEntityWrapper; import org.springblade.core.tool.utils.BeanUtil; import $!{package.Entity}.$!{entity}; @@ -29,11 +28,11 @@ import $!{voPackage}.$!{entity}VO; * @author $!{author} * @since $!{date} */ -public class $!{entity}Wrapper extends BaseEntityWrapper<$!{entity}, $!{entity}VO> { +public class $!{entity}Wrapper extends BaseEntityWrapper<$!{entity}, $!{entity}VO> { public static $!{entity}Wrapper build() { - return new $!{entity}Wrapper(); - } + return new $!{entity}Wrapper(); + } @Override public $!{entity}VO entityVO($!{entity} $!{table.entityPath}) { diff --git a/blade-starter-develop/src/main/resources/templates/saber/api.js.vm b/blade-starter-develop/src/main/resources/templates/saber/api.ts.vm similarity index 100% rename from blade-starter-develop/src/main/resources/templates/saber/api.js.vm rename to blade-starter-develop/src/main/resources/templates/saber/api.ts.vm diff --git a/blade-starter-develop/src/main/resources/templates/saber/crud.vue.vm b/blade-starter-develop/src/main/resources/templates/saber/crud.vue.vm index 2d99b1c..ca36701 100644 --- a/blade-starter-develop/src/main/resources/templates/saber/crud.vue.vm +++ b/blade-starter-develop/src/main/resources/templates/saber/crud.vue.vm @@ -1,14 +1,23 @@ +#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