diff --git a/nursing-unit-base-core/src/main/java/org/jeecg/modules/data/entity/DataSourceEntity.java b/nursing-unit-base-core/src/main/java/org/jeecg/modules/data/entity/DataSourceEntity.java new file mode 100644 index 0000000..c5deede --- /dev/null +++ b/nursing-unit-base-core/src/main/java/org/jeecg/modules/data/entity/DataSourceEntity.java @@ -0,0 +1,75 @@ +package org.jeecg.modules.data.entity; + +import lombok.Data; + +/** + * @Description: 多数据源管理 + * @Author: caolei + * @Date: 2025-04-01 + * @Version: V1.0 + */ +@Data +public class DataSourceEntity { + + public DataSourceEntity(String id, String code, String name, String dbType, String dbDriver, String dbUrl, String dbName, String dbUsername, String dbPassword, String sysOrgCode){ + this.id = id; + this.code = code; + this.name = name; + this.dbType = dbType; + this.dbDriver = dbDriver; + this.dbUrl = dbUrl; + this.dbName = dbName; + this.dbUsername = dbUsername; + this.dbPassword = dbPassword; + this.sysOrgCode = sysOrgCode; + } + + /** + * id + */ + private String id; + /** + * 数据源编码 + */ + private String code; + /** + * 数据源名称 + */ + private String name; + /** + * 描述 + */ + private String remark; + /** + * 数据库类型 + */ + private String dbType; + /** + * 驱动类 + */ + private String dbDriver; + /** + * 数据源地址 + */ + private String dbUrl; + /** + * 数据库名称 + */ + private String dbName; + /** + * 用户名 + */ + private String dbUsername; + /** + * 密码 + */ + private String dbPassword; + /** + * 创建人 + */ + private String createBy; + /** + * 所属部门 + */ + private String sysOrgCode; +} diff --git a/nursing-unit-base-core/src/main/java/org/jeecg/modules/data/loader/DataSourceLoader.java b/nursing-unit-base-core/src/main/java/org/jeecg/modules/data/loader/DataSourceLoader.java new file mode 100644 index 0000000..7e9faec --- /dev/null +++ b/nursing-unit-base-core/src/main/java/org/jeecg/modules/data/loader/DataSourceLoader.java @@ -0,0 +1,64 @@ +package org.jeecg.modules.data.loader; + +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.dynamic.datasource.creator.DataSourceProperty; +import com.baomidou.dynamic.datasource.creator.druid.DruidDataSourceCreator; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.modules.data.util.SecurityUtil; +import org.jeecg.modules.data.entity.DataSourceEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import javax.annotation.PostConstruct; +import javax.sql.DataSource; +import java.util.List; + +@Slf4j +@Service +public class DataSourceLoader { + + @Autowired + private DruidDataSourceCreator dataSourceCreator; + @Autowired + private DataSource dataSource; + + @PostConstruct + public void init() { + refreshDataSources(); + } + + public void refreshDataSources() { + DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource; + DataSource mainDataSource = ds.getDataSource(""); + + // 从主数据源读取配置 + List configs = new JdbcTemplate(mainDataSource).query( + "SELECT id, code, name, db_type, db_driver, db_url, db_name, db_username ,db_password ,sys_org_code FROM sys_data_source", + (rs, rowNum) -> new DataSourceEntity( + rs.getString("id"), + rs.getString("code"), + rs.getString("name"), + rs.getString("db_type"), + rs.getString("db_driver"), + rs.getString("db_url"), + rs.getString("db_name"), + rs.getString("db_username"), + rs.getString("db_password"), + rs.getString("sys_org_code") + ) + ); + + // 创建并添加数据源 + configs.forEach(config -> { + DataSourceProperty dataSourceProperty = new DataSourceProperty(); + dataSourceProperty.setUrl(config.getDbUrl()); + dataSourceProperty.setUsername(config.getDbUsername()); + String dbPassword = SecurityUtil.jiemi(config.getDbPassword()); + dataSourceProperty.setPassword(dbPassword); + dataSourceProperty.setDriverClassName(config.getDbDriver()); + DataSource dynamicDataSource = dataSourceCreator.createDataSource(dataSourceProperty); + ds.addDataSource(config.getCode(), dynamicDataSource); + }); + } + +} \ No newline at end of file diff --git a/nursing-unit-base-core/src/main/java/org/jeecg/modules/data/util/SecurityUtil.java b/nursing-unit-base-core/src/main/java/org/jeecg/modules/data/util/SecurityUtil.java new file mode 100644 index 0000000..46ce833 --- /dev/null +++ b/nursing-unit-base-core/src/main/java/org/jeecg/modules/data/util/SecurityUtil.java @@ -0,0 +1,51 @@ +package org.jeecg.modules.data.util; + + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.crypto.symmetric.SymmetricAlgorithm; +import cn.hutool.crypto.symmetric.SymmetricCrypto; + +/** + * @Description: 密码加密解密 + * @author: lsq + * @date: 2020年09月07日 14:26 + */ +public class SecurityUtil { + /**加密key*/ + private static String key = "JEECGBOOT1423670"; + + //---AES加密---------begin--------- + /**加密 + * @param content + * @return + */ + public static String jiami(String content) { + SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes()); + String encryptResultStr = aes.encryptHex(content); + return encryptResultStr; + } + + /**解密 + * @param encryptResultStr + * @return + */ + public static String jiemi(String encryptResultStr){ + SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key.getBytes()); + //解密为字符串 + String decryptResult = aes.decryptStr(encryptResultStr, CharsetUtil.CHARSET_UTF_8); + return decryptResult; + } + //---AES加密---------end--------- + /** + * 主函数 + */ + public static void main(String[] args) { + String content="test1111"; + String encrypt = jiami(content); + System.out.println(encrypt); + //构建 + String decrypt = jiemi(encrypt); + //解密为字符串 + System.out.println(decrypt); + } +}