Эх сурвалжийг харах

!149 代码生成器支持 MySQL、Oracle、PostgreSQL、SQLServer、DM 等数据库
Merge pull request !149 from 芋道源码/feature/1.6.2

芋道源码 3 жил өмнө
parent
commit
99137289e1
58 өөрчлөгдсөн 459 нэмэгдсэн , 723 устгасан
  1. 18 2
      sql/ruoyi-vue-pro.sql
  2. 6 0
      yudao-dependencies/pom.xml
  3. 5 0
      yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml
  4. 3 3
      yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/JdbcUtils.java
  5. 4 0
      yudao-module-infra/yudao-module-infra-biz/pom.xml
  6. 14 41
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/CodegenController.java
  7. 22 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java
  8. 1 1
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/column/CodegenColumnBaseVO.java
  9. 0 4
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/table/CodegenTableBaseVO.java
  10. 3 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.java
  11. 17 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.java
  12. 0 25
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/table/SchemaTableRespVO.java
  13. 1 1
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigPageReqVO.java
  14. 2 2
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/vo/DataSourceConfigBaseVO.java
  15. 24 8
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/convert/codegen/CodegenConvert.java
  16. 1 2
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/codegen/CodegenColumnDO.java
  17. 4 3
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/codegen/CodegenTableDO.java
  18. 0 54
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/codegen/SchemaColumnDO.java
  19. 0 36
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/codegen/SchemaTableDO.java
  20. 5 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/db/DataSourceConfigDO.java
  21. 10 4
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/CodegenTableMapper.java
  22. 0 19
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/SchemaColumnMapper.java
  23. 0 26
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/SchemaTableMapper.java
  24. 0 23
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/enums/codegen/CodegenImportTypeEnum.java
  25. 9 39
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java
  26. 52 101
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java
  27. 13 55
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java
  28. 0 117
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenSQLParser.java
  29. 0 2
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigService.java
  30. 30 9
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImpl.java
  31. 33 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableService.java
  32. 65 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.java
  33. 14 3
      yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/sql/h2.vm
  34. 27 0
      yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/DefaultDatabaseQueryTest.java
  35. 5 5
      yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImplTest.java
  36. 0 0
      yudao-server/src/main/resources/admin-ui/static/js/12.js
  37. BIN
      yudao-server/src/main/resources/admin-ui/static/js/12.js.gz
  38. 0 0
      yudao-server/src/main/resources/admin-ui/static/js/17.js
  39. BIN
      yudao-server/src/main/resources/admin-ui/static/js/17.js.gz
  40. 0 0
      yudao-server/src/main/resources/admin-ui/static/js/26.js
  41. BIN
      yudao-server/src/main/resources/admin-ui/static/js/26.js.gz
  42. 0 0
      yudao-server/src/main/resources/admin-ui/static/js/27.js
  43. BIN
      yudao-server/src/main/resources/admin-ui/static/js/27.js.gz
  44. 0 0
      yudao-server/src/main/resources/admin-ui/static/js/28.js
  45. BIN
      yudao-server/src/main/resources/admin-ui/static/js/28.js.gz
  46. 0 0
      yudao-server/src/main/resources/admin-ui/static/js/5.js
  47. BIN
      yudao-server/src/main/resources/admin-ui/static/js/5.js.gz
  48. 0 0
      yudao-server/src/main/resources/admin-ui/static/js/6.js
  49. BIN
      yudao-server/src/main/resources/admin-ui/static/js/6.js.gz
  50. 0 0
      yudao-server/src/main/resources/admin-ui/static/js/8.js
  51. BIN
      yudao-server/src/main/resources/admin-ui/static/js/8.js.gz
  52. 0 0
      yudao-server/src/main/resources/admin-ui/static/js/app.js
  53. BIN
      yudao-server/src/main/resources/admin-ui/static/js/app.js.gz
  54. 3 18
      yudao-ui-admin/src/api/infra/codegen.js
  55. 1 1
      yudao-ui-admin/src/views/infra/codegen/editTable.vue
  56. 42 34
      yudao-ui-admin/src/views/infra/codegen/importTable.vue
  57. 22 82
      yudao-ui-admin/src/views/infra/codegen/index.vue
  58. 3 3
      yudao-ui-admin/src/views/infra/dataSourceConfig/index.vue

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 18 - 2
sql/ruoyi-vue-pro.sql


+ 6 - 0
yudao-dependencies/pom.xml

@@ -25,6 +25,7 @@
         <mysql.version>5.1.46</mysql.version>
         <druid.version>1.2.8</druid.version>
         <mybatis-plus.version>3.4.3.4</mybatis-plus.version>
+        <mybatis-plus-generator.version>3.5.2</mybatis-plus-generator.version>
         <dynamic-datasource.version>3.5.0</dynamic-datasource.version>
         <redisson.version>3.17.0</redisson.version>
         <!-- Config 配置中心相关 -->
