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 @@ + + +