diff --git a/pom.xml b/pom.xml
index 5b1745f2d..62abb9683 100644
--- a/pom.xml
+++ b/pom.xml
@@ -389,6 +389,13 @@
${revision}
+
+
+ org.dromara
+ ruoyi-datasource
+ ${revision}
+
+
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 155f594c6..350a6a15a 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -81,6 +81,12 @@
ruoyi-workflow
+
+
+ org.dromara
+ ruoyi-datasource
+
+
de.codecentric
spring-boot-admin-starter-client
diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml
index daff497a0..8e0207cac 100644
--- a/ruoyi-modules/pom.xml
+++ b/ruoyi-modules/pom.xml
@@ -15,6 +15,7 @@
ruoyi-job
ruoyi-system
ruoyi-workflow
+ ruoyi-datasource
ruoyi-modules
diff --git a/ruoyi-modules/ruoyi-datasource/pom.xml b/ruoyi-modules/ruoyi-datasource/pom.xml
new file mode 100644
index 000000000..a7e7654b4
--- /dev/null
+++ b/ruoyi-modules/ruoyi-datasource/pom.xml
@@ -0,0 +1,94 @@
+
+
+ 4.0.0
+
+ org.dromara
+ ruoyi-modules
+ ${revision}
+ ../pom.xml
+
+
+ jar
+ ruoyi-datasource
+
+
+ 0.6.0
+
+
+
+ 数据源模块
+
+
+
+
+
+ org.dromara
+ ruoyi-common-core
+
+
+
+ org.dromara
+ ruoyi-common-idempotent
+
+
+
+
+ org.dromara
+ ruoyi-common-mybatis
+
+
+
+ org.dromara
+ ruoyi-common-log
+
+
+
+ org.dromara
+ ruoyi-common-excel
+
+
+
+ org.dromara
+ ruoyi-common-web
+
+
+
+ org.dromara
+ ruoyi-common-tenant
+
+
+
+ com.mysql
+ mysql-connector-j
+
+
+
+ com.oracle.database.jdbc
+ ojdbc8
+
+
+
+ org.postgresql
+ postgresql
+
+
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+
+
+
+ cn.hutool
+ hutool-db
+
+
+
+ com.clickhouse
+ clickhouse-jdbc
+ ${clickhouse.version}
+
+
+
+
diff --git a/ruoyi-modules/ruoyi-datasource/src/main/java/org/dromara/datasource/controller/SysDatasourceController.java b/ruoyi-modules/ruoyi-datasource/src/main/java/org/dromara/datasource/controller/SysDatasourceController.java
new file mode 100644
index 000000000..c5e0557ca
--- /dev/null
+++ b/ruoyi-modules/ruoyi-datasource/src/main/java/org/dromara/datasource/controller/SysDatasourceController.java
@@ -0,0 +1,226 @@
+package org.dromara.datasource.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.StrUtil;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.datasource.domain.bo.DsFieldQueryBo;
+import org.dromara.datasource.domain.bo.DsQueryBo;
+import org.dromara.datasource.domain.bo.SysDatasourceBo;
+import org.dromara.datasource.domain.vo.SysDatasourceVo;
+import org.dromara.datasource.jdbc.JdbcQuery;
+import org.dromara.datasource.jdbc.core.DbType;
+import org.dromara.datasource.service.ISysDatasourceService;
+import org.dromara.datasource.utils.Assert;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 动态数据源
+ *
+ * @author ixyxj
+ * @date 2024-05-02
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/datasource")
+public class SysDatasourceController extends BaseController {
+
+ private final ISysDatasourceService sysDatasourceService;
+
+ /**
+ * 查询动态数据源列表
+ */
+ @SaCheckPermission("system:datasource:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SysDatasourceBo bo, PageQuery pageQuery) {
+ return sysDatasourceService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出动态数据源列表
+ */
+ @SaCheckPermission("system:datasource:export")
+ @Log(title = "动态数据源", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(SysDatasourceBo bo, HttpServletResponse response) {
+ List list = sysDatasourceService.queryList(bo);
+ ExcelUtil.exportExcel(list, "动态数据源", SysDatasourceVo.class, response);
+ }
+
+ /**
+ * 获取动态数据源详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("system:datasource:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(sysDatasourceService.queryById(id));
+ }
+
+ /**
+ * 新增动态数据源
+ */
+ @SaCheckPermission("system:datasource:add")
+ @Log(title = "动态数据源", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody SysDatasourceBo bo) {
+ return toAjax(sysDatasourceService.insertByBo(bo));
+ }
+
+ /**
+ * 修改动态数据源
+ */
+ @SaCheckPermission("datasource:datasource:edit")
+ @Log(title = "动态数据源", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody SysDatasourceBo bo) {
+ return toAjax(sysDatasourceService.updateByBo(bo));
+ }
+
+ /**
+ * 删除动态数据源
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("system:datasource:remove")
+ @Log(title = "动态数据源", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(sysDatasourceService.deleteWithValidByIds(List.of(ids), true));
+ }
+
+ /**
+ * 获取数据源类型
+ */
+ @SaCheckPermission("system:datasource:query")
+ @GetMapping("/types")
+ public R types() {
+ return R.ok(DbType.values());
+ }
+
+ /**
+ * 获取数据库列表
+ */
+ @SaCheckPermission("system:datasource:query")
+ @PostMapping("/databases")
+ public R> databases(@Validated @RequestBody DsQueryBo bo) {
+ List query = sysDatasourceService.getJdbcService().query(bo.getDsName(), bo.getDsType(), JdbcQuery::queryDatabases);
+ return R.ok(query);
+ }
+
+ /**
+ * 获取表列表
+ */
+ @SaCheckPermission("system:datasource:query")
+ @PostMapping("/tables")
+ public R>> tables(@Validated @RequestBody DsQueryBo bo) {
+ List