@@ -193,6 +194,11 @@
                 <artifactId>mybatis-plus-boot-starter</artifactId>
                 <version>${mybatis-plus.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-generator</artifactId> <!-- 代码生成器,使用它解析表结构 -->
+                <version>${mybatis-plus-generator.version}</version>
+            </dependency>
             <dependency>
                 <groupId>com.baomidou</groupId>
                 <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <!-- 多数据源 -->

+ 5 - 0
yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml

@@ -38,6 +38,11 @@
             <artifactId>mysql-connector-java</artifactId>
             <version>${mysql.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.oracle.database.jdbc</groupId>
+            <artifactId>ojdbc8</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>druid-spring-boot-starter</artifactId>

+ 3 - 3
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/DatabaseUtils.java → yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/JdbcUtils.java

@@ -4,16 +4,16 @@ import java.sql.Connection;
 import java.sql.DriverManager;
 
 /**
- * 数据库工具类
+ * JDBC 工具类
  *
  * @author 芋道源码
  */
-public class DatabaseUtils {
+public class JdbcUtils {
 
     /**
      * 判断连接是否正确
      *
-     * @param url 数据源连接
+     * @param url      数据源连接
      * @param username 账号
      * @param password 密码
      * @return 是否正确

+ 4 - 0
yudao-module-infra/yudao-module-infra-biz/pom.xml

@@ -47,6 +47,10 @@
             <groupId>cn.iocoder.boot</groupId>
             <artifactId>yudao-spring-boot-starter-mybatis</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId> <!-- 代码生成器,使用它解析表结构 -->
+        </dependency>
 
         <dependency>
             <groupId>cn.iocoder.boot</groupId>

+ 14 - 41
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/CodegenController.java

@@ -4,19 +4,18 @@ import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.ZipUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
+import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO;
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.CodegenDetailRespVO;
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.CodegenPreviewRespVO;
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO;
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO;
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO;
-import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.SchemaTableRespVO;
+import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO;
 import cn.iocoder.yudao.module.infra.convert.codegen.CodegenConvert;
 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
-import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.SchemaTableDO;
 import cn.iocoder.yudao.module.infra.service.codegen.CodegenService;
-import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
-import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -33,7 +32,6 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@@ -50,19 +48,16 @@ public class CodegenController {
     @GetMapping("/db/table/list")
     @ApiOperation(value = "获得数据库自带的表定义列表", notes = "会过滤掉已经导入 Codegen 的表")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "tableName", value = "表名,模糊匹配", required = true, example = "yudao", dataTypeClass = String.class),
-            @ApiImplicitParam(name = "tableComment", value = "描述,模糊匹配", required = true, example = "芋道", dataTypeClass = String.class)
+            @ApiImplicitParam(name = "dataSourceConfigId", value = "数据源配置的编号", required = true, example = "1", dataTypeClass = Long.class),
+            @ApiImplicitParam(name = "name", value = "表名,模糊匹配", example = "yudao", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "comment", value = "描述,模糊匹配", example = "芋道", dataTypeClass = String.class)
     })
     @PreAuthorize("@ss.hasPermission('infra:codegen:query')")
-    public CommonResult<List<SchemaTableRespVO>> getSchemaTableList(
-            @RequestParam(value = "tableName", required = false) String tableName,
-            @RequestParam(value = "tableComment", required = false) String tableComment) {
-        // 获得数据库自带的表定义列表
-        List<SchemaTableDO> schemaTables = codegenService.getSchemaTableList(tableName, tableComment);
-        // 移除在 Codegen 中,已经存在的
-        Set<String> existsTables = CollectionUtils.convertSet(codegenService.getCodeGenTableList(), CodegenTableDO::getTableName);
-        schemaTables.removeIf(table -> existsTables.contains(table.getTableName()));
-        return success(CodegenConvert.INSTANCE.convertList04(schemaTables));
+    public CommonResult<List<DatabaseTableRespVO>> getDatabaseTableList(
+            @RequestParam(value = "dataSourceConfigId") Long dataSourceConfigId,
+            @RequestParam(value = "name", required = false) String name,
+            @RequestParam(value = "comment", required = false) String comment) {
+        return success(codegenService.getDatabaseTableList(dataSourceConfigId, name, comment));
     }
 
     @GetMapping("/table/page")
@@ -85,19 +80,10 @@ public class CodegenController {
     }
 
     @ApiOperation("基于数据库的表结构,创建代码生成器的表和字段定义")
-    @ApiImplicitParam(name = "tableNames", value = "表名数组", required = true, example = "sys_user", dataTypeClass = List.class)
-    @PostMapping("/create-list-from-db")
-    @PreAuthorize("@ss.hasPermission('infra:codegen:create')")
-    public CommonResult<List<Long>> createCodegenListFromDB(@RequestParam("tableNames") List<String> tableNames) {
-        return success(codegenService.createCodegenListFromDB(getLoginUserId(), tableNames));
-    }
-
-    @ApiOperation("基于 SQL 建表语句,创建代码生成器的表和字段定义")
-    @ApiImplicitParam(name = "sql", value = "SQL 建表语句", required = true, example = "sql", dataTypeClass = String.class)
-    @PostMapping("/create-list-from-sql")
+    @PostMapping("/create-list")
     @PreAuthorize("@ss.hasPermission('infra:codegen:create')")
-    public CommonResult<Long> createCodegenListFromSQL(@RequestParam("sql") String sql) {
-        return success(codegenService.createCodegenListFromSQL(getLoginUserId(), sql));
+    public CommonResult<List<Long>> createCodegenList(@Valid @RequestBody CodegenCreateListReqVO reqVO) {
+        return success(codegenService.createCodegenList(getLoginUserId(), reqVO));
     }
 
     @ApiOperation("更新数据库的表和字段定义")
@@ -117,19 +103,6 @@ public class CodegenController {
         return success(true);
     }
 
-    @ApiOperation("基于 SQL 建表语句,同步数据库的表和字段定义")
-    @PutMapping("/sync-from-sql")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class),
-            @ApiImplicitParam(name = "sql", value = "SQL 建表语句", required = true, example = "sql", dataTypeClass = String.class)
-    })
-    @PreAuthorize("@ss.hasPermission('infra:codegen:update')")
-    public CommonResult<Boolean> syncCodegenFromSQL(@RequestParam("tableId") Long tableId,
-                                                    @RequestParam("sql") String sql) {
-        codegenService.syncCodegenFromSQL(tableId, sql);
-        return success(true);
-    }
-
     @ApiOperation("删除数据库的表和字段定义")
     @DeleteMapping("/delete")
     @ApiImplicitParam(name = "tableId", value = "表编号", required = true, example = "1024", dataTypeClass = Long.class)

+ 22 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java

@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.infra.controller.admin.codegen.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@ApiModel("管理后台 - 基于数据库的表结构,创建代码生成器的表和字段定义 Request VO")
+@Data
+public class CodegenCreateListReqVO {
+
+    @ApiModelProperty(value = "数据源配置的编号", required = true, example = "1")
+    @NotNull(message = "数据源配置的编号不能为空")
+    private Long dataSourceConfigId;
+
+    @ApiModelProperty(value = "表名数组", required = true, example = "[1, 2, 3]")
+    @NotNull(message = "表名数组不能为空")
+    private List<String> tableNames;
+
+}

+ 1 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/column/CodegenColumnBaseVO.java

@@ -22,7 +22,7 @@ public class CodegenColumnBaseVO {
 
     @ApiModelProperty(value = "字段类型", required = true, example = "int(11)")
     @NotNull(message = "字段类型不能为空")
-    private String columnType;
+    private String dataType;
 
     @ApiModelProperty(value = "字段描述", required = true, example = "年龄")
     @NotNull(message = "字段描述不能为空")

+ 0 - 4
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/table/CodegenTableBaseVO.java

@@ -12,10 +12,6 @@ import javax.validation.constraints.NotNull;
 @Data
 public class CodegenTableBaseVO {
 
-    @ApiModelProperty(value = "导入类型", required = true, example = "1", notes = "参见 CodegenImportTypeEnum 枚举")
-    @NotNull(message = "导入类型不能为空")
-    private Integer importType;
-
     @ApiModelProperty(value = "生成场景", required = true, example = "1", notes = "参见 CodegenSceneEnum 枚举")
     @NotNull(message = "导入类型不能为空")
     private Integer scene;

+ 3 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.java

@@ -17,6 +17,9 @@ public class CodegenTableRespVO extends CodegenTableBaseVO {
     @ApiModelProperty(value = "编号", required = true, example = "1")
     private Long id;
 
+    @ApiModelProperty(value = "主键编号", required = true, example = "1024")
+    private Integer dataSourceConfigId;
+
     @ApiModelProperty(value = "创建时间", required = true)
     private Date createTime;
 

+ 17 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.java

@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel("管理后台 - 数据库的表定义 Response VO")
+@Data
+public class DatabaseTableRespVO {
+
+    @ApiModelProperty(value = "表名称", required = true, example = "yuanma")
+    private String name;
+
+    @ApiModelProperty(value = "表描述", required = true, example = "芋道源码")
+    private String comment;
+
+}

+ 0 - 25
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/table/SchemaTableRespVO.java

@@ -1,25 +0,0 @@
-package cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.Date;
-
-@ApiModel("管理后台 - 数据字典的表定义 Response VO")
-@Data
-public class SchemaTableRespVO {
-
-    @ApiModelProperty(value = "数据库", required = true, example = "yudao")
-    private String tableSchema;
-
-    @ApiModelProperty(value = "表名称", required = true, example = "yuanma")
-    private String tableName;
-
-    @ApiModelProperty(value = "表描述", required = true, example = "芋道源码")
-    private String tableComment;
-
-    @ApiModelProperty(value = "创建时间", required = true)
-    private Date createTime;
-
-}

+ 1 - 1
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/config/vo/ConfigPageReqVO.java

@@ -18,7 +18,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
 @ToString(callSuper = true)
 public class ConfigPageReqVO extends PageParam {
 
-    @ApiModelProperty(value = "数名称", example = "模糊匹配")
+    @ApiModelProperty(value = "数据源名称", example = "模糊匹配")
     private String name;
 
     @ApiModelProperty(value = "参数键名", example = "yunai.db.username", notes = "模糊匹配")

+ 2 - 2
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/vo/DataSourceConfigBaseVO.java

@@ -12,8 +12,8 @@ import javax.validation.constraints.*;
 @Data
 public class DataSourceConfigBaseVO {
 
-    @ApiModelProperty(value = "数名称", required = true, example = "test")
-    @NotNull(message = "数名称不能为空")
+    @ApiModelProperty(value = "数据源名称", required = true, example = "test")
+    @NotNull(message = "数据源名称不能为空")
     private String name;
 
     @ApiModelProperty(value = "数据源连接", required = true, example = "jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro")

+ 24 - 8
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/convert/codegen/CodegenConvert.java

@@ -6,12 +6,14 @@ import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.CodegenPreviewR
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO;
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.column.CodegenColumnRespVO;
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO;
-import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.SchemaTableRespVO;
+import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO;
 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
-import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.SchemaColumnDO;
-import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.SchemaTableDO;
+import com.baomidou.mybatisplus.generator.config.po.TableField;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
 import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
 import org.mapstruct.factory.Mappers;
 
 import java.util.List;
@@ -23,13 +25,27 @@ public interface CodegenConvert {
 
     CodegenConvert INSTANCE = Mappers.getMapper(CodegenConvert.class);
 
-    // ========== InformationSchemaTableDO 和 InformationSchemaColumnDO 相关 ==========
+    // ========== TableInfo 相关 ==========
 
-    CodegenTableDO convert(SchemaTableDO bean);
+    @Mappings({
+            @Mapping(source = "name", target = "tableName"),
+            @Mapping(source = "comment", target = "tableComment"),
+    })
+    CodegenTableDO convert(TableInfo bean);
 
-    List<CodegenColumnDO> convertList(List<SchemaColumnDO> list);
+    List<CodegenColumnDO> convertList(List<TableField> list);
 
-    CodegenTableRespVO convert(SchemaColumnDO bean);
+    @Mappings({
+            @Mapping(source = "name", target = "columnName"),
+            @Mapping(source = "type", target = "dataType"),
+            @Mapping(source = "comment", target = "columnComment"),
+            @Mapping(source = "metaInfo.nullable", target = "nullable"),
+            @Mapping(source = "keyFlag", target = "primaryKey"),
+            @Mapping(source = "keyIdentityFlag", target = "autoIncrement"),
+            @Mapping(source = "columnType.type", target = "javaType"),
+            @Mapping(source = "propertyName", target = "javaField"),
+    })
+    CodegenColumnDO convert(TableField bean);
 
     // ========== CodegenTableDO 相关 ==========
 
@@ -47,7 +63,7 @@ public interface CodegenConvert {
 
     List<CodegenColumnDO> convertList03(List<CodegenUpdateReqVO.Column> columns);
 
-    List<SchemaTableRespVO> convertList04(List<SchemaTableDO> list);
+    List<DatabaseTableRespVO> convertList04(List<TableInfo> list);
 
     // ========== 其它 ==========
 

+ 1 - 2
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/codegen/CodegenColumnDO.java

@@ -41,7 +41,7 @@ public class CodegenColumnDO extends BaseDO {
     /**
      * 字段类型
      */
-    private String columnType;
+    private String dataType;
     /**
      * 字段描述
      */
@@ -74,7 +74,6 @@ public class CodegenColumnDO extends BaseDO {
     /**
      * Java 属性名
      */
-//    @NotBlank(message = "Java属性不能为空")
     private String javaField;
     /**
      * 字典类型

+ 4 - 3
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/codegen/CodegenTableDO.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.infra.dal.dataobject.codegen;
 
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenSceneEnum;
 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -25,11 +26,11 @@ public class CodegenTableDO extends BaseDO {
     private Long id;
 
     /**
-     * 导入类型
+     * 数据源编号
      *
-     * 枚举 {@link CodegenTemplateTypeEnum}
+     * 关联 {@link DataSourceConfigDO#getId()}
      */
-    private Integer importType;
+    private Long dataSourceConfigId;
     /**
      * 生成场景
      *

+ 0 - 54
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/codegen/SchemaColumnDO.java

@@ -1,54 +0,0 @@
-package cn.iocoder.yudao.module.infra.dal.dataobject.codegen;
-
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Builder;
-import lombok.Data;
-
-/**
- * MySQL 数据库中的 column 字段定义
- *
- * @author 芋道源码
- */
-@TableName(value = "information_schema.columns", autoResultMap = true)
-@Data
-@Builder
-public class SchemaColumnDO {
-
-    /**
-     * 表名称
-     */
-    private String tableName;
-    /**
-     * 字段名
-     */
-    private String columnName;
-    /**
-     * 字段类型
-     */
-    private String columnType;
-    /**
-     * 字段描述
-     */
-    private String columnComment;
-    /**
-     * 是否允许为空
-     */
-    @TableField("case when is_nullable = 'yes' then '1' else '0' end")
-    private Boolean nullable;
-    /**
-     * 是否主键
-     */
-    @TableField("case when column_key = 'PRI' then '1' else '0' end")
-    private Boolean primaryKey;
-    /**
-     * 是否自增
-     */
-    @TableField("case when extra = 'auto_increment' then '1' else '0' end")
-    private Boolean autoIncrement;
-    /**
-     * 排序字段
-     */
-    private Integer ordinalPosition;
-
-}

+ 0 - 36
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/codegen/SchemaTableDO.java

@@ -1,36 +0,0 @@
-package cn.iocoder.yudao.module.infra.dal.dataobject.codegen;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Builder;
-import lombok.Data;
-
-import java.util.Date;
-
-/**
- * MySQL 数据库中的 table 表定义
- *
- * @author 芋道源码
- */
-@TableName(value = "information_schema.tables", autoResultMap = true)
-@Data
-@Builder
-public class SchemaTableDO {
-
-    /**
-     * 数据库
-     */
-    private String tableSchema;
-    /**
-     * 表名称
-     */
-    private String tableName;
-    /**
-     * 表描述
-     */
-    private String tableComment;
-    /**
-     * 创建时间
-     */
-    private Date createTime;
-
-}

+ 5 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/db/DataSourceConfigDO.java

@@ -13,6 +13,11 @@ import lombok.Data;
 @Data
 public class DataSourceConfigDO extends BaseDO {
 
+    /**
+     * 主键编号 - Master 数据源
+     */
+    public static final Long ID_MASTER = 0L;
+
     /**
      * 主键编号
      */

+ 10 - 4
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/CodegenTableMapper.java

@@ -3,16 +3,18 @@ package cn.iocoder.yudao.module.infra.dal.mysql.codegen;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
-import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 @Mapper
 public interface CodegenTableMapper extends BaseMapperX<CodegenTableDO> {
 
-    default CodegenTableDO selectByTableName(String tableName) {
-        return selectOne(new QueryWrapper<CodegenTableDO>().eq("table_name", tableName));
+    default CodegenTableDO selectByTableNameAndDataSourceConfigId(String tableName, Long dataSourceConfigId) {
+        return selectOne(CodegenTableDO::getTableName, tableName,
+                CodegenTableDO::getDataSourceConfigId, dataSourceConfigId);
     }
 
     default PageResult<CodegenTableDO> selectPage(CodegenTablePageReqVO pageReqVO) {
@@ -22,4 +24,8 @@ public interface CodegenTableMapper extends BaseMapperX<CodegenTableDO> {
                 .betweenIfPresent("create_time", pageReqVO.getBeginCreateTime(), pageReqVO.getEndCreateTime()));
     }
 
+    default List<CodegenTableDO> selectListByDataSourceConfigId(Long dataSourceConfigId) {
+        return selectList(CodegenTableDO::getDataSourceConfigId, dataSourceConfigId);
+    }
+
 }

+ 0 - 19
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/SchemaColumnMapper.java

@@ -1,19 +0,0 @@
-package cn.iocoder.yudao.module.infra.dal.mysql.codegen;
-
-import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
-import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.SchemaColumnDO;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.List;
-
-@Mapper
-public interface SchemaColumnMapper extends BaseMapperX<SchemaColumnDO> {
-
-    default List<SchemaColumnDO> selectListByTableName(String tableSchema, String tableName) {
-        return selectList(new QueryWrapper<SchemaColumnDO>().eq("table_name", tableName)
-                .eq("table_schema", tableSchema)
-                .orderByAsc("ordinal_position"));
-    }
-
-}

+ 0 - 26
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegen/SchemaTableMapper.java

@@ -1,26 +0,0 @@
-package cn.iocoder.yudao.module.infra.dal.mysql.codegen;
-
-import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
-import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
-import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.SchemaTableDO;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.Collection;
-import java.util.List;
-
-@Mapper
-public interface SchemaTableMapper extends BaseMapperX<SchemaTableDO> {
-
-    default List<SchemaTableDO> selectList(Collection<String> tableSchemas, String tableName, String tableComment) {
-        return selectList(new QueryWrapperX<SchemaTableDO>().in("table_schema", tableSchemas)
-                .likeIfPresent("table_name", tableName)
-                .likeIfPresent("table_comment", tableComment));
-    }
-
-    default SchemaTableDO selectByTableSchemaAndTableName(String tableSchema, String tableName) {
-        return selectOne(new QueryWrapper<SchemaTableDO>().eq("table_schema",tableSchema)
-                        .eq("table_name", tableName));
-    }
-
-}

+ 0 - 23
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/enums/codegen/CodegenImportTypeEnum.java

@@ -1,23 +0,0 @@
-package cn.iocoder.yudao.module.infra.enums.codegen;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * 代码生成的导入类型
- *
- * @author 芋道源码
- */
-@AllArgsConstructor
-@Getter
-public enum CodegenImportTypeEnum {
-
-    DB(1), // 从 information_schema 的 table 和 columns 表导入
-    SQL(2); // 基于建表 SQL 语句导入
-
-    /**
-     * 类型
-     */
-    private final Integer type;
-
-}

+ 9 - 39
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java

@@ -1,11 +1,12 @@
 package cn.iocoder.yudao.module.infra.service.codegen;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO;
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO;
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO;
+import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO;
 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
-import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.SchemaTableDO;
 
 import java.util.List;
 import java.util.Map;
@@ -17,32 +18,14 @@ import java.util.Map;
  */
 public interface CodegenService {
 
-    /**
-     * 基于 SQL 建表语句,创建代码生成器的表定义
-     *
-     * @param userId 用户编号
-     * @param sql SQL 建表语句
-     * @return 创建的表定义的编号
-     */
-    Long createCodegenListFromSQL(Long userId, String sql);
-
     /**
      * 基于数据库的表结构,创建代码生成器的表定义
      *
      * @param userId 用户编号
-     * @param tableName 表名称
-     * @return 创建的表定义的编号
-     */
-    Long createCodegen(Long userId, String tableName);
-
-    /**
-     * 基于 {@link #createCodegen(Long, String)} 的批量创建
-     *
-     * @param userId 用户编号
-     * @param tableNames 表名称数组
+     * @param reqVO 表信息
      * @return 创建的表定义的编号数组
      */
-    List<Long> createCodegenListFromDB(Long userId, List<String> tableNames);
+    List<Long> createCodegenList(Long userId, CodegenCreateListReqVO reqVO);
 
     /**
      * 更新数据库的表和字段定义
@@ -58,14 +41,6 @@ public interface CodegenService {
      */
     void syncCodegenFromDB(Long tableId);
 
-    /**
-     * 基于 SQL 建表语句,同步数据库的表和字段定义
-     *
-     * @param tableId 表编号
-     * @param sql SQL 建表语句
-     */
-    void syncCodegenFromSQL(Long tableId, String sql);
-
     /**
      * 删除数据库的表和字段定义
      *
@@ -89,13 +64,6 @@ public interface CodegenService {
      */
     CodegenTableDO getCodegenTablePage(Long id);
 
-    /**
-     * 获得全部表定义
-     *
-     * @return 表定义数组
-     */
-    List<CodegenTableDO> getCodeGenTableList();
-
     /**
      * 获得指定表的字段定义数组
      *
@@ -115,10 +83,12 @@ public interface CodegenService {
     /**
      * 获得数据库自带的表定义列表
      *
-     * @param tableName 表名称
-     * @param tableComment 表描述
+     *
+     * @param dataSourceConfigId 数据源的配置编号
+     * @param name 表名称
+     * @param comment 表描述
      * @return 表定义列表
      */
-    List<SchemaTableDO> getSchemaTableList(String tableName, String tableComment);
+    List<DatabaseTableRespVO> getDatabaseTableList(Long dataSourceConfigId, String name, String comment);
 
 }

+ 52 - 101
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java

@@ -3,24 +3,21 @@ package cn.iocoder.yudao.module.infra.service.codegen;
 import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO;
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO;
 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO;
+import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO;
 import cn.iocoder.yudao.module.infra.convert.codegen.CodegenConvert;
 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
-import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.SchemaColumnDO;
-import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.SchemaTableDO;
 import cn.iocoder.yudao.module.infra.dal.mysql.codegen.CodegenColumnMapper;
 import cn.iocoder.yudao.module.infra.dal.mysql.codegen.CodegenTableMapper;
-import cn.iocoder.yudao.module.infra.dal.mysql.codegen.SchemaColumnMapper;
-import cn.iocoder.yudao.module.infra.dal.mysql.codegen.SchemaTableMapper;
-import cn.iocoder.yudao.module.infra.enums.codegen.CodegenImportTypeEnum;
-import cn.iocoder.yudao.module.infra.framework.codegen.config.CodegenProperties;
 import cn.iocoder.yudao.module.infra.service.codegen.inner.CodegenBuilder;
 import cn.iocoder.yudao.module.infra.service.codegen.inner.CodegenEngine;
-import cn.iocoder.yudao.module.infra.service.codegen.inner.CodegenSQLParser;
+import cn.iocoder.yudao.module.infra.service.db.DatabaseTableService;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
-import org.apache.commons.collections4.KeyValue;
+import com.baomidou.mybatisplus.generator.config.po.TableField;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -43,9 +40,8 @@ import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.*;
 public class CodegenServiceImpl implements CodegenService {
 
     @Resource
-    private SchemaTableMapper schemaTableMapper;
-    @Resource
-    private SchemaColumnMapper schemaColumnMapper;
+    private DatabaseTableService databaseTableService;
+
     @Resource
     private CodegenTableMapper codegenTableMapper;
     @Resource
@@ -59,70 +55,47 @@ public class CodegenServiceImpl implements CodegenService {
     @Resource
     private CodegenEngine codegenEngine;
 
-    @Resource
-    private CodegenProperties codegenProperties;
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<Long> createCodegenList(Long userId, CodegenCreateListReqVO reqVO) {
+        List<Long> ids = new ArrayList<>(reqVO.getTableNames().size());
+        // 遍历添加。虽然效率会低一点,但是没必要做成完全批量,因为不会这么大量
+        reqVO.getTableNames().forEach(tableName -> ids.add(createCodegen(userId, reqVO.getDataSourceConfigId(), tableName)));
+        return ids;
+    }
+
+    public Long createCodegen(Long userId, Long dataSourceConfigId, String tableName) {
+        // 从数据库中,获得数据库表结构
+        TableInfo tableInfo = databaseTableService.getTable(dataSourceConfigId, tableName);
+        // 导入
+        return createCodegen0(userId, dataSourceConfigId, tableInfo);
+    }
 
-    private Long createCodegen0(Long userId, CodegenImportTypeEnum importType,
-                                SchemaTableDO schemaTable, List<SchemaColumnDO> schemaColumns) {
+    private Long createCodegen0(Long userId, Long dataSourceConfigId, TableInfo tableInfo) {
         // 校验导入的表和字段非空
-        if (schemaTable == null) {
+        if (tableInfo == null) {
             throw exception(CODEGEN_IMPORT_TABLE_NULL);
         }
-        if (CollUtil.isEmpty(schemaColumns)) {
+        if (CollUtil.isEmpty(tableInfo.getFields())) {
             throw exception(CODEGEN_IMPORT_COLUMNS_NULL);
         }
         // 校验是否已经存在
-        if (codegenTableMapper.selectByTableName(schemaTable.getTableName()) != null) {
+        if (codegenTableMapper.selectByTableNameAndDataSourceConfigId(tableInfo.getName(),
+                dataSourceConfigId) != null) {
             throw exception(CODEGEN_TABLE_EXISTS);
         }
 
         // 构建 CodegenTableDO 对象,插入到 DB 中
-        CodegenTableDO table = codegenBuilder.buildTable(schemaTable);
-        table.setImportType(importType.getType());
+        CodegenTableDO table = codegenBuilder.buildTable(tableInfo);
+        table.setDataSourceConfigId(dataSourceConfigId);
         table.setAuthor(userApi.getUser(userId).getNickname());
         codegenTableMapper.insert(table);
         // 构建 CodegenColumnDO 数组,插入到 DB 中
-        List<CodegenColumnDO> columns = codegenBuilder.buildColumns(table.getId(), schemaColumns);
+        List<CodegenColumnDO> columns = codegenBuilder.buildColumns(table.getId(), tableInfo.getFields());
         codegenColumnMapper.insertBatch(columns);
         return table.getId();
     }
 
-    @Override
-    public Long createCodegenListFromSQL(Long userId, String sql) {
-        // 从 SQL 中,获得数据库表结构
-        SchemaTableDO schemaTable;
-        List<SchemaColumnDO> schemaColumns;
-        try {
-            KeyValue<SchemaTableDO, List<SchemaColumnDO>> result = CodegenSQLParser.parse(sql);
-            schemaTable = result.getKey();
-            schemaColumns = result.getValue();
-        } catch (Exception ex) {
-            throw exception(CODEGEN_PARSE_SQL_ERROR);
-        }
-        // 导入
-        return this.createCodegen0(userId, CodegenImportTypeEnum.SQL, schemaTable, schemaColumns);
-    }
-
-    @Override
-    public Long createCodegen(Long userId, String tableName) {
-        // 获取当前schema
-        String tableSchema = codegenProperties.getDbSchemas().iterator().next();
-        // 从数据库中,获得数据库表结构
-        SchemaTableDO schemaTable = schemaTableMapper.selectByTableSchemaAndTableName(tableSchema, tableName);
-        List<SchemaColumnDO> schemaColumns = schemaColumnMapper.selectListByTableName(tableSchema, tableName);
-        // 导入
-        return this.createCodegen0(userId, CodegenImportTypeEnum.DB, schemaTable, schemaColumns);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public List<Long> createCodegenListFromDB(Long userId, List<String> tableNames) {
-        List<Long> ids = new ArrayList<>(tableNames.size());
-        // 遍历添加。虽然效率会低一点,但是没必要做成完全批量,因为不会这么大量
-        tableNames.forEach(tableName -> ids.add(createCodegen(userId, tableName)));
-        return ids;
-    }
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateCodegen(CodegenUpdateReqVO updateReqVO) {
@@ -147,56 +120,34 @@ public class CodegenServiceImpl implements CodegenService {
         if (table == null) {
             throw exception(CODEGEN_TABLE_NOT_EXISTS);
         }
-        String tableSchema = codegenProperties.getDbSchemas().iterator().next();
         // 从数据库中,获得数据库表结构
-        List<SchemaColumnDO> schemaColumns = schemaColumnMapper.selectListByTableName(tableSchema, table.getTableName());
-
-        // 执行同步
-        this.syncCodegen0(tableId, schemaColumns);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void syncCodegenFromSQL(Long tableId, String sql) {
-        // 校验是否已经存在
-        CodegenTableDO table = codegenTableMapper.selectById(tableId);
-        if (table == null) {
-            throw exception(CODEGEN_TABLE_NOT_EXISTS);
-        }
-        // 从 SQL 中,获得数据库表结构
-        List<SchemaColumnDO> schemaColumns;
-        try {
-            KeyValue<SchemaTableDO, List<SchemaColumnDO>> result = CodegenSQLParser.parse(sql);
-            schemaColumns = result.getValue();
-        } catch (Exception ex) {
-            throw exception(CODEGEN_PARSE_SQL_ERROR);
-        }
-
+        TableInfo tableInfo = databaseTableService.getTable(table.getDataSourceConfigId(), table.getTableName());
         // 执行同步
-        this.syncCodegen0(tableId, schemaColumns);
+        syncCodegen0(tableId, tableInfo);
     }
 
-    private void syncCodegen0(Long tableId, List<SchemaColumnDO> schemaColumns) {
+    private void syncCodegen0(Long tableId, TableInfo tableInfo) {
         // 校验导入的字段不为空
-        if (CollUtil.isEmpty(schemaColumns)) {
+        List<TableField> tableFields = tableInfo.getFields();
+        if (CollUtil.isEmpty(tableFields)) {
             throw exception(CODEGEN_SYNC_COLUMNS_NULL);
         }
-        Set<String> schemaColumnNames = CollectionUtils.convertSet(schemaColumns, SchemaColumnDO::getColumnName);
+        Set<String> tableFieldNames = CollectionUtils.convertSet(tableFields, TableField::getName);
 
         // 构建 CodegenColumnDO 数组,只同步新增的字段
         List<CodegenColumnDO> codegenColumns = codegenColumnMapper.selectListByTableId(tableId);
         Set<String> codegenColumnNames = CollectionUtils.convertSet(codegenColumns, CodegenColumnDO::getColumnName);
         // 移除已经存在的字段
-        schemaColumns.removeIf(column -> codegenColumnNames.contains(column.getColumnName()));
+        tableFields.removeIf(column -> codegenColumnNames.contains(column.getColumnName()));
         // 计算需要删除的字段
-        Set<Long> deleteColumnIds = codegenColumns.stream().filter(column -> !schemaColumnNames.contains(column.getColumnName()))
+        Set<Long> deleteColumnIds = codegenColumns.stream().filter(column -> !tableFieldNames.contains(column.getColumnName()))
                 .map(CodegenColumnDO::getId).collect(Collectors.toSet());
-        if (CollUtil.isEmpty(schemaColumns) && CollUtil.isEmpty(deleteColumnIds)) {
+        if (CollUtil.isEmpty(tableFields) && CollUtil.isEmpty(deleteColumnIds)) {
             throw exception(CODEGEN_SYNC_NONE_CHANGE);
         }
 
         // 插入新增的字段
-        List<CodegenColumnDO> columns = codegenBuilder.buildColumns(tableId, schemaColumns);
+        List<CodegenColumnDO> columns = codegenBuilder.buildColumns(tableId, tableFields);
         codegenColumnMapper.insertBatch(columns);
         // 删除不存在的字段
         if (CollUtil.isNotEmpty(deleteColumnIds)) {
@@ -228,11 +179,6 @@ public class CodegenServiceImpl implements CodegenService {
         return codegenTableMapper.selectById(id);
     }
 
-    @Override
-    public List<CodegenTableDO> getCodeGenTableList() {
-        return codegenTableMapper.selectList();
-    }
-
     @Override
     public List<CodegenColumnDO> getCodegenColumnListByTableId(Long tableId) {
         return codegenColumnMapper.selectListByTableId(tableId);
@@ -255,13 +201,18 @@ public class CodegenServiceImpl implements CodegenService {
     }
 
     @Override
-    public List<SchemaTableDO> getSchemaTableList(String tableName, String tableComment) {
-        List<SchemaTableDO> tables = schemaTableMapper.selectList(codegenProperties.getDbSchemas(), tableName, tableComment);
-        // TODO 强制移除 Quartz 的表,未来做成可配置
-        tables.removeIf(table -> table.getTableName().startsWith("QRTZ_"));
-        tables.removeIf(table -> table.getTableName().startsWith("ACT_"));
-        tables.removeIf(table -> table.getTableName().startsWith("FLW_"));
-        return tables;
+    public List<DatabaseTableRespVO> getDatabaseTableList(Long dataSourceConfigId, String name, String comment) {
+        List<TableInfo> tables = databaseTableService.getTableList(dataSourceConfigId, name, comment);
+        // 移除置顶前缀的表名 // TODO 未来做成可配置
+        tables.removeIf(table -> table.getName().startsWith("QRTZ_"));
+        tables.removeIf(table -> table.getName().startsWith("ACT_"));
+        tables.removeIf(table -> table.getName().startsWith("FLW_"));
+        // 移除已经生成的表
+        // 移除在 Codegen 中,已经存在的
+        Set<String> existsTables = CollectionUtils.convertSet(
+                codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId), CodegenTableDO::getTableName);
+        tables.removeIf(table -> existsTables.contains(table.getName()));
+        return CodegenConvert.INSTANCE.convertList04(tables);
     }
 
 }

+ 13 - 55
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java

@@ -7,23 +7,22 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import cn.iocoder.yudao.module.infra.convert.codegen.CodegenConvert;
 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
 import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
-import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.SchemaColumnDO;
-import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.SchemaTableDO;
 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenColumnHtmlTypeEnum;
 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenColumnListConditionEnum;
 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum;
+import com.baomidou.mybatisplus.generator.config.po.TableField;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
 import com.google.common.collect.Sets;
 import org.springframework.stereotype.Component;
 
-import java.math.BigDecimal;
 import java.util.*;
 
 import static cn.hutool.core.text.CharSequenceUtil.*;
 
 /**
  * 代码生成器的 Builder,负责:
- * 1. 将数据库的表 {@link SchemaTableDO} 定义,构建成 {@link CodegenTableDO}
- * 2. 将数据库的列 {@link SchemaColumnDO} 构定义,建成 {@link CodegenColumnDO}
+ * 1. 将数据库的表 {@link TableInfo} 定义,构建成 {@link CodegenTableDO}
+ * 2. 将数据库的列 {@link TableField} 构定义,建成 {@link CodegenColumnDO}
  */
 @Component
 public class CodegenBuilder {
@@ -82,21 +81,6 @@ public class CodegenBuilder {
      */
     private static final Set<String> LIST_OPERATION_RESULT_EXCLUDE_COLUMN = Sets.newHashSet();
 
-    /**
-     * Java 类型与 MySQL 类型的映射关系
-     */
-    private static final Map<String, Set<String>> javaTypeMappings = MapUtil.<String, Set<String>>builder()
-            .put(Boolean.class.getSimpleName(), Sets.newHashSet("bit"))
-            .put(Integer.class.getSimpleName(), Sets.newHashSet("tinyint", "smallint", "mediumint", "int"))
-            .put(Long.class.getSimpleName(), Collections.singleton("bigint"))
-            .put(Double.class.getSimpleName(), Sets.newHashSet("float", "double"))
-            .put(BigDecimal.class.getSimpleName(), Sets.newHashSet("decimal", "numeric"))
-            .put(String.class.getSimpleName(), Sets.newHashSet("tinytext", "text", "mediumtext", "longtext", // 长文本
-                    "char", "varchar", "nvarchar", "varchar2")) // 短文本
-            .put(Date.class.getSimpleName(), Sets.newHashSet("datetime", "time", "date", "timestamp"))
-            .put("byte[]", Sets.newHashSet("blob"))
-            .build();
-
     static {
         Arrays.stream(ReflectUtil.getFields(BaseDO.class)).forEach(field -> BASE_DO_FIELDS.add(field.getName()));
         BASE_DO_FIELDS.add(TENANT_ID_FIELD);
@@ -109,8 +93,8 @@ public class CodegenBuilder {
         LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是需要返回的
     }
 
-    public CodegenTableDO buildTable(SchemaTableDO schemaTable) {
-        CodegenTableDO table = CodegenConvert.INSTANCE.convert(schemaTable);
+    public CodegenTableDO buildTable(TableInfo tableInfo) {
+        CodegenTableDO table = CodegenConvert.INSTANCE.convert(tableInfo);
         initTableDefault(table);
         return table;
     }
@@ -133,45 +117,19 @@ public class CodegenBuilder {
         table.setTemplateType(CodegenTemplateTypeEnum.CRUD.getType());
     }
 
-    public List<CodegenColumnDO> buildColumns(Long tableId, List<SchemaColumnDO> schemaColumns) {
-        List<CodegenColumnDO> columns = CodegenConvert.INSTANCE.convertList(schemaColumns);
+    public List<CodegenColumnDO> buildColumns(Long tableId, List<TableField> tableFields) {
+        List<CodegenColumnDO> columns = CodegenConvert.INSTANCE.convertList(tableFields);
+        int index = 1;
         for (CodegenColumnDO column : columns) {
             column.setTableId(tableId);
-            initColumnDefault(column);
+            column.setOrdinalPosition(index++);
+            // 初始化 Column 列的默认字段
+            processColumnOperation(column); // 处理 CRUD 相关的字段的默认值
+            processColumnUI(column); // 处理 UI 相关的字段的默认值
         }
         return columns;
     }
 
-    /**
-     * 初始化 Column 列的默认字段
-     *
-     * @param column 列定义
-     */
-    private void initColumnDefault(CodegenColumnDO column) {
-        // 处理 Java 相关的字段的默认值
-        processColumnJava(column);
-        // 处理 CRUD 相关的字段的默认值
-        processColumnOperation(column);
-        // 处理 UI 相关的字段的默认值
-        processColumnUI(column);
-    }
-
-    private void processColumnJava(CodegenColumnDO column) {
-        // 处理 javaField 字段
-        column.setJavaField(toCamelCase(column.getColumnName()));
-        // 处理 dictType 字段,暂无
-        // 处理 javaType 字段(兼容无符号类型)
-        String dbType = replaceIgnoreCase(subBefore(column.getColumnType(), '(', false),
-                " UNSIGNED", "");
-        javaTypeMappings.entrySet().stream()
-                .filter(entry -> entry.getValue().contains(dbType))
-                .findFirst().ifPresent(entry -> column.setJavaType(entry.getKey()));
-        if (column.getJavaType() == null) {
-            throw new IllegalStateException(String.format("column(%s) 的数据库类型(%s) 找不到匹配的 Java 类型",
-                    column.getColumnName(), column.getColumnType()));
-        }
-    }
-
     private void processColumnOperation(CodegenColumnDO column) {
         // 处理 createOperation 字段
         column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField())

+ 0 - 117
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenSQLParser.java

@@ -1,117 +0,0 @@
-package cn.iocoder.yudao.module.infra.service.codegen.inner;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.SchemaColumnDO;
-import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.SchemaTableDO;
-import com.alibaba.druid.DbType;
-import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
-import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
-import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
-import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
-import com.alibaba.druid.sql.ast.statement.SQLTableElement;
-import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement;
-import com.alibaba.druid.sql.repository.SchemaRepository;
-import org.apache.commons.collections4.KeyValue;
-import org.apache.commons.collections4.keyvalue.DefaultKeyValue;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-import static com.alibaba.druid.sql.SQLUtils.normalize;
-
-/**
- * SQL 解析器,将创建表的 SQL,解析成 {@link SchemaTableDO} 和 {@link SchemaColumnDO} 对象,
- * 后续可以基于它们,生成代码~
- *
- * @author 芋道源码
- */
-public class CodegenSQLParser {
-
-    /**
-     * 解析建表 SQL 语句,返回 {@link SchemaTableDO} 和 {@link SchemaColumnDO} 对象
-     *
-     * @param sql 建表 SQL 语句
-     * @return 解析结果
-     */
-    public static KeyValue<SchemaTableDO, List<SchemaColumnDO>> parse(String sql) {
-        // 解析 SQL 成 Statement
-        SQLCreateTableStatement statement = parseCreateSQL(sql);
-        // 解析 Table 表
-        SchemaTableDO table = parseTable(statement);
-        // 解析 Column 字段
-        List<SchemaColumnDO> columns = parseColumns(statement);
-        columns.forEach(column -> column.setTableName(table.getTableName()));
-        // 返回
-        return new DefaultKeyValue<>(table, columns);
-    }
-
-    /**
-     * 使用 Druid 工具,建表 SQL 语句
-     *
-     * @param sql 建表 SQL 语句
-     * @return 创建 Statement
-     */
-    private static SQLCreateTableStatement parseCreateSQL(String sql) {
-        // 解析 SQL
-        SchemaRepository repository = new SchemaRepository(DbType.mysql);
-        repository.console(sql);
-        // 获得该表对应的 MySqlCreateTableStatement 对象
-        String tableName = CollUtil.getFirst(repository.getDefaultSchema().getObjects()).getName();
-        return (MySqlCreateTableStatement) repository.findTable(tableName).getStatement();
-    }
-
-    private static SchemaTableDO parseTable(SQLCreateTableStatement statement) {
-        return SchemaTableDO.builder()
-                .tableName(statement.getTableSource().getTableName(true))
-                .tableComment(getCommentText(statement))
-                .build();
-    }
-
-    private static String getCommentText(SQLCreateTableStatement statement) {
-        if (statement == null || statement.getComment() == null) {
-            return "";
-        }
-        return ((SQLCharExpr) statement.getComment()).getText();
-    }
-
-    private static List<SchemaColumnDO> parseColumns(SQLCreateTableStatement statement) {
-        List<SchemaColumnDO> columns = new ArrayList<>();
-        statement.getTableElementList().forEach(element -> parseColumn(columns, element));
-        return columns;
-    }
-
-    private static void parseColumn(List<SchemaColumnDO> columns, SQLTableElement element) {
-        // 处理主键
-        if (element instanceof SQLPrimaryKey) {
-            parsePrimaryKey(columns, (SQLPrimaryKey) element);
-            return;
-        }
-        // 处理字段定义
-        if (element instanceof SQLColumnDefinition) {
-            parseColumnDefinition(columns, (SQLColumnDefinition) element);
-        }
-    }
-
-    private static void parsePrimaryKey(List<SchemaColumnDO> columns, SQLPrimaryKey primaryKey) {
-        String columnName = normalize(primaryKey.getColumns().get(0).toString()); // 暂时不考虑联合主键
-        // 匹配 columns 主键字段,设置为 primary
-        columns.stream().filter(column -> column.getColumnName().equals(columnName))
-            .forEach(column -> column.setPrimaryKey(true));
-    }
-
-    private static void parseColumnDefinition(List<SchemaColumnDO> columns, SQLColumnDefinition definition) {
-        String text = definition.toString().toUpperCase();
-        columns.add(SchemaColumnDO.builder()
-                .columnName(normalize(definition.getColumnName()))
-                .columnType(definition.getDataType().toString())
-                .columnComment(Objects.isNull(definition.getComment()) ? ""
-                        : normalize(definition.getComment().toString()))
-                .nullable(!text.contains(" NOT NULL"))
-                .primaryKey(false)
-                .autoIncrement(text.contains("AUTO_INCREMENT"))
-                .ordinalPosition(columns.size() + 1)
-                .build());
-    }
-
-}

+ 0 - 2
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigService.java

@@ -1,10 +1,8 @@
 package cn.iocoder.yudao.module.infra.service.db;
 
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.infra.controller.admin.db.vo.DataSourceConfigCreateReqVO;
 import cn.iocoder.yudao.module.infra.controller.admin.db.vo.DataSourceConfigUpdateReqVO;
 import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
-import org.w3c.dom.stylesheets.LinkStyle;
 
 import javax.validation.Valid;
 import java.util.List;

+ 30 - 9
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImpl.java

@@ -1,22 +1,20 @@
 package cn.iocoder.yudao.module.infra.service.db;
 
-import cn.hutool.db.DbUtil;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.mybatis.core.util.DatabaseUtils;
+import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
 import cn.iocoder.yudao.module.infra.controller.admin.db.vo.DataSourceConfigCreateReqVO;
 import cn.iocoder.yudao.module.infra.controller.admin.db.vo.DataSourceConfigUpdateReqVO;
 import cn.iocoder.yudao.module.infra.convert.db.DataSourceConfigConvert;
 import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
 import cn.iocoder.yudao.module.infra.dal.mysql.db.DataSourceConfigMapper;
-import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils;
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
 import org.jasypt.encryption.StringEncryptor;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
-
-import java.sql.Connection;
 import java.util.List;
+import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_EXISTS;
@@ -37,6 +35,9 @@ public class DataSourceConfigServiceImpl implements DataSourceConfigService {
     @Resource
     private StringEncryptor stringEncryptor;
 
+    @Resource
+    private DynamicDataSourceProperties dynamicDataSourceProperties;
+
     @Override
     public Long createDataSourceConfig(DataSourceConfigCreateReqVO createReqVO) {
         DataSourceConfigDO dataSourceConfig = DataSourceConfigConvert.INSTANCE.convert(createReqVO);
@@ -77,21 +78,41 @@ public class DataSourceConfigServiceImpl implements DataSourceConfigService {
 
     @Override
     public DataSourceConfigDO getDataSourceConfig(Long id) {
+        // 如果 id 为 0,默认为 master 的数据源
+        if (Objects.equals(id, DataSourceConfigDO.ID_MASTER)) {
+            return buildMasterDataSourceConfig();
+        }
+        // 从 DB 中读取
         DataSourceConfigDO dataSourceConfig = dataSourceConfigMapper.selectById(id);
-        dataSourceConfig.setPassword(stringEncryptor.decrypt(dataSourceConfig.getPassword()));
+        try {
+            dataSourceConfig.setPassword(stringEncryptor.decrypt(dataSourceConfig.getPassword()));
+        } catch (Exception ignore) { // 解码失败,则不解码
+        }
         return dataSourceConfig;
     }
 
     @Override
     public List<DataSourceConfigDO> getDataSourceConfigList() {
-        return dataSourceConfigMapper.selectList();
+        List<DataSourceConfigDO> result = dataSourceConfigMapper.selectList();
+        // 补充 master 数据源
+        result.add(0, buildMasterDataSourceConfig());
+        return result;
     }
 
     private void checkConnectionOK(DataSourceConfigDO config) {
-        boolean success = DatabaseUtils.isConnectionOK(config.getUrl(), config.getUsername(), config.getPassword());
+        boolean success = JdbcUtils.isConnectionOK(config.getUrl(), config.getUsername(), config.getPassword());
         if (!success) {
             throw exception(DATA_SOURCE_CONFIG_NOT_OK);
         }
     }
 
+    private DataSourceConfigDO buildMasterDataSourceConfig() {
+        String primary = dynamicDataSourceProperties.getPrimary();
+        DataSourceProperty dataSourceProperty = dynamicDataSourceProperties.getDatasource().get(primary);
+        return new DataSourceConfigDO().setId(DataSourceConfigDO.ID_MASTER).setName(primary)
+                .setUrl(dataSourceProperty.getUrl())
+                .setUsername(dataSourceProperty.getUsername())
+                .setPassword(dataSourceProperty.getPassword());
+    }
+
 }

+ 33 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableService.java

@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.infra.service.db;
+
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+
+import java.util.List;
+
+/**
+ * 数据库表 Service
+ *
+ * @author 芋道源码
+ */
+public interface DatabaseTableService {
+
+    /**
+     * 获得表列表,基于表名称 + 表描述进行模糊匹配
+     *
+     * @param dataSourceConfigId 数据源配置的编号
+     * @param nameLike 表名称,模糊匹配
+     * @param commentLike 表描述,模糊匹配
+     * @return 表列表
+     */
+    List<TableInfo> getTableList(Long dataSourceConfigId, String nameLike, String commentLike);
+
+    /**
+     * 获得指定表名
+     *
+     * @param dataSourceConfigId 数据源配置的编号
+     * @param tableName 表名称
+     * @return 表
+     */
+    TableInfo getTable(Long dataSourceConfigId, String tableName);
+
+}

+ 65 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/db/DatabaseTableServiceImpl.java

@@ -0,0 +1,65 @@
+package cn.iocoder.yudao.module.infra.service.db;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 数据库表 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+public class DatabaseTableServiceImpl implements DatabaseTableService {
+
+    @Resource
+    private DataSourceConfigService dataSourceConfigService;
+
+    @Override
+    public List<TableInfo> getTableList(Long dataSourceConfigId, String nameLike, String commentLike) {
+        List<TableInfo> tables = getTableList0(dataSourceConfigId, null);
+        return tables.stream().filter(tableInfo -> (StrUtil.isEmpty(nameLike) || tableInfo.getName().contains(nameLike))
+                        && (StrUtil.isEmpty(commentLike) || tableInfo.getComment().contains(commentLike)))
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public TableInfo getTable(Long dataSourceConfigId, String name) {
+        return CollUtil.getFirst(getTableList0(dataSourceConfigId, name));
+    }
+
+    public List<TableInfo> getTableList0(Long dataSourceConfigId, String name) {
+        // 获得数据源配置
+        DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId);
+        Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId);
+
+        // 使用 MyBatis Plus Generator 解析表结构
+        DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(),
+                config.getPassword()).build();
+        StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder();
+        if (StrUtil.isNotEmpty(name)) {
+            strategyConfig.addInclude(name);
+        }
+        GlobalConfig globalConfig = new GlobalConfig.Builder().dateType(DateType.ONLY_DATE).build(); // 只使用 Date 类型,不使用 LocalDate
+        ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfig, strategyConfig.build(),
+                null, globalConfig, null);
+        // 按照名字排序
+        List<TableInfo> tables = builder.getTableInfoList();
+        tables.sort(Comparator.comparing(TableInfo::getName));
+        return tables;
+    }
+
+}

+ 14 - 3
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/sql/h2.vm

@@ -1,19 +1,30 @@
 -- 将该建表 SQL 语句,添加到 yudao-module-${table.moduleName}-biz 模块的 test/resources/sql/create_tables.sql 文件里
 CREATE TABLE IF NOT EXISTS "${table.tableName}" (
 #foreach ($column in $columns)
+#if (${column.javaType} == 'Long')
+    #set ($dataType='bigint')
+#elseif (${column.javaType} == 'Integer')
+    #set ($dataType='int')
+#elseif (${column.javaType} == 'Boolean')
+    #set ($dataType='bit')
+#elseif (${column.javaType} == 'Date')
+    #set ($dataType='datetime')
+#else
+    #set ($dataType='varchar')
+#end
     #if (${column.primaryKey})##处理主键
-    "${column.javaField}"#if (${column.javaType} == 'String') ${column.columnType} NOT NULL#else ${column.columnType} NOT NULL GENERATED BY DEFAULT AS IDENTITY#end,
+    "${column.javaField}"#if (${column.javaType} == 'String') ${dataType} NOT NULL#else ${dataType} NOT NULL GENERATED BY DEFAULT AS IDENTITY#end,
     #else
     #if (${column.columnName} == 'create_time')
     "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
     #elseif (${column.columnName} == 'update_time')
     "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
     #elseif (${column.columnName} == 'creator' || ${column.columnName} == 'updater')
-    "${column.columnName}" ${column.columnType} DEFAULT '',
+    "${column.columnName}" ${dataType} DEFAULT '',
     #elseif (${column.columnName} == 'deleted')
     "deleted" bit NOT NULL DEFAULT FALSE,
     #else
-    "${column.columnName}" ${column.columnType}#if (${column.nullable} == false) NOT NULL#end,
+    "${column.columnName}" ${dataType}#if (${column.nullable} == false) NOT NULL#end,
     #end
     #end
 #end

+ 27 - 0
yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/DefaultDatabaseQueryTest.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.infra.service;
+
+import com.baomidou.mybatisplus.generator.IDatabaseQuery.DefaultDatabaseQuery;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+
+import java.util.List;
+
+public class DefaultDatabaseQueryTest {
+
+    public static void main(String[] args) {
+        DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder("jdbc:oracle:thin:@127.0.0.1:1521:xe",
+                "root", "123456").build();
+//        StrategyConfig strategyConfig = new StrategyConfig.Builder().build();
+
+        ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfig, null, null, null, null);
+
+        DefaultDatabaseQuery query = new DefaultDatabaseQuery(builder);
+
+        long time = System.currentTimeMillis();
+        List<TableInfo> tableInfos = query.queryTables();
+        System.out.println(tableInfos.size());
+        System.out.println(System.currentTimeMillis() - time);
+    }
+
+}

+ 5 - 5
yudao-module-infra/yudao-module-infra-biz/src/test/java/cn/iocoder/yudao/module/infra/service/db/DataSourceConfigServiceImplTest.java

@@ -1,6 +1,6 @@
 package cn.iocoder.yudao.module.infra.service.db;
 
-import cn.iocoder.yudao.framework.mybatis.core.util.DatabaseUtils;
+import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
 import cn.iocoder.yudao.module.infra.controller.admin.db.vo.DataSourceConfigCreateReqVO;
 import cn.iocoder.yudao.module.infra.controller.admin.db.vo.DataSourceConfigUpdateReqVO;
@@ -41,12 +41,12 @@ public class DataSourceConfigServiceImplTest extends BaseDbUnitTest {
 
     @Test
     public void testCreateDataSourceConfig_success() {
-        try (MockedStatic<DatabaseUtils> databaseUtilsMock = mockStatic(DatabaseUtils.class)) {
+        try (MockedStatic<JdbcUtils> databaseUtilsMock = mockStatic(JdbcUtils.class)) {
             // 准备参数
             DataSourceConfigCreateReqVO reqVO = randomPojo(DataSourceConfigCreateReqVO.class);
             // mock 方法
             when(stringEncryptor.encrypt(eq(reqVO.getPassword()))).thenReturn("123456");
-            databaseUtilsMock.when(() -> DatabaseUtils.isConnectionOK(eq(reqVO.getUrl()),
+            databaseUtilsMock.when(() -> JdbcUtils.isConnectionOK(eq(reqVO.getUrl()),
                     eq(reqVO.getUsername()), eq(reqVO.getPassword()))).thenReturn(true);
 
             // 调用
@@ -62,7 +62,7 @@ public class DataSourceConfigServiceImplTest extends BaseDbUnitTest {
 
     @Test
     public void testUpdateDataSourceConfig_success() {
-        try (MockedStatic<DatabaseUtils> databaseUtilsMock = mockStatic(DatabaseUtils.class)) {
+        try (MockedStatic<JdbcUtils> databaseUtilsMock = mockStatic(JdbcUtils.class)) {
             // mock 数据
             DataSourceConfigDO dbDataSourceConfig = randomPojo(DataSourceConfigDO.class);
             dataSourceConfigMapper.insert(dbDataSourceConfig);// @Sql: 先插入出一条存在的数据
@@ -72,7 +72,7 @@ public class DataSourceConfigServiceImplTest extends BaseDbUnitTest {
             });
             // mock 方法
             when(stringEncryptor.encrypt(eq(reqVO.getPassword()))).thenReturn("123456");
-            databaseUtilsMock.when(() -> DatabaseUtils.isConnectionOK(eq(reqVO.getUrl()),
+            databaseUtilsMock.when(() -> JdbcUtils.isConnectionOK(eq(reqVO.getUrl()),
                     eq(reqVO.getUsername()), eq(reqVO.getPassword()))).thenReturn(true);
 
             // 调用

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
yudao-server/src/main/resources/admin-ui/static/js/12.js


BIN
yudao-server/src/main/resources/admin-ui/static/js/12.js.gz


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
yudao-server/src/main/resources/admin-ui/static/js/17.js


BIN
yudao-server/src/main/resources/admin-ui/static/js/17.js.gz


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
yudao-server/src/main/resources/admin-ui/static/js/26.js


BIN
yudao-server/src/main/resources/admin-ui/static/js/26.js.gz


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
yudao-server/src/main/resources/admin-ui/static/js/27.js


BIN
yudao-server/src/main/resources/admin-ui/static/js/27.js.gz


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
yudao-server/src/main/resources/admin-ui/static/js/28.js


BIN
yudao-server/src/main/resources/admin-ui/static/js/28.js.gz


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
yudao-server/src/main/resources/admin-ui/static/js/5.js


BIN
yudao-server/src/main/resources/admin-ui/static/js/5.js.gz


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
yudao-server/src/main/resources/admin-ui/static/js/6.js


BIN
yudao-server/src/main/resources/admin-ui/static/js/6.js.gz


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
yudao-server/src/main/resources/admin-ui/static/js/8.js


BIN
yudao-server/src/main/resources/admin-ui/static/js/8.js.gz


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
yudao-server/src/main/resources/admin-ui/static/js/app.js


BIN
yudao-server/src/main/resources/admin-ui/static/js/app.js.gz


+ 3 - 18
yudao-ui-admin/src/api/infra/codegen.js

@@ -73,26 +73,11 @@ export function getSchemaTableList(query) {
 }
 
 // 基于数据库的表结构,创建代码生成器的表定义
-export function createCodegenListFromDB(tableNames) {
+export function createCodegenList(data) {
   return request({
-    url: '/infra/codegen/create-list-from-db',
+    url: '/infra/codegen/create-list',
     method: 'post',
-    headers:{
-      'Content-type': 'application/x-www-form-urlencoded'
-    },
-    data: 'tableNames=' + tableNames
-  })
-}
-
-// 基于 SQL 建表语句,创建代码生成器的表定义
-export function createCodegenListFromSQL(data) {
-  return request({
-    url: '/infra/codegen/create-list-from-sql',
-    method: 'post',
-    headers:{
-      'Content-type': 'application/x-www-form-urlencoded'
-    },
-    data: 'sql=' + data.sql,
+    data: data
   })
 }
 

+ 1 - 1
yudao-ui-admin/src/views/infra/codegen/editTable.vue

@@ -19,7 +19,7 @@
           </el-table-column>
           <el-table-column
             label="物理类型"
-            prop="columnType"
+            prop="dataType"
             min-width="10%"
             :show-overflow-tooltip="true"
           />

+ 42 - 34
yudao-ui-admin/src/views/infra/codegen/importTable.vue

@@ -1,24 +1,18 @@
 <template>
   <!-- 导入表 -->
   <el-dialog title="导入表" :visible.sync="visible" width="800px" top="5vh" append-to-body>
-    <el-form :model="queryParams" ref="queryForm" :inline="true">
-      <el-form-item label="表名称" prop="tableName">
-        <el-input
-          v-model="queryParams.tableName"
-          placeholder="请输入表名称"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
+      <el-form-item label="数据源" prop="dataSourceConfigId">
+        <el-select v-model="queryParams.dataSourceConfigId" placeholder="请选择数据源" clearable>
+          <el-option v-for="config in dataSourceConfigs"
+                     :key="config.id" :label="config.name" :value="config.id"/>
+        </el-select>
       </el-form-item>
-      <el-form-item label="表描述" prop="tableComment">
-        <el-input
-          v-model="queryParams.tableComment"
-          placeholder="请输入表描述"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
+      <el-form-item label="表名称" prop="name">
+        <el-input v-model="queryParams.name" placeholder="请输入表名称" clearable  @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="表描述" prop="comment">
+        <el-input v-model="queryParams.comment" placeholder="请输入表描述" clearable @keyup.enter.native="handleQuery"/>
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -26,16 +20,11 @@
       </el-form-item>
     </el-form>
     <el-row>
-      <el-table @row-click="clickRow" ref="table" :data="dbTableList" @selection-change="handleSelectionChange" height="260px">
-        <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="tableSchema" label="数据库" :show-overflow-tooltip="true"></el-table-column>
-        <el-table-column prop="tableName" label="表名称" :show-overflow-tooltip="true"></el-table-column>
-        <el-table-column prop="tableComment" label="表描述" :show-overflow-tooltip="true"></el-table-column>
-        <el-table-column prop="createTime" label="创建时间">
-          <template slot-scope="scope">
-            <span>{{ parseTime(scope.row.createTime) }}</span>
-          </template>
-        </el-table-column>
+      <el-table v-loading="loading" @row-click="clickRow" ref="table" :data="dbTableList"
+                @selection-change="handleSelectionChange" height="260px">
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="name" label="表名称" :show-overflow-tooltip="true" />
+        <el-table-column prop="comment" label="表描述" :show-overflow-tooltip="true" />
       </el-table>
     </el-row>
     <div slot="footer" class="dialog-footer">
@@ -46,10 +35,13 @@
 </template>
 
 <script>
-import { getSchemaTableList, createCodegenListFromDB } from "@/api/infra/codegen";
+import { getSchemaTableList, createCodegenList } from "@/api/infra/codegen";
+import {getDataSourceConfigList} from "@/api/infra/dataSourceConfig";
 export default {
   data() {
     return {
+      // 遮罩层
+      loading: false,
       // 遮罩层
       visible: false,
       // 选中数组值
@@ -60,28 +52,40 @@ export default {
       dbTableList: [],
       // 查询参数
       queryParams: {
-        tableName: undefined,
-        tableComment: undefined
-      }
+        dataSourceConfigId: undefined,
+        name: undefined,
+        comment: undefined,
+      },
+      // 数据源列表
+      dataSourceConfigs: [],
     };
   },
   methods: {
     // 显示弹框
     show() {
-      this.getList();
       this.visible = true;
+      // 加载数据源
+      getDataSourceConfigList().then(response => {
+        this.dataSourceConfigs = response.data;
+        this.queryParams.dataSourceConfigId = this.dataSourceConfigs[0].id;
+        // 加载表列表
+        this.getList();
+      });
     },
     clickRow(row) {
       this.$refs.table.toggleRowSelection(row);
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
-      this.tables = selection.map(item => item.tableName);
+      this.tables = selection.map(item => item.name);
     },
     // 查询表数据
     getList() {
+      this.loading = true;
       getSchemaTableList(this.queryParams).then(res => {
         this.dbTableList = res.data;
+      }).finally(() => {
+        this.loading = false;
       });
     },
     /** 搜索按钮操作 */
@@ -91,11 +95,15 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.queryParams.dataSourceConfigId = this.dataSourceConfigs[0].id;
       this.handleQuery();
     },
     /** 导入按钮操作 */
     handleImportTable() {
-      createCodegenListFromDB(this.tables.join(",")).then(res => {
+      createCodegenList({
+        dataSourceConfigId: this.queryParams.dataSourceConfigId,
+        tableNames: this.tables
+      }).then(res => {
         this.$modal.msgSuccess("导入成功");
         this.visible = false;
         this.$emit("ok");

+ 22 - 82
yudao-ui-admin/src/views/infra/codegen/index.vue

@@ -26,29 +26,28 @@
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button type="info" plain icon="el-icon-upload" size="mini" @click="openImportTable"
-                   v-hasPermi="['infra:codegen:create']">基于 DB 导入</el-button>
-        <el-button type="info" plain icon="el-icon-upload" size="mini" @click="openImportSQL"
-                   v-hasPermi="['infra:codegen:create']">基于 SQL 导入</el-button>
+                   v-hasPermi="['infra:codegen:create']">导入</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
     <!-- 列表 -->
     <el-table v-loading="loading" :data="tableList">
-      <el-table-column label="表名称" align="center" prop="tableName" :show-overflow-tooltip="true" width="200"/>
+      <el-table-column label="数据源" align="center" :formatter="dataSourceConfigNameFormat"/>
+      <el-table-column label="表名称" align="center" prop="tableName" width="200"/>
       <el-table-column label="表描述" align="center" prop="tableComment" :show-overflow-tooltip="true" width="120"/>
-      <el-table-column label="实体" align="center" prop="className" :show-overflow-tooltip="true" width="200"/>
-      <el-table-column label="创建时间" align="center" prop="createTime" width="160">
+      <el-table-column label="实体" align="center" prop="className" width="200"/>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.createTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="更新时间" align="center" prop="createTime" width="160">
+      <el-table-column label="更新时间" align="center" prop="createTime" width="180">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.updateTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column label="操作" align="center" width="300px" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button type="text" size="small" icon="el-icon-view" @click="handlePreview(scope.row)" v-hasPermi="['infra:codegen:preview']">预览</el-button>
           <el-button type="text" size="small" icon="el-icon-edit" @click="handleEditTable(scope.row)" v-hasPermi="['infra:codegen:update']">编辑</el-button>
@@ -81,23 +80,6 @@
 
     <!-- 基于 DB 导入 -->
     <import-table ref="import" @ok="handleQuery" />
-
-    <!-- 基于 SQL 导入 -->
-    <el-dialog :title="importSQL.title" :visible.sync="importSQL.open" width="800px" append-to-body>
-      <el-form ref="importSQLForm" :model="importSQL.form" :rules="importSQL.rules" label-width="120px">
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="建表 SQL 语句" prop="sql">
-              <el-input v-model="importSQL.form.sql" type="textarea" rows="30" style="width: 650px;" placeholder="请输入建 SQL 语句" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitImportSQLForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    </el-dialog>
   </div>
 </template>
 
@@ -109,6 +91,7 @@ import importTable from "./importTable";
 // 代码高亮插件
 import hljs from "highlight.js/lib/highlight";
 import "highlight.js/styles/github-gist.css";
+import {getDataSourceConfigList} from "@/api/infra/dataSourceConfig";
 hljs.registerLanguage("java", require("highlight.js/lib/languages/java"));
 hljs.registerLanguage("xml", require("highlight.js/lib/languages/xml"));
 hljs.registerLanguage("html", require("highlight.js/lib/languages/xml"));
@@ -150,21 +133,16 @@ export default {
         data: {},
         activeName: "",
       },
-      // 基于 SQL 导入
-      importSQL: {
-        open: false,
-        title: "",
-        form: {
-
-        },
-        rules: {
-          sql: [{ required: true, message: "SQL 不能为空", trigger: "blur" }]
-        }
-      }
+      // 数据源列表
+      dataSourceConfigs: [],
     };
   },
   created() {
     this.getList();
+    // 加载数据源
+    getDataSourceConfigList().then(response => {
+      this.dataSourceConfigs = response.data;
+    });
   },
   activated() {
     const time = this.$route.query.t;
@@ -200,12 +178,6 @@ export default {
     },
     /** 同步数据库操作 */
     handleSynchDb(row) {
-      // 基于 SQL 同步
-      if (row.importType === 2) {
-        this.importSQL.open = true;
-        this.importSQL.form.tableId = row.id;
-        return;
-      }
       // 基于 DB 同步
       const tableName = row.tableName;
       this.$modal.confirm('确认要强制同步"' + tableName + '"表结构吗?').then(function() {
@@ -218,10 +190,6 @@ export default {
     openImportTable() {
       this.$refs.import.show();
     },
-    /** 打开 SQL 导入的弹窗 **/
-    openImportSQL() {
-      this.importSQL.open = true;
-    },
     /** 重置按钮操作 */
     resetQuery() {
       this.dateRange = [];
@@ -336,43 +304,15 @@ export default {
           this.$modal.msgSuccess("删除成功");
       }).catch(() => {});
     },
-    // 取消按钮
-    cancel() {
-      this.importSQL.open = false;
-      this.reset();
-    },
-    // 表单重置
-    reset() {
-      this.importSQL.form = {
-        tableId: undefined,
-        sql: undefined,
-      };
-      this.resetForm("importSQLForm");
-    },
-    // 提交 import SQL 表单
-    submitImportSQLForm() {
-      this.$refs["importSQLForm"].validate(valid => {
-        if (!valid) {
-          return;
-        }
-        // 修改的提交
-        let form = this.importSQL.form;
-        if (form.tableId != null) {
-          syncCodegenFromSQL(form.tableId, form.sql).then(response => {
-            this.$modal.msgSuccess("同步成功");
-            this.importSQL.open = false;
-            this.getList();
-          });
-          return;
+    // 数据源配置的名字
+    dataSourceConfigNameFormat(row, column) {
+      for (const config of this.dataSourceConfigs) {
+        if (row.dataSourceConfigId === config.id) {
+          return config.name;
         }
-        // 添加的提交
-        createCodegenListFromSQL(form).then(response => {
-          this.$modal.msgSuccess("导入成功");
-          this.importSQL.open = false;
-          this.getList();
-        });
-      });
-    }
+      }
+      return '未知【' + row.leaderUserId + '】';
+    },
   }
 };
 </script>

+ 3 - 3
yudao-ui-admin/src/views/infra/dataSourceConfig/index.vue

@@ -11,7 +11,7 @@
     <!-- 列表 -->
     <el-table v-loading="loading" :data="list">
       <el-table-column label="主键编号" align="center" prop="id" />
-      <el-table-column label="数名称" align="center" prop="name" />
+      <el-table-column label="数据源名称" align="center" prop="name" />
       <el-table-column label="数据源连接" align="center" prop="url" />
       <el-table-column label="用户名" align="center" prop="username" />
       <el-table-column label="创建时间" align="center" prop="createTime" width="180">
@@ -32,7 +32,7 @@
     <!-- 对话框(添加 / 修改) -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="100px">
-        <el-form-item label="数名称" prop="name">
+        <el-form-item label="数据源名称" prop="name">
           <el-input v-model="form.name" placeholder="请输入参数名称" />
         </el-form-item>
         <el-form-item label="数据源连接" prop="url">
@@ -76,7 +76,7 @@ export default {
       form: {},
       // 表单校验
       rules: {
-        name: [{ required: true, message: "数名称不能为空", trigger: "blur" }],
+        name: [{ required: true, message: "数据源名称不能为空", trigger: "blur" }],
         url: [{ required: true, message: "数据源连接不能为空", trigger: "blur" }],
         username: [{ required: true, message: "用户名不能为空", trigger: "blur" }],
         password: [{ required: true, message: "密码不能为空", trigger: "blur" }],

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно