Pārlūkot izejas kodu

新增代码生成相关接口

hubin 10 mēneši atpakaļ
vecāks
revīzija
a5df6ac449
20 mainītis faili ar 650 papildinājumiem un 10 dzēšanām
  1. 6 3
      build.gradle
  2. 5 0
      src/main/java/com/aizuda/boot/config/OpenApiConfiguration.java
  3. 58 0
      src/main/java/com/aizuda/boot/modules/common/DbCheckHealth.java
  4. 21 6
      src/main/java/com/aizuda/boot/modules/common/vo/SelectOptionVO.java
  5. 70 0
      src/main/java/com/aizuda/boot/modules/gen/controller/GenDatabaseController.java
  6. 33 0
      src/main/java/com/aizuda/boot/modules/gen/controller/GenTableController.java
  7. 67 0
      src/main/java/com/aizuda/boot/modules/gen/controller/GenTemplateController.java
  8. 99 0
      src/main/java/com/aizuda/boot/modules/gen/entity/GenDatabase.java
  9. 40 0
      src/main/java/com/aizuda/boot/modules/gen/entity/GenTemplate.java
  10. 16 0
      src/main/java/com/aizuda/boot/modules/gen/mapper/GenDatabaseMapper.java
  11. 16 0
      src/main/java/com/aizuda/boot/modules/gen/mapper/GenTemplateMapper.java
  12. 5 0
      src/main/java/com/aizuda/boot/modules/gen/mapper/xml/GenDatabaseMapper.xml
  13. 5 0
      src/main/java/com/aizuda/boot/modules/gen/mapper/xml/GenTemplateMapper.xml
  14. 21 0
      src/main/java/com/aizuda/boot/modules/gen/service/IGenDatabaseService.java
  15. 12 0
      src/main/java/com/aizuda/boot/modules/gen/service/IGenTableService.java
  16. 17 0
      src/main/java/com/aizuda/boot/modules/gen/service/IGenTemplateService.java
  17. 62 0
      src/main/java/com/aizuda/boot/modules/gen/service/impl/GenDatabaseServiceImpl.java
  18. 63 0
      src/main/java/com/aizuda/boot/modules/gen/service/impl/GenTableServiceImpl.java
  19. 33 0
      src/main/java/com/aizuda/boot/modules/gen/service/impl/GenTemplateServiceImpl.java
  20. 1 1
      src/main/java/com/aizuda/boot/modules/system/service/impl/SysDictServiceImpl.java

+ 6 - 3
build.gradle

@@ -32,7 +32,7 @@ buildscript {
         springBootVersion = "3.1.1"
         springdocVersion = "2.5.0"
         flowlongVersion = "1.0.0"
-        aizudaVersion = "1.0.3"
+        aizudaVersion = "1.0.2"
     }
 
     // 仓库配置
