diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DynamicDataSourceAutoConfiguration.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DynamicDataSourceAutoConfiguration.java
index f86cbae6c..a96291cc8 100644
--- a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DynamicDataSourceAutoConfiguration.java
+++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/DynamicDataSourceAutoConfiguration.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -30,8 +30,8 @@ import lombok.RequiredArgsConstructor;
import org.jasypt.encryption.StringEncryptor;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/annotation/EnableDynamicDataSource.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/annotation/EnableDynamicDataSource.java
index 015eba6b2..feeb97c22 100644
--- a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/annotation/EnableDynamicDataSource.java
+++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/annotation/EnableDynamicDataSource.java
@@ -1,6 +1,6 @@
package com.pig4cloud.pigx.common.datasource.annotation;
-import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure;
+import com.alibaba.druid.spring.boot4.autoconfigure.DruidDataSourceAutoConfigure;
import com.pig4cloud.pigx.common.datasource.DynamicDataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Import;
diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DruidDataSourceProperties.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DruidDataSourceProperties.java
index 88c388559..368c4ec97 100644
--- a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DruidDataSourceProperties.java
+++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/DruidDataSourceProperties.java
@@ -1,5 +1,6 @@
package com.pig4cloud.pigx.common.datasource.config;
+import com.baomidou.dynamic.datasource.creator.druid.DruidConfig;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -11,31 +12,31 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
*/
@Data
@ConfigurationProperties("spring.datasource.druid")
-public class DruidDataSourceProperties {
+public class DruidDataSourceProperties extends DruidConfig {
- /**
- * 数据源用户名
- */
- private String username;
+ /**
+ * 数据源用户名
+ */
+ private String username;
- /**
- * 数据源密码
- */
- private String password;
+ /**
+ * 数据源密码
+ */
+ private String password;
- /**
- * jdbcurl
- */
- private String url;
+ /**
+ * jdbcurl
+ */
+ private String url;
- /**
- * 数据源驱动
- */
- private String driverClassName;
+ /**
+ * 数据源驱动
+ */
+ private String driverClassName;
- /**
- * 查询数据源的SQL
- */
- private String queryDsSql = "select * from gen_datasource_conf where del_flag = '0'";
+ /**
+ * 查询数据源的SQL(使用参数化查询防止SQL注入,添加租户隔离)
+ */
+ private String queryDsSql = "select * from gen_datasource_conf where del_flag = ?";
}
diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/JdbcDynamicDataSourceProvider.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/JdbcDynamicDataSourceProvider.java
index ace487ed5..a829d8396 100644
--- a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/JdbcDynamicDataSourceProvider.java
+++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/JdbcDynamicDataSourceProvider.java
@@ -24,7 +24,7 @@ import com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider;
import com.pig4cloud.pigx.common.core.constant.enums.YesNoEnum;
import com.pig4cloud.pigx.common.datasource.support.DataSourceConstants;
import com.pig4cloud.pigx.common.datasource.util.DsConfTypeEnum;
-import com.pig4cloud.pigx.common.datasource.util.DsJdbcUrlEnum;
+import com.pig4cloud.pigx.common.datasource.util.DsTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.jasypt.encryption.StringEncryptor;
@@ -90,7 +90,7 @@ public class JdbcDynamicDataSourceProvider extends AbstractJdbcDataSourceProvide
String url;
// JDBC 配置形式
- DsJdbcUrlEnum urlEnum = DsJdbcUrlEnum.get(dsType);
+ DsTypeEnum urlEnum = DsTypeEnum.get(dsType);
if (DsConfTypeEnum.JDBC.getType().equals(confType)) {
url = rs.getString(DataSourceConstants.DS_JDBC_URL);
} else {
@@ -103,6 +103,8 @@ public class JdbcDynamicDataSourceProvider extends AbstractJdbcDataSourceProvide
// Druid Config
DruidConfig druidConfig = new DruidConfig();
druidConfig.setProxyFilters(SQL_LOG_FILTER);
+ druidConfig.setConnectionErrorRetryAttempts(5);
+ druidConfig.setBreakAfterAcquireFailure(true);
druidConfig.setValidationQuery(urlEnum.getValidationQuery());
property.setDruid(druidConfig);
property.setUrl(url);
diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/MasterDataSourceProvider.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/MasterDataSourceProvider.java
index b93319c53..8e7ddeebf 100644
--- a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/MasterDataSourceProvider.java
+++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/config/MasterDataSourceProvider.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -19,7 +19,6 @@ package com.pig4cloud.pigx.common.datasource.config;
import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
-import com.baomidou.dynamic.datasource.creator.druid.DruidConfig;
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
import javax.sql.DataSource;
@@ -63,9 +62,8 @@ public class MasterDataSourceProvider extends AbstractDataSourceProvider {
property.setPassword(properties.getPassword());
property.setUrl(properties.getUrl());
- DruidConfig druidConfig = new DruidConfig();
- druidConfig.setProxyFilters(SQL_LOG_FILTER);
- property.setDruid(druidConfig);
+ properties.setProxyFilters(SQL_LOG_FILTER);
+ property.setDruid(properties);
map.put(DS_MASTER, defaultDataSourceCreator.createDataSource(property));
return map;
}
diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/util/DsJdbcUrlEnum.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/util/DsJdbcUrlEnum.java
deleted file mode 100644
index 7e4adc1f5..000000000
--- a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/util/DsJdbcUrlEnum.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.pig4cloud.pigx.common.datasource.util;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-
-/**
- * @author lengleng
- * @date 2020/12/11
- *
- * jdbc-url
- */
-@Getter
-@AllArgsConstructor
-public enum DsJdbcUrlEnum {
-
- /**
- * mysql 数据库
- */
- MYSQL("mysql",
- "jdbc:mysql://%s:%s/%s?characterEncoding=utf8"
- + "&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true"
- + "&useLegacyDatetimeCode=false&allowMultiQueries=true&allowPublicKeyRetrieval=true",
- "select 1", "mysql8 链接"),
-
- /**
- * pg 数据库
- */
- PG("pg", "jdbc:postgresql://%s:%s/%s", "select 1", "postgresql 链接"),
-
- /**
- * SQL SERVER
- */
- MSSQL("mssql", "jdbc:sqlserver://%s:%s;database=%s;characterEncoding=UTF-8", "select 1", "sqlserver 链接"),
-
- /**
- * oracle
- */
- ORACLE("oracle", "jdbc:oracle:thin:@%s:%s:%s", "select 1 from dual", "oracle 链接"),
-
- /**
- * db2
- */
- DB2("db2", "jdbc:db2://%s:%s/%s", "select 1 from sysibm.sysdummy1", "DB2 TYPE4 连接"),
-
- /**
- * 达梦
- */
- DM("dm", "jdbc:dm://%s:%s/%s", "select 1 from dual", "达梦连接"),
-
- /**
- * pg 数据库
- */
- HIGHGO("highgo", "jdbc:highgo://%s:%s/%s", "select 1", "highgo 链接");
-
- private final String dbName;
-
- private final String url;
-
- private final String validationQuery;
-
- private final String description;
-
- public static DsJdbcUrlEnum get(String dsType) {
- return Arrays.stream(DsJdbcUrlEnum.values())
- .filter(dsJdbcUrlEnum -> dsType.equals(dsJdbcUrlEnum.getDbName()))
- .findFirst()
- .get();
- }
-
-}
diff --git a/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/util/DsTypeEnum.java b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/util/DsTypeEnum.java
new file mode 100644
index 000000000..e75a105c5
--- /dev/null
+++ b/pigx-common/pigx-common-datasource/src/main/java/com/pig4cloud/pigx/common/datasource/util/DsTypeEnum.java
@@ -0,0 +1,82 @@
+package com.pig4cloud.pigx.common.datasource.util;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+
+/**
+ * @author lengleng
+ * @date 2020/12/11
+ *
+ * 数据源类型枚举,包含 JDBC URL 模板、连接验证语句、描述及 AnyLine 解析适配器等元数据。
+ */
+@Getter
+@AllArgsConstructor
+public enum DsTypeEnum {
+
+ /**
+ * mysql 数据库
+ */
+ MYSQL("mysql",
+ "jdbc:mysql://%s:%s/%s?characterEncoding=utf8"
+ + "&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true"
+ + "&useLegacyDatetimeCode=false&allowMultiQueries=true&allowPublicKeyRetrieval=true",
+ "select 1", "mysql8 链接", "org.anyline.data.jdbc.mysql.MySQLAdapter"),
+
+ /**
+ * pg 数据库
+ */
+ PG("pg", "jdbc:postgresql://%s:%s/%s", "select 1", "postgresql 链接",
+ "org.anyline.data.jdbc.postgresql.PostgresqlAdapter"),
+
+ /**
+ * SQL SERVER
+ */
+ MSSQL("mssql", "jdbc:sqlserver://%s:%s;database=%s;characterEncoding=UTF-8", "select 1", "sqlserver 链接",
+ "org.anyline.data.jdbc.mssql.MSSQLAdapter"),
+
+ /**
+ * oracle
+ */
+ ORACLE("oracle", "jdbc:oracle:thin:@%s:%s:%s", "select 1 from dual", "oracle 链接",
+ "org.anyline.data.jdbc.oracle.OracleAdapter"),
+
+ /**
+ * db2
+ */
+ DB2("db2", "jdbc:db2://%s:%s/%s", "select 1 from sysibm.sysdummy1", "DB2 TYPE4 连接",
+ "org.anyline.data.jdbc.db2.DB2Adapter"),
+
+ /**
+ * 达梦
+ */
+ DM("dm", "jdbc:dm://%s:%s/%s", "select 1 from dual", "达梦连接", "org.anyline.data.jdbc.dm.DMAdapter"),
+
+ /**
+ * highgo 数据库
+ */
+ HIGHGO("highgo", "jdbc:highgo://%s:%s/%s", "select 1", "highgo 链接",
+ "org.anyline.data.jdbc.highgo.HighgoAdapter");
+
+ private final String dbName;
+
+ private final String url;
+
+ private final String validationQuery;
+
+ private final String description;
+
+ /**
+ * AnyLine JDBC 解析适配器的全类名,用于运行时检测对应数据库方言插件是否已加载。
+ */
+ private final String anylineAdapter;
+
+ public static DsTypeEnum get(String dsType) {
+ return Arrays.stream(DsTypeEnum.values())
+ .filter(dsTypeEnum -> dsType.equals(dsTypeEnum.getDbName()))
+ .findFirst()
+ .get();
+ }
+
+}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/PigxCodeGenDefaultProperties.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/PigxCodeGenDefaultProperties.java
index d5425966e..4aa589433 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/PigxCodeGenDefaultProperties.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/config/PigxCodeGenDefaultProperties.java
@@ -23,12 +23,12 @@ public class PigxCodeGenDefaultProperties implements InitializingBean {
/**
* 是否开启在线更新
*/
- private boolean autoCheckVersion = true;
+ private boolean autoCheckVersion = false;
- /**
- * 分支名称,默认为master
- */
- private String branch = "next";
+ /**
+ * 分支名称,默认为 202601
+ */
+ private String branch = "202601";
/**
* 模板项目地址
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GenCreateTableController.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GenCreateTableController.java
index 2bff6f7c9..5591eab1c 100755
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GenCreateTableController.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GenCreateTableController.java
@@ -1,6 +1,6 @@
package com.pig4cloud.pigx.codegen.controller;
/*
- * Copyright (c) 2018-2026, luolin All rights reserved.
+ * Copyright (c) 2018-2025, luolin All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -16,13 +16,13 @@ package com.pig4cloud.pigx.codegen.controller;
* Author: luolin (766488893@qq.com)
*/
-import cn.hutool.core.bean.BeanUtil;
-import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pig4cloud.pigx.codegen.entity.GenCreateTable;
import com.pig4cloud.pigx.codegen.service.GenCreateTableService;
+import com.pig4cloud.pigx.codegen.util.AnylineDataSourceHelper;
import com.pig4cloud.pigx.codegen.util.vo.GenCreateTableVO;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.security.annotation.HasPermission;
@@ -84,12 +84,13 @@ public class GenCreateTableController {
@PostMapping
@HasPermission("codegen_table_add")
public R save(@RequestBody GenCreateTableVO createTableVO) {
- // 切换目标数据源
- DynamicDataSourceContextHolder.push(createTableVO.getDsName());
- createTableService.createTable(createTableVO);
+ AnylineDataSourceHelper.run(createTableVO.getDsName(), () -> createTableService.createTable(createTableVO));
GenCreateTable createTable = new GenCreateTable();
- BeanUtil.copyProperties(createTableVO, createTable);
- DynamicDataSourceContextHolder.clear();
+ createTable.setId(createTableVO.getId());
+ createTable.setDsName(createTableVO.getDsName());
+ createTable.setTableName(createTableVO.getTableName());
+ createTable.setComments(createTableVO.getComments());
+ createTable.setColumnInfo(JSONUtil.toJsonStr(createTableVO.getColumnInfo()));
return R.ok(createTableService.saveOrUpdate(createTable));
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GenDsConfController.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GenDsConfController.java
index 07e88f765..5e94fb51d 100755
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GenDsConfController.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GenDsConfController.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -32,7 +32,6 @@ import com.pig4cloud.pigx.common.xss.core.XssCleanIgnore;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
-import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
import javax.sql.DataSource;
@@ -75,6 +74,16 @@ public class GenDsConfController {
return R.ok(datasourceConfService.list());
}
+ /**
+ * 查询数据源解析插件加载状态
+ *
+ * @return R 包含各数据源类型(dsType)与其 AnyLine 解析插件是否已加载(true/false)的映射
+ */
+ @GetMapping("/parser-plugins")
+ public R parserPlugins() {
+ return R.ok(datasourceConfService.listParserPlugins());
+ }
+
/**
* 通过id查询数据源表
* @param id id
@@ -135,7 +144,7 @@ public class GenDsConfController {
// 生成
byte[] data = screw.documentGeneration(dsName, dataSource, screwProperties).toByteArray();
response.reset();
- response.addHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(data.length));
+ response.setContentLength(data.length);
response.setContentType("application/octet-stream");
IoUtil.write(response.getOutputStream(), Boolean.FALSE, data);
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GenTableController.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GenTableController.java
index ac5e02505..989cffa6c 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GenTableController.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GenTableController.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -126,22 +126,11 @@ public class GenTableController {
*
* @param dsName 数据源名称
* @param tableName 表名称
- * @param isBatch 是否批量操作
* @return 操作结果
*/
@GetMapping("/sync/{dsName}/{tableName}")
- public R syncTable(@PathVariable("dsName") String dsName, @PathVariable String tableName, @RequestParam(required = false) boolean isBatch) {
- // 批量操作同步的时候,不需要删除
- if (!isBatch) {
- // 表配置删除
- tableService.remove(
- Wrappers.lambdaQuery().eq(GenTable::getDsName, dsName).eq(GenTable::getTableName, tableName));
- // 字段配置删除
- tableColumnService.remove(Wrappers.lambdaQuery()
- .eq(GenTableColumnEntity::getDsName, dsName)
- .eq(GenTableColumnEntity::getTableName, tableName));
- }
- return R.ok(tableService.queryOrBuildTable(dsName, tableName));
+ public R syncTable(@PathVariable("dsName") String dsName, @PathVariable String tableName) {
+ return R.ok(tableService.syncTable(dsName, tableName));
}
/**
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GeneratorController.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GeneratorController.java
index cd9185ef7..4532b13ce 100755
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GeneratorController.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/controller/GeneratorController.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -76,7 +76,7 @@ public class GeneratorController {
response.reset();
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=code.zip");
- response.addHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(data.length));
+ response.setContentLength(data.length);
response.setContentType("application/octet-stream; charset=UTF-8");
IoUtil.write(response.getOutputStream(), false, data);
}
@@ -132,7 +132,7 @@ public class GeneratorController {
byte[] data = result.getBytes(StandardCharsets.UTF_8);
response.reset();
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=form.vue");
- response.addHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(data.length));
+ response.setContentLength(data.length);
response.setContentType("application/octet-stream; charset=UTF-8");
IoUtil.write(response.getOutputStream(), false, data);
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/entity/GenCreateTable.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/entity/GenCreateTable.java
index 41e530ce1..e9680e669 100755
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/entity/GenCreateTable.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/entity/GenCreateTable.java
@@ -1,6 +1,6 @@
package com.pig4cloud.pigx.codegen.entity;
/*
- * Copyright (c) 2018-2026, luolin All rights reserved.
+ * Copyright (c) 2018-2025, luolin All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/entity/GenFieldType.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/entity/GenFieldType.java
index c1f5cd1db..8cb9052a5 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/entity/GenFieldType.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/entity/GenFieldType.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -64,6 +64,18 @@ public class GenFieldType extends Model {
@Schema(description = "属性包名")
private String packageName;
+ /**
+ * 默认表单类型
+ */
+ @Schema(description = "默认表单类型")
+ private String defaultFormType;
+
+ /**
+ * 默认查询表单类型
+ */
+ @Schema(description = "默认查询表单类型")
+ private String defaultQueryFormType;
+
/**
* 创建人
*/
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/entity/GenTable.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/entity/GenTable.java
index 62c7898ce..1e79fd409 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/entity/GenTable.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/entity/GenTable.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -43,165 +43,171 @@ import java.util.List;
@Schema(description = "列属性")
public class GenTable extends Model {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- /**
- * id
- */
- @TableId(type = IdType.ASSIGN_ID)
- @Schema(description = "id")
- private Long id;
+ /**
+ * id
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ @Schema(description = "id")
+ private Long id;
- /**
- * 数据源名称
- */
- @Schema(description = "数据源名称")
- private String dsName;
+ /**
+ * 数据源名称
+ */
+ @Schema(description = "数据源名称")
+ private String dsName;
- /**
- * 数据源类型
- */
- @Schema(description = "数据源类型")
- private String dbType;
+ /**
+ * 数据源类型
+ */
+ @Schema(description = "数据源类型")
+ private String dbType;
- /**
- * 表名
- */
- @Schema(description = "表名")
- private String tableName;
+ /**
+ * 表名
+ */
+ @Schema(description = "表名")
+ private String tableName;
- /**
- * 类名
- */
- @Schema(description = "类名")
- private String className;
+ /**
+ * 类名
+ */
+ @Schema(description = "类名")
+ private String className;
- /**
- * 说明
- */
- @Schema(description = "说明")
- private String tableComment;
+ /**
+ * 说明
+ */
+ @Schema(description = "说明")
+ private String tableComment;
- /**
- * 作者
- */
- @Schema(description = "作者")
- private String author;
+ /**
+ * 作者
+ */
+ @Schema(description = "作者")
+ private String author;
- /**
- * 邮箱
- */
- @Schema(description = "邮箱")
- private String email;
+ /**
+ * 邮箱
+ */
+ @Schema(description = "邮箱")
+ private String email;
- /**
- * 项目包名
- */
- @Schema(description = "项目包名")
- private String packageName;
+ /**
+ * 项目包名
+ */
+ @Schema(description = "项目包名")
+ private String packageName;
- /**
- * 项目版本号
- */
- @Schema(description = "项目版本号")
- private String version;
+ /**
+ * 项目版本号
+ */
+ @Schema(description = "项目版本号")
+ private String version;
- /**
- * 生成方式 0:zip压缩包 1:自定义目录
- */
- @Schema(description = "生成方式 0:zip压缩包 1:自定义目录")
- private String generatorType;
+ /**
+ * 生成方式 0:zip压缩包 1:自定义目录
+ */
+ @Schema(description = "生成方式 0:zip压缩包 1:自定义目录")
+ private String generatorType;
- /**
- * 后端生成路径
- */
- @Schema(description = "后端生成路径")
- private String backendPath;
+ /**
+ * 后端生成路径
+ */
+ @Schema(description = "后端生成路径")
+ private String backendPath;
- /**
- * 前端生成路径
- */
- @Schema(description = "前端生成路径")
- private String frontendPath;
+ /**
+ * 前端生成路径
+ */
+ @Schema(description = "前端生成路径")
+ private String frontendPath;
- /**
- * 模块名
- */
- @Schema(description = "模块名")
- private String moduleName;
+ /**
+ * 模块名
+ */
+ @Schema(description = "模块名")
+ private String moduleName;
- /**
- * 功能名
- */
- @Schema(description = "功能名")
- private String functionName;
+ /**
+ * 功能名
+ */
+ @Schema(description = "功能名")
+ private String functionName;
- /**
- * 表单布局 1:一列 2:两列
- */
- @Schema(description = "表单布局 1:一列 2:两列")
- private Integer formLayout;
+ /**
+ * 表单布局 1:一列 2:两列
+ */
+ @Schema(description = "表单布局 1:一列 2:两列")
+ private Integer formLayout;
- /**
- * 所属菜单ID
- */
- @Schema(description = "所属菜单ID")
- private Long syncMenuId;
+ /**
+ * 所属菜单ID
+ */
+ @Schema(description = "所属菜单ID")
+ private Long syncMenuId;
- /**
- * 是否同步路由
- */
- @Schema
- private String syncRoute;
+ /**
+ * 是否同步路由
+ */
+ @Schema
+ private String syncRoute;
- /**
- * 基类ID
- */
- @Schema(description = "基类ID")
- private Long baseclassId;
+ /**
+ * 基类ID
+ */
+ @Schema(description = "基类ID")
+ private Long baseclassId;
- /**
- * 创建时间
- */
- @Schema(description = "创建时间")
- private LocalDateTime createTime;
+ /**
+ * 创建时间
+ */
+ @Schema(description = "创建时间")
+ private LocalDateTime createTime;
- /**
- * 代码生成风格
- */
- private Long style;
+ /**
+ * 代码生成风格
+ */
+ private Long style;
- /**
- * 子表名称
- */
- private String childTableName;
+ /**
+ * 子表名称
+ */
+ private String childTableName;
- /**
- * 主表关联键
- */
- private String mainField;
+ /**
+ * 主表关联键
+ */
+ private String mainField;
- /**
- * 子表关联键
- */
- private String childField;
+ /**
+ * 子表关联键
+ */
+ private String childField;
- /**
- * 字段列表
- */
- @TableField(exist = false)
- private List fieldList;
+ /** 父字段 */
+ private String parentField;
- /**
- * 子表字段列表
- */
- @TableField(exist = false)
- private List childFieldList;
+ /** 名称字段 */
+ private String nameField;
- /**
- * 代码风格(模版分组信息)
- */
- @TableField(exist = false)
- private List groupList;
+ /**
+ * 字段列表
+ */
+ @TableField(exist = false)
+ private List fieldList;
+
+ /**
+ * 子表字段列表
+ */
+ @TableField(exist = false)
+ private List childFieldList;
+
+ /**
+ * 代码风格(模版分组信息)
+ */
+ @TableField(exist = false)
+ private List groupList;
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/mapper/GenCreateTableMapper.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/mapper/GenCreateTableMapper.java
index 70d85c7e8..0a8be2ef6 100755
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/mapper/GenCreateTableMapper.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/mapper/GenCreateTableMapper.java
@@ -1,6 +1,6 @@
package com.pig4cloud.pigx.codegen.mapper;
/*
- * Copyright (c) 2018-2026, luolin All rights reserved.
+ * Copyright (c) 2018-2025, luolin All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenCreateTableService.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenCreateTableService.java
index aab0a2171..3d99bc211 100755
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenCreateTableService.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenCreateTableService.java
@@ -1,7 +1,7 @@
package com.pig4cloud.pigx.codegen.service;
/*
- * Copyright (c) 2018-2026, luolin All rights reserved.
+ * Copyright (c) 2018-2025, luolin All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenDatasourceConfService.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenDatasourceConfService.java
index 742adb573..d86a4b4fb 100755
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenDatasourceConfService.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenDatasourceConfService.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -19,6 +19,8 @@ package com.pig4cloud.pigx.codegen.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pig4cloud.pigx.codegen.entity.GenDatasourceConf;
+import java.util.Map;
+
/**
* 数据源表
*
@@ -55,6 +57,13 @@ public interface GenDatasourceConfService extends IService {
*/
Boolean checkDataSource(GenDatasourceConf datasourceConf);
+ /**
+ * 查询数据库解析插件加载状态
+ *
+ * @return 数据源类型与解析插件状态
+ */
+ Map listParserPlugins();
+
/**
* 通过数据源名称删除
* @param dsIds 数据源ID
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenTableColumnService.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenTableColumnService.java
index 2d95300fb..037a72274 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenTableColumnService.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenTableColumnService.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -32,6 +32,8 @@ public interface GenTableColumnService extends IService {
void initFieldList(List tableFieldList);
+ void syncFieldList(String dsName, String tableName, List tableFieldList);
+
void updateTableField(String dsName, String tableName, List tableFieldList);
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenTableService.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenTableService.java
index 99658dfac..87059a69d 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenTableService.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/GenTableService.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -53,6 +53,15 @@ public interface GenTableService extends IService {
*/
GenTable queryOrBuildTable(String dsName, String tableName);
+ /**
+ * 同步表和字段配置
+ *
+ * @param dsName 数据源
+ * @param tableName 表名
+ * @return 同步后的表配置
+ */
+ GenTable syncTable(String dsName, String tableName);
+
/**
* 查询表ddl 语句
*
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/CreateTableServiceImpl.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/CreateTableServiceImpl.java
index b51bebb32..560495089 100755
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/CreateTableServiceImpl.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/CreateTableServiceImpl.java
@@ -1,6 +1,6 @@
package com.pig4cloud.pigx.codegen.service.impl;
/*
- * Copyright (c) 2018-2026, luolin All rights reserved.
+ * Copyright (c) 2018-2025, luolin All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -16,14 +16,13 @@ package com.pig4cloud.pigx.codegen.service.impl;
* Author: luolin (766488893@qq.com)
*/
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pig4cloud.pigx.codegen.entity.GenCreateTable;
import com.pig4cloud.pigx.codegen.mapper.GenCreateTableMapper;
import com.pig4cloud.pigx.codegen.service.GenCreateTableService;
import com.pig4cloud.pigx.codegen.util.table.CreateTableHandler;
import com.pig4cloud.pigx.codegen.util.table.model.TableInfo;
+import com.pig4cloud.pigx.codegen.util.vo.GenCreateTableColumnVO;
import com.pig4cloud.pigx.codegen.util.vo.GenCreateTableVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -32,6 +31,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.LinkedHashMap;
+import java.util.List;
/**
* 自动创建表管理
@@ -50,17 +50,52 @@ public class CreateTableServiceImpl extends ServiceImpl columns = new LinkedHashMap<>();
- LinkedHashMap linkedHashMap = JSONUtil.toBean(columnsInfo, LinkedHashMap.class);
- linkedHashMap.forEach((key, val) -> {
- columns.put(key, JSONUtil.toBean(val, Column.class));
- });
+ List columnInfoList = createTableVO.getColumnInfo();
+ if (columnInfoList != null) {
+ for (GenCreateTableColumnVO columnInfo : columnInfoList) {
+ Column column = buildColumn(columnInfo);
+ columns.put(column.getName(), column);
+ }
+ }
tableInfo.setColumns(columns);
tableInfo.setComment(createTableVO.getComments());
- return createTableHandler.createTable(tableInfo);
+ return createTableHandler.createTable(createTableVO.getDsName(), tableInfo);
}
+ private Column buildColumn(GenCreateTableColumnVO columnInfo) {
+ Column column = new Column();
+ column.setName(columnInfo.getName());
+ column.setType(columnInfo.getType());
+ column.setComment(columnInfo.getComment());
+ column.setDefaultValue(columnInfo.getDefaultValue());
+
+ if (columnInfo.getLength() != null) {
+ column.setLength(columnInfo.getLength());
+ }
+
+ if (columnInfo.getPrecision() != null) {
+ column.setPrecision(columnInfo.getPrecision());
+ }
+
+ if (columnInfo.getScale() != null) {
+ column.setScale(columnInfo.getScale());
+ }
+
+ if (columnInfo.getNullable() != null) {
+ column.setNullable(columnInfo.getNullable());
+ }
+
+ if (columnInfo.getPrimary() != null) {
+ column.setPrimary(columnInfo.getPrimary());
+ }
+
+ if (columnInfo.getAutoIncrement() != null) {
+ column.setAutoIncrement(columnInfo.getAutoIncrement());
+ }
+ return column;
+ }
+
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenDatasourceConfServiceImpl.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenDatasourceConfServiceImpl.java
index 4f6784309..c231f4986 100755
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenDatasourceConfServiceImpl.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenDatasourceConfServiceImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -17,6 +17,7 @@
package com.pig4cloud.pigx.codegen.service.impl;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DataSourceCreator;
@@ -28,7 +29,7 @@ import com.pig4cloud.pigx.codegen.mapper.GenDatasourceConfMapper;
import com.pig4cloud.pigx.codegen.service.GenDatasourceConfService;
import com.pig4cloud.pigx.common.core.util.SpringContextHolder;
import com.pig4cloud.pigx.common.datasource.util.DsConfTypeEnum;
-import com.pig4cloud.pigx.common.datasource.util.DsJdbcUrlEnum;
+import com.pig4cloud.pigx.common.datasource.util.DsTypeEnum;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jasypt.encryption.StringEncryptor;
@@ -38,6 +39,8 @@ import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
+import java.util.LinkedHashMap;
+import java.util.Map;
/**
* 数据源表
@@ -133,7 +136,7 @@ public class GenDatasourceConfServiceImpl extends ServiceImpl listParserPlugins() {
+ Map result = new LinkedHashMap<>();
+ for (DsTypeEnum dsEnum : DsTypeEnum.values()) {
+ result.put(dsEnum.getDbName(), isClassPresent(dsEnum.getAnylineAdapter()));
+ }
+ return result;
+ }
+
+ private boolean isClassPresent(String className) {
+ try {
+ ClassUtil.loadClass(className, false);
+ return true;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenTableColumnServiceImpl.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenTableColumnServiceImpl.java
index 604b7acc2..294d23ba4 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenTableColumnServiceImpl.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenTableColumnServiceImpl.java
@@ -10,12 +10,12 @@ import com.pig4cloud.pigx.codegen.mapper.GenTableColumnMapper;
import com.pig4cloud.pigx.codegen.service.GenTableColumnService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
+import java.util.stream.Collectors;
/**
* 表字段信息管理
@@ -28,6 +28,8 @@ import java.util.concurrent.atomic.AtomicInteger;
public class GenTableColumnServiceImpl extends ServiceImpl
implements GenTableColumnService {
+ private static final String DEFAULT_COMPONENT_TYPE = "text";
+
private final GenFieldTypeMapper fieldTypeMapper;
/**
@@ -35,39 +37,47 @@ public class GenTableColumnServiceImpl extends ServiceImpl tableFieldList) {
- // 字段类型、属性类型映射
- List list = fieldTypeMapper.selectList(Wrappers.emptyWrapper());
- Map fieldTypeMap = new LinkedHashMap<>(list.size());
- list.forEach(
- fieldTypeMapping -> fieldTypeMap.put(fieldTypeMapping.getColumnType().toLowerCase(), fieldTypeMapping));
-
- // 索引计数器
+ Map fieldTypeMap = this.buildFieldTypeMap();
AtomicInteger index = new AtomicInteger(0);
+ tableFieldList.forEach(field -> this.initNewField(field, fieldTypeMap, index));
+ }
+
+ @Override
+ public void syncFieldList(String dsName, String tableName, List tableFieldList) {
+ Map fieldTypeMap = this.buildFieldTypeMap();
+ List existingFieldList = this.list(Wrappers.lambdaQuery()
+ .eq(GenTableColumnEntity::getDsName, dsName)
+ .eq(GenTableColumnEntity::getTableName, tableName)
+ .orderByAsc(GenTableColumnEntity::getSort)
+ .orderByAsc(GenTableColumnEntity::getId));
+ Map existingFieldMap = existingFieldList.stream()
+ .collect(Collectors.toMap(GenTableColumnEntity::getFieldName, Function.identity(), (left, right) -> left,
+ LinkedHashMap::new));
+ int nextSort = existingFieldList.stream()
+ .map(GenTableColumnEntity::getSort)
+ .filter(Objects::nonNull)
+ .max(Comparator.naturalOrder())
+ .orElse(-1) + 1;
+ AtomicInteger sortCounter = new AtomicInteger(nextSort);
+ List mergedFieldList = new ArrayList<>(tableFieldList.size());
+
tableFieldList.forEach(field -> {
- // 将字段名转化为驼峰格式
- field.setAttrName(NamingCase.toCamelCase(field.getFieldName()));
+ GenTableColumnEntity existingField = existingFieldMap.remove(field.getFieldName());
+ if (Objects.isNull(existingField)) {
+ this.initNewField(field, fieldTypeMap, sortCounter);
+ mergedFieldList.add(field);
+ return;
+ }
+ this.mergeField(existingField, field, fieldTypeMap, sortCounter);
+ mergedFieldList.add(existingField);
+ });
- // 获取字段对应的类型
- GenFieldType fieldTypeMapping = fieldTypeMap.getOrDefault(field.getFieldType().toLowerCase(), null);
- if (fieldTypeMapping == null) {
- // 没找到对应的类型,则为Object类型
- field.setAttrType("Object");
- }
- else {
- field.setAttrType(fieldTypeMapping.getAttrType());
- field.setPackageName(fieldTypeMapping.getPackageName());
- }
-
- // 设置查询类型和表单查询类型都为“=”
- field.setQueryType("=");
- field.setQueryFormType("text");
-
- // 设置表单类型为文本框类型
- field.setFormType("text");
-
- // 保证审计字段最后显示
- field.setSort(Objects.isNull(field.getSort()) ? index.getAndIncrement() : field.getSort());
- });
+ if (!existingFieldMap.isEmpty()) {
+ this.removeBatchByIds(existingFieldMap.values().stream().map(GenTableColumnEntity::getId).toList());
+ }
+ if (!mergedFieldList.isEmpty()) {
+ this.saveOrUpdateBatch(mergedFieldList);
+ }
}
/**
@@ -77,7 +87,6 @@ public class GenTableColumnServiceImpl extends ServiceImpl tableFieldList) {
AtomicInteger sort = new AtomicInteger();
this.updateBatchById(tableFieldList.stream()
@@ -85,4 +94,59 @@ public class GenTableColumnServiceImpl extends ServiceImpl buildFieldTypeMap() {
+ List list = fieldTypeMapper.selectList(Wrappers.emptyWrapper());
+ Map fieldTypeMap = new LinkedHashMap<>(list.size());
+ list.stream()
+ .filter(fieldType -> Objects.nonNull(fieldType.getColumnType()))
+ .forEach(fieldType -> fieldTypeMap.put(this.normalizeColumnType(fieldType.getColumnType()), fieldType));
+ return fieldTypeMap;
+ }
+
+ private void initNewField(GenTableColumnEntity field, Map fieldTypeMap,
+ AtomicInteger sortCounter) {
+ field.setAttrName(NamingCase.toCamelCase(field.getFieldName()));
+ this.applyFieldTypeMapping(field, fieldTypeMap);
+ field.setQueryType("=");
+ field.setSort(Objects.nonNull(field.getSort()) ? field.getSort() : sortCounter.getAndIncrement());
+ }
+
+ private void mergeField(GenTableColumnEntity existingField, GenTableColumnEntity latestField,
+ Map fieldTypeMap, AtomicInteger sortCounter) {
+ existingField.setFieldType(latestField.getFieldType());
+ existingField.setFieldComment(latestField.getFieldComment());
+ existingField.setPrimaryPk(latestField.getPrimaryPk());
+ this.applyFieldTypeMapping(existingField, fieldTypeMap);
+ if (Objects.isNull(existingField.getAttrName())) {
+ existingField.setAttrName(NamingCase.toCamelCase(existingField.getFieldName()));
+ }
+ if (Objects.isNull(existingField.getSort())) {
+ existingField.setSort(Objects.nonNull(latestField.getSort()) ? latestField.getSort() : sortCounter.getAndIncrement());
+ }
+ }
+
+ private void applyFieldTypeMapping(GenTableColumnEntity field, Map fieldTypeMap) {
+ GenFieldType fieldType = Objects.isNull(field.getFieldType()) ? null
+ : fieldTypeMap.get(this.normalizeColumnType(field.getFieldType()));
+ if (Objects.isNull(fieldType)) {
+ field.setAttrType("Object");
+ field.setPackageName(null);
+ field.setFormType(DEFAULT_COMPONENT_TYPE);
+ field.setQueryFormType(DEFAULT_COMPONENT_TYPE);
+ return;
+ }
+ field.setAttrType(fieldType.getAttrType());
+ field.setPackageName(fieldType.getPackageName());
+ field.setFormType(this.resolveComponentType(fieldType.getDefaultFormType()));
+ field.setQueryFormType(this.resolveComponentType(fieldType.getDefaultQueryFormType()));
+ }
+
+ private String resolveComponentType(String type) {
+ return StringUtils.hasText(type) ? type : DEFAULT_COMPONENT_TYPE;
+ }
+
+ private String normalizeColumnType(String type) {
+ return type.toLowerCase(Locale.ROOT);
+ }
+
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenTableServiceImpl.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenTableServiceImpl.java
index d759f8bb0..5b6810224 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenTableServiceImpl.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenTableServiceImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -21,6 +21,9 @@ import cn.hutool.core.text.NamingCase;
import cn.hutool.core.util.EnumUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.druid.pool.DruidDataSource;
+import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
+import com.baomidou.dynamic.datasource.ds.ItemDataSource;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -34,10 +37,8 @@ import com.pig4cloud.pigx.codegen.mapper.GenTableMapper;
import com.pig4cloud.pigx.codegen.service.GenGroupService;
import com.pig4cloud.pigx.codegen.service.GenTableColumnService;
import com.pig4cloud.pigx.codegen.service.GenTableService;
-import com.pig4cloud.pigx.codegen.util.AutoFillEnum;
-import com.pig4cloud.pigx.codegen.util.BoolFillEnum;
-import com.pig4cloud.pigx.codegen.util.CommonColumnFiledEnum;
-import com.pig4cloud.pigx.codegen.util.GenKit;
+import com.pig4cloud.pigx.codegen.util.*;
+import com.pig4cloud.pigx.common.core.util.SpringContextHolder;
import lombok.RequiredArgsConstructor;
import org.anyline.metadata.Column;
import org.anyline.metadata.Database;
@@ -71,7 +72,6 @@ public class GenTableServiceImpl extends ServiceImpl i
private final GenGroupService genGroupService;
-
/**
* 查询表ddl 语句
*
@@ -117,8 +117,7 @@ public class GenTableServiceImpl extends ServiceImpl i
// 手动切换数据源
DynamicDataSourceContextHolder.push(table.getDsName());
CacheProxy.clear();
- List tableList = ServiceProxy.metadata().tables()
- .values().stream().filter(t -> {
+ List tableList = ServiceProxy.metadata().tables().values().stream().filter(t -> {
if (StrUtil.isBlank(table.getTableName())) {
return true;
}
@@ -129,12 +128,13 @@ public class GenTableServiceImpl extends ServiceImpl i
})
// 根据 createTime 、updateTime 倒序排序
.sorted((o1, o2) -> {
- long time1 = (o1.getUpdateTime() != null ? o1.getUpdateTime().getTime() :
- (o1.getCreateTime() != null ? o1.getCreateTime().getTime() : 0));
- long time2 = (o2.getUpdateTime() != null ? o2.getUpdateTime().getTime() :
- (o2.getCreateTime() != null ? o2.getCreateTime().getTime() : 0));
+ long time1 = (o1.getUpdateTime() != null ? o1.getUpdateTime().getTime()
+ : (o1.getCreateTime() != null ? o1.getCreateTime().getTime() : 0));
+ long time2 = (o2.getUpdateTime() != null ? o2.getUpdateTime().getTime()
+ : (o2.getCreateTime() != null ? o2.getCreateTime().getTime() : 0));
return NumberUtil.compare(time2, time1);
- }).toList();
+ })
+ .toList();
// 根据 page 进行分页
List records = CollUtil.page((int) page.getCurrent() - 1, (int) page.getSize(), tableList);
@@ -152,9 +152,18 @@ public class GenTableServiceImpl extends ServiceImpl i
@Override
public List queryTableList(String dsName) {
// 手动切换数据源
+ DynamicRoutingDataSource dynamicRoutingDataSource = SpringContextHolder.getBean(DynamicRoutingDataSource.class);
DynamicDataSourceContextHolder.push(dsName);
CacheProxy.clear();
- return ServiceProxy.metadata().tables().values().stream().toList();
+ List tableList = ServiceProxy.metadata().tables().values().stream().toList();
+ if (dynamicRoutingDataSource.getDataSource(dsName) instanceof ItemDataSource itemDataSource) {
+ for (Table table : tableList) {
+ if (itemDataSource.getDataSource() instanceof DruidDataSource druidDataSource) {
+ table.setExtend(druidDataSource.getDbType());
+ }
+ }
+ }
+ return tableList;
}
/**
@@ -185,20 +194,55 @@ public class GenTableServiceImpl extends ServiceImpl i
return genTable;
}
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public GenTable syncTable(String dsName, String tableName) {
+ return AnylineDataSourceHelper.execute(dsName, () -> {
+ CacheProxy.clear();
+ AnylineService service = ServiceProxy.service(dsName);
+ Table tableMetadata = service.metadata().table(tableName);
+ Database database = service.metadata().database();
+ GenTable genTable = baseMapper.selectOne(
+ Wrappers.lambdaQuery().eq(GenTable::getTableName, tableName).eq(GenTable::getDsName, dsName));
+ if (Objects.isNull(genTable)) {
+ genTable = this.buildGenTable(dsName, tableName, tableMetadata, database);
+ DynamicDataSourceContextHolder.clear();
+ this.save(genTable);
+ } else {
+ this.refreshTableMetadata(genTable, tableMetadata, database);
+ DynamicDataSourceContextHolder.clear();
+ this.updateById(genTable);
+ }
+
+ List tableFieldList = getGenTableColumnEntities(dsName, tableName, tableMetadata);
+ columnService.syncFieldList(dsName, tableName, tableFieldList);
+ return this.queryOrBuildTable(dsName, tableName);
+ });
+ }
+
@Transactional(rollbackFor = Exception.class)
protected GenTable tableImport(String dsName, String tableName) {
- // 手动切换数据源
- DynamicDataSourceContextHolder.push(dsName);
+ return AnylineDataSourceHelper.execute(dsName, () -> {
+ CacheProxy.clear();
+ AnylineService service = ServiceProxy.service(dsName);
+ Table tableMetadata = service.metadata().table(tableName);
+ Database database = service.metadata().database();
+ GenTable table = this.buildGenTable(dsName, tableName, tableMetadata, database);
- // 查询表是否存在
+ DynamicDataSourceContextHolder.clear();
+ this.save(table);
+
+ List tableFieldList = getGenTableColumnEntities(dsName, tableName, tableMetadata);
+ columnService.initFieldList(tableFieldList);
+ columnService.saveOrUpdateBatch(tableFieldList);
+
+ table.setFieldList(tableFieldList);
+ return table;
+ });
+ }
+
+ private GenTable buildGenTable(String dsName, String tableName, Table tableMetadata, Database database) {
GenTable table = new GenTable();
- // 从数据库获取表信息
- CacheProxy.clear();
- AnylineService service = ServiceProxy.service();
- Table tableMetadata = service.metadata().table(tableName);
- Database database = service.metadata().database();
- // 获取默认表配置信息 ()
-
table.setPackageName(defaultProperties.getPackageName());
table.setVersion(defaultProperties.getVersion());
table.setBackendPath(defaultProperties.getBackendPath());
@@ -208,33 +252,22 @@ public class GenTableServiceImpl extends ServiceImpl i
table.setTableName(tableName);
table.setDsName(dsName);
table.setTableComment(tableMetadata.getComment());
-
table.setDbType(database.getDatabaseType().title());
table.setFormLayout(defaultProperties.getFormLayout());
table.setSyncRoute(defaultProperties.getSyncRoute());
table.setGeneratorType(defaultProperties.getGeneratorType());
table.setClassName(NamingCase.toPascalCase(tableName));
- // 模块名称默认为 admin
table.setModuleName(defaultProperties.getModuleName());
table.setFunctionName(GenKit.getFunctionName(tableName));
table.setCreateTime(LocalDateTime.now());
-
- // 使用默认数据源
- DynamicDataSourceContextHolder.clear();
- this.save(table);
-
- // 获取原生字段数据
- List tableFieldList = getGenTableColumnEntities(dsName, tableName, tableMetadata);
-
- // 初始化字段数据
- columnService.initFieldList(tableFieldList);
- // 保存列数据
- columnService.saveOrUpdateBatch(tableFieldList);
-
- table.setFieldList(tableFieldList);
return table;
}
+ private void refreshTableMetadata(GenTable table, Table tableMetadata, Database database) {
+ table.setTableComment(tableMetadata.getComment());
+ table.setDbType(database.getDatabaseType().title());
+ }
+
/**
* 获取表字段信息
*
@@ -255,7 +288,7 @@ public class GenTableServiceImpl extends ServiceImpl i
genTableColumnEntity.setFieldComment(column.getComment());
genTableColumnEntity.setFieldType(column.getTypeName());
genTableColumnEntity.setPrimaryPk(
- column.isPrimaryKey() == 1 ? BoolFillEnum.TRUE.getValue() : BoolFillEnum.FALSE.getValue());
+ column.isPrimaryKey() ? BoolFillEnum.TRUE.getValue() : BoolFillEnum.FALSE.getValue());
genTableColumnEntity.setAutoFill(AutoFillEnum.DEFAULT.name());
genTableColumnEntity.setFormItem(BoolFillEnum.TRUE.getValue());
genTableColumnEntity.setGridItem(BoolFillEnum.TRUE.getValue());
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenTemplateServiceImpl.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenTemplateServiceImpl.java
index 5f8667985..eb8b66c99 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenTemplateServiceImpl.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GenTemplateServiceImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -41,9 +41,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import java.util.Set;
/**
@@ -55,8 +53,11 @@ import java.util.Set;
@Slf4j
@Service
@RequiredArgsConstructor
-public class GenTemplateServiceImpl extends ServiceImpl
- implements GenTemplateService {
+public class GenTemplateServiceImpl extends ServiceImpl implements GenTemplateService {
+
+ private static final String CONFIG_JSON_FILE = "config.json";
+
+ private static final String VERSION_FILE = "VERSION";
private final PigxCodeGenDefaultProperties defaultProperties;
@@ -64,7 +65,6 @@ public class GenTemplateServiceImpl extends ServiceImpl configAndVersion = getConfigAndVersion();
- JSONObject configJsonObj = (JSONObject) configAndVersion.get("configJsonObj");
- String versionFile = (String) configAndVersion.get("versionFile");
+ ConfigAndVersion configAndVersion = getConfigAndVersion();
+ JSONObject configJsonObj = configAndVersion.getConfigJsonObj();
+ String versionFile = configAndVersion.getVersionFile();
// 查询出全部的模板组名称
Set cgtmConfigGroupNames = configJsonObj.keySet();
// 根据模板组名称+version 查询是否存在,不存在则新增,存在跳过
for (String cgtmConfigGroupName : cgtmConfigGroupNames) {
- boolean exists = genGroupMapper.exists(Wrappers.lambdaQuery()
- .eq(GenGroupEntity::getGroupName, cgtmConfigGroupName + versionFile));
+ boolean exists = groupExists(withVersion(cgtmConfigGroupName, versionFile));
if (exists) {
continue;
@@ -101,6 +100,7 @@ public class GenTemplateServiceImpl extends ServiceImpl configAndVersion = getConfigAndVersion();
- JSONObject configJsonObj = (JSONObject) configAndVersion.get("configJsonObj");
- String versionFile = (String) configAndVersion.get("versionFile");
+ ConfigAndVersion configAndVersion = getConfigAndVersion();
+ JSONObject configJsonObj = configAndVersion.getConfigJsonObj();
+ String versionFile = configAndVersion.getVersionFile();
// 查询出全部的模板组名称
boolean exists = false;
Set cgtmConfigGroupNames = configJsonObj.keySet();
for (String cgtmConfigGroupName : cgtmConfigGroupNames) {
- exists = genGroupMapper.exists(Wrappers.lambdaQuery()
- .eq(GenGroupEntity::getGroupName, cgtmConfigGroupName + versionFile));
+ exists = groupExists(withVersion(cgtmConfigGroupName, versionFile));
}
return R.ok(exists);
@@ -126,25 +125,19 @@ public class GenTemplateServiceImpl extends ServiceImpl
+ * @return {@link ConfigAndVersion }
*/
- private Map getConfigAndVersion() {
+ private ConfigAndVersion getConfigAndVersion() {
// 获取 config.json 和 version 文件
- String configFile = getCGTMFile("config.json");
- String versionFile = getCGTMFile("VERSION");
+ String configFile = getCGTMFile(CONFIG_JSON_FILE);
+ String versionFile = getCGTMFile(VERSION_FILE);
// 解析 config.json
JSONObject configJsonObj = JSONUtil.parseObj(configFile);
- // 将 configJsonObj 和 versionFile 放入 Map 中
- Map configAndVersion = new HashMap<>();
- configAndVersion.put("configJsonObj", configJsonObj);
- configAndVersion.put("versionFile", versionFile);
-
- return configAndVersion;
+ return new ConfigAndVersion(configJsonObj, versionFile);
}
-
/**
* 插入模板文件
*
@@ -154,33 +147,16 @@ public class GenTemplateServiceImpl extends ServiceImpl templateFileVOList = configJsonObj.getBeanList(groupName, GenTemplateFileVO.class);
for (GenTemplateFileVO genTemplateFileVO : templateFileVOList) {
- // 1. 获取模板文件
- String templateFile = getCGTMFile(genTemplateFileVO.getTemplateFile());
-
- // 2. 插入模板文件
- GenTemplateEntity genTemplateEntity = new GenTemplateEntity();
- genTemplateEntity.setTemplateName(genTemplateFileVO.getTemplateName() + version);
- genTemplateEntity.setTemplateDesc(genTemplateFileVO.getTemplateName() + version);
- genTemplateEntity.setTemplateCode(templateFile);
- genTemplateEntity.setGeneratorPath(genTemplateFileVO.getGeneratorPath());
- baseMapper.insert(genTemplateEntity);
-
- // 3. 插入模板组关联
- GenTemplateGroupEntity genTemplateGroupEntity = new GenTemplateGroupEntity();
- genTemplateGroupEntity.setTemplateId(genTemplateEntity.getId());
- genTemplateGroupEntity.setGroupId(genGroupEntity.getId());
- genTemplateGroupMapper.insert(genTemplateGroupEntity);
+ GenTemplateEntity genTemplateEntity = getOrCreateTemplate(genTemplateFileVO, version);
+ createTemplateGroupRelationIfAbsent(genTemplateEntity.getId(), genGroupEntity.getId());
}
}
-
/**
* 获取 cgtmfile
*
@@ -188,14 +164,82 @@ public class GenTemplateServiceImpl extends ServiceImpllambdaQuery().eq(GenGroupEntity::getGroupName, groupName));
+ }
+
+ private GenGroupEntity createGroup(String groupName, String version) {
+ GenGroupEntity genGroupEntity = new GenGroupEntity();
+ genGroupEntity.setGroupName(withVersion(groupName, version));
+ genGroupMapper.insert(genGroupEntity);
+ return genGroupEntity;
+ }
+
+ private GenTemplateEntity getOrCreateTemplate(GenTemplateFileVO templateFileVO, String version) {
+ String templateName = withVersion(templateFileVO.getTemplateName(), version);
+ GenTemplateEntity genTemplateEntity = findTemplateByName(templateName);
+ if (genTemplateEntity != null) {
+ log.info("模板文件已存在,复用: {}", templateName);
+ return genTemplateEntity;
+ }
+
+ GenTemplateEntity templateEntity = new GenTemplateEntity();
+ templateEntity.setTemplateName(templateName);
+ templateEntity.setTemplateDesc(templateName);
+ templateEntity.setTemplateCode(getCGTMFile(templateFileVO.getTemplateFile()));
+ templateEntity.setGeneratorPath(templateFileVO.getGeneratorPath());
+ baseMapper.insert(templateEntity);
+ log.info("模板文件已插入: {}", templateName);
+ return templateEntity;
+ }
+
+ private GenTemplateEntity findTemplateByName(String templateName) {
+ return baseMapper.selectOne(Wrappers.lambdaQuery().eq(GenTemplateEntity::getTemplateName, templateName));
+ }
+
+ private void createTemplateGroupRelationIfAbsent(Long templateId, Long groupId) {
+ boolean relationExists = genTemplateGroupMapper.exists(Wrappers.lambdaQuery().eq(GenTemplateGroupEntity::getTemplateId, templateId).eq(GenTemplateGroupEntity::getGroupId, groupId));
+ if (relationExists) {
+ return;
+ }
+
+ GenTemplateGroupEntity genTemplateGroupEntity = new GenTemplateGroupEntity();
+ genTemplateGroupEntity.setTemplateId(templateId);
+ genTemplateGroupEntity.setGroupId(groupId);
+ genTemplateGroupMapper.insert(genTemplateGroupEntity);
+ }
+
+ private String withVersion(String name, String version) {
+ return name + version;
+ }
+
+ @RequiredArgsConstructor
+ private static final class ConfigAndVersion {
+
+ private final JSONObject configJsonObj;
+
+ private final String versionFile;
+
+ private JSONObject getConfigJsonObj() {
+ return configJsonObj;
+ }
+
+ private String getVersionFile() {
+ return versionFile;
}
}
+
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GeneratorServiceImpl.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GeneratorServiceImpl.java
index 2f4da57e6..2711daed4 100755
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GeneratorServiceImpl.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/service/impl/GeneratorServiceImpl.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2026, lengleng All rights reserved.
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -223,10 +223,10 @@ public class GeneratorServiceImpl implements GeneratorService {
Map dataModel = getDataModel(genTable.getId());
// 获取模板信息,Lambda 表达式简化代码
- GenTemplateEntity genTemplateEntity = genTemplateService.getOneOpt(Wrappers.lambdaQuery()
+ GenTemplateEntity genTemplateEntity = genTemplateService
+ .getOneOpt(Wrappers.lambdaQuery()
.likeRight(GenTemplateEntity::getTemplateName, GeneratorStyleEnum.VFORM_JSON.getDesc())
- .orderByDesc(GenTemplateEntity::getCreateTime), false
- )
+ .orderByDesc(GenTemplateEntity::getCreateTime), false)
.orElseThrow(() -> new CheckedException("模板不存在"));
// 渲染模板并返回结果
return VelocityKit.renderStr(genTemplateEntity.getTemplateCode(), dataModel);
@@ -257,10 +257,10 @@ public class GeneratorServiceImpl implements GeneratorService {
dataModel.put("resultMap", resultMap);
// 获取模板信息 查询模板中最新的 vform.json 文件
- GenTemplateEntity genTemplateEntity = genTemplateService.getOneOpt(Wrappers.lambdaQuery()
+ GenTemplateEntity genTemplateEntity = genTemplateService
+ .getOneOpt(Wrappers.lambdaQuery()
.likeRight(GenTemplateEntity::getTemplateName, GeneratorStyleEnum.VFORM_VUE.getDesc())
- .orderByDesc(GenTemplateEntity::getCreateTime), false
- )
+ .orderByDesc(GenTemplateEntity::getCreateTime), false)
.orElseThrow(() -> new CheckedException("模板不存在"));
// 渲染模板并返回结果
@@ -294,7 +294,9 @@ public class GeneratorServiceImpl implements GeneratorService {
query.setName(menuName);
query.setMenuType(MenuTypeEnum.LEFT_MENU.getType());
- List existingMenus = RetOps.of(menuService.getMenuDetails(query)).getData().orElse(Collections.emptyList());
+ List existingMenus = RetOps.of(menuService.getMenuDetails(query))
+ .getData()
+ .orElse(Collections.emptyList());
if (!CollUtil.isEmpty(existingMenus)) {
return;
@@ -320,7 +322,11 @@ public class GeneratorServiceImpl implements GeneratorService {
sysMenu.setParentId(table.getSyncMenuId());
sysMenu.setName(menuName);
sysMenu.setMenuType(MenuTypeEnum.LEFT_MENU.getType());
- sysMenu.setPath(String.format("/%s/%s/index", table.getModuleName(), table.getFunctionName()));
+ sysMenu.setVisible(YesNoEnum.YES.getCode());
+ sysMenu.setKeepAlive(YesNoEnum.NO.getCode());
+ sysMenu.setEmbedded(YesNoEnum.NO.getCode());
+ sysMenu.setSortOrder(0);
+ sysMenu.setPath(String.format("/%s/%s/index", normalizedModuleName(table), table.getFunctionName()));
return sysMenu;
}
@@ -333,13 +339,19 @@ public class GeneratorServiceImpl implements GeneratorService {
private void createButtons(GenTable table, Long parentId) {
String[] buttonNames = {"查看", "新增", "编辑", "删除", "导入导出"};
String[] permissions = {"view", "add", "edit", "del", "export"};
+ String moduleName = normalizedModuleName(table);
for (int i = 0; i < buttonNames.length; i++) {
+ String permission = String.format("%s_%s_%s", moduleName, table.getFunctionName(), permissions[i]);
SysMenu button = new SysMenu();
button.setParentId(parentId);
button.setMenuType(MenuTypeEnum.BUTTON.getType());
button.setName(buttonNames[i]);
- button.setPermission(String.format("%s_%s_%s", table.getModuleName(), table.getFunctionName(), permissions[i]));
+ button.setVisible(YesNoEnum.YES.getCode());
+ button.setKeepAlive(YesNoEnum.NO.getCode());
+ button.setEmbedded(YesNoEnum.NO.getCode());
+ button.setSortOrder(0);
+ button.setPermission(StrUtil.toLowerCase(permission));
menuService.saveMenu(button);
}
}
@@ -354,7 +366,9 @@ public class GeneratorServiceImpl implements GeneratorService {
return;
}
- List existingRoutes = RetOps.of(routeService.getRouteDetails()).getData().orElse(Collections.emptyList());
+ List existingRoutes = RetOps.of(routeService.getRouteDetails())
+ .getData()
+ .orElse(Collections.emptyList());
boolean exist = existingRoutes.stream()
.anyMatch(routeConf -> routeConf.getRouteId().equals(table.getModuleName()));
@@ -376,7 +390,9 @@ public class GeneratorServiceImpl implements GeneratorService {
SysRouteConf sysRouteConf = new SysRouteConf();
sysRouteConf.setRouteId(table.getModuleName());
sysRouteConf.setRouteName(table.getModuleName());
- sysRouteConf.setPredicates(String.format("[{\"args\": {\"_genkey_0\": \"/%s/**\"}, \"name\": \"Path\"}]", table.getModuleName()));
+ sysRouteConf.setPredicates(
+ String.format("[{\"args\": {\"_genkey_0\": \"/%s/**\"}, \"name\": \"Path\"}]"
+ , normalizedModuleName(table)));
sysRouteConf.setFilters("[]");
sysRouteConf.setUri(String.format("lb://%s-biz", table.getModuleName()));
return sysRouteConf;
@@ -410,8 +426,9 @@ public class GeneratorServiceImpl implements GeneratorService {
dataModel.put(DataModelConstants.PACKAGE, table.getPackageName());
dataModel.put(DataModelConstants.PACKAGE_PATH, table.getPackageName().replace(".", "/"));
dataModel.put(DataModelConstants.VERSION, table.getVersion());
- dataModel.put(DataModelConstants.MODULE_NAME, table.getModuleName());
- dataModel.put(DataModelConstants.MODULE_NAME_UPPER_FIRST, StrUtil.upperFirst(table.getModuleName()));
+ String moduleName = normalizedModuleName(table);
+ dataModel.put(DataModelConstants.MODULE_NAME, moduleName);
+ dataModel.put(DataModelConstants.MODULE_NAME_UPPER_FIRST, StrUtil.upperFirst(moduleName));
dataModel.put(DataModelConstants.FUNCTION_NAME, table.getFunctionName());
dataModel.put(DataModelConstants.FUNCTION_NAME_UPPER_FIRST, StrUtil.upperFirst(table.getFunctionName()));
dataModel.put(DataModelConstants.FORM_LAYOUT, table.getFormLayout());
@@ -445,15 +462,27 @@ public class GeneratorServiceImpl implements GeneratorService {
dataModel.put(DataModelConstants.MAIN_FIELD, NamingCase.toCamelCase(table.getMainField()));
dataModel.put(DataModelConstants.CHILD_FIELD, NamingCase.toCamelCase(table.getChildField()));
dataModel.put(DataModelConstants.CHILD_CLASS_NAME_UPPER_FIRST, NamingCase.toPascalCase(childTableName));
- dataModel.put(DataModelConstants.CHILD_CLASS_NAME, StrUtil.lowerFirst(NamingCase.toPascalCase(childTableName)));
+ dataModel.put(DataModelConstants.CHILD_CLASS_NAME,
+ StrUtil.lowerFirst(NamingCase.toPascalCase(childTableName)));
// 设置是否是多租户模式 (判断字段列表中是否包含 tenant_id 字段)
- childFieldList.stream().filter(genTableColumnEntity -> genTableColumnEntity.getFieldName().equals("tenant_id"))
- .findFirst().ifPresent(columnEntity -> dataModel.put(DataModelConstants.IS_CHILD_TENANT, true));
+ childFieldList.stream()
+ .filter(genTableColumnEntity -> genTableColumnEntity.getFieldName().equals("tenant_id"))
+ .findFirst()
+ .ifPresent(columnEntity -> dataModel.put(DataModelConstants.IS_CHILD_TENANT, true));
+ }
+
+ // 设置树表
+ if (StrUtil.isNotBlank(table.getParentField())) {
+ dataModel.put(DataModelConstants.TREE_PARENT_FIELD, NamingCase.toCamelCase(table.getParentField()));
+ dataModel.put(DataModelConstants.TREE_NAME_FIELD, NamingCase.toCamelCase(table.getNameField()));
}
// 设置是否是多租户模式 (判断字段列表中是否包含 tenant_id 字段)
- table.getFieldList().stream().filter(genTableColumnEntity -> genTableColumnEntity.getFieldName().equals("tenant_id"))
- .findFirst().ifPresent(columnEntity -> dataModel.put(DataModelConstants.IS_TENANT, true));
+ table.getFieldList()
+ .stream()
+ .filter(genTableColumnEntity -> genTableColumnEntity.getFieldName().equals("tenant_id"))
+ .findFirst()
+ .ifPresent(columnEntity -> dataModel.put(DataModelConstants.IS_TENANT, true));
return dataModel;
}
@@ -467,6 +496,16 @@ public class GeneratorServiceImpl implements GeneratorService {
return StrUtil.startWith(SpringBootVersion.getVersion(), "3");
}
+ /**
+ * 获取去掉中划线的模块名称
+ *
+ * @param table 表配置
+ * @return 去掉中划线后的模块名称
+ */
+ private String normalizedModuleName(GenTable table) {
+ return StrUtil.removeAll(table.getModuleName(), StrUtil.DASHED);
+ }
+
/**
* 将表字段按照类型分组并存储到数据模型中
*
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/AnylineDataSourceHelper.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/AnylineDataSourceHelper.java
new file mode 100644
index 000000000..96306ff1a
--- /dev/null
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/AnylineDataSourceHelper.java
@@ -0,0 +1,88 @@
+package com.pig4cloud.pigx.codegen.util;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import lombok.experimental.UtilityClass;
+import org.anyline.data.datasource.DataSourceHolder;
+
+import javax.sql.DataSource;
+import java.util.function.Supplier;
+
+/**
+ * Anyline 动态数据源辅助类。
+ *
+ * 统一封装以下动作:
+ *
+ * - 根据数据源名称获取动态数据源
+ * - 按需向 Anyline 注册 {@link javax.sql.DataSource}
+ * - 切换 {@link DynamicDataSourceContextHolder} 上下文并在执行结束后清理
+ *
+ * 业务层只需要关注具体操作逻辑,不再重复处理数据源切换细节。
+ */
+@UtilityClass
+public class AnylineDataSourceHelper {
+
+
+ /**
+ * 在指定数据源上下文中执行无返回值逻辑。
+ *
+ * @param dsName 数据源名称
+ * @param action 要执行的业务逻辑
+ */
+ public void run(String dsName, Runnable action) {
+ execute(dsName, () -> {
+ action.run();
+ return null;
+ });
+ }
+
+ /**
+ * 在指定数据源上下文中执行有返回值逻辑。
+ *
+ * 进入执行前会确保 Anyline 已注册对应数据源,并在 finally 中清理动态数据源上下文。
+ *
+ * @param dsName 数据源名称
+ * @param action 要执行的业务逻辑
+ * @param 返回值类型
+ * @return 业务逻辑返回值
+ */
+ public T execute(String dsName, Supplier action) {
+ if (StrUtil.isBlank(dsName)) {
+ throw new IllegalArgumentException("dsName must not be blank");
+ }
+
+ DynamicRoutingDataSource routingDataSource = SpringUtil.getBean(DynamicRoutingDataSource.class);
+ DataSource dataSource = routingDataSource.getDataSource(dsName);
+ if (dataSource == null) {
+ throw new IllegalArgumentException("DataSource not found: " + dsName);
+ }
+
+ registerIfAbsent(dsName, dataSource);
+ DynamicDataSourceContextHolder.push(dsName);
+ try {
+ return action.get();
+ } finally {
+ DynamicDataSourceContextHolder.clear();
+ }
+ }
+
+ /**
+ * 按需向 Anyline 注册数据源,避免重复注册。
+ *
+ * @param dsName 数据源名称
+ * @param dataSource Spring 动态数据源中解析出的数据源实例
+ */
+ private void registerIfAbsent(String dsName, DataSource dataSource) {
+ if (DataSourceHolder.exists(dsName)) {
+ return;
+ }
+ try {
+ DataSourceHolder.reg(dsName, dataSource);
+ } catch (Exception e) {
+ throw new IllegalStateException("Failed to register Anyline datasource: " + dsName, e);
+ }
+ }
+
+}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/CommonColumnFiledEnum.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/CommonColumnFiledEnum.java
index 12fcd218f..a7b60e7fd 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/CommonColumnFiledEnum.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/CommonColumnFiledEnum.java
@@ -1,7 +1,7 @@
package com.pig4cloud.pigx.codegen.util;
-import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.RequiredArgsConstructor;
/**
* @author lengleng
@@ -10,7 +10,7 @@ import lombok.Getter;
* 通用字段的填充策略和显示策略
*/
@Getter
-@AllArgsConstructor
+@RequiredArgsConstructor
public enum CommonColumnFiledEnum {
/**
@@ -42,21 +42,21 @@ public enum CommonColumnFiledEnum {
/**
* 表单是否默认显示 1/0
*/
- private String formItem;
+ private final String formItem;
/**
* 表格是否默认显示 1/0
*/
- private String gridItem;
+ private final String gridItem;
/**
* 自动填充策略
*/
- private String autoFill;
+ private final String autoFill;
/**
* 排序值
*/
- private Integer sort;
+ private final Integer sort;
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/DataModelConstants.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/DataModelConstants.java
index 60d483453..cf331dd4f 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/DataModelConstants.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/DataModelConstants.java
@@ -7,52 +7,81 @@ package com.pig4cloud.pigx.codegen.util;
* @date 2024/7/16
*/
public class DataModelConstants {
- // 基本信息
- public static final String IS_SPRING_BOOT_3 = "isSpringBoot3";
- public static final String SYNC_MENU_ID = "syncMenuId";
- public static final String DB_TYPE = "dbType";
- public static final String PACKAGE = "package";
- public static final String PACKAGE_PATH = "packagePath";
- public static final String VERSION = "version";
- // 模块和功能名称
- public static final String MODULE_NAME = "moduleName";
- public static final String MODULE_NAME_UPPER_FIRST = "ModuleName";
- public static final String FUNCTION_NAME = "functionName";
- public static final String FUNCTION_NAME_UPPER_FIRST = "FunctionName";
+ // 基本信息
+ public static final String IS_SPRING_BOOT_3 = "isSpringBoot3";
- // 布局和样式
- public static final String FORM_LAYOUT = "formLayout";
- public static final String STYLE = "style";
+ public static final String SYNC_MENU_ID = "syncMenuId";
- // 作者和时间
- public static final String AUTHOR = "author";
- public static final String DATETIME = "datetime";
- public static final String DATE = "date";
+ public static final String DB_TYPE = "dbType";
- // 导入列表
- public static final String IMPORT_LIST = "importList";
+ public static final String PACKAGE = "package";
- // 表信息
- public static final String TABLE_NAME = "tableName";
- public static final String TABLE_COMMENT = "tableComment";
- public static final String CLASS_NAME = "className";
- public static final String CLASS_NAME_UPPER_FIRST = "ClassName";
- public static final String FIELD_LIST = "fieldList";
+ public static final String PACKAGE_PATH = "packagePath";
- // 路径
- public static final String BACKEND_PATH = "backendPath";
- public static final String FRONTEND_PATH = "frontendPath";
+ public static final String VERSION = "version";
- // 子表信息
- public static final String CHILD_FIELD_LIST = "childFieldList";
- public static final String CHILD_TABLE_NAME = "childTableName";
- public static final String MAIN_FIELD = "mainField";
- public static final String CHILD_FIELD = "childField";
- public static final String CHILD_CLASS_NAME_UPPER_FIRST = "ChildClassName";
- public static final String CHILD_CLASS_NAME = "childClassName";
- public static final String IS_CHILD_TENANT = "isChildTenant";
+ // 模块和功能名称
+ public static final String MODULE_NAME = "moduleName";
+
+ public static final String MODULE_NAME_UPPER_FIRST = "ModuleName";
+
+ public static final String FUNCTION_NAME = "functionName";
+
+ public static final String FUNCTION_NAME_UPPER_FIRST = "FunctionName";
+
+ // 布局和样式
+ public static final String FORM_LAYOUT = "formLayout";
+
+ public static final String STYLE = "style";
+
+ // 作者和时间
+ public static final String AUTHOR = "author";
+
+ public static final String DATETIME = "datetime";
+
+ public static final String DATE = "date";
+
+ // 导入列表
+ public static final String IMPORT_LIST = "importList";
+
+ // 表信息
+ public static final String TABLE_NAME = "tableName";
+
+ public static final String TABLE_COMMENT = "tableComment";
+
+ public static final String CLASS_NAME = "className";
+
+ public static final String CLASS_NAME_UPPER_FIRST = "ClassName";
+
+ public static final String FIELD_LIST = "fieldList";
+
+ // 路径
+ public static final String BACKEND_PATH = "backendPath";
+
+ public static final String FRONTEND_PATH = "frontendPath";
+
+ // 子表信息
+ public static final String CHILD_FIELD_LIST = "childFieldList";
+
+ public static final String CHILD_TABLE_NAME = "childTableName";
+
+ public static final String MAIN_FIELD = "mainField";
+
+ public static final String CHILD_FIELD = "childField";
+
+ public static final String CHILD_CLASS_NAME_UPPER_FIRST = "ChildClassName";
+
+ public static final String CHILD_CLASS_NAME = "childClassName";
+
+ public static final String IS_CHILD_TENANT = "isChildTenant";
+
+ // 树表信息
+ public static final String TREE_PARENT_FIELD = "parentField";
+
+ public static final String TREE_NAME_FIELD = "nameField";
+
+ // 租户信息
+ public static final String IS_TENANT = "isTenant";
- // 租户信息
- public static final String IS_TENANT = "isTenant";
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/GeneratorStyleEnum.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/GeneratorStyleEnum.java
index ce9fac70d..0990c0d55 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/GeneratorStyleEnum.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/GeneratorStyleEnum.java
@@ -1,7 +1,7 @@
package com.pig4cloud.pigx.codegen.util;
-import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.RequiredArgsConstructor;
/**
* 代码生成主题
@@ -9,7 +9,7 @@ import lombok.Getter;
* @author 冷冷
*/
@Getter
-@AllArgsConstructor
+@RequiredArgsConstructor
public enum GeneratorStyleEnum {
VFORM_JSON(1L, "vform.json"),
@@ -19,11 +19,11 @@ public enum GeneratorStyleEnum {
/**
* 对应模板ID
*/
- private Long templateId;
+ private final Long templateId;
/**
* 描述
*/
- private String desc;
+ private final String desc;
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/NamingCaseTool.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/NamingCaseTool.java
index 7a1bde8d8..5d813ff73 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/NamingCaseTool.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/NamingCaseTool.java
@@ -2,6 +2,8 @@ package com.pig4cloud.pigx.codegen.util;
import cn.hutool.core.text.NamingCase;
+import java.util.Locale;
+
/**
* 命名规则处理,针对驼峰,下划线等处理
*
@@ -10,26 +12,37 @@ import cn.hutool.core.text.NamingCase;
*/
public class NamingCaseTool {
- /**
- * 传入字段获取的get方法
- * @param in 字段名称
- * @return
- */
- public static String getProperty(String in) {
- return String.format("get%s", NamingCase.toPascalCase(in));
- }
+ /**
+ * 传入字段获取的get方法
+ *
+ * @param in 字段名称
+ * @return
+ */
+ public static String getProperty(String in) {
+ return "get" + NamingCase.toPascalCase(in);
+ }
- public static String setProperty(String in) {
- return String.format("set%s", NamingCase.toPascalCase(in));
- }
+ public static String setProperty(String in) {
+ return "set" + NamingCase.toPascalCase(in);
+ }
- /**
- * 首字母大写
- * @param in 字段
- * @return 首字母大写
- */
- public static String pascalCase(String in) {
- return String.format(NamingCase.toPascalCase(in));
- }
+ /**
+ * 首字母大写
+ *
+ * @param in 字段
+ * @return 首字母大写
+ */
+ public static String pascalCase(String in) {
+ return NamingCase.toPascalCase(in);
+ }
+ /**
+ * 将字符串转换为小写
+ *
+ * @param in 输入字符串
+ * @return 转换为小写后的字符串
+ */
+ public static String lowerCase(String in) {
+ return in.toLowerCase(Locale.ROOT);
+ }
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/VFormTypeEnum.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/VFormTypeEnum.java
index bf9b622d5..b1713edfa 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/VFormTypeEnum.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/VFormTypeEnum.java
@@ -1,7 +1,7 @@
package com.pig4cloud.pigx.codegen.util;
-import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.RequiredArgsConstructor;
/**
* vfrom 字段类型
@@ -10,7 +10,7 @@ import lombok.Getter;
* @date 2023/6/5
*/
@Getter
-@AllArgsConstructor
+@RequiredArgsConstructor
public enum VFormTypeEnum {
GRID("grid"),
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/table/CreateTableHandler.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/table/CreateTableHandler.java
index e917624e1..d214b3c97 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/table/CreateTableHandler.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/table/CreateTableHandler.java
@@ -36,36 +36,37 @@ import org.springframework.stereotype.Component;
@RequiredArgsConstructor
public class CreateTableHandler {
- /**
- * 运行表单主键ID
- */
- private final static String RUN_FORM_COLUMN_NAME = "run_form_id";
+ /**
+ * 运行表单主键ID
+ */
+ private final static String RUN_FORM_COLUMN_NAME = "run_form_id";
- /**
- * 自动创建表
- * @param tableInfo 表信息
- */
- public Boolean createTable(TableInfo tableInfo) {
- if (tableInfo.getColumns() == null || tableInfo.getColumns().isEmpty()) {
- throw new RuntimeException("自动创建表[" + tableInfo.getName() + "]中至少需要一个字段");
- }
- if (!TableModelEnum.CREATE.name().toLowerCase().equals(tableInfo.getModel())) {
- throw new RuntimeException("自动创建表[" + tableInfo.getModel() + "]模式的处理未找到,请检查");
- }
- try {
- AnylineService service = ServiceProxy.service();
- // 如果已存在,删除重键
- Table table = service.metadata().table(tableInfo.getName(), false);
- if (null != table)
- service.ddl().drop(table);
- // 执行建表SQL
- service.ddl().create(tableInfo);
- log.info("自动创建表处理完成!");
- }
- catch (Exception e) {
- throw new RuntimeException("自动创建表异常", e);
- }
- return Boolean.TRUE;
- }
+ /**
+ * 自动创建表
+ *
+ * @param dsName
+ * @param tableInfo 表信息
+ */
+ public Boolean createTable(String dsName, TableInfo tableInfo) {
+ if (tableInfo.getColumns() == null || tableInfo.getColumns().isEmpty()) {
+ throw new RuntimeException("自动创建表[" + tableInfo.getName() + "]中至少需要一个字段");
+ }
+ if (!TableModelEnum.CREATE.name().toLowerCase().equals(tableInfo.getModel())) {
+ throw new RuntimeException("自动创建表[" + tableInfo.getModel() + "]模式的处理未找到,请检查");
+ }
+ try {
+ AnylineService service = ServiceProxy.service(dsName);
+ // 如果已存在,删除重键
+ Table table = service.metadata().table(tableInfo.getName(), false);
+ if (null != table)
+ service.ddl().drop(table);
+ // 执行建表SQL
+ service.ddl().create(tableInfo);
+ log.info("自动创建表处理完成!");
+ } catch (Exception e) {
+ throw new RuntimeException("自动创建表异常", e);
+ }
+ return Boolean.TRUE;
+ }
}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/table/enums/TableModelEnum.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/table/enums/TableModelEnum.java
index cb3acf466..0d32dbfb5 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/table/enums/TableModelEnum.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/table/enums/TableModelEnum.java
@@ -1,6 +1,6 @@
package com.pig4cloud.pigx.codegen.util.table.enums;
/*
- * Copyright (c) 2018-2026, luolin All rights reserved.
+ * Copyright (c) 2018-2025, luolin All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/table/model/TableInfo.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/table/model/TableInfo.java
index d399c6e70..a0cc56cb6 100644
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/table/model/TableInfo.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/table/model/TableInfo.java
@@ -1,6 +1,6 @@
package com.pig4cloud.pigx.codegen.util.table.model;
/*
- * Copyright (c) 2018-2026, luolin All rights reserved.
+ * Copyright (c) 2018-2025, luolin All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/vo/GenCreateTableColumnVO.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/vo/GenCreateTableColumnVO.java
new file mode 100644
index 000000000..15ecf1abb
--- /dev/null
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/vo/GenCreateTableColumnVO.java
@@ -0,0 +1,48 @@
+package com.pig4cloud.pigx.codegen.util.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.experimental.FieldNameConstants;
+
+/**
+ * 自动创建表字段信息
+ *
+ * @author luolin
+ * @date 2026-04-10
+ */
+@Data
+@FieldNameConstants
+@Schema(description = "自动创建表字段信息")
+public class GenCreateTableColumnVO {
+
+ @Schema(description = "字段名称")
+ private String name;
+
+ @Schema(description = "字段注释")
+ private String comment;
+
+ @Schema(description = "字段类型")
+ private String type;
+
+ @Schema(description = "字段长度")
+ private Integer length;
+
+ @Schema(description = "精度")
+ private Integer precision;
+
+ @Schema(description = "小数位")
+ private Integer scale;
+
+ @Schema(description = "默认值")
+ private Object defaultValue;
+
+ @Schema(description = "是否主键")
+ private Boolean primary;
+
+ @Schema(description = "是否允许为空")
+ private Boolean nullable;
+
+ @Schema(description = "是否自增")
+ private Boolean autoIncrement;
+
+}
diff --git a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/vo/GenCreateTableVO.java b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/vo/GenCreateTableVO.java
index 7926656fb..0734cf74b 100755
--- a/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/vo/GenCreateTableVO.java
+++ b/pigx-visual/pigx-codegen/src/main/java/com/pig4cloud/pigx/codegen/util/vo/GenCreateTableVO.java
@@ -1,6 +1,6 @@
package com.pig4cloud.pigx.codegen.util.vo;
/*
- * Copyright (c) 2018-2026, luolin All rights reserved.
+ * Copyright (c) 2018-2025, luolin All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -19,8 +19,10 @@ package com.pig4cloud.pigx.codegen.util.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
+import lombok.experimental.FieldNameConstants;
import java.time.LocalDateTime;
+import java.util.List;
/**
* 自动创建表管理
@@ -29,6 +31,7 @@ import java.time.LocalDateTime;
* @date 2022-09-23 21:56:11
*/
@Data
+@FieldNameConstants
@Schema(description = "自动创建表管理")
public class GenCreateTableVO {
@@ -80,16 +83,10 @@ public class GenCreateTableVO {
@Schema(description = "创建时间")
private LocalDateTime createTime;
- /**
- * 表字段信息
- */
- @Schema(description = "表字段信息")
- private String columnsInfo;
-
/**
* 字段信息
*/
@Schema(description = "字段信息")
- private String columnInfo;
+ private List columnInfo;
}
diff --git a/pigx-visual/pigx-codegen/src/main/resources/logback-spring.xml b/pigx-visual/pigx-codegen/src/main/resources/logback-spring.xml
index 09a212bd6..6879ae21a 100644
--- a/pigx-visual/pigx-codegen/src/main/resources/logback-spring.xml
+++ b/pigx-visual/pigx-codegen/src/main/resources/logback-spring.xml
@@ -1,6 +1,6 @@