From 2235f1f5a4e761c6f969f7c0b240d6547019aa3b Mon Sep 17 00:00:00 2001
From: ray <1490493387@qq.com>
Date: Sun, 21 Jul 2024 21:50:41 +0800
Subject: [PATCH] =?UTF-8?q?wip:=20=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?=
=?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../youlai/system/common/base/BaseEntity.java | 8 +-
.../config/property/GeneratorProperties.java | 6 +
.../controller/GeneratorController.java | 6 +-
.../com/youlai/system/enums/FormTypeEnum.java | 70 +++++++
.../youlai/system/enums/QueryTypeEnum.java | 58 ++++++
.../youlai/system/mapper/DatabaseMapper.java | 6 +
.../youlai/system/mapper/GenConfigMapper.java | 20 ++
.../system/mapper/GenFieldConfigMapper.java | 20 ++
.../youlai/system/model/entity/GenConfig.java | 53 ++++++
.../system/model/entity/GenFieldConfig.java | 82 ++++++++
.../youlai/system/model/entity/SysDept.java | 7 +
.../youlai/system/model/entity/SysDict.java | 7 +
.../youlai/system/model/entity/SysRole.java | 7 +
.../youlai/system/model/entity/SysUser.java | 7 +
...PreviewVO.java => GeneratorPreviewVO.java} | 2 +-
.../system/service/GeneratorService.java | 4 +-
.../service/impl/GeneratorServiceImpl.java | 165 +++++++++++++---
.../service/impl/SysUserServiceImpl.java | 4 +-
src/main/resources/application-generator.yml | 42 ++++-
src/main/resources/mapper/GenConfigMapper.xml | 7 +
.../resources/mapper/GenFieldConfigMapper.xml | 28 +++
.../resources/templates/generator/api.ts.vm | 121 ++++++++++++
.../templates/generator/controller.java.vm | 4 +-
.../templates/generator/converter.java.vm | 2 +-
.../templates/generator/entity.java.vm | 13 +-
.../templates/generator/form.java.vm | 28 ++-
.../templates/generator/index.vue.vm | 178 ++++++++++++++++++
.../templates/generator/mapper.java.vm | 2 +-
.../templates/generator/mapper.xml.vm | 2 +-
.../templates/generator/query.java.vm | 14 +-
.../templates/generator/service.java.vm | 7 +-
.../templates/generator/serviceImpl.java.vm | 4 +-
.../resources/templates/generator/vo.java.vm | 13 +-
33 files changed, 912 insertions(+), 85 deletions(-)
create mode 100644 src/main/java/com/youlai/system/enums/FormTypeEnum.java
create mode 100644 src/main/java/com/youlai/system/enums/QueryTypeEnum.java
create mode 100644 src/main/java/com/youlai/system/mapper/GenConfigMapper.java
create mode 100644 src/main/java/com/youlai/system/mapper/GenFieldConfigMapper.java
create mode 100644 src/main/java/com/youlai/system/model/entity/GenConfig.java
create mode 100644 src/main/java/com/youlai/system/model/entity/GenFieldConfig.java
rename src/main/java/com/youlai/system/model/vo/{TableGeneratePreviewVO.java => GeneratorPreviewVO.java} (91%)
create mode 100644 src/main/resources/mapper/GenConfigMapper.xml
create mode 100644 src/main/resources/mapper/GenFieldConfigMapper.xml
create mode 100644 src/main/resources/templates/generator/api.ts.vm
create mode 100644 src/main/resources/templates/generator/index.vue.vm
diff --git a/src/main/java/com/youlai/system/common/base/BaseEntity.java b/src/main/java/com/youlai/system/common/base/BaseEntity.java
index d6a89e8d..40eec701 100644
--- a/src/main/java/com/youlai/system/common/base/BaseEntity.java
+++ b/src/main/java/com/youlai/system/common/base/BaseEntity.java
@@ -14,7 +14,7 @@ import java.time.LocalDateTime;
/**
* 基础实体类
*
- *
实体类的基类,包含了实体类的公共属性,如创建时间、更新时间、逻辑删除标识等
+ * 实体类的基类,包含了实体类的公共属性,如创建时间、更新时间
*
* @author Ray
* @since 2024/6/23
@@ -41,9 +41,5 @@ public class BaseEntity implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
- /**
- * 逻辑删除标识 (0-未删除 1-已删除)
- */
- @TableLogic(value = "0", delval = "1")
- private Integer isDeleted;
+
}
diff --git a/src/main/java/com/youlai/system/config/property/GeneratorProperties.java b/src/main/java/com/youlai/system/config/property/GeneratorProperties.java
index b9124b6a..126680b8 100644
--- a/src/main/java/com/youlai/system/config/property/GeneratorProperties.java
+++ b/src/main/java/com/youlai/system/config/property/GeneratorProperties.java
@@ -1,5 +1,6 @@
package com.youlai.system.config.property;
+import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.map.MapUtil;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -30,6 +31,11 @@ public class GeneratorProperties {
private String packageName;
+ /**
+ * 文件扩展名,如 .java
+ */
+ private String extension= FileNameUtil.EXT_JAVA;
+
}
diff --git a/src/main/java/com/youlai/system/controller/GeneratorController.java b/src/main/java/com/youlai/system/controller/GeneratorController.java
index de378db5..3b4ef62c 100644
--- a/src/main/java/com/youlai/system/controller/GeneratorController.java
+++ b/src/main/java/com/youlai/system/controller/GeneratorController.java
@@ -5,7 +5,7 @@ import com.youlai.system.common.result.PageResult;
import com.youlai.system.common.result.Result;
import com.youlai.system.model.query.TablePageQuery;
import com.youlai.system.model.vo.TableColumnVO;
-import com.youlai.system.model.vo.TableGeneratePreviewVO;
+import com.youlai.system.model.vo.GeneratorPreviewVO;
import com.youlai.system.model.vo.TablePageVO;
import com.youlai.system.service.GeneratorService;
import io.swagger.v3.oas.annotations.Operation;
@@ -48,8 +48,8 @@ public class GeneratorController {
@Operation(summary = "获取预览生成代码")
@GetMapping("/table/{tableName}/preview")
- public Result> getTablePreviewData(@PathVariable String tableName) {
- List list = generatorService.getTablePreviewData(tableName);
+ public Result> getTablePreviewData(@PathVariable String tableName) {
+ List list = generatorService.getTablePreviewData(tableName);
return Result.success(list);
}
diff --git a/src/main/java/com/youlai/system/enums/FormTypeEnum.java b/src/main/java/com/youlai/system/enums/FormTypeEnum.java
new file mode 100644
index 00000000..8a0aa8b8
--- /dev/null
+++ b/src/main/java/com/youlai/system/enums/FormTypeEnum.java
@@ -0,0 +1,70 @@
+package com.youlai.system.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.youlai.system.common.base.IBaseEnum;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * 表单类型枚举
+ *
+ * @author Ray
+ * @since 2.10.0
+ */
+@Getter
+@RequiredArgsConstructor
+public enum FormTypeEnum implements IBaseEnum {
+
+ /**
+ * 输入框
+ */
+ INPUT(1, "输入框"),
+
+ /**
+ * 下拉框
+ */
+ SELECT(2, "下拉框"),
+
+ /**
+ * 单选框
+ */
+ RADIO(3, "单选框"),
+
+ /**
+ * 数字输入框
+ */
+ INPUT_NUMBER(4, "数字输入框"),
+
+ /**
+ * 开关
+ */
+ SWITCH(5, "开关"),
+
+ /**
+ * 复选框
+ */
+ CHECK_BOX(6, "复选框"),
+
+ /**
+ * 文本域
+ */
+ TEXT_AREA(7, "文本域"),
+
+ /**
+ * 日期时间框
+ */
+ DATE_TIME(8, "日期时间框"),
+
+ /**
+ * 日期框
+ */
+ DATE(9, "日期框"),;
+
+
+ // Mybatis-Plus 提供注解表示插入数据库时插入该值
+ @EnumValue
+ private final Integer value;
+
+ // @JsonValue // 表示对枚举序列化时返回此字段
+ private final String label;
+}
diff --git a/src/main/java/com/youlai/system/enums/QueryTypeEnum.java b/src/main/java/com/youlai/system/enums/QueryTypeEnum.java
new file mode 100644
index 00000000..53bae2c7
--- /dev/null
+++ b/src/main/java/com/youlai/system/enums/QueryTypeEnum.java
@@ -0,0 +1,58 @@
+package com.youlai.system.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.youlai.system.common.base.IBaseEnum;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * 查询类型枚举
+ *
+ * @author Ray
+ * @since 2.10.0
+ */
+@Getter
+@RequiredArgsConstructor
+public enum QueryTypeEnum implements IBaseEnum {
+
+
+ EQ(1, "="),
+
+
+ NE(2, "!="),
+
+
+ GT(3, ">"),
+
+
+ GE(4, ">="),
+
+ LT(5, "<"),
+
+ LE(6, "<="),
+
+ BETWEEN(7, "BETWEEN"),
+
+ LIKE(8, "LIKE '%s%'"),
+
+ LIKE_LEFT(9, "LIKE '%s'"),
+
+ LIKE_RIGHT(10, "LIKE 's%'"),
+
+ IN(11, "IN"),
+
+ NOT_IN(12, "NOT IN"),
+
+ IS_NULL(13, "IS NULL"),
+
+ IS_NOT_NULL(14, "IS NOT NULL")
+ ;
+
+ // Mybatis-Plus 提供注解表示插入数据库时插入该值
+ @EnumValue
+ private final Integer value;
+
+ // @JsonValue // 表示对枚举序列化时返回此字段
+ private final String label;
+
+}
diff --git a/src/main/java/com/youlai/system/mapper/DatabaseMapper.java b/src/main/java/com/youlai/system/mapper/DatabaseMapper.java
index c478a817..abc91f4a 100644
--- a/src/main/java/com/youlai/system/mapper/DatabaseMapper.java
+++ b/src/main/java/com/youlai/system/mapper/DatabaseMapper.java
@@ -11,6 +11,12 @@ import org.apache.ibatis.annotations.Mapper;
import java.util.List;
+/**
+ * 数据库 Mapper 接口
+ *
+ * @author ray
+ * @since 2.10.0
+ */
@Mapper
public interface DatabaseMapper extends BaseMapper {
diff --git a/src/main/java/com/youlai/system/mapper/GenConfigMapper.java b/src/main/java/com/youlai/system/mapper/GenConfigMapper.java
new file mode 100644
index 00000000..b0e8bd49
--- /dev/null
+++ b/src/main/java/com/youlai/system/mapper/GenConfigMapper.java
@@ -0,0 +1,20 @@
+package com.youlai.system.mapper;
+
+import com.youlai.system.model.entity.GenConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 代码生成基础配置访问层
+ *
+ * @author Ray
+ * @since 2.10.0
+ */
+@Mapper
+public interface GenConfigMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/src/main/java/com/youlai/system/mapper/GenFieldConfigMapper.java b/src/main/java/com/youlai/system/mapper/GenFieldConfigMapper.java
new file mode 100644
index 00000000..389a7f1c
--- /dev/null
+++ b/src/main/java/com/youlai/system/mapper/GenFieldConfigMapper.java
@@ -0,0 +1,20 @@
+package com.youlai.system.mapper;
+
+import com.youlai.system.model.entity.GenFieldConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 代码生成字段配置访问层
+ *
+ * @author Ray
+ * @since 2.10.0
+ */
+@Mapper
+public interface GenFieldConfigMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/src/main/java/com/youlai/system/model/entity/GenConfig.java b/src/main/java/com/youlai/system/model/entity/GenConfig.java
new file mode 100644
index 00000000..35640653
--- /dev/null
+++ b/src/main/java/com/youlai/system/model/entity/GenConfig.java
@@ -0,0 +1,53 @@
+package com.youlai.system.model.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import com.youlai.system.common.base.BaseEntity;
+import lombok.Data;
+
+/**
+ * 代码生成基础配置
+ */
+@TableName(value ="gen_config")
+@Data
+public class GenConfig extends BaseEntity {
+ /**
+ *
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 表名
+ */
+ private String tableName;
+
+ /**
+ * 表注释
+ */
+ private String tableComment;
+
+ /**
+ * 实体名
+ */
+ private String entityName;
+
+ /**
+ * 包名
+ */
+ private String packageName;
+
+ /**
+ * 模块名
+ */
+ private String moduleName;
+
+ /**
+ * 作者
+ */
+ private String author;
+
+
+ @TableLogic
+ private Boolean isDeleted;
+}
\ No newline at end of file
diff --git a/src/main/java/com/youlai/system/model/entity/GenFieldConfig.java b/src/main/java/com/youlai/system/model/entity/GenFieldConfig.java
new file mode 100644
index 00000000..de609e30
--- /dev/null
+++ b/src/main/java/com/youlai/system/model/entity/GenFieldConfig.java
@@ -0,0 +1,82 @@
+package com.youlai.system.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.youlai.system.common.base.BaseEntity;
+import com.youlai.system.enums.FormTypeEnum;
+import com.youlai.system.enums.QueryTypeEnum;
+import lombok.Data;
+
+/**
+ * 字段配置实体
+ *
+ * @author Ray
+ * @since 2.10.0
+ */
+@TableName(value = "gen_field_config")
+@Data
+public class GenFieldConfig extends BaseEntity {
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 关联的配置ID
+ */
+ private Long configId;
+
+ /**
+ * 字段名称
+ */
+ private String fieldName;
+
+ /**
+ * 字段类型
+ */
+ private String fieldType;
+
+ /**
+ * 字段描述
+ */
+ private String fieldComment;
+
+ /**
+ * 表单类型
+ */
+ private FormTypeEnum formType;
+
+ /**
+ * 查询方式
+ */
+ private QueryTypeEnum queryType;
+
+ /**
+ * 是否在列表显示
+ */
+ private Boolean isShowInList;
+
+ /**
+ * 是否在表单显示
+ */
+ private Boolean isShowInForm;
+
+ /**
+ * 是否在查询条件显示
+ */
+ private Boolean isShowInQuery;
+
+ /**
+ * 是否必填
+ */
+ private Boolean isRequired;
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/youlai/system/model/entity/SysDept.java b/src/main/java/com/youlai/system/model/entity/SysDept.java
index 79be15ff..94bd4909 100644
--- a/src/main/java/com/youlai/system/model/entity/SysDept.java
+++ b/src/main/java/com/youlai/system/model/entity/SysDept.java
@@ -3,6 +3,7 @@ package com.youlai.system.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
import com.youlai.system.common.base.BaseEntity;
import lombok.Getter;
import lombok.Setter;
@@ -62,4 +63,10 @@ public class SysDept extends BaseEntity {
*/
private Long updateBy;
+ /**
+ * 逻辑删除标识 (0-未删除 1-已删除)
+ */
+ @TableLogic
+ private Boolean isDeleted;
+
}
\ No newline at end of file
diff --git a/src/main/java/com/youlai/system/model/entity/SysDict.java b/src/main/java/com/youlai/system/model/entity/SysDict.java
index be28b821..3fe8abcb 100644
--- a/src/main/java/com/youlai/system/model/entity/SysDict.java
+++ b/src/main/java/com/youlai/system/model/entity/SysDict.java
@@ -2,6 +2,7 @@ package com.youlai.system.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
import com.youlai.system.common.base.BaseEntity;
import lombok.Data;
@@ -39,4 +40,10 @@ public class SysDict extends BaseEntity {
*/
private String remark;
+ /**
+ * 逻辑删除标识 (0-未删除 1-已删除)
+ */
+ @TableLogic(value = "0", delval = "1")
+ private Integer isDeleted;
+
}
\ No newline at end of file
diff --git a/src/main/java/com/youlai/system/model/entity/SysRole.java b/src/main/java/com/youlai/system/model/entity/SysRole.java
index 5f485a0f..2c8469b6 100644
--- a/src/main/java/com/youlai/system/model/entity/SysRole.java
+++ b/src/main/java/com/youlai/system/model/entity/SysRole.java
@@ -2,6 +2,7 @@ package com.youlai.system.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
import com.youlai.system.common.base.BaseEntity;
import lombok.Getter;
import lombok.Setter;
@@ -55,4 +56,10 @@ public class SysRole extends BaseEntity {
* 更新人 ID
*/
private Long updateBy;
+
+ /**
+ * 逻辑删除标识 (0-未删除 1-已删除)
+ */
+ @TableLogic(value = "0", delval = "1")
+ private Boolean isDeleted;
}
\ No newline at end of file
diff --git a/src/main/java/com/youlai/system/model/entity/SysUser.java b/src/main/java/com/youlai/system/model/entity/SysUser.java
index 3375558f..54fa7ae1 100644
--- a/src/main/java/com/youlai/system/model/entity/SysUser.java
+++ b/src/main/java/com/youlai/system/model/entity/SysUser.java
@@ -2,6 +2,7 @@ package com.youlai.system.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
import com.youlai.system.common.base.BaseEntity;
import lombok.Getter;
import lombok.Setter;
@@ -72,4 +73,10 @@ public class SysUser extends BaseEntity {
* 更新人 ID
*/
private Long updateBy;
+
+ /**
+ * 逻辑删除标识 (0-未删除 1-已删除)
+ */
+ @TableLogic(value = "0", delval = "1")
+ private Integer isDeleted;
}
\ No newline at end of file
diff --git a/src/main/java/com/youlai/system/model/vo/TableGeneratePreviewVO.java b/src/main/java/com/youlai/system/model/vo/GeneratorPreviewVO.java
similarity index 91%
rename from src/main/java/com/youlai/system/model/vo/TableGeneratePreviewVO.java
rename to src/main/java/com/youlai/system/model/vo/GeneratorPreviewVO.java
index 6f0c62c8..5fcdef89 100644
--- a/src/main/java/com/youlai/system/model/vo/TableGeneratePreviewVO.java
+++ b/src/main/java/com/youlai/system/model/vo/GeneratorPreviewVO.java
@@ -5,7 +5,7 @@ import lombok.Data;
@Schema(description = "表生成代码预览VO")
@Data
-public class TableGeneratePreviewVO {
+public class GeneratorPreviewVO {
@Schema(description = "生成文件路径")
private String path;
diff --git a/src/main/java/com/youlai/system/service/GeneratorService.java b/src/main/java/com/youlai/system/service/GeneratorService.java
index 6b96933f..ef4243e9 100644
--- a/src/main/java/com/youlai/system/service/GeneratorService.java
+++ b/src/main/java/com/youlai/system/service/GeneratorService.java
@@ -3,7 +3,7 @@ package com.youlai.system.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.system.model.query.TablePageQuery;
import com.youlai.system.model.vo.TableColumnVO;
-import com.youlai.system.model.vo.TableGeneratePreviewVO;
+import com.youlai.system.model.vo.GeneratorPreviewVO;
import com.youlai.system.model.vo.TablePageVO;
import java.util.List;
@@ -39,5 +39,5 @@ public interface GeneratorService {
* @param tableName 表名
* @return
*/
- List getTablePreviewData(String tableName);
+ List getTablePreviewData(String tableName);
}
diff --git a/src/main/java/com/youlai/system/service/impl/GeneratorServiceImpl.java b/src/main/java/com/youlai/system/service/impl/GeneratorServiceImpl.java
index 36dfc7e3..6d7f52a4 100644
--- a/src/main/java/com/youlai/system/service/impl/GeneratorServiceImpl.java
+++ b/src/main/java/com/youlai/system/service/impl/GeneratorServiceImpl.java
@@ -1,18 +1,30 @@
package com.youlai.system.service.impl;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.template.Template;
import cn.hutool.extra.template.TemplateConfig;
import cn.hutool.extra.template.TemplateEngine;
import cn.hutool.extra.template.TemplateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.youlai.system.config.property.GeneratorProperties;
import com.youlai.system.mapper.DatabaseMapper;
+import com.youlai.system.mapper.GenConfigMapper;
+import com.youlai.system.mapper.GenFieldConfigMapper;
+import com.youlai.system.model.entity.GenConfig;
+import com.youlai.system.model.entity.GenFieldConfig;
import com.youlai.system.model.query.TablePageQuery;
import com.youlai.system.model.vo.TableColumnVO;
-import com.youlai.system.model.vo.TableGeneratePreviewVO;
+import com.youlai.system.model.vo.GeneratorPreviewVO;
import com.youlai.system.model.vo.TablePageVO;
import com.youlai.system.service.GeneratorService;
import lombok.RequiredArgsConstructor;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import cn.hutool.extra.template.TemplateConfig.ResourceMode;
@@ -31,6 +43,15 @@ public class GeneratorServiceImpl implements GeneratorService {
private final DatabaseMapper databaseMapper;
+ private final GeneratorProperties generatorProperties;
+
+ private final GenConfigMapper genConfigMapper;
+ private final GenFieldConfigMapper genFieldConfigMapper;
+
+ // 注入 spring.application.name
+ @Value("${spring.application.name}")
+ private String applicationName;
+
/**
* 数据表分页列表
*
@@ -60,49 +81,133 @@ public class GeneratorServiceImpl implements GeneratorService {
* @return 预览数据
*/
@Override
- public List getTablePreviewData(String tableName) {
+ public List getTablePreviewData(String tableName) {
- List list = new ArrayList<>();
+ List list = new ArrayList<>();
- TemplateConfig templateConfig = new TemplateConfig("templates" , ResourceMode.CLASSPATH);
- TemplateEngine templateEngine = TemplateUtil.createEngine(templateConfig);
+ GenConfig genConfig = genConfigMapper.selectOne(new LambdaQueryWrapper()
+ .eq(GenConfig::getTableName, tableName)
+ );
+ Assert.isTrue(genConfig != null, "未找到表生成配置");
+
+ List fieldConfigs = genFieldConfigMapper.selectList(new LambdaQueryWrapper()
+ .eq(GenFieldConfig::getConfigId, genConfig.getId())
+ );
+ Assert.isTrue(CollectionUtil.isNotEmpty(fieldConfigs), "未找到字段生成配置");
+
+ // 遍历模板配置
+ Map templateConfigs = generatorProperties.getTemplateConfigs();
+ for (Map.Entry templateConfigEntry : templateConfigs.entrySet()) {
+ GeneratorPreviewVO previewVO = new GeneratorPreviewVO();
+
+ GeneratorProperties.TemplateConfig templateConfig = templateConfigEntry.getValue();
+
+ /* 1. 生成文件名 UserController */
+ // User Role Menu Dept
+ String entityName = genConfig.getEntityName();
+ // Controller Service Mapper Entity
+ String templateName = templateConfigEntry.getKey();
+ // .java .ts .vue
+ String extension = templateConfig.getExtension();
+
+ // 文件名 UserController.java
+ String fileName = getFileName(entityName, templateName, extension);
+ previewVO.setFileName(fileName);
- Map bindingMap = new HashMap<>();
- bindingMap.put("tableName", "sys_user");
- bindingMap.put("author", "Ray");
- bindingMap.put("date", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm"));
- bindingMap.put("entityName", "User" );
- bindingMap.put("lowerFirstEntityName", "user");
- bindingMap.put("tableComment", "用户");
+ /* 2. 生成文件路径 */
+ // com.youlai.system
+ String packageName = genConfig.getPackageName();
+ // controller
+ String subPackageName = templateConfig.getPackageName();
+ // 文件路径 com.youlai.system.controller
+ String filePath = getFilePath(templateName, packageName, subPackageName);
+ previewVO.setPath(filePath);
- // 包路径
- bindingMap.put("package", "com.youlai.system");
+ /* 3. 生成文件内容 */
- Template template = templateEngine.getTemplate("generator" + File.separator + "controller.java.vm");
- String content = template.render(bindingMap);
- TableGeneratePreviewVO controller = new TableGeneratePreviewVO();
- controller.setPath("youlai-boot/controller");
- controller.setContent(content);
- controller.setFileName("UserController.java");
+ // 生成文件内容
+ String content = getCodeContent(templateConfig, genConfig, fieldConfigs);
+ previewVO.setContent(content);
- list.add(controller);
-
- TableGeneratePreviewVO vo = new TableGeneratePreviewVO();
- vo.setPath("youlai-boot/model/vo");
- vo.setContent(content);
- vo.setFileName("UserVO.java");
-
- list.add(vo);
+ list.add(previewVO);
+ }
return list;
}
- private String generatePath(){
-
+ private String getFileName(String entityName, String templateName, String extension) {
+ if (templateName.equals("Entity")) {
+ return entityName + extension;
+ }
+ if (templateName.equals("MapperXml")) {
+ return entityName + "Mapper" + extension;
+ }
+ if (templateName.equals("API")|| templateName.equals("VIEW")) {
+ return StrUtil.toSymbolCase(entityName,'-') + extension;
+ }
+ return entityName + templateName + extension;
}
+ private String getFilePath(String templateName, String packageName, String subPackageName) {
+ String path;
+ if (templateName.equals("MapperXml")) {
+ path = (applicationName
+ + File.separator
+ + "src" + File.separator + "main" + File.separator + "resources"
+ + File.separator + subPackageName
+ ).replace(".", File.separator);
+ } else if (templateName.equals("API") || templateName.equals("VIEW")) {
+ path = ("vue3-element-admin"
+ + File.separator
+ + "src" + File.separator + subPackageName
+ ).replace(".", File.separator);
+ } else {
+ path = (applicationName
+ + File.separator
+ + "src" + File.separator + "main" + File.separator + "java"
+ + File.separator + packageName + File.separator + subPackageName
+ ).replace(".", File.separator);
+ }
+ return path;
+ }
+ /**
+ * 生成代码内容
+ *
+ * @param templateConfig 模板配置
+ * @param genConfig 生成配置
+ * @param fieldConfigs 字段配置
+ * @return 代码内容
+ */
+ private String getCodeContent(GeneratorProperties.TemplateConfig templateConfig, GenConfig genConfig, List fieldConfigs) {
+
+ Map bindMap = new HashMap<>();
+
+ String entityName = genConfig.getEntityName();
+
+ bindMap.put("package", genConfig.getPackageName());
+ bindMap.put("subPackage", templateConfig.getPackageName());
+ bindMap.put("date", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm"));
+ bindMap.put("entityName", entityName);
+ bindMap.put("tableName", genConfig.getTableName());
+ bindMap.put("author", genConfig.getAuthor());
+ bindMap.put("lowerFirstEntityName", StrUtil.lowerFirst(entityName));
+ bindMap.put("tableComment", StrUtil.replace(genConfig.getTableComment(), "表", Strings.EMPTY));
+ bindMap.put("fieldConfigs", fieldConfigs);
+
+ for (GenFieldConfig fieldConfig : fieldConfigs) {
+ bindMap.put("hasLocalDateTime", "LocalDateTime".equals(fieldConfig.getFieldType()));
+ bindMap.put("hasBigDecimal", "BigDecimal".equals(fieldConfig.getFieldType()));
+ bindMap.put("hasRequiredField", Boolean.TRUE.equals(fieldConfig.getIsRequired()));
+ }
+
+ TemplateEngine templateEngine = TemplateUtil.createEngine(new TemplateConfig("templates", ResourceMode.CLASSPATH));
+ Template template = templateEngine.getTemplate(templateConfig.getTemplatePath());
+ String content = template.render(bindMap);
+
+ return content;
+ }
}
diff --git a/src/main/java/com/youlai/system/service/impl/SysUserServiceImpl.java b/src/main/java/com/youlai/system/service/impl/SysUserServiceImpl.java
index 6dddcd9b..a8fca05a 100644
--- a/src/main/java/com/youlai/system/service/impl/SysUserServiceImpl.java
+++ b/src/main/java/com/youlai/system/service/impl/SysUserServiceImpl.java
@@ -157,7 +157,7 @@ public class SysUserServiceImpl extends ServiceImpl impl
* 删除用户
*
* @param idsStr 用户ID,多个以英文逗号(,)分割
- * @return true|false
+ * @return
*/
@Override
public boolean deleteUsers(String idsStr) {
@@ -175,7 +175,7 @@ public class SysUserServiceImpl extends ServiceImpl impl
*
* @param userId 用户ID
* @param password 用户密码
- * @return true|false
+ * @return
*/
@Override
public boolean updatePassword(Long userId, String password) {
diff --git a/src/main/resources/application-generator.yml b/src/main/resources/application-generator.yml
index d3edd2a5..2a7e3996 100644
--- a/src/main/resources/application-generator.yml
+++ b/src/main/resources/application-generator.yml
@@ -3,7 +3,41 @@ generator:
## 模板配置
templateConfigs:
Controller:
- ## 模板路径
- templatePath: templates/generator/controller.java.vm
- ## 包名
- packageName: controller
\ No newline at end of file
+ templatePath: generator/controller.java.vm
+ packageName: controller
+ Service:
+ templatePath: generator/service.java.vm
+ packageName: service
+ ServiceImpl:
+ templatePath: generator/serviceImpl.java.vm
+ packageName: service.impl
+ Mapper:
+ templatePath: generator/mapper.java.vm
+ packageName: mapper
+ MapperXml:
+ templatePath: generator/mapper.xml.vm
+ packageName: mapper
+ extension: .xml
+ Query:
+ templatePath: generator/query.java.vm
+ packageName: model.query
+ Form:
+ templatePath: generator/form.java.vm
+ packageName: model.form
+ VO:
+ templatePath: generator/vo.java.vm
+ packageName: model.vo
+ Entity:
+ templatePath: generator/entity.java.vm
+ packageName: model.entity
+ API:
+ templatePath: generator/api.ts.vm
+ packageName: api
+ extension: .ts
+ VIEW:
+ templatePath: generator/index.vue.vm
+ packageName: views
+ extension: .vue
+
+
+
diff --git a/src/main/resources/mapper/GenConfigMapper.xml b/src/main/resources/mapper/GenConfigMapper.xml
new file mode 100644
index 00000000..ba394cd3
--- /dev/null
+++ b/src/main/resources/mapper/GenConfigMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/src/main/resources/mapper/GenFieldConfigMapper.xml b/src/main/resources/mapper/GenFieldConfigMapper.xml
new file mode 100644
index 00000000..03607e26
--- /dev/null
+++ b/src/main/resources/mapper/GenFieldConfigMapper.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id,config_id,name,
+ type,description,show_in_list,
+ show_in_form,show_in_query,form_type,
+ query_method,create_time,update_time
+
+
diff --git a/src/main/resources/templates/generator/api.ts.vm b/src/main/resources/templates/generator/api.ts.vm
new file mode 100644
index 00000000..4fb19ad1
--- /dev/null
+++ b/src/main/resources/templates/generator/api.ts.vm
@@ -0,0 +1,121 @@
+import request from "@/utils/request";
+
+const ${className.toUpperCase()}_BASE_URL = "/api/v1/${className.toLowerCase()}s";
+
+class ${className}API {
+ /** 获取${className}分页数据 */
+ static getPage(queryParams?: ${className}PageQuery) {
+ return request>({
+ url: `${${className.toUpperCase()}_BASE_URL}/page`,
+ method: "get",
+ params: queryParams,
+ });
+ }
+
+ /** 获取${className}下拉数据源 */
+ static getOptions() {
+ return request({
+ url: `${${className.toUpperCase()}_BASE_URL}/options`,
+ method: "get",
+ });
+ }
+
+ /**
+ * 获取${className}的菜单ID集合
+ *
+ * @param ${className.toLowerCase()}Id ${className}ID
+ * @returns ${className}的菜单ID集合
+ */
+ static get${className}MenuIds(${className.toLowerCase()}Id: number) {
+ return request({
+ url: `${${className.toUpperCase()}_BASE_URL}/${${className.toLowerCase()}Id}/menuIds`,
+ method: "get",
+ });
+ }
+
+ /**
+ * 分配菜单权限
+ *
+ * @param ${className.toLowerCase()}Id ${className}ID
+ * @param data 菜单ID集合
+ */
+ static update${className}Menus(${className.toLowerCase()}Id: number, data: number[]) {
+ return request({
+ url: `${${className.toUpperCase()}_BASE_URL}/${${className.toLowerCase()}Id}/menus`,
+ method: "put",
+ data: data,
+ });
+ }
+
+ /**
+ * 获取${className}表单数据
+ *
+ * @param id ${className}ID
+ * @returns ${className}表单数据
+ */
+ static getFormData(id: number) {
+ return request({
+ url: `${${className.toUpperCase()}_BASE_URL}/${id}/form`,
+ method: "get",
+ });
+ }
+
+ /** 添加${className} */
+ static add(data: ${className}Form) {
+ return request({
+ url: `${${className.toUpperCase()}_BASE_URL}`,
+ method: "post",
+ data: data,
+ });
+ }
+
+ /**
+ * 更新${className}
+ *
+ * @param id ${className}ID
+ * @param data ${className}表单数据
+ */
+ static update(id: number, data: ${className}Form) {
+ return request({
+ url: `${${className.toUpperCase()}_BASE_URL}/${id}`,
+ method: "put",
+ data: data,
+ });
+ }
+
+ /**
+ * 批量删除${className},多个以英文逗号(,)分割
+ *
+ * @param ids ${className}ID字符串,多个以英文逗号(,)分割
+ */
+ static deleteByIds(ids: string) {
+ return request({
+ url: `${${className.toUpperCase()}_BASE_URL}/${ids}`,
+ method: "delete",
+ });
+ }
+}
+
+export default ${className}API;
+
+/** ${className}分页查询参数 */
+export interface ${className}PageQuery extends PageQuery {
+ /** 搜索关键字 */
+ keywords?: string;
+}
+
+/** ${className}分页对象 */
+export interface ${className}PageVO {
+ #foreach($field in $fields)
+ /** ${field.comment} */
+ ${field.name}?: ${field.type};
+ #end
+}
+
+/** ${className}表单对象 */
+export interface ${className}Form {
+ #foreach($field in $fields)
+ /** ${field.comment} */
+ ${field.name}?: ${field.type};
+ #end
+}
diff --git a/src/main/resources/templates/generator/controller.java.vm b/src/main/resources/templates/generator/controller.java.vm
index 6cf522ff..292830e4 100644
--- a/src/main/resources/templates/generator/controller.java.vm
+++ b/src/main/resources/templates/generator/controller.java.vm
@@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.*;
import jakarta.validation.Valid;
/**
- * $!{tableComment} 前端控制器
+ * $!{tableComment}前端控制层
*
* @author ${author}
* @since ${date}
@@ -44,7 +44,7 @@ public class ${entityName}Controller {
return Result.judge(result);
}
- @Operation(summary = "$!{tableComment}表单数据")
+ @Operation(summary = "获取$!{tableComment}表单数据")
@GetMapping("/{id}/form")
public Result<${entityName}Form> get${entityName}Form(
@Parameter(description = "$!{tableComment}ID") @PathVariable Long id
diff --git a/src/main/resources/templates/generator/converter.java.vm b/src/main/resources/templates/generator/converter.java.vm
index 45a65a30..6907a4d5 100644
--- a/src/main/resources/templates/generator/converter.java.vm
+++ b/src/main/resources/templates/generator/converter.java.vm
@@ -6,7 +6,7 @@ import ${package}.model.entity.${entityName};
import ${package}.model.form.${entityName}Form;
/**
- * $!{tableComment}转换器
+ * $!{tableComment}对象转换器
*
* @author ${author}
* @since ${date}
diff --git a/src/main/resources/templates/generator/entity.java.vm b/src/main/resources/templates/generator/entity.java.vm
index dd975f7c..ca994871 100644
--- a/src/main/resources/templates/generator/entity.java.vm
+++ b/src/main/resources/templates/generator/entity.java.vm
@@ -23,13 +23,14 @@ import com.youlai.system.common.base.BaseEntity;
public class ${entityName} extends BaseEntity {
private static final long serialVersionUID = 1L;
-
-#foreach($field in ${table.fields})
-#if("$!field.comment" != "")
+#if($fieldConfigs)
+ #foreach($fieldConfig in ${fieldConfigs})
+ #if("$!fieldConfig.fieldComment" != "")
/**
- * ${field.comment}
+ * ${fieldConfig.fieldComment}
*/
-#end
- private ${field.propertyType} ${field.propertyName};
+ #end
+ private ${fieldConfig.fieldType} ${fieldConfig.fieldName};
+ #end
#end
}
diff --git a/src/main/resources/templates/generator/form.java.vm b/src/main/resources/templates/generator/form.java.vm
index 0ba5d808..ea493d0f 100644
--- a/src/main/resources/templates/generator/form.java.vm
+++ b/src/main/resources/templates/generator/form.java.vm
@@ -1,4 +1,4 @@
-package ${package}.model.form;
+package ${package}.${subPackage};
import java.io.Serial;
import java.io.Serializable;
@@ -11,10 +11,12 @@ import java.time.LocalDateTime;
#if(${hasBigDecimal})
import java.math.BigDecimal;
#end
-
+#if(${hasRequiredField})
+import jakarta.validation.constraints.*;
+#end
/**
- * $!{tableComment} 表单对象
+ * $!{tableComment}表单对象
*
* @author ${author}
* @since ${date}
@@ -28,10 +30,22 @@ public class ${entityName}Form implements Serializable {
private static final long serialVersionUID = 1L;
## ---------- BEGIN 字段循环遍历 ----------
-#foreach($field in ${fields})
- #if("$!field.comment" != "")
- @Schema(description = "${field.comment}")
+#if($fieldConfigs)
+ #foreach($fieldConfig in ${fieldConfigs})
+ #if($fieldConfig.showInForm)
+ #if($fieldConfig.isRequired)
+ #if($fieldConfig.fieldType == 'String')
+ @NotBlank(message = "$fieldConfig.fieldComment不能为空")
+ #else
+ @NotNull(message = "$fieldConfig.fieldComment不能为空")
+ #end
+ #end
+ #if("$!fieldConfig.fieldComment" != "")
+ @Schema(description = "${fieldConfig.fieldComment}")
+ #end
+ private ${fieldConfig.fieldType} ${fieldConfig.fieldName};
+ #end
#end
- private ${field.propertyType} ${field.propertyName};
#end
+
}
diff --git a/src/main/resources/templates/generator/index.vue.vm b/src/main/resources/templates/generator/index.vue.vm
new file mode 100644
index 00000000..bdd146fa
--- /dev/null
+++ b/src/main/resources/templates/generator/index.vue.vm
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+ 重置
+
+
+
+
+
+
+
+
+
+ 新增
+
+
+
+ 删除
+
+
+
+
+
+ #foreach($field in $fields)
+
+ #end
+
+
+
+
+
+ 编辑
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+ #foreach($field in $fields)
+
+
+
+ #end
+
+
+
+
+
+
+
+
+
+