mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-03-25 06:44:33 +08:00
refactor 重构代码生成工具链,复用代码模板以提升代码生成性能
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -22,7 +22,7 @@
|
|||||||
<springdoc.version>3.0.2</springdoc.version>
|
<springdoc.version>3.0.2</springdoc.version>
|
||||||
<therapi-javadoc.version>0.15.0</therapi-javadoc.version>
|
<therapi-javadoc.version>0.15.0</therapi-javadoc.version>
|
||||||
<fesod.version>2.0.1-incubating</fesod.version>
|
<fesod.version>2.0.1-incubating</fesod.version>
|
||||||
<velocity.version>2.3</velocity.version>
|
<velocity.version>2.4.1</velocity.version>
|
||||||
<satoken.version>1.45.0</satoken.version>
|
<satoken.version>1.45.0</satoken.version>
|
||||||
<mybatis-plus.version>3.5.16</mybatis-plus.version>
|
<mybatis-plus.version>3.5.16</mybatis-plus.version>
|
||||||
<mybatis-plus-join.version>1.5.6</mybatis-plus-join.version>
|
<mybatis-plus-join.version>1.5.6</mybatis-plus-join.version>
|
||||||
|
|||||||
@@ -1,93 +1,45 @@
|
|||||||
package org.dromara.generator.config;
|
package org.dromara.generator.config;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import cn.hutool.extra.template.TemplateConfig;
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.dromara.common.core.factory.YmlPropertySourceFactory;
|
||||||
|
import org.dromara.generator.config.properties.GenProperties;
|
||||||
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.context.annotation.PropertySource;
|
import org.springframework.context.annotation.PropertySource;
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取代码生成相关配置
|
* 读取代码生成相关配置
|
||||||
*
|
*
|
||||||
* @author ruoyi
|
* @author ruoyi
|
||||||
*/
|
*/
|
||||||
@Component
|
@AutoConfiguration
|
||||||
@ConfigurationProperties(prefix = "gen")
|
@EnableConfigurationProperties(GenProperties.class)
|
||||||
@PropertySource(value = {"classpath:generator.yml"}, encoding = "UTF-8")
|
@PropertySource(value = "classpath:generator.yml", factory = YmlPropertySourceFactory.class)
|
||||||
public class GenConfig {
|
public class GenConfig {
|
||||||
|
|
||||||
/**
|
private static GenProperties genProperties;
|
||||||
* 作者
|
|
||||||
*/
|
|
||||||
public static String author;
|
|
||||||
|
|
||||||
/**
|
public GenConfig(GenProperties genProperties) {
|
||||||
* 生成包路径
|
GenConfig.genProperties = genProperties;
|
||||||
*/
|
|
||||||
public static String packageName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 自动去除表前缀,默认是false
|
|
||||||
*/
|
|
||||||
public static boolean autoRemovePre;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 表前缀(类名不会包含表前缀)
|
|
||||||
*/
|
|
||||||
public static String tablePrefix;
|
|
||||||
|
|
||||||
public static String getAuthor() {
|
|
||||||
return author;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public static String getAuthor() {
|
||||||
* 注入代码生成作者配置。
|
return genProperties.getAuthor();
|
||||||
*
|
|
||||||
* @param author 作者名称
|
|
||||||
*/
|
|
||||||
@Value("${author}")
|
|
||||||
public void setAuthor(String author) {
|
|
||||||
GenConfig.author = author;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getPackageName() {
|
public static String getPackageName() {
|
||||||
return packageName;
|
return genProperties.getPackageName();
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 注入代码生成基础包名配置。
|
|
||||||
*
|
|
||||||
* @param packageName 基础包名
|
|
||||||
*/
|
|
||||||
@Value("${packageName}")
|
|
||||||
public void setPackageName(String packageName) {
|
|
||||||
GenConfig.packageName = packageName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean getAutoRemovePre() {
|
public static boolean getAutoRemovePre() {
|
||||||
return autoRemovePre;
|
return genProperties.isAutoRemovePre();
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 注入是否自动移除表前缀配置。
|
|
||||||
*
|
|
||||||
* @param autoRemovePre 是否自动移除表前缀
|
|
||||||
*/
|
|
||||||
@Value("${autoRemovePre}")
|
|
||||||
public void setAutoRemovePre(boolean autoRemovePre) {
|
|
||||||
GenConfig.autoRemovePre = autoRemovePre;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getTablePrefix() {
|
public static String getTablePrefix() {
|
||||||
return tablePrefix;
|
return genProperties.getTablePrefix();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public static TemplateConfig getTemplateConfig() {
|
||||||
* 注入代码生成表前缀配置。
|
return genProperties.getTemplateConfig();
|
||||||
*
|
|
||||||
* @param tablePrefix 表前缀字符串
|
|
||||||
*/
|
|
||||||
@Value("${tablePrefix}")
|
|
||||||
public void setTablePrefix(String tablePrefix) {
|
|
||||||
GenConfig.tablePrefix = tablePrefix;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package org.dromara.generator.config.properties;
|
||||||
|
|
||||||
|
import cn.hutool.extra.template.TemplateConfig;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 代码生成配置属性
|
||||||
|
*
|
||||||
|
* @author 秋辞未寒
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ConfigurationProperties(prefix = "gen")
|
||||||
|
public class GenProperties {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 作者
|
||||||
|
*/
|
||||||
|
private String author;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成包路径
|
||||||
|
*/
|
||||||
|
private String packageName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自动去除表前缀,默认是false
|
||||||
|
*/
|
||||||
|
private boolean autoRemovePre = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表前缀(类名不会包含表前缀)
|
||||||
|
*/
|
||||||
|
private String tablePrefix;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 模板配置
|
||||||
|
*/
|
||||||
|
private TemplateConfig templateConfig = new TemplateConfig(StandardCharsets.UTF_8, null, TemplateConfig.ResourceMode.CLASSPATH);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
package org.dromara.generator.constant;
|
package org.dromara.generator.constant;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 代码生成通用常量
|
* 代码生成通用常量
|
||||||
*
|
*
|
||||||
@@ -187,4 +191,48 @@ public interface GenConstants {
|
|||||||
* 必填标识,对应前端表单规则中的必填字段配置。
|
* 必填标识,对应前端表单规则中的必填字段配置。
|
||||||
*/
|
*/
|
||||||
String REQUIRE = "1";
|
String REQUIRE = "1";
|
||||||
|
|
||||||
|
// 后端源码模板
|
||||||
|
String JAVA_DOMAIN_TEMPLATE_PATH = "vm/java/domain.java.vm";
|
||||||
|
String JAVA_VO_TEMPLATE_PATH = "vm/java/vo.java.vm";
|
||||||
|
String JAVA_BO_TEMPLATE_PATH = "vm/java/bo.java.vm";
|
||||||
|
String JAVA_MAPPER_TEMPLATE_PATH = "vm/java/mapper.java.vm";
|
||||||
|
String JAVA_SERVICE_TEMPLATE_PATH = "vm/java/service.java.vm";
|
||||||
|
String JAVA_SERVICE_IMPL_TEMPLATE_PATH = "vm/java/serviceImpl.java.vm";
|
||||||
|
String JAVA_CONTROLLER_TEMPLATE_PATH = "vm/java/controller.java.vm";
|
||||||
|
// MyBatis MapperXML 模板
|
||||||
|
String XML_MAPPER_TEMPLATE_PATH = "vm/xml/mapper.xml.vm";
|
||||||
|
// 前端接口源码模板
|
||||||
|
String TS_API_TEMPLATE_PATH = "vm/ts/api.ts.vm";
|
||||||
|
String TS_TYPES_TEMPLATE_PATH = "vm/ts/types.ts.vm";
|
||||||
|
// 前端页面源码模板
|
||||||
|
String VUE_INDEX_TEMPLATE_PATH = "vm/vue/index.vue.vm";
|
||||||
|
String VUE_INDEX_TREE_TEMPLATE_PATH = "vm/vue/index-tree.vue.vm";
|
||||||
|
// 数据库SQL模板
|
||||||
|
String SQL_ORACLE_TEMPLATE_PATH = "vm/sql/oracle.sql.vm";
|
||||||
|
String SQL_POSTGRES_TEMPLATE_PATH = "vm/sql/postgres.sql.vm";
|
||||||
|
String SQL_SQLSERVER_TEMPLATE_PATH = "vm/sql/sqlserver.sql.vm";
|
||||||
|
String SQL_MYSQL_TEMPLATE_PATH = "vm/sql/mysql.sql.vm";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有模板路径集合
|
||||||
|
*/
|
||||||
|
Set<String> TEMPLATE_PATHS = CollUtil.newHashSet(
|
||||||
|
JAVA_DOMAIN_TEMPLATE_PATH
|
||||||
|
, JAVA_VO_TEMPLATE_PATH
|
||||||
|
, JAVA_BO_TEMPLATE_PATH
|
||||||
|
, JAVA_MAPPER_TEMPLATE_PATH
|
||||||
|
, JAVA_SERVICE_TEMPLATE_PATH
|
||||||
|
, JAVA_SERVICE_IMPL_TEMPLATE_PATH
|
||||||
|
, JAVA_CONTROLLER_TEMPLATE_PATH
|
||||||
|
, XML_MAPPER_TEMPLATE_PATH
|
||||||
|
, TS_API_TEMPLATE_PATH
|
||||||
|
, TS_TYPES_TEMPLATE_PATH
|
||||||
|
, VUE_INDEX_TEMPLATE_PATH
|
||||||
|
, VUE_INDEX_TREE_TEMPLATE_PATH
|
||||||
|
, SQL_ORACLE_TEMPLATE_PATH
|
||||||
|
, SQL_POSTGRES_TEMPLATE_PATH
|
||||||
|
, SQL_SQLSERVER_TEMPLATE_PATH
|
||||||
|
, SQL_MYSQL_TEMPLATE_PATH
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,10 +15,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.anyline.metadata.Column;
|
import org.anyline.metadata.Column;
|
||||||
import org.anyline.metadata.Table;
|
import org.anyline.metadata.Table;
|
||||||
import org.anyline.proxy.ServiceProxy;
|
import org.anyline.proxy.ServiceProxy;
|
||||||
import org.apache.velocity.Template;
|
import org.dromara.common.core.domain.PageResult;
|
||||||
import org.apache.velocity.VelocityContext;
|
|
||||||
import org.apache.velocity.app.Velocity;
|
|
||||||
import org.dromara.common.core.constant.Constants;
|
|
||||||
import org.dromara.common.core.exception.ServiceException;
|
import org.dromara.common.core.exception.ServiceException;
|
||||||
import org.dromara.common.core.utils.SpringUtils;
|
import org.dromara.common.core.utils.SpringUtils;
|
||||||
import org.dromara.common.core.utils.StreamUtils;
|
import org.dromara.common.core.utils.StreamUtils;
|
||||||
@@ -26,7 +23,6 @@ import org.dromara.common.core.utils.StringUtils;
|
|||||||
import org.dromara.common.core.utils.file.FileUtils;
|
import org.dromara.common.core.utils.file.FileUtils;
|
||||||
import org.dromara.common.json.utils.JsonUtils;
|
import org.dromara.common.json.utils.JsonUtils;
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
import org.dromara.common.core.domain.PageResult;
|
|
||||||
import org.dromara.common.mybatis.utils.IdGeneratorUtil;
|
import org.dromara.common.mybatis.utils.IdGeneratorUtil;
|
||||||
import org.dromara.generator.constant.GenConstants;
|
import org.dromara.generator.constant.GenConstants;
|
||||||
import org.dromara.generator.domain.GenTable;
|
import org.dromara.generator.domain.GenTable;
|
||||||
@@ -34,15 +30,14 @@ import org.dromara.generator.domain.GenTableColumn;
|
|||||||
import org.dromara.generator.mapper.GenTableColumnMapper;
|
import org.dromara.generator.mapper.GenTableColumnMapper;
|
||||||
import org.dromara.generator.mapper.GenTableMapper;
|
import org.dromara.generator.mapper.GenTableMapper;
|
||||||
import org.dromara.generator.util.GenUtils;
|
import org.dromara.generator.util.GenUtils;
|
||||||
import org.dromara.generator.util.VelocityInitializer;
|
import org.dromara.generator.util.TemplateEngineUtils;
|
||||||
import org.dromara.generator.util.VelocityUtils;
|
import org.dromara.generator.util.template.PathNamedTemplate;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.StringWriter;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
@@ -346,18 +341,14 @@ public class GenTableServiceImpl implements IGenTableService {
|
|||||||
table.setMenuIds(menuIds);
|
table.setMenuIds(menuIds);
|
||||||
// 设置主键列信息
|
// 设置主键列信息
|
||||||
setPkColumn(table);
|
setPkColumn(table);
|
||||||
VelocityInitializer.initVelocity();
|
|
||||||
|
|
||||||
VelocityContext context = VelocityUtils.prepareContext(table);
|
|
||||||
|
|
||||||
|
Dict context = TemplateEngineUtils.buildContext(table);
|
||||||
// 获取模板列表
|
// 获取模板列表
|
||||||
List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
|
List<PathNamedTemplate> templates = TemplateEngineUtils.getTemplateList(table.getTplCategory());
|
||||||
for (String template : templates) {
|
for (PathNamedTemplate template : templates) {
|
||||||
// 渲染模板
|
// 渲染模板
|
||||||
StringWriter sw = new StringWriter();
|
String render = template.render(context);
|
||||||
Template tpl = Velocity.getTemplate(template, Constants.UTF8);
|
dataMap.put(template.getPathName(), render);
|
||||||
tpl.merge(context, sw);
|
|
||||||
dataMap.put(template, sw.toString());
|
|
||||||
}
|
}
|
||||||
return dataMap;
|
return dataMap;
|
||||||
}
|
}
|
||||||
@@ -389,21 +380,18 @@ public class GenTableServiceImpl implements IGenTableService {
|
|||||||
// 设置主键列信息
|
// 设置主键列信息
|
||||||
setPkColumn(table);
|
setPkColumn(table);
|
||||||
|
|
||||||
VelocityInitializer.initVelocity();
|
Dict context = TemplateEngineUtils.buildContext(table);
|
||||||
|
|
||||||
VelocityContext context = VelocityUtils.prepareContext(table);
|
|
||||||
|
|
||||||
// 获取模板列表
|
// 获取模板列表
|
||||||
List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
|
List<PathNamedTemplate> templates = TemplateEngineUtils.getTemplateList(table.getTplCategory());
|
||||||
for (String template : templates) {
|
for (PathNamedTemplate template : templates) {
|
||||||
if (!StringUtils.containsAny(template, "sql.vm", "api.ts.vm", "types.ts.vm", "index.vue.vm", "index-tree.vue.vm")) {
|
String pathName = template.getPathName();
|
||||||
|
// 渲染模板
|
||||||
|
if (!StringUtils.containsAny(pathName, "sql.vm", "api.ts.vm", "types.ts.vm", "index.vue.vm", "index-tree.vue.vm")) {
|
||||||
// 渲染模板
|
// 渲染模板
|
||||||
StringWriter sw = new StringWriter();
|
|
||||||
Template tpl = Velocity.getTemplate(template, Constants.UTF8);
|
|
||||||
tpl.merge(context, sw);
|
|
||||||
try {
|
try {
|
||||||
String path = getGenPath(table, template);
|
String render = template.render(context);
|
||||||
FileUtils.writeUtf8String(sw.toString(), path);
|
String path = getGenPath(table, pathName);
|
||||||
|
FileUtils.writeUtf8String(render, path);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new ServiceException("渲染模板失败,表名:" + table.getTableName());
|
throw new ServiceException("渲染模板失败,表名:" + table.getTableName());
|
||||||
}
|
}
|
||||||
@@ -496,22 +484,17 @@ public class GenTableServiceImpl implements IGenTableService {
|
|||||||
// 设置主键列信息
|
// 设置主键列信息
|
||||||
setPkColumn(table);
|
setPkColumn(table);
|
||||||
|
|
||||||
VelocityInitializer.initVelocity();
|
Dict context = TemplateEngineUtils.buildContext(table);
|
||||||
|
|
||||||
VelocityContext context = VelocityUtils.prepareContext(table);
|
|
||||||
|
|
||||||
// 获取模板列表
|
// 获取模板列表
|
||||||
List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
|
List<PathNamedTemplate> templates = TemplateEngineUtils.getTemplateList(table.getTplCategory());
|
||||||
for (String template : templates) {
|
for (PathNamedTemplate template : templates) {
|
||||||
|
String pathName = template.getPathName();
|
||||||
// 渲染模板
|
// 渲染模板
|
||||||
StringWriter sw = new StringWriter();
|
|
||||||
Template tpl = Velocity.getTemplate(template, Constants.UTF8);
|
|
||||||
tpl.merge(context, sw);
|
|
||||||
try {
|
try {
|
||||||
|
String render = template.render(context);
|
||||||
// 添加到zip
|
// 添加到zip
|
||||||
zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table)));
|
zip.putNextEntry(new ZipEntry(TemplateEngineUtils.getFileName(pathName, table)));
|
||||||
IoUtil.write(zip, StandardCharsets.UTF_8, false, sw.toString());
|
IoUtil.write(zip, StandardCharsets.UTF_8, false, render);
|
||||||
IoUtil.close(sw);
|
|
||||||
zip.flush();
|
zip.flush();
|
||||||
zip.closeEntry();
|
zip.closeEntry();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@@ -628,9 +611,9 @@ public class GenTableServiceImpl implements IGenTableService {
|
|||||||
public static String getGenPath(GenTable table, String template) {
|
public static String getGenPath(GenTable table, String template) {
|
||||||
String genPath = table.getGenPath();
|
String genPath = table.getGenPath();
|
||||||
if (StringUtils.equals(genPath, "/")) {
|
if (StringUtils.equals(genPath, "/")) {
|
||||||
return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table);
|
return System.getProperty("user.dir") + File.separator + "src" + File.separator + TemplateEngineUtils.getFileName(template, table);
|
||||||
}
|
}
|
||||||
return genPath + File.separator + VelocityUtils.getFileName(template, table);
|
return genPath + File.separator + TemplateEngineUtils.getFileName(template, table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,27 +3,33 @@ package org.dromara.generator.util;
|
|||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.convert.Convert;
|
||||||
import cn.hutool.core.lang.Dict;
|
import cn.hutool.core.lang.Dict;
|
||||||
import org.dromara.common.mybatis.enums.DataBaseType;
|
import cn.hutool.extra.template.TemplateEngine;
|
||||||
import org.dromara.generator.constant.GenConstants;
|
import cn.hutool.extra.template.TemplateUtil;
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.common.core.utils.DateUtils;
|
import org.dromara.common.core.utils.DateUtils;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.json.utils.JsonUtils;
|
import org.dromara.common.json.utils.JsonUtils;
|
||||||
|
import org.dromara.common.mybatis.enums.DataBaseType;
|
||||||
import org.dromara.common.mybatis.helper.DataBaseHelper;
|
import org.dromara.common.mybatis.helper.DataBaseHelper;
|
||||||
|
import org.dromara.generator.config.GenConfig;
|
||||||
|
import org.dromara.generator.constant.GenConstants;
|
||||||
import org.dromara.generator.domain.GenTable;
|
import org.dromara.generator.domain.GenTable;
|
||||||
import org.dromara.generator.domain.GenTableColumn;
|
import org.dromara.generator.domain.GenTableColumn;
|
||||||
import lombok.AccessLevel;
|
import org.dromara.generator.util.template.PathNamedTemplate;
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import org.apache.velocity.VelocityContext;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
import static org.dromara.generator.constant.GenConstants.TS_TYPES_TEMPLATE_PATH;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 模板处理工具类
|
* 模板引擎工具
|
||||||
*
|
|
||||||
* @author ruoyi
|
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||||
public class VelocityUtils {
|
public class TemplateEngineUtils {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 项目空间路径
|
* 项目空间路径
|
||||||
@@ -40,56 +46,73 @@ public class VelocityUtils {
|
|||||||
*/
|
*/
|
||||||
private static final String DEFAULT_PARENT_MENU_ID = "3";
|
private static final String DEFAULT_PARENT_MENU_ID = "3";
|
||||||
|
|
||||||
|
// 模板引擎
|
||||||
|
private static final TemplateEngine TEMPLATE_ENGINE;
|
||||||
|
private static final Map<String, PathNamedTemplate> TEMPLATE_MAPPER;
|
||||||
|
|
||||||
|
static {
|
||||||
|
// 模板引擎初始化
|
||||||
|
TEMPLATE_ENGINE = TemplateUtil.createEngine(GenConfig.getTemplateConfig());
|
||||||
|
TEMPLATE_MAPPER = PathNamedTemplate.form(TEMPLATE_ENGINE, GenConstants.TEMPLATE_PATHS);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置模板变量信息
|
* 构建模板上下文
|
||||||
|
*
|
||||||
|
* @param contextInit 模板上下文初始化函数
|
||||||
|
* @return 模板上下文
|
||||||
|
*/
|
||||||
|
public static Dict buildContext(Consumer<Dict> contextInit) {
|
||||||
|
Dict context = new Dict();
|
||||||
|
contextInit.accept(context);
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建模板上下文
|
||||||
*
|
*
|
||||||
* @param genTable 代码生成业务表对象
|
* @param genTable 代码生成业务表对象
|
||||||
* @return 初始化后的 Velocity 上下文
|
* @return 模板上下文
|
||||||
*/
|
*/
|
||||||
public static VelocityContext prepareContext(GenTable genTable) {
|
public static Dict buildContext(GenTable genTable) {
|
||||||
|
// 构建上下文
|
||||||
|
Dict context = new Dict();
|
||||||
String moduleName = genTable.getModuleName();
|
String moduleName = genTable.getModuleName();
|
||||||
String businessName = genTable.getBusinessName();
|
String businessName = genTable.getBusinessName();
|
||||||
String packageName = genTable.getPackageName();
|
String packageName = genTable.getPackageName();
|
||||||
String tplCategory = genTable.getTplCategory();
|
String tplCategory = genTable.getTplCategory();
|
||||||
String functionName = genTable.getFunctionName();
|
String functionName = genTable.getFunctionName();
|
||||||
|
|
||||||
VelocityContext velocityContext = new VelocityContext();
|
context.put("tplCategory", genTable.getTplCategory());
|
||||||
velocityContext.put("tplCategory", genTable.getTplCategory());
|
context.put("tableName", genTable.getTableName());
|
||||||
velocityContext.put("tableName", genTable.getTableName());
|
context.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】");
|
||||||
velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】");
|
context.put("ClassName", genTable.getClassName());
|
||||||
velocityContext.put("ClassName", genTable.getClassName());
|
context.put("className", StringUtils.uncapitalize(genTable.getClassName()));
|
||||||
velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName()));
|
context.put("moduleName", moduleName);
|
||||||
velocityContext.put("moduleName", genTable.getModuleName());
|
context.put("BusinessName", StringUtils.capitalize(businessName));
|
||||||
velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName()));
|
context.put("businessName", businessName);
|
||||||
velocityContext.put("businessName", genTable.getBusinessName());
|
context.put("basePackage", getPackagePrefix(packageName));
|
||||||
velocityContext.put("basePackage", getPackagePrefix(packageName));
|
context.put("packageName", packageName);
|
||||||
velocityContext.put("packageName", packageName);
|
context.put("author", genTable.getFunctionAuthor());
|
||||||
velocityContext.put("author", genTable.getFunctionAuthor());
|
context.put("datetime", DateUtils.getDate());
|
||||||
velocityContext.put("datetime", DateUtils.getDate());
|
context.put("pkColumn", genTable.getPkColumn());
|
||||||
velocityContext.put("pkColumn", genTable.getPkColumn());
|
context.put("importList", getImportList(genTable));
|
||||||
velocityContext.put("importList", getImportList(genTable));
|
context.put("permissionPrefix", getPermissionPrefix(moduleName, businessName));
|
||||||
velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName));
|
context.put("columns", genTable.getColumns());
|
||||||
velocityContext.put("columns", genTable.getColumns());
|
context.put("table", genTable);
|
||||||
velocityContext.put("table", genTable);
|
context.put("dicts", getDicts(genTable));
|
||||||
velocityContext.put("dicts", getDicts(genTable));
|
// 向模板上下文写入菜单相关变量
|
||||||
setMenuVelocityContext(velocityContext, genTable);
|
|
||||||
if (GenConstants.TPL_TREE.equals(tplCategory)) {
|
|
||||||
setTreeVelocityContext(velocityContext, genTable);
|
|
||||||
}
|
|
||||||
return velocityContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 向模板上下文写入菜单相关变量。
|
|
||||||
*
|
|
||||||
* @param context 模板上下文
|
|
||||||
* @param genTable 代码生成业务表对象
|
|
||||||
*/
|
|
||||||
public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) {
|
|
||||||
String options = genTable.getOptions();
|
String options = genTable.getOptions();
|
||||||
Dict paramsObj = JsonUtils.parseMap(options);
|
Dict paramsObj = JsonUtils.parseMap(options);
|
||||||
String parentMenuId = getParentMenuId(paramsObj);
|
String parentMenuId = getParentMenuId(paramsObj);
|
||||||
context.put("parentMenuId", parentMenuId);
|
context.put("parentMenuId", parentMenuId);
|
||||||
|
|
||||||
|
// 向树形模板上下文写入树字段相关变量
|
||||||
|
if (GenConstants.TPL_TREE.equals(tplCategory)) {
|
||||||
|
setTreeContext(context, genTable);
|
||||||
|
}
|
||||||
|
|
||||||
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -98,10 +121,10 @@ public class VelocityUtils {
|
|||||||
* @param context 模板上下文
|
* @param context 模板上下文
|
||||||
* @param genTable 代码生成业务表对象
|
* @param genTable 代码生成业务表对象
|
||||||
*/
|
*/
|
||||||
public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) {
|
public static void setTreeContext(Dict context, GenTable genTable) {
|
||||||
String options = genTable.getOptions();
|
String options = genTable.getOptions();
|
||||||
Dict paramsObj = JsonUtils.parseMap(options);
|
Dict paramsObj = JsonUtils.parseMap(options);
|
||||||
String treeCode = getTreecode(paramsObj);
|
String treeCode = getTreeCode(paramsObj);
|
||||||
String treeParentCode = getTreeParentCode(paramsObj);
|
String treeParentCode = getTreeParentCode(paramsObj);
|
||||||
String treeName = getTreeName(paramsObj);
|
String treeName = getTreeName(paramsObj);
|
||||||
|
|
||||||
@@ -122,32 +145,38 @@ public class VelocityUtils {
|
|||||||
*
|
*
|
||||||
* @return 模板列表
|
* @return 模板列表
|
||||||
*/
|
*/
|
||||||
public static List<String> getTemplateList(String tplCategory) {
|
public static List<PathNamedTemplate> getTemplateList(String tplCategory) {
|
||||||
List<String> templates = new ArrayList<>();
|
List<PathNamedTemplate> templates = new ArrayList<>();
|
||||||
templates.add("vm/java/domain.java.vm");
|
// 后端源码模板
|
||||||
templates.add("vm/java/vo.java.vm");
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.JAVA_DOMAIN_TEMPLATE_PATH));
|
||||||
templates.add("vm/java/bo.java.vm");
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.JAVA_VO_TEMPLATE_PATH));
|
||||||
templates.add("vm/java/mapper.java.vm");
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.JAVA_BO_TEMPLATE_PATH));
|
||||||
templates.add("vm/java/service.java.vm");
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.JAVA_MAPPER_TEMPLATE_PATH));
|
||||||
templates.add("vm/java/serviceImpl.java.vm");
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.JAVA_SERVICE_TEMPLATE_PATH));
|
||||||
templates.add("vm/java/controller.java.vm");
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.JAVA_SERVICE_IMPL_TEMPLATE_PATH));
|
||||||
templates.add("vm/xml/mapper.xml.vm");
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.JAVA_CONTROLLER_TEMPLATE_PATH));
|
||||||
|
// MyBatis MapperXML 模板
|
||||||
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.XML_MAPPER_TEMPLATE_PATH));
|
||||||
|
// 前端接口源码模板
|
||||||
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.TS_API_TEMPLATE_PATH));
|
||||||
|
templates.add(TEMPLATE_MAPPER.get(TS_TYPES_TEMPLATE_PATH));
|
||||||
|
// 数据库模板
|
||||||
DataBaseType dataBaseType = DataBaseHelper.getDataBaseType();
|
DataBaseType dataBaseType = DataBaseHelper.getDataBaseType();
|
||||||
if (dataBaseType.isOracle()) {
|
if (dataBaseType.isOracle()) {
|
||||||
templates.add("vm/sql/oracle/sql.vm");
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.SQL_ORACLE_TEMPLATE_PATH));
|
||||||
} else if (dataBaseType.isPostgreSql()) {
|
} else if (dataBaseType.isPostgreSql()) {
|
||||||
templates.add("vm/sql/postgres/sql.vm");
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.SQL_POSTGRES_TEMPLATE_PATH));
|
||||||
} else if (dataBaseType.isSqlServer()) {
|
} else if (dataBaseType.isSqlServer()) {
|
||||||
templates.add("vm/sql/sqlserver/sql.vm");
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.SQL_SQLSERVER_TEMPLATE_PATH));
|
||||||
} else {
|
} else {
|
||||||
templates.add("vm/sql/sql.vm");
|
// 默认使用MySQL模板
|
||||||
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.SQL_MYSQL_TEMPLATE_PATH));
|
||||||
}
|
}
|
||||||
templates.add("vm/ts/api.ts.vm");
|
// 前端页面源码模板
|
||||||
templates.add("vm/ts/types.ts.vm");
|
|
||||||
if (GenConstants.TPL_CRUD.equals(tplCategory)) {
|
if (GenConstants.TPL_CRUD.equals(tplCategory)) {
|
||||||
templates.add("vm/vue/index.vue.vm");
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.VUE_INDEX_TEMPLATE_PATH));
|
||||||
} else if (GenConstants.TPL_TREE.equals(tplCategory)) {
|
} else if (GenConstants.TPL_TREE.equals(tplCategory)) {
|
||||||
templates.add("vm/vue/index-tree.vue.vm");
|
templates.add(TEMPLATE_MAPPER.get(GenConstants.VUE_INDEX_TREE_TEMPLATE_PATH));
|
||||||
}
|
}
|
||||||
return templates;
|
return templates;
|
||||||
}
|
}
|
||||||
@@ -174,7 +203,8 @@ public class VelocityUtils {
|
|||||||
String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/");
|
String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/");
|
||||||
String mybatisPath = MYBATIS_PATH + "/" + moduleName;
|
String mybatisPath = MYBATIS_PATH + "/" + moduleName;
|
||||||
String vuePath = "vue";
|
String vuePath = "vue";
|
||||||
|
// templatePath
|
||||||
|
// genFilePathFormat
|
||||||
if (template.contains("domain.java.vm")) {
|
if (template.contains("domain.java.vm")) {
|
||||||
fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
|
fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
|
||||||
}
|
}
|
||||||
@@ -306,7 +336,7 @@ public class VelocityUtils {
|
|||||||
* @param paramsObj 生成其他选项
|
* @param paramsObj 生成其他选项
|
||||||
* @return 树编码
|
* @return 树编码
|
||||||
*/
|
*/
|
||||||
public static String getTreecode(Map<String, Object> paramsObj) {
|
public static String getTreeCode(Map<String, Object> paramsObj) {
|
||||||
if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) {
|
if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_CODE)) {
|
||||||
return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE)));
|
return StringUtils.toCamelCase(Convert.toStr(paramsObj.get(GenConstants.TREE_CODE)));
|
||||||
}
|
}
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
package org.dromara.generator.util;
|
|
||||||
|
|
||||||
import org.dromara.common.core.constant.Constants;
|
|
||||||
import lombok.AccessLevel;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import org.apache.velocity.app.Velocity;
|
|
||||||
|
|
||||||
import java.util.Properties;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* VelocityEngine工厂
|
|
||||||
*
|
|
||||||
* @author ruoyi
|
|
||||||
*/
|
|
||||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
|
||||||
public class VelocityInitializer {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化vm方法
|
|
||||||
*
|
|
||||||
* @throws RuntimeException 初始化 Velocity 引擎失败时抛出
|
|
||||||
*/
|
|
||||||
public static void initVelocity() {
|
|
||||||
Properties p = new Properties();
|
|
||||||
try {
|
|
||||||
// 加载classpath目录下的vm文件
|
|
||||||
p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
|
|
||||||
// 定义字符集
|
|
||||||
p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8);
|
|
||||||
// 初始化Velocity引擎,指定配置Properties
|
|
||||||
Velocity.init(p);
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package org.dromara.generator.util.template;
|
||||||
|
|
||||||
|
import cn.hutool.extra.template.Template;
|
||||||
|
import cn.hutool.extra.template.TemplateEngine;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 基于路径命名的模板委托实现
|
||||||
|
*
|
||||||
|
* @author 秋辞未寒
|
||||||
|
*/
|
||||||
|
public class PathNamedTemplate implements Template {
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final String pathName;
|
||||||
|
|
||||||
|
private final Template delegate;
|
||||||
|
|
||||||
|
private PathNamedTemplate(String pathName, Template delegate) {
|
||||||
|
this.pathName = pathName;
|
||||||
|
this.delegate = delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(Map<?, ?> bindingMap, Writer writer) {
|
||||||
|
delegate.render(bindingMap, writer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(Map<?, ?> bindingMap, OutputStream out) {
|
||||||
|
delegate.render(bindingMap, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(Map<?, ?> bindingMap, File file) {
|
||||||
|
delegate.render(bindingMap, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String render(Map<?, ?> bindingMap) {
|
||||||
|
return delegate.render(bindingMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PathNamedTemplate form(String pathName, Template delegate) {
|
||||||
|
return new PathNamedTemplate(pathName, delegate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PathNamedTemplate form(TemplateEngine templateEngine,String pathName) {
|
||||||
|
return new PathNamedTemplate(pathName,templateEngine.getTemplate(pathName));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, PathNamedTemplate> form(TemplateEngine templateEngine, Set<String> pathNames) {
|
||||||
|
Map<String, PathNamedTemplate> result = new HashMap<>();
|
||||||
|
for (String pathName : pathNames) {
|
||||||
|
PathNamedTemplate pathNamedTemplate = form(templateEngine, pathName);
|
||||||
|
result.put(pathName, pathNamedTemplate);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
org.dromara.generator.config.GenConfig
|
||||||
@@ -8,3 +8,9 @@ gen:
|
|||||||
autoRemovePre: false
|
autoRemovePre: false
|
||||||
# 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
|
# 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
|
||||||
tablePrefix: sys_
|
tablePrefix: sys_
|
||||||
|
# 模板配置
|
||||||
|
templateConfig:
|
||||||
|
# 模版加载模式
|
||||||
|
resourceMode: CLASSPATH
|
||||||
|
# 模板加载路径
|
||||||
|
# path: vm
|
||||||
|
|||||||
Reference in New Issue
Block a user