mirror of
https://gitee.com/log4j/pig.git
synced 2024-12-23 05:00:23 +08:00
commit
f7fa513e06
@ -1,20 +1,4 @@
|
||||
/*
|
||||
* Copyright (c) 2020 pig4cloud Authors. All Rights Reserved.
|
||||
*
|
||||
* 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.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,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.pig4cloud.pig.codegen.support;
|
||||
package com.pig4cloud.pig.codegen.service;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
@ -27,8 +11,6 @@ import com.pig4cloud.pig.codegen.entity.TableEntity;
|
||||
import com.pig4cloud.pig.common.core.constant.CommonConstants;
|
||||
import com.pig4cloud.pig.common.core.exception.CheckedException;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.configuration.Configuration;
|
||||
import org.apache.commons.configuration.ConfigurationException;
|
||||
import org.apache.commons.configuration.PropertiesConfiguration;
|
||||
@ -41,7 +23,6 @@ import org.apache.velocity.tools.generic.DateTool;
|
||||
import org.apache.velocity.tools.generic.MathTool;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.StringWriter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
@ -49,49 +30,80 @@ import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
/**
|
||||
* 代码生成器 工具类 copy
|
||||
* elunez/eladmin/blob/master/eladmin-generator/src/main/java/me/zhengjie/utils/GenUtil.java
|
||||
* 生成代码抽象
|
||||
*
|
||||
* @author Zheng Jie
|
||||
* @author lengleng
|
||||
* @date 2020-03-13
|
||||
* @author Fxz
|
||||
* @date 2022/7/21 02:24
|
||||
*/
|
||||
@Slf4j
|
||||
@UtilityClass
|
||||
public class CodeGenKits {
|
||||
public interface GenCodeService {
|
||||
|
||||
public final String CRUD_PREFIX = "export const tableOption =";
|
||||
default Map<String, String> gen(GenConfig genConfig, Map<String, String> table, List<Map<String, String>> columns,
|
||||
ZipOutputStream zip, GenFormConf formConf) {
|
||||
// 构建表实体
|
||||
TableEntity tableEntity = buildTableEntity(genConfig, table);
|
||||
|
||||
private final String ENTITY_JAVA_VM = "Entity.java.vm";
|
||||
// 处理列相关
|
||||
buildColumnEntity(tableEntity, columns);
|
||||
|
||||
private final String MAPPER_JAVA_VM = "Mapper.java.vm";
|
||||
// 模板入参
|
||||
Map<String, Object> tempModel = buildTempModel(tableEntity, genConfig);
|
||||
|
||||
private final String SERVICE_JAVA_VM = "Service.java.vm";
|
||||
|
||||
private final String SERVICE_IMPL_JAVA_VM = "ServiceImpl.java.vm";
|
||||
|
||||
private final String CONTROLLER_JAVA_VM = "Controller.java.vm";
|
||||
|
||||
private final String MAPPER_XML_VM = "Mapper.xml.vm";
|
||||
|
||||
private final String MENU_SQL_VM = "menu.sql.vm";
|
||||
|
||||
private final String AVUE_INDEX_VUE_VM = "avue/index.vue.vm";
|
||||
|
||||
private final String ELE_INDEX_VUE_VM = "element/index.vue.vm";
|
||||
|
||||
private final String ELE_ADD_UPDATE_VUE_VM = "element/form.vue.vm";
|
||||
|
||||
private final String AVUE_API_JS_VM = "avue/api.js.vm";
|
||||
|
||||
private final String AVUE_CRUD_JS_VM = "avue/crud.js.vm";
|
||||
return renderData(genConfig, zip, tableEntity, tempModel, formConf);
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置
|
||||
* @param config
|
||||
* @return
|
||||
* 渲染数据
|
||||
* @param genConfig 用户输入相关
|
||||
* @param zip 输出zip流
|
||||
* @param tableEntity 表格实体
|
||||
* @param map 参数集合
|
||||
* @param formConf 表单设计
|
||||
*/
|
||||
private List<String> getTemplates(GenConfig config) {
|
||||
@SneakyThrows
|
||||
default Map<String, String> renderData(GenConfig genConfig, ZipOutputStream zip, TableEntity tableEntity,
|
||||
Map<String, Object> map, GenFormConf formConf) {
|
||||
// 设置velocity资源加载器
|
||||
Properties prop = new Properties();
|
||||
prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
|
||||
Velocity.init(prop);
|
||||
|
||||
VelocityContext context = new VelocityContext(map);
|
||||
// 函数库
|
||||
context.put("math", new MathTool());
|
||||
context.put("dateTool", new DateTool());
|
||||
|
||||
// 获取模板列表
|
||||
List<String> templates = getTemplates(genConfig);
|
||||
Map<String, String> resultMap = new LinkedHashMap<>(8);
|
||||
|
||||
for (String template : templates) {
|
||||
// 渲染模板
|
||||
StringWriter sw = new StringWriter();
|
||||
Template tpl = Velocity.getTemplate(template, CharsetUtil.UTF_8);
|
||||
tpl.merge(context, sw);
|
||||
|
||||
// 添加到zip
|
||||
String fileName = getFileName(template, tableEntity.getCaseClassName(), map.get("package").toString(),
|
||||
map.get("moduleName").toString());
|
||||
|
||||
if (zip != null) {
|
||||
zip.putNextEntry(new ZipEntry(Objects.requireNonNull(fileName)));
|
||||
IoUtil.write(zip, StandardCharsets.UTF_8, false, sw.toString());
|
||||
IoUtil.close(sw);
|
||||
zip.closeEntry();
|
||||
}
|
||||
resultMap.put(template, sw.toString());
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 注入支持的模板列表
|
||||
* @param config 用户输入
|
||||
* @return ListString
|
||||
*/
|
||||
default List<String> getTemplates(GenConfig config) {
|
||||
List<String> templates = new ArrayList<>();
|
||||
templates.add("template/Entity.java.vm");
|
||||
templates.add("template/Mapper.java.vm");
|
||||
@ -100,55 +112,103 @@ public class CodeGenKits {
|
||||
templates.add("template/ServiceImpl.java.vm");
|
||||
templates.add("template/Controller.java.vm");
|
||||
templates.add("template/menu.sql.vm");
|
||||
templates.add("template/avue/api.js.vm");
|
||||
|
||||
if (StyleTypeEnum.AVUE.getStyle().equals(config.getStyle())) {
|
||||
templates.add("template/avue/index.vue.vm");
|
||||
templates.add("template/avue/crud.js.vm");
|
||||
}
|
||||
else {
|
||||
templates.add("template/element/index.vue.vm");
|
||||
templates.add("template/element/form.vue.vm");
|
||||
}
|
||||
|
||||
return templates;
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成代码
|
||||
* @return
|
||||
* 获取文件名
|
||||
*/
|
||||
@SneakyThrows
|
||||
public Map<String, String> generatorCode(GenConfig genConfig, Map<String, String> table,
|
||||
List<Map<String, String>> columns, ZipOutputStream zip, GenFormConf formConf) {
|
||||
// 配置信息
|
||||
Configuration config = getConfig();
|
||||
boolean hasBigDecimal = false;
|
||||
// 表信息
|
||||
TableEntity tableEntity = new TableEntity();
|
||||
tableEntity.setTableName(table.get("tableName"));
|
||||
default String getFileName(String template, String className, String packageName, String moduleName) {
|
||||
String packagePath = CommonConstants.BACK_END_PROJECT + File.separator + "src" + File.separator + "main"
|
||||
+ File.separator + "java" + File.separator;
|
||||
|
||||
if (StringUtils.isNotBlank(packageName)) {
|
||||
packagePath += packageName.replace(".", File.separator) + File.separator + moduleName + File.separator;
|
||||
}
|
||||
|
||||
if (template.contains("Entity.java.vm")) {
|
||||
return packagePath + "entity" + File.separator + className + ".java";
|
||||
}
|
||||
|
||||
if (template.contains("Mapper.java.vm")) {
|
||||
return packagePath + "mapper" + File.separator + className + "Mapper.java";
|
||||
}
|
||||
|
||||
if (template.contains("Service.java.vm")) {
|
||||
return packagePath + "service" + File.separator + className + "Service.java";
|
||||
}
|
||||
|
||||
if (template.contains("ServiceImpl.java.vm")) {
|
||||
return packagePath + "service" + File.separator + "impl" + File.separator + className + "ServiceImpl.java";
|
||||
}
|
||||
|
||||
if (template.contains("Controller.java.vm")) {
|
||||
return packagePath + "controller" + File.separator + className + "Controller.java";
|
||||
}
|
||||
|
||||
if (template.contains("Mapper.xml.vm")) {
|
||||
return CommonConstants.BACK_END_PROJECT + File.separator + "src" + File.separator + "main" + File.separator
|
||||
+ "resources" + File.separator + "mapper" + File.separator + className + "Mapper.xml";
|
||||
}
|
||||
|
||||
if (template.contains("menu.sql.vm")) {
|
||||
return className.toLowerCase() + "_menu.sql";
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
default Map<String, Object> buildTempModel(TableEntity tableEntity, GenConfig genConfig) {
|
||||
// 封装模板数据
|
||||
Map<String, Object> map = new HashMap<>(16);
|
||||
map.put("tableName", tableEntity.getTableName());
|
||||
map.put("pk", tableEntity.getPk());
|
||||
map.put("className", tableEntity.getCaseClassName());
|
||||
map.put("classname", tableEntity.getLowerClassName());
|
||||
map.put("pathName", tableEntity.getLowerClassName().toLowerCase());
|
||||
map.put("columns", tableEntity.getColumns());
|
||||
map.put("datetime", DateUtil.now());
|
||||
|
||||
if (StrUtil.isNotBlank(genConfig.getComments())) {
|
||||
tableEntity.setComments(genConfig.getComments());
|
||||
map.put("comments", genConfig.getComments());
|
||||
}
|
||||
else {
|
||||
tableEntity.setComments(table.get("tableComment"));
|
||||
map.put("comments", tableEntity.getComments());
|
||||
}
|
||||
|
||||
String tablePrefix;
|
||||
if (StrUtil.isNotBlank(genConfig.getTablePrefix())) {
|
||||
tablePrefix = genConfig.getTablePrefix();
|
||||
if (StrUtil.isNotBlank(genConfig.getAuthor())) {
|
||||
map.put("author", genConfig.getAuthor());
|
||||
}
|
||||
else {
|
||||
tablePrefix = config.getString("tablePrefix");
|
||||
map.put("author", getConfig().getString("author"));
|
||||
}
|
||||
|
||||
// 表名转换成Java类名
|
||||
String className = tableToJava(tableEntity.getTableName(), tablePrefix);
|
||||
tableEntity.setCaseClassName(className);
|
||||
tableEntity.setLowerClassName(StringUtils.uncapitalize(className));
|
||||
if (StrUtil.isNotBlank(genConfig.getModuleName())) {
|
||||
map.put("moduleName", genConfig.getModuleName());
|
||||
}
|
||||
else {
|
||||
map.put("moduleName", getConfig().getString("moduleName"));
|
||||
}
|
||||
|
||||
if (StrUtil.isNotBlank(genConfig.getPackageName())) {
|
||||
map.put("package", genConfig.getPackageName());
|
||||
map.put("mainPath", genConfig.getPackageName());
|
||||
}
|
||||
else {
|
||||
map.put("package", getConfig().getString("package"));
|
||||
map.put("mainPath", getConfig().getString("mainPath"));
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建 ColumnEntity
|
||||
* @param columns 列元信息
|
||||
*/
|
||||
default void buildColumnEntity(TableEntity tableEntity, List<Map<String, String>> columns) {
|
||||
// 获取需要在swagger文档中隐藏的属性字段
|
||||
List<Object> hiddenColumns = config.getList("hiddenColumn");
|
||||
List<Object> hiddenColumns = getConfig().getList("hiddenColumn");
|
||||
// 列信息
|
||||
List<ColumnEntity> columnList = new ArrayList<>();
|
||||
for (Map<String, String> column : columns) {
|
||||
@ -181,11 +241,9 @@ public class CodeGenKits {
|
||||
|
||||
// 列的数据类型,转换成Java类型
|
||||
String dataType = StrUtil.subBefore(columnEntity.getDataType(), "(", false);
|
||||
String attrType = config.getString(dataType, "unknowType");
|
||||
String attrType = getConfig().getString(dataType, "unknowType");
|
||||
columnEntity.setAttrType(attrType);
|
||||
if (!hasBigDecimal && "BigDecimal".equals(attrType)) {
|
||||
hasBigDecimal = true;
|
||||
}
|
||||
|
||||
// 是否主键
|
||||
if ("PRI".equalsIgnoreCase(column.get("columnKey")) && tableEntity.getPk() == null) {
|
||||
tableEntity.setPk(columnEntity);
|
||||
@ -199,138 +257,45 @@ public class CodeGenKits {
|
||||
if (tableEntity.getPk() == null) {
|
||||
tableEntity.setPk(tableEntity.getColumns().get(0));
|
||||
}
|
||||
}
|
||||
|
||||
// 封装模板数据
|
||||
Map<String, Object> map = new HashMap<>(16);
|
||||
map.put("tableName", tableEntity.getTableName());
|
||||
map.put("pk", tableEntity.getPk());
|
||||
map.put("className", tableEntity.getCaseClassName());
|
||||
map.put("classname", tableEntity.getLowerClassName());
|
||||
map.put("pathName", tableEntity.getLowerClassName().toLowerCase());
|
||||
map.put("columns", tableEntity.getColumns());
|
||||
map.put("hasBigDecimal", hasBigDecimal);
|
||||
map.put("datetime", DateUtil.now());
|
||||
/**
|
||||
* 构建 TableEntity
|
||||
* @param genConfig 用户输入相关
|
||||
* @param table 表元信息
|
||||
* @return TableEntity
|
||||
*/
|
||||
default TableEntity buildTableEntity(GenConfig genConfig, Map<String, String> table) {
|
||||
// 表信息
|
||||
TableEntity tableEntity = new TableEntity();
|
||||
tableEntity.setTableName(table.get("tableName"));
|
||||
|
||||
if (StrUtil.isNotBlank(genConfig.getComments())) {
|
||||
map.put("comments", genConfig.getComments());
|
||||
tableEntity.setComments(genConfig.getComments());
|
||||
}
|
||||
else {
|
||||
map.put("comments", tableEntity.getComments());
|
||||
tableEntity.setComments(table.get("tableComment"));
|
||||
}
|
||||
|
||||
if (StrUtil.isNotBlank(genConfig.getAuthor())) {
|
||||
map.put("author", genConfig.getAuthor());
|
||||
String tablePrefix;
|
||||
if (StrUtil.isNotBlank(genConfig.getTablePrefix())) {
|
||||
tablePrefix = genConfig.getTablePrefix();
|
||||
}
|
||||
else {
|
||||
map.put("author", config.getString("author"));
|
||||
tablePrefix = getConfig().getString("tablePrefix");
|
||||
}
|
||||
// 表名转换成Java类名
|
||||
String className = tableToJava(tableEntity.getTableName(), tablePrefix);
|
||||
tableEntity.setCaseClassName(className);
|
||||
tableEntity.setLowerClassName(StringUtils.uncapitalize(className));
|
||||
|
||||
if (StrUtil.isNotBlank(genConfig.getModuleName())) {
|
||||
map.put("moduleName", genConfig.getModuleName());
|
||||
}
|
||||
else {
|
||||
map.put("moduleName", config.getString("moduleName"));
|
||||
}
|
||||
|
||||
if (StrUtil.isNotBlank(genConfig.getPackageName())) {
|
||||
map.put("package", genConfig.getPackageName());
|
||||
map.put("mainPath", genConfig.getPackageName());
|
||||
}
|
||||
else {
|
||||
map.put("package", config.getString("package"));
|
||||
map.put("mainPath", config.getString("mainPath"));
|
||||
}
|
||||
|
||||
// 渲染数据
|
||||
return renderData(genConfig, zip, formConf, tableEntity, map);
|
||||
}
|
||||
|
||||
/**
|
||||
* 渲染数据
|
||||
* @param genConfig 配置信息
|
||||
* @param zip 流 (为空,直接返回Map)
|
||||
* @param formConf 表单信息
|
||||
* @param tableEntity 表基本信息
|
||||
* @param map 模板参数
|
||||
* @return map key-filename value-contents
|
||||
* @throws IOException
|
||||
*/
|
||||
private Map<String, String> renderData(GenConfig genConfig, ZipOutputStream zip, GenFormConf formConf,
|
||||
TableEntity tableEntity, Map<String, Object> map) throws IOException {
|
||||
// 设置velocity资源加载器
|
||||
Properties prop = new Properties();
|
||||
prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
|
||||
Velocity.init(prop);
|
||||
|
||||
VelocityContext context = new VelocityContext(map);
|
||||
// 函数库
|
||||
context.put("math", new MathTool());
|
||||
context.put("dateTool", new DateTool());
|
||||
|
||||
// 获取模板列表
|
||||
List<String> templates = getTemplates(genConfig);
|
||||
Map<String, String> resultMap = new HashMap<>(8);
|
||||
|
||||
for (String template : templates) {
|
||||
// 如果是crud
|
||||
if (template.contains(AVUE_CRUD_JS_VM) && formConf != null) {
|
||||
|
||||
String fileName = getFileName(template, tableEntity.getCaseClassName(), map.get("package").toString(),
|
||||
map.get("moduleName").toString());
|
||||
String contents = CRUD_PREFIX + formConf.getFormInfo();
|
||||
|
||||
if (zip != null) {
|
||||
zip.putNextEntry(new ZipEntry(Objects.requireNonNull(fileName)));
|
||||
IoUtil.write(zip, StandardCharsets.UTF_8, false, contents);
|
||||
zip.closeEntry();
|
||||
}
|
||||
|
||||
resultMap.put(template, contents);
|
||||
continue;
|
||||
}
|
||||
|
||||
// 渲染模板
|
||||
StringWriter sw = new StringWriter();
|
||||
Template tpl = Velocity.getTemplate(template, CharsetUtil.UTF_8);
|
||||
tpl.merge(context, sw);
|
||||
|
||||
// 添加到zip
|
||||
String fileName = getFileName(template, tableEntity.getCaseClassName(), map.get("package").toString(),
|
||||
map.get("moduleName").toString());
|
||||
|
||||
if (zip != null) {
|
||||
zip.putNextEntry(new ZipEntry(Objects.requireNonNull(fileName)));
|
||||
IoUtil.write(zip, StandardCharsets.UTF_8, false, sw.toString());
|
||||
IoUtil.close(sw);
|
||||
zip.closeEntry();
|
||||
}
|
||||
resultMap.put(template, sw.toString());
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 列名转换成Java属性名
|
||||
*/
|
||||
public String columnToJava(String columnName) {
|
||||
return WordUtils.capitalizeFully(columnName, new char[] { '_' }).replace("_", "");
|
||||
}
|
||||
|
||||
/**
|
||||
* 表名转换成Java类名
|
||||
*/
|
||||
private String tableToJava(String tableName, String tablePrefix) {
|
||||
if (StringUtils.isNotBlank(tablePrefix)) {
|
||||
tableName = tableName.replaceFirst(tablePrefix, "");
|
||||
}
|
||||
return columnToJava(tableName);
|
||||
return tableEntity;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取配置信息
|
||||
*/
|
||||
public Configuration getConfig() {
|
||||
default Configuration getConfig() {
|
||||
try {
|
||||
return new PropertiesConfiguration("generator.properties");
|
||||
}
|
||||
@ -340,68 +305,20 @@ public class CodeGenKits {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文件名
|
||||
* 表名转换成Java类名
|
||||
*/
|
||||
private String getFileName(String template, String className, String packageName, String moduleName) {
|
||||
String packagePath = CommonConstants.BACK_END_PROJECT + File.separator + "src" + File.separator + "main"
|
||||
+ File.separator + "java" + File.separator;
|
||||
|
||||
if (StringUtils.isNotBlank(packageName)) {
|
||||
packagePath += packageName.replace(".", File.separator) + File.separator + moduleName + File.separator;
|
||||
default String tableToJava(String tableName, String tablePrefix) {
|
||||
if (StringUtils.isNotBlank(tablePrefix)) {
|
||||
tableName = tableName.replaceFirst(tablePrefix, "");
|
||||
}
|
||||
return columnToJava(tableName);
|
||||
}
|
||||
|
||||
if (template.contains(ENTITY_JAVA_VM)) {
|
||||
return packagePath + "entity" + File.separator + className + ".java";
|
||||
}
|
||||
|
||||
if (template.contains(MAPPER_JAVA_VM)) {
|
||||
return packagePath + "mapper" + File.separator + className + "Mapper.java";
|
||||
}
|
||||
|
||||
if (template.contains(SERVICE_JAVA_VM)) {
|
||||
return packagePath + "service" + File.separator + className + "Service.java";
|
||||
}
|
||||
|
||||
if (template.contains(SERVICE_IMPL_JAVA_VM)) {
|
||||
return packagePath + "service" + File.separator + "impl" + File.separator + className + "ServiceImpl.java";
|
||||
}
|
||||
|
||||
if (template.contains(CONTROLLER_JAVA_VM)) {
|
||||
return packagePath + "controller" + File.separator + className + "Controller.java";
|
||||
}
|
||||
|
||||
if (template.contains(MAPPER_XML_VM)) {
|
||||
return CommonConstants.BACK_END_PROJECT + File.separator + "src" + File.separator + "main" + File.separator
|
||||
+ "resources" + File.separator + "mapper" + File.separator + className + "Mapper.xml";
|
||||
}
|
||||
|
||||
if (template.contains(MENU_SQL_VM)) {
|
||||
return className.toLowerCase() + "_menu.sql";
|
||||
}
|
||||
|
||||
if (template.contains(AVUE_INDEX_VUE_VM) || template.contains(ELE_INDEX_VUE_VM)) {
|
||||
return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "views"
|
||||
+ File.separator + moduleName + File.separator + className.toLowerCase() + File.separator
|
||||
+ "index.vue";
|
||||
}
|
||||
|
||||
if (template.contains(AVUE_API_JS_VM)) {
|
||||
return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "api" + File.separator
|
||||
+ className.toLowerCase() + ".js";
|
||||
}
|
||||
|
||||
if (template.contains(AVUE_CRUD_JS_VM)) {
|
||||
return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "const"
|
||||
+ File.separator + "crud" + File.separator + className.toLowerCase() + ".js";
|
||||
}
|
||||
|
||||
if (template.contains(ELE_ADD_UPDATE_VUE_VM)) {
|
||||
return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "views"
|
||||
+ File.separator + moduleName + File.separator + className.toLowerCase() + File.separator
|
||||
+ className.toLowerCase() + "-form.vue";
|
||||
}
|
||||
|
||||
return null;
|
||||
/**
|
||||
* 列名转换成Java属性名
|
||||
*/
|
||||
default String columnToJava(String columnName) {
|
||||
return WordUtils.capitalizeFully(columnName, new char[] { '_' }).replace("_", "");
|
||||
}
|
||||
|
||||
}
|
@ -23,8 +23,8 @@ import com.pig4cloud.pig.codegen.entity.ColumnEntity;
|
||||
import com.pig4cloud.pig.codegen.entity.GenFormConf;
|
||||
import com.pig4cloud.pig.codegen.mapper.GenFormConfMapper;
|
||||
import com.pig4cloud.pig.codegen.mapper.GeneratorMapper;
|
||||
import com.pig4cloud.pig.codegen.service.GenCodeService;
|
||||
import com.pig4cloud.pig.codegen.service.GenFormConfService;
|
||||
import com.pig4cloud.pig.codegen.support.CodeGenKits;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.SneakyThrows;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
@ -52,6 +52,8 @@ public class GenFormConfServiceImpl extends ServiceImpl<GenFormConfMapper, GenFo
|
||||
|
||||
private final GeneratorMapper generatorMapper;
|
||||
|
||||
private final GenCodeService avue;
|
||||
|
||||
/**
|
||||
* 1. 根据数据源、表名称,查询已配置表单信息 2. 不存在调用模板生成
|
||||
* @param dsName 数据源ID
|
||||
@ -80,13 +82,13 @@ public class GenFormConfServiceImpl extends ServiceImpl<GenFormConfMapper, GenFo
|
||||
for (Map<String, String> column : columns) {
|
||||
ColumnEntity columnEntity = new ColumnEntity();
|
||||
columnEntity.setComments(column.get("columnComment"));
|
||||
columnEntity.setLowerAttrName(StringUtils.uncapitalize(CodeGenKits.columnToJava(column.get("columnName"))));
|
||||
columnEntity.setLowerAttrName(StringUtils.uncapitalize(avue.columnToJava(column.get("columnName"))));
|
||||
columnList.add(columnEntity);
|
||||
}
|
||||
context.put("columns", columnList);
|
||||
StringWriter writer = new StringWriter();
|
||||
template.merge(context, writer);
|
||||
return StrUtil.trim(StrUtil.removePrefix(writer.toString(), CodeGenKits.CRUD_PREFIX));
|
||||
return StrUtil.trim(StrUtil.removePrefix(writer.toString(), "export const tableOption ="));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,8 +28,9 @@ import com.pig4cloud.pig.codegen.entity.GenConfig;
|
||||
import com.pig4cloud.pig.codegen.entity.GenFormConf;
|
||||
import com.pig4cloud.pig.codegen.mapper.GenFormConfMapper;
|
||||
import com.pig4cloud.pig.codegen.mapper.GeneratorMapper;
|
||||
import com.pig4cloud.pig.codegen.service.GenCodeService;
|
||||
import com.pig4cloud.pig.codegen.service.GeneratorService;
|
||||
import com.pig4cloud.pig.codegen.support.CodeGenKits;
|
||||
import com.pig4cloud.pig.codegen.support.StyleTypeEnum;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@ -52,6 +53,8 @@ public class GeneratorServiceImpl implements GeneratorService {
|
||||
|
||||
private final GenFormConfMapper genFormConfMapper;
|
||||
|
||||
private final Map<String, GenCodeService> genCodeServiceMap;
|
||||
|
||||
/**
|
||||
* 分页查询表
|
||||
* @param tableName 查询条件
|
||||
@ -77,17 +80,22 @@ public class GeneratorServiceImpl implements GeneratorService {
|
||||
.eq(GenFormConf::getTableName, genConfig.getTableName()).orderByDesc(GenFormConf::getCreateTime));
|
||||
|
||||
String tableNames = genConfig.getTableName();
|
||||
String dsName = genConfig.getDsName();
|
||||
|
||||
// 获取实现
|
||||
GenCodeService genCodeService = genCodeServiceMap.get(StyleTypeEnum.getDecs(genConfig.getStyle()));
|
||||
|
||||
for (String tableName : StrUtil.split(tableNames, StrUtil.DASHED)) {
|
||||
// 查询表信息
|
||||
Map<String, String> table = generatorMapper.queryTable(tableName, genConfig.getDsName());
|
||||
Map<String, String> table = generatorMapper.queryTable(tableName, dsName);
|
||||
// 查询列信息
|
||||
List<Map<String, String>> columns = generatorMapper.queryColumns(tableName, genConfig.getDsName());
|
||||
List<Map<String, String>> columns = generatorMapper.queryColumns(tableName, dsName);
|
||||
// 生成代码
|
||||
if (CollUtil.isNotEmpty(formConfList)) {
|
||||
return CodeGenKits.generatorCode(genConfig, table, columns, null, formConfList.get(0));
|
||||
return genCodeService.gen(genConfig, table, columns, null, formConfList.get(0));
|
||||
}
|
||||
else {
|
||||
return CodeGenKits.generatorCode(genConfig, table, columns, null, null);
|
||||
return genCodeService.gen(genConfig, table, columns, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
@ -109,17 +117,21 @@ public class GeneratorServiceImpl implements GeneratorService {
|
||||
ZipOutputStream zip = new ZipOutputStream(outputStream);
|
||||
|
||||
String tableNames = genConfig.getTableName();
|
||||
String dsName = genConfig.getDsName();
|
||||
|
||||
GenCodeService genCodeService = genCodeServiceMap.get(StyleTypeEnum.getDecs(genConfig.getStyle()));
|
||||
|
||||
for (String tableName : StrUtil.split(tableNames, StrUtil.DASHED)) {
|
||||
// 查询表信息
|
||||
Map<String, String> table = generatorMapper.queryTable(tableName, genConfig.getDsName());
|
||||
Map<String, String> table = generatorMapper.queryTable(tableName, dsName);
|
||||
// 查询列信息
|
||||
List<Map<String, String>> columns = generatorMapper.queryColumns(tableName, genConfig.getDsName());
|
||||
List<Map<String, String>> columns = generatorMapper.queryColumns(tableName, dsName);
|
||||
// 生成代码
|
||||
if (CollUtil.isNotEmpty(formConfList)) {
|
||||
CodeGenKits.generatorCode(genConfig, table, columns, zip, formConfList.get(0));
|
||||
genCodeService.gen(genConfig, table, columns, zip, formConfList.get(0));
|
||||
}
|
||||
else {
|
||||
CodeGenKits.generatorCode(genConfig, table, columns, zip, null);
|
||||
genCodeService.gen(genConfig, table, columns, zip, null);
|
||||
}
|
||||
}
|
||||
IoUtil.close(zip);
|
||||
|
@ -0,0 +1,106 @@
|
||||
package com.pig4cloud.pig.codegen.service.impl.temp;
|
||||
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
import com.pig4cloud.pig.codegen.entity.GenConfig;
|
||||
import com.pig4cloud.pig.codegen.entity.GenFormConf;
|
||||
import com.pig4cloud.pig.codegen.entity.TableEntity;
|
||||
import com.pig4cloud.pig.codegen.service.GenCodeService;
|
||||
import com.pig4cloud.pig.common.core.constant.CommonConstants;
|
||||
import lombok.SneakyThrows;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
/**
|
||||
* @author Fxz
|
||||
* @date 2022/7/21 02:45
|
||||
*/
|
||||
@Service("avue")
|
||||
public class AvueGenCodeServiceImpl implements GenCodeService {
|
||||
|
||||
public final String CRUD_PREFIX = "export const tableOption =";
|
||||
|
||||
/**
|
||||
* 注入支持的模板列表
|
||||
* @param config 用户输入
|
||||
* @return ListString
|
||||
*/
|
||||
@Override
|
||||
public List<String> getTemplates(GenConfig config) {
|
||||
List<String> templates = GenCodeService.super.getTemplates(config);
|
||||
templates.add("template/avue/index.vue.vm");
|
||||
templates.add("template/avue/crud.js.vm");
|
||||
templates.add("template/avue/api.js.vm");
|
||||
return templates;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文件名
|
||||
* @param template
|
||||
* @param className
|
||||
* @param packageName
|
||||
* @param moduleName
|
||||
*/
|
||||
@Override
|
||||
public String getFileName(String template, String className, String packageName, String moduleName) {
|
||||
if (template.contains("avue/index.vue.vm")) {
|
||||
return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "views"
|
||||
+ File.separator + moduleName + File.separator + className.toLowerCase() + File.separator
|
||||
+ "index.vue";
|
||||
}
|
||||
|
||||
if (template.contains("avue/api.js.vm")) {
|
||||
return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "api" + File.separator
|
||||
+ className.toLowerCase() + ".js";
|
||||
}
|
||||
|
||||
if (template.contains("avue/crud.js.vm")) {
|
||||
return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "const"
|
||||
+ File.separator + "crud" + File.separator + className.toLowerCase() + ".js";
|
||||
}
|
||||
|
||||
return GenCodeService.super.getFileName(template, className, packageName, moduleName);
|
||||
}
|
||||
|
||||
/**
|
||||
* 渲染数据
|
||||
* @param genConfig 用户输入相关
|
||||
* @param zip 输出zip流
|
||||
* @param tableEntity 表格实体
|
||||
* @param map 参数集合
|
||||
* @param formConf 表单设计
|
||||
* @return
|
||||
*/
|
||||
@SneakyThrows
|
||||
public Map<String, String> renderData(GenConfig genConfig, ZipOutputStream zip, TableEntity tableEntity,
|
||||
Map<String, Object> map, GenFormConf formConf) {
|
||||
|
||||
Map<String, String> resultMap = new HashMap<>();
|
||||
|
||||
if (Objects.nonNull(formConf)) {
|
||||
// 存在 curd 存在设计好的JSON 则使用Json 覆盖
|
||||
String crudTempName = "template/avue/crud.js.vm";
|
||||
String fileName = getFileName(crudTempName, tableEntity.getCaseClassName(), map.get("package").toString(),
|
||||
map.get("moduleName").toString());
|
||||
String contents = CRUD_PREFIX + formConf.getFormInfo();
|
||||
|
||||
if (zip != null) {
|
||||
zip.putNextEntry(new ZipEntry(Objects.requireNonNull(fileName)));
|
||||
IoUtil.write(zip, StandardCharsets.UTF_8, false, contents);
|
||||
zip.closeEntry();
|
||||
}
|
||||
resultMap.putAll(GenCodeService.super.renderData(genConfig, zip, tableEntity, map, formConf));
|
||||
resultMap.put(crudTempName, contents);
|
||||
return resultMap;
|
||||
}
|
||||
return GenCodeService.super.renderData(genConfig, zip, tableEntity, map, formConf);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
package com.pig4cloud.pig.codegen.service.impl.temp;
|
||||
|
||||
import com.pig4cloud.pig.codegen.entity.GenConfig;
|
||||
import com.pig4cloud.pig.codegen.service.GenCodeService;
|
||||
import com.pig4cloud.pig.common.core.constant.CommonConstants;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Fxz
|
||||
* @date 2022/7/21 02:46
|
||||
*/
|
||||
@Service("element")
|
||||
public class EleGenCodeServiceImpl implements GenCodeService {
|
||||
|
||||
/**
|
||||
* 注入支持的模板列表
|
||||
* @param config 用户输入
|
||||
* @return ListString
|
||||
*/
|
||||
@Override
|
||||
public List<String> getTemplates(GenConfig config) {
|
||||
List<String> templates = GenCodeService.super.getTemplates(config);
|
||||
templates.add("template/element/index.vue.vm");
|
||||
templates.add("template/element/form.vue.vm");
|
||||
templates.add("template/avue/api.js.vm");
|
||||
return templates;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文件名
|
||||
* @param template
|
||||
* @param className
|
||||
* @param packageName
|
||||
* @param moduleName
|
||||
*/
|
||||
@Override
|
||||
public String getFileName(String template, String className, String packageName, String moduleName) {
|
||||
if (template.contains("element/index.vue.vm")) {
|
||||
return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "views"
|
||||
+ File.separator + moduleName + File.separator + className.toLowerCase() + File.separator
|
||||
+ "index.vue";
|
||||
}
|
||||
|
||||
if (template.contains("element/form.vue.vm")) {
|
||||
return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "views"
|
||||
+ File.separator + moduleName + File.separator + className.toLowerCase() + File.separator
|
||||
+ className.toLowerCase() + "-form.vue";
|
||||
}
|
||||
|
||||
if (template.contains("avue/api.js.vm")) {
|
||||
return CommonConstants.FRONT_END_PROJECT + File.separator + "src" + File.separator + "api" + File.separator
|
||||
+ className.toLowerCase() + ".js";
|
||||
}
|
||||
|
||||
return GenCodeService.super.getFileName(template, className, packageName, moduleName);
|
||||
}
|
||||
|
||||
}
|
@ -3,6 +3,8 @@ package com.pig4cloud.pig.codegen.support;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* @author lengleng
|
||||
* @date 2021/7/31
|
||||
@ -16,12 +18,12 @@ public enum StyleTypeEnum {
|
||||
/**
|
||||
* 前端类型-avue 风格
|
||||
*/
|
||||
AVUE("0", "avue 风格"),
|
||||
AVUE("0", "avue"),
|
||||
|
||||
/**
|
||||
* 前端类型-element 风格
|
||||
*/
|
||||
ELEMENT("1", "element 风格");
|
||||
ELEMENT("1", "element");
|
||||
|
||||
/**
|
||||
* 类型
|
||||
@ -33,4 +35,9 @@ public enum StyleTypeEnum {
|
||||
*/
|
||||
private String description;
|
||||
|
||||
public static String getDecs(String style) {
|
||||
return Arrays.stream(StyleTypeEnum.values()).filter(styleTypeEnum -> styleTypeEnum.getStyle().equals(style))
|
||||
.findFirst().orElse(ELEMENT).getDescription();
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user