@@ -81,7 +81,7 @@ dependencyManagement {
 }
 
 dependencies {
-    implementation("com.aizuda:aizuda-service-parent:1.0.2") {
+    implementation("com.aizuda:aizuda-service-parent:${aizudaVersion}") {
         // 纯 mysql 运行环境打开该配置排除 PG 依赖
         // exclude group:"org.postgresql", module:"postgresql"
     }
@@ -90,8 +90,11 @@ dependencies {
     implementation("com.github.ben-manes.caffeine:caffeine")
     implementation("org.springframework.boot:spring-boot-starter-websocket")
 
+    // 代码生成
+    implementation("com.aizuda:aizuda-generator:${aizudaVersion}")
+
     // 日志
-    api('org.springframework.boot:spring-boot-starter-log4j2')
+    api("org.springframework.boot:spring-boot-starter-log4j2")
     api("com.lmax:disruptor")
 
     // 文档 https://springdoc.org

+ 5 - 0
src/main/java/com/aizuda/boot/config/OpenApiConfiguration.java

@@ -50,5 +50,10 @@ public class OpenApiConfiguration {
     public GroupedOpenApi sysApi() {
         return GroupedOpenApi.builder().group("系统管理").pathsToMatch("/sys/**").build();
     }
+
+    @Bean
+    public GroupedOpenApi genApi() {
+        return GroupedOpenApi.builder().group("代码生成").pathsToMatch("/gen/**").build();
+    }
 }
 

+ 58 - 0
src/main/java/com/aizuda/boot/modules/common/DbCheckHealth.java

@@ -0,0 +1,58 @@
+package com.aizuda.boot.modules.common;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.function.Consumer;
+
+/**
+ * 数据库健康检查
+ *
+ * @author hubin
+ * @since 2021-05-19
+ */
+@Slf4j
+public class DbCheckHealth {
+
+    /**
+     * 获取数据库连接
+     *
+     * @param className 驱动类
+     * @param url       连接地址
+     * @param user      用户名
+     * @param password  密码
+     */
+    public static Connection getConnection(String className, String url, String user, String password)
+            throws ClassNotFoundException, SQLException {
+        Class.forName(className);
+        return DriverManager.getConnection(url, user, password);
+    }
+
+    /**
+     * 测试数据库连接
+     *
+     * @param className     驱动类
+     * @param url           连接地址
+     * @param user          用户名
+     * @param password      密码
+     * @param errorConsumer 失败回调函数
+     */
+    public static void test(String className, String url, String user, String password, Consumer<String> errorConsumer) {
+        Connection connection = null;
+        try {
+            connection = getConnection(className, url, user, password);
+        } catch (Exception e) {
+            errorConsumer.accept(e.getMessage());
+        } finally {
+            if (null != connection) {
+                try {
+                    connection.close();
+                } catch (SQLException s) {
+                    log.error("数据库连接关闭失败", s);
+                }
+            }
+        }
+    }
+}

+ 21 - 6
src/main/java/com/aizuda/boot/modules/common/vo/SelectOptionVO.java

@@ -1,8 +1,7 @@
 package com.aizuda.boot.modules.common.vo;
 
-import lombok.AllArgsConstructor;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Getter;
-import lombok.NoArgsConstructor;
 import lombok.Setter;
 
 import java.io.Serializable;
@@ -12,12 +11,28 @@ import java.io.Serializable;
  */
 @Getter
 @Setter
-@NoArgsConstructor
-@AllArgsConstructor
 public class SelectOptionVO implements Serializable {
-    // 显示标题
+
+    @Schema(description = "主键 ID")
+    protected Long id;
+
+    @Schema(description = "显示标题")
     private String title;
-    // 选择内容
+
+    @Schema(description = "选择内容")
     private Object content;
 
+    public static SelectOptionVO of(String title, Object content) {
+        SelectOptionVO vo = new SelectOptionVO();
+        vo.setTitle(title);
+        vo.setContent(content);
+        return vo;
+    }
+
+    public static SelectOptionVO of(Long id, String title) {
+        SelectOptionVO vo = new SelectOptionVO();
+        vo.setId(id);
+        vo.setTitle(title);
+        return vo;
+    }
 }

+ 70 - 0
src/main/java/com/aizuda/boot/modules/gen/controller/GenDatabaseController.java

@@ -0,0 +1,70 @@
+package com.aizuda.boot.modules.gen.controller;
+
+import com.aizuda.boot.modules.common.vo.SelectOptionVO;
+import com.aizuda.boot.modules.gen.entity.GenDatabase;
+import com.aizuda.boot.modules.gen.service.IGenDatabaseService;
+import com.aizuda.core.api.ApiController;
+import com.aizuda.core.api.PageParam;
+import com.aizuda.core.validation.Create;
+import com.aizuda.core.validation.Update;
+import com.baomidou.kisso.annotation.Permission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 代码生成数据源表 前端控制器
+ *
+ * @author 青苗
+ * @since 2024-08-28
+ */
+@Tag(name = "代码生成数据源表")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/gen/database")
+public class GenDatabaseController extends ApiController {
+    private IGenDatabaseService genDatabaseService;
+
+    @Operation(summary = "分页列表")
+    @PostMapping("/page")
+    public Page<GenDatabase> getPage(@RequestBody PageParam<GenDatabase> dto) {
+        return genDatabaseService.page(dto.page(), dto.getData());
+    }
+
+    @Operation(summary = "下拉选择项列表")
+    @Permission("gen:database:listSelectOptions")
+    @GetMapping("/list-select-options")
+    public List<SelectOptionVO> listSelectOptions() {
+        return genDatabaseService.listSelectOptions();
+    }
+
+    @Operation(summary = "查询 id 信息")
+    @GetMapping("/get")
+    public GenDatabase get(@RequestParam Long id) {
+        return genDatabaseService.getById(id);
+    }
+
+    @Operation(summary = "根据 id 修改信息")
+    @PostMapping("/update")
+    public boolean update(@Validated(Update.class) @RequestBody GenDatabase genDatabase) {
+        return genDatabaseService.updateById(genDatabase);
+    }
+
+    @Operation(summary = "创建添加")
+    @PostMapping("/create")
+    public boolean create(@Validated(Create.class) @RequestBody GenDatabase genDatabase) {
+        return genDatabaseService.save(genDatabase);
+    }
+
+    @Operation(summary = "根据 ids 删除")
+    @PostMapping("/delete")
+    public boolean delete(@NotEmpty @RequestBody List<Long> ids) {
+        return genDatabaseService.removeByIds(ids);
+    }
+}

+ 33 - 0
src/main/java/com/aizuda/boot/modules/gen/controller/GenTableController.java

@@ -0,0 +1,33 @@
+package com.aizuda.boot.modules.gen.controller;
+
+import com.aizuda.boot.modules.gen.service.IGenTableService;
+import com.aizuda.core.api.ApiController;
+import com.baomidou.kisso.annotation.Permission;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 代码生成业务表 前端控制器
+ *
+ * @author 青苗
+ * @since 2024-08-25
+ */
+@Tag(name = "代码生成业务表")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/gen/table")
+public class GenTableController extends ApiController {
+    private IGenTableService genTableService;
+
+    @Operation(summary = "测试")
+    @Permission("gen:table:gen")
+    @PostMapping("/gen")
+    public boolean gen() {
+        return genTableService.gen();
+    }
+
+}

+ 67 - 0
src/main/java/com/aizuda/boot/modules/gen/controller/GenTemplateController.java

@@ -0,0 +1,67 @@
+package com.aizuda.boot.modules.gen.controller;
+
+import com.aizuda.core.api.ApiController;
+import com.aizuda.core.api.PageParam;
+import com.aizuda.core.validation.Create;
+import com.aizuda.core.validation.Update;
+import com.aizuda.boot.modules.gen.entity.GenTemplate;
+import com.aizuda.boot.modules.gen.service.IGenTemplateService;
+import com.baomidou.kisso.annotation.Permission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 代码生成模板表 前端控制器
+ *
+ * @author 青苗
+ * @since 2024-08-25
+ */
+@Tag(name = "代码生成模板表")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/gen/template")
+public class GenTemplateController extends ApiController {
+    private IGenTemplateService genTemplateService;
+
+    @Operation(summary = "分页列表")
+    @Permission("gen:template:page")
+    @PostMapping("/page")
+    public Page<GenTemplate> getPage(@RequestBody PageParam<GenTemplate> dto) {
+        return genTemplateService.page(dto.page(), dto.getData());
+    }
+
+    @Operation(summary = "查询 id 信息")
+    @Permission("gen:template:get")
+    @GetMapping("/get")
+    public GenTemplate get(@RequestParam Long id) {
+        return genTemplateService.getById(id);
+    }
+
+    @Operation(summary = "根据 id 修改信息")
+    @Permission("gen:template:update")
+    @PostMapping("/update")
+    public boolean update(@Validated(Update.class) @RequestBody GenTemplate genTemplate) {
+        return genTemplateService.updateById(genTemplate);
+    }
+
+    @Operation(summary = "创建添加")
+    @Permission("gen:template:create")
+    @PostMapping("/create")
+    public boolean create(@Validated(Create.class) @RequestBody GenTemplate genTemplate) {
+        return genTemplateService.save(genTemplate);
+    }
+
+    @Operation(summary = "根据 ids 删除")
+    @Permission("gen:template:delete")
+    @PostMapping("/delete")
+    public boolean delete(@NotEmpty @RequestBody List<Long> ids) {
+        return genTemplateService.removeByIds(ids);
+    }
+}

+ 99 - 0
src/main/java/com/aizuda/boot/modules/gen/entity/GenDatabase.java

@@ -0,0 +1,99 @@
+package com.aizuda.boot.modules.gen.entity;
+
+import com.aizuda.core.bean.BaseEntity;
+import com.aizuda.core.validation.Create;
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.annotation.TableName;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.PositiveOrZero;
+import jakarta.validation.constraints.Size;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Setter;
+import lombok.Getter;
+
+/**
+ * 代码生成数据源表
+ *
+ * @author 青苗
+ * @since 2024-08-28
+ */
+@Getter
+@Setter
+@Schema(name = "GenDatabase", description = "代码生成数据源表")
+@TableName("gen_database")
+public class GenDatabase extends BaseEntity {
+
+	@Schema(description = "类型")
+	@NotBlank(groups = Create.class)
+	@Size(max = 50)
+	private String type;
+
+	@Schema(description = "别名")
+	@NotBlank(groups = Create.class)
+	@Size(max = 50)
+	private String alias;
+
+	@Schema(description = "用户名")
+	@NotBlank(groups = Create.class)
+	@Size(max = 50)
+	private String username;
+
+	@Schema(description = "密码")
+	@NotBlank(groups = Create.class)
+	@Size(max = 50)
+	private String password;
+
+	@Schema(description = "端口")
+	@NotNull(groups = Create.class)
+	@PositiveOrZero
+	private Integer port;
+
+	@Schema(description = "主机")
+	@NotBlank(groups = Create.class)
+	@Size(max = 50)
+	private String host;
+
+	@Schema(description = "数据库名")
+	@NotBlank(groups = Create.class)
+	@Size(max = 50)
+	private String database;
+
+	public String driverClassName() {
+		return "org.postgresql.Driver";
+	}
+
+	public String url() {
+		DbType dbType = this.dbType();
+		StringBuilder url = new StringBuilder();
+		if (dbType == DbType.MYSQL) {
+			url.append("jdbc:mysql://");
+		} else if (dbType == DbType.ORACLE) {
+			url.append("jdbc:oracle:thin:@//");
+		} else {
+			url.append("jdbc:postgresql://");
+		}
+		url.append(this.host).append(":").append(this.port);
+		url.append("/").append(this.database);
+		if (dbType == DbType.MYSQL) {
+			url.append("?useUnicode=true&characterEncoding=UTF-8&useSSL=false&useAffectedRows=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai");
+		}
+		return url.toString();
+	}
+
+	/**
+	 * 数据库类型判断
+	 */
+	public DbType dbType() {
+		if (null != type) {
+			if (type.contains("mysql")) {
+				return DbType.MYSQL;
+			}
+			if (type.contains("oracle")) {
+				return DbType.ORACLE;
+			}
+		}
+		return DbType.POSTGRE_SQL;
+	}
+}

+ 40 - 0
src/main/java/com/aizuda/boot/modules/gen/entity/GenTemplate.java

@@ -0,0 +1,40 @@
+package com.aizuda.boot.modules.gen.entity;
+
+import com.aizuda.core.bean.BaseEntity;
+import com.aizuda.core.validation.Create;
+import com.baomidou.mybatisplus.annotation.TableName;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Setter;
+import lombok.Getter;
+
+/**
+ * 代码生成模板表
+ *
+ * @author 青苗
+ * @since 2024-08-25
+ */
+@Getter
+@Setter
+@Schema(name = "GenTemplate", description = "代码生成模板表")
+@TableName("gen_template")
+public class GenTemplate extends BaseEntity {
+
+	@Schema(description = "模板名称")
+	@NotBlank(groups = Create.class)
+	@Size(max = 100)
+	private String tplName;
+
+	@Schema(description = "模板内容")
+	@NotBlank(groups = Create.class)
+	@Size(max = 2147483647)
+	private String tplContent;
+
+	@Schema(description = "输出文件")
+	@NotBlank(groups = Create.class)
+	@Size(max = 255)
+	private String outFile;
+
+}

+ 16 - 0
src/main/java/com/aizuda/boot/modules/gen/mapper/GenDatabaseMapper.java

@@ -0,0 +1,16 @@
+package com.aizuda.boot.modules.gen.mapper;
+
+import com.aizuda.boot.modules.gen.entity.GenDatabase;
+import com.aizuda.service.mapper.CrudMapper;
+
+/**
+ * <p>
+ * 代码生成数据源表 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2024-08-28
+ */
+public interface GenDatabaseMapper extends CrudMapper<GenDatabase> {
+
+}

+ 16 - 0
src/main/java/com/aizuda/boot/modules/gen/mapper/GenTemplateMapper.java

@@ -0,0 +1,16 @@
+package com.aizuda.boot.modules.gen.mapper;
+
+import com.aizuda.boot.modules.gen.entity.GenTemplate;
+import com.aizuda.service.mapper.CrudMapper;
+
+/**
+ * <p>
+ * 代码生成模板表 Mapper 接口
+ * </p>
+ *
+ * @author 青苗
+ * @since 2024-08-25
+ */
+public interface GenTemplateMapper extends CrudMapper<GenTemplate> {
+
+}

+ 5 - 0
src/main/java/com/aizuda/boot/modules/gen/mapper/xml/GenDatabaseMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.aizuda.boot.modules.gen.mapper.GenDatabaseMapper">
+
+</mapper>

+ 5 - 0
src/main/java/com/aizuda/boot/modules/gen/mapper/xml/GenTemplateMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.aizuda.boot.modules.gen.mapper.GenTemplateMapper">
+
+</mapper>

+ 21 - 0
src/main/java/com/aizuda/boot/modules/gen/service/IGenDatabaseService.java

@@ -0,0 +1,21 @@
+package com.aizuda.boot.modules.gen.service;
+
+import com.aizuda.boot.modules.common.vo.SelectOptionVO;
+import com.aizuda.boot.modules.gen.entity.GenDatabase;
+import com.aizuda.service.service.IBaseService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.util.List;
+
+/**
+ * 代码生成数据源表 服务类
+ *
+ * @author 青苗
+ * @since 2024-08-28
+ */
+public interface IGenDatabaseService extends IBaseService<GenDatabase> {
+
+    Page<GenDatabase> page(Page<GenDatabase> page, GenDatabase genDatabase);
+
+    List<SelectOptionVO> listSelectOptions();
+}

+ 12 - 0
src/main/java/com/aizuda/boot/modules/gen/service/IGenTableService.java

@@ -0,0 +1,12 @@
+package com.aizuda.boot.modules.gen.service;
+
+/**
+ * 代码生成业务表 服务类
+ *
+ * @author 青苗
+ * @since 2024-08-25
+ */
+public interface IGenTableService {
+
+    boolean gen();
+}

+ 17 - 0
src/main/java/com/aizuda/boot/modules/gen/service/IGenTemplateService.java

@@ -0,0 +1,17 @@
+package com.aizuda.boot.modules.gen.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.aizuda.service.service.IBaseService;
+import com.aizuda.boot.modules.gen.entity.GenTemplate;
+
+/**
+ * 代码生成模板表 服务类
+ *
+ * @author 青苗
+ * @since 2024-08-25
+ */
+public interface IGenTemplateService extends IBaseService<GenTemplate> {
+
+    Page<GenTemplate> page(Page<GenTemplate> page, GenTemplate genTemplate);
+
+}

+ 62 - 0
src/main/java/com/aizuda/boot/modules/gen/service/impl/GenDatabaseServiceImpl.java

@@ -0,0 +1,62 @@
+package com.aizuda.boot.modules.gen.service.impl;
+
+import com.aizuda.boot.modules.common.DbCheckHealth;
+import com.aizuda.boot.modules.common.vo.SelectOptionVO;
+import com.aizuda.boot.modules.gen.entity.GenDatabase;
+import com.aizuda.boot.modules.gen.mapper.GenDatabaseMapper;
+import com.aizuda.boot.modules.gen.service.IGenDatabaseService;
+import com.aizuda.core.api.ApiAssert;
+import com.aizuda.service.service.BaseServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 代码生成数据源表 服务实现类
+ *
+ * @author 青苗
+ * @since 2024-08-28
+ */
+@Service
+public class GenDatabaseServiceImpl extends BaseServiceImpl<GenDatabaseMapper, GenDatabase> implements IGenDatabaseService {
+
+    @Override
+    public Page<GenDatabase> page(Page<GenDatabase> page, GenDatabase genDatabase) {
+        LambdaQueryWrapper<GenDatabase> lqw = Wrappers.lambdaQuery(genDatabase);
+        return super.page(page, lqw);
+    }
+
+    @Override
+    public boolean save(GenDatabase genDatabase) {
+        this.checkDatabase(genDatabase);
+        return super.save(genDatabase);
+    }
+
+    private void checkDatabase(GenDatabase gd) {
+        DbCheckHealth.test(gd.driverClassName(), gd.url(), gd.getUsername(), gd.getPassword(),
+                error -> ApiAssert.fail("数据库配置有误," + error));
+    }
+
+    @Override
+    public boolean updateById(GenDatabase genDatabase) {
+        ApiAssert.fail(null == genDatabase.getId(), "主键不存在无法更新");
+        this.checkDatabase(genDatabase);
+        return super.updateById(genDatabase);
+    }
+
+    @Override
+    public List<SelectOptionVO> listSelectOptions() {
+        List<SelectOptionVO> voList = new ArrayList<>();
+        voList.add(SelectOptionVO.of(0L, "默认"));
+        List<GenDatabase> genDatabases = lambdaQuery().select(GenDatabase::getId, GenDatabase::getAlias).list();
+        if (CollectionUtils.isNotEmpty(genDatabases)) {
+            voList.addAll(genDatabases.stream().map(t -> SelectOptionVO.of(t.getId(), t.getAlias())).toList());
+        }
+        return voList;
+    }
+}

+ 63 - 0
src/main/java/com/aizuda/boot/modules/gen/service/impl/GenTableServiceImpl.java

@@ -0,0 +1,63 @@
+package com.aizuda.boot.modules.gen.service.impl;
+
+import com.aizuda.boot.modules.gen.service.IGenTableService;
+import com.aizuda.core.bean.BaseEntity;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+import com.baomidou.mybatisplus.generator.fill.Column;
+import lombok.AllArgsConstructor;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 代码生成业务表 服务实现类
+ *
+ * @author 青苗
+ * @since 2024-08-25
+ */
+@Service
+@AllArgsConstructor
+public class GenTableServiceImpl implements IGenTableService {
+    private DataSourceProperties dsp;
+
+    @Override
+    public boolean gen() {
+        DataSourceConfig.Builder dataSource = new DataSourceConfig.Builder(dsp.getUrl(), dsp.getUsername(), dsp.getPassword());
+        // 全局配置
+        GlobalConfig.Builder globalConfig = new GlobalConfig.Builder().author("青苗")
+                .outputDir("C://aizuda-code")
+                .dateType(DateType.ONLY_DATE)
+                .enableSwagger();
+        // 包配置
+        PackageConfig.Builder packageInfo = new PackageConfig.Builder().parent("com.aizuda.boot.modules.gen");
+        // 策略配置
+        StrategyConfig.Builder strategy = new StrategyConfig.Builder();
+        strategy.addInclude(List.of("gen_table"))
+                .controllerBuilder().enableRestStyle().enableHyphenStyle()
+                .serviceBuilder().superServiceClass("com.aizuda.service.service.IBaseService")
+                .mapperBuilder().superClass("com.aizuda.service.mapper.CrudMapper")
+                .entityBuilder().enableLombok().disableSerialVersionUID().addTableFills(
+                        new Column("create_id", FieldFill.INSERT),
+                        new Column("create_by", FieldFill.INSERT),
+                        new Column("create_time", FieldFill.INSERT),
+                        new Column("update_by", FieldFill.UPDATE),
+                        new Column("update_time", FieldFill.UPDATE)
+                ).addSuperEntityColumns("id", "create_id", "create_by", "create_time",
+                        "update_by", "update_time", "deleted")
+                .logicDeleteColumnName("deleted")
+                .superClass(BaseEntity.class);
+        // 注入配置
+        InjectionConfig.Builder injection = new InjectionConfig.Builder();
+        // 模板配置
+        TemplateConfig.Builder template = new TemplateConfig.Builder().disable(TemplateType.XML);
+        // 模板渲染引擎 new CodeTemplateEngine()
+        ConfigBuilder config = new ConfigBuilder(packageInfo.build(), dataSource.build(), strategy.build(), template.build(),
+                globalConfig.build(), injection.build());
+        config.getTableInfoList();
+        return true;
+    }
+}

+ 33 - 0
src/main/java/com/aizuda/boot/modules/gen/service/impl/GenTemplateServiceImpl.java

@@ -0,0 +1,33 @@
+package com.aizuda.boot.modules.gen.service.impl;
+
+import com.aizuda.core.api.ApiAssert;
+import com.aizuda.boot.modules.gen.entity.GenTemplate;
+import com.aizuda.boot.modules.gen.mapper.GenTemplateMapper;
+import com.aizuda.boot.modules.gen.service.IGenTemplateService;
+import com.aizuda.service.service.BaseServiceImpl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.stereotype.Service;
+
+/**
+ * 代码生成模板表 服务实现类
+ *
+ * @author 青苗
+ * @since 2024-08-25
+ */
+@Service
+public class GenTemplateServiceImpl extends BaseServiceImpl<GenTemplateMapper, GenTemplate> implements IGenTemplateService {
+
+    @Override
+    public Page<GenTemplate> page(Page<GenTemplate> page, GenTemplate genTemplate) {
+        LambdaQueryWrapper<GenTemplate> lqw = Wrappers.lambdaQuery(genTemplate);
+        return super.page(page, lqw);
+    }
+
+    @Override
+    public boolean updateById(GenTemplate genTemplate) {
+        ApiAssert.fail(null == genTemplate.getId(), "主键不存在无法更新");
+        return super.updateById(genTemplate);
+    }
+}

+ 1 - 1
src/main/java/com/aizuda/boot/modules/system/service/impl/SysDictServiceImpl.java

@@ -53,7 +53,7 @@ public class SysDictServiceImpl extends BaseServiceImpl<SysDictMapper, SysDict>
                 dictList = lambdaQuery().eq(SysDict::getPid, dictList.get(0).getId()).orderByDesc(SysDict::getSort).list();
             }
             // 表单下拉选择项列表转换
-            sovList = dictList.stream().map(t -> new SelectOptionVO(t.getName(), t.getContent())).toList();
+            sovList = dictList.stream().map(t -> SelectOptionVO.of(t.getName(), t.getContent())).toList();
         }
         return sovList;
     }