From d89b7ab7ce0cef193de6fbe439feecee449e31d1 Mon Sep 17 00:00:00 2001
From: hbr <1991483710@qq.com>
Date: Tue, 4 Jun 2024 18:36:20 +0800
Subject: [PATCH] =?UTF-8?q?feat:=E5=A4=9A=E6=95=B0=E6=8D=AE=E6=BA=90?=
=?UTF-8?q?=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +
.../service/impl/BusinessServiceImpl.java | 44 ++++---
zhiLian-cloud-datasource/pom.xml | 21 ++++
.../zhiLian-datasource-service/pom.xml | 117 ++++++++++++++++++
.../zhiLian/datasource/DataSourceInfo.java | 39 ++++++
.../datasource/DynamicDataSourceHolder.java | 42 +++++++
.../ZhiLianDataSourceApplication.java | 27 ++++
.../datasource/config/DataSourceAsp.java | 44 +++++++
.../datasource/config/DruidConfig.java | 71 +++++++++++
.../datasource/config/DynamicDataSource.java | 31 +++++
.../datasource/contents/CommonConstant.java | 18 +++
.../contents/DatasourceContent.java | 15 +++
.../datasource/util/DataSourceService.java | 44 +++++++
.../src/main/resources/banner.txt | 2 +
.../src/main/resources/bootstrap.yml | 32 +++++
.../src/main/resources/logback.xml | 74 +++++++++++
.../vehicle/ZhiLianVehicleApplication.java | 4 +-
.../vehicle/controller/FenceController.java | 4 +-
.../vehicle/controller/GroupController.java | 2 +-
.../vehicle/controller/VehicleController.java | 2 +-
.../vehicle/datasource/ManyDataSource.java | 63 ++++++++++
.../datasource/config/DataSourceAsp.java | 42 +++++++
.../factory/DruidDataSourceFactory.java | 50 ++++++++
.../holder/DynamicDataSourceHolder.java | 43 +++++++
.../config/role/DynamicDataSource.java | 35 ++++++
.../contents/DatasourceContent.java | 15 +++
.../datasource/domain/DataSourceInfo.java | 52 ++++++++
.../vehicle/datasource/domain/EntInfo.java | 30 +++++
.../datasource/util/DataSourceService.java | 48 +++++++
.../com/zhiLian/vehicle/domain/vo/Path.java | 6 +
30 files changed, 997 insertions(+), 22 deletions(-)
create mode 100644 zhiLian-cloud-datasource/pom.xml
create mode 100644 zhiLian-cloud-datasource/zhiLian-datasource-service/pom.xml
create mode 100644 zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/DataSourceInfo.java
create mode 100644 zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/DynamicDataSourceHolder.java
create mode 100644 zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/ZhiLianDataSourceApplication.java
create mode 100644 zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/config/DataSourceAsp.java
create mode 100644 zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/config/DruidConfig.java
create mode 100644 zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/config/DynamicDataSource.java
create mode 100644 zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/contents/CommonConstant.java
create mode 100644 zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/contents/DatasourceContent.java
create mode 100644 zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/util/DataSourceService.java
create mode 100644 zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/resources/banner.txt
create mode 100644 zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/resources/bootstrap.yml
create mode 100644 zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/resources/logback.xml
create mode 100644 zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/ManyDataSource.java
create mode 100644 zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/DataSourceAsp.java
create mode 100644 zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/factory/DruidDataSourceFactory.java
create mode 100644 zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/holder/DynamicDataSourceHolder.java
create mode 100644 zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/role/DynamicDataSource.java
create mode 100644 zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/contents/DatasourceContent.java
create mode 100644 zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/domain/DataSourceInfo.java
create mode 100644 zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/domain/EntInfo.java
create mode 100644 zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/util/DataSourceService.java
diff --git a/pom.xml b/pom.xml
index 146fb61..ef3b8b5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -219,6 +219,8 @@
zhiLian-iotdb
zhiLian-vehicle
zhiLian-business/zhiLian-data-service
+ zhiLian-cloud-datasource
+ zhiLian-cloud-datasource/zhiLian-datasource-service
pom
diff --git a/zhiLian-business/zhiLian-data-service/src/main/java/com/zhiLian/business/service/impl/BusinessServiceImpl.java b/zhiLian-business/zhiLian-data-service/src/main/java/com/zhiLian/business/service/impl/BusinessServiceImpl.java
index 18f1ec1..0770301 100644
--- a/zhiLian-business/zhiLian-data-service/src/main/java/com/zhiLian/business/service/impl/BusinessServiceImpl.java
+++ b/zhiLian-business/zhiLian-data-service/src/main/java/com/zhiLian/business/service/impl/BusinessServiceImpl.java
@@ -96,7 +96,7 @@ public class BusinessServiceImpl extends ServiceImpl
int i = businessMapper.insertBusiness(business);
System.out.println(business);
SysUser sysUser = SysUser.builder()
- .userName(business.getName() + business.getId())
+ .userName(business.getName())
.password("admin123")
.nickName(business.getName())
.email(business.getBusinessEmail())
@@ -107,6 +107,26 @@ public class BusinessServiceImpl extends ServiceImpl
Result add = remoteUserService.add(sysUser);
return i;
}
+
+
+ /**
+ * 修改企业
+ *
+ * @param business 企业
+ * @return 结果
+ */
+ @Override
+ public int updateBusiness(Business business)
+ {
+ business.setUpdateTime(DateUtils.getNowDate());
+ httpConnectMysql(business);
+ return businessMapper.updateBusiness(business);
+ }
+
+ /**
+ * 判断redis是否存在端口号
+ * @param business
+ */
public void httpConnectMysql(Business business){
if (business.getBusinessStates().equals(2) ) {
if (!redisTemplate.hasKey(business.getId()+business.getName())){
@@ -117,6 +137,10 @@ public class BusinessServiceImpl extends ServiceImpl
}
+ /**
+ * http URL 链接
+ * @param business
+ */
private static void extracted(Business business) {
String postUrl="http://122.51.111.225:10006/webhook/%E6%96%B0%E5%BB%BA%E4%BC%81%E4%B8%9A%E6%95%B0%E6%8D%AE%E6%BA%90";
HashMap hashMap = new HashMap<>();
@@ -134,8 +158,8 @@ public class BusinessServiceImpl extends ServiceImpl
httpConn.setRequestProperty("Content-Type", "application/json");
// 打开输出流,默认是false
httpConn.setDoOutput(true);
- // 打开输入流,默认是true,可省略
- httpConn.setDoInput(true);
+// // 打开输入流,默认是true,可省略
+// httpConn.setDoInput(true);
// 4.从HttpURLConnection获取输出流和写数据
OutputStream oStream = httpConn.getOutputStream();
oStream.write(json.getBytes());
@@ -156,20 +180,6 @@ public class BusinessServiceImpl extends ServiceImpl
}
}
- /**
- * 修改企业
- *
- * @param business 企业
- * @return 结果
- */
- @Override
- public int updateBusiness(Business business)
- {
- business.setUpdateTime(DateUtils.getNowDate());
- httpConnectMysql(business);
- return businessMapper.updateBusiness(business);
- }
-
/**
* 批量删除企业
*
diff --git a/zhiLian-cloud-datasource/pom.xml b/zhiLian-cloud-datasource/pom.xml
new file mode 100644
index 0000000..f5884d8
--- /dev/null
+++ b/zhiLian-cloud-datasource/pom.xml
@@ -0,0 +1,21 @@
+
+
+ 4.0.0
+
+ com.zhiLian
+ zhiLian-server
+ 3.6.3
+
+
+ zhiLian-cloud-datasource
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
diff --git a/zhiLian-cloud-datasource/zhiLian-datasource-service/pom.xml b/zhiLian-cloud-datasource/zhiLian-datasource-service/pom.xml
new file mode 100644
index 0000000..7656591
--- /dev/null
+++ b/zhiLian-cloud-datasource/zhiLian-datasource-service/pom.xml
@@ -0,0 +1,117 @@
+
+
+ 4.0.0
+
+ com.zhiLian
+ zhiLian-server
+ 3.6.3
+ ../../pom.xml
+
+
+ zhiLian-datasource-service
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+ zhiLian-datasource-service多数据源配置
+
+
+
+
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-sentinel
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+ io.springfox
+ springfox-swagger-ui
+ ${swagger.fox.version}
+
+
+
+
+ com.mysql
+ mysql-connector-j
+
+
+
+
+ com.zhiLian
+ zhiLian-common-datasource
+
+
+
+
+ com.zhiLian
+ zhiLian-common-datascope
+
+
+
+
+ com.zhiLian
+ zhiLian-common-log
+
+
+
+
+ com.zhiLian
+ zhiLian-common-swagger
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
+
diff --git a/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/DataSourceInfo.java b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/DataSourceInfo.java
new file mode 100644
index 0000000..f23b7cc
--- /dev/null
+++ b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/DataSourceInfo.java
@@ -0,0 +1,39 @@
+package com.zhiLian.datasource;
+
+
+import com.zhiLian.common.core.utils.StringUtils;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import static com.zhiLian.datasource.contents.DatasourceContent.*;
+
+/**
+ * @author DongZl
+ * @description: 数据源实体类
+ * @Date 2023-8-1 上午 11:15
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class DataSourceInfo {
+
+ private String key;
+
+ private String url;
+
+ private String userName;
+
+ private String password;
+
+
+ public static DataSourceInfo databaseNameBuild(String databaseName){
+ return DataSourceInfo.builder()
+ .key(databaseName)
+ .url(StringUtils.format(DATASOURCE_URL, databaseName))
+ .password(PASSWORD)
+ .userName(USER_NAME)
+ .build();
+ }
+}
diff --git a/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/DynamicDataSourceHolder.java b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/DynamicDataSourceHolder.java
new file mode 100644
index 0000000..b9cf276
--- /dev/null
+++ b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/DynamicDataSourceHolder.java
@@ -0,0 +1,42 @@
+package com.zhiLian.datasource;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.Assert;
+
+/**
+ * 数据源切换处理
+ *
+ * @author Dongzl
+ */
+@Slf4j
+public class DynamicDataSourceHolder {
+ /**
+ * 保存动态数据源名称
+ */
+ private static final ThreadLocal DYNAMIC_DATASOURCE_KEY = new ThreadLocal<>();
+
+ /**
+ * 设置/切换数据源,决定当前线程使用哪个数据源
+ */
+ public static void setDynamicDataSourceKey(String key){
+ log.info("数据源切换为:{}",key);
+ DYNAMIC_DATASOURCE_KEY.set(key);
+ }
+
+ /**
+ * 获取动态数据源名称,默认使用mater数据源
+ */
+ public static String getDynamicDataSourceKey(){
+ String key = DYNAMIC_DATASOURCE_KEY.get();
+ Assert.notNull(key, "请携带数据标识");
+ return key;
+ }
+
+ /**
+ * 移除当前数据源
+ */
+ public static void removeDynamicDataSourceKey(){
+ log.info("移除数据源:{}",DYNAMIC_DATASOURCE_KEY.get());
+ DYNAMIC_DATASOURCE_KEY.remove();
+ }
+}
diff --git a/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/ZhiLianDataSourceApplication.java b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/ZhiLianDataSourceApplication.java
new file mode 100644
index 0000000..fc3844c
--- /dev/null
+++ b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/ZhiLianDataSourceApplication.java
@@ -0,0 +1,27 @@
+package com.zhiLian.datasource;
+
+
+import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;
+import com.zhiLian.common.security.annotation.EnableCustomConfig;
+import com.zhiLian.common.security.annotation.EnableMyFeignClients;
+import com.zhiLian.common.swagger.annotation.EnableCustomSwagger2;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+
+/**
+ * BingRui.Hou
+ *
+ * @Description 描述
+ * @ClassName ZhiLianDataSourceApplication
+ * @Date 2024/06/03 14:06
+ */
+@EnableCustomConfig
+@EnableCustomSwagger2
+@EnableMyFeignClients
+@SpringBootApplication(exclude = {DynamicDataSourceAutoConfiguration.class,DataSourceAutoConfiguration.class })
+public class ZhiLianDataSourceApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(ZhiLianDataSourceApplication.class, args);
+ }
+}
diff --git a/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/config/DataSourceAsp.java b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/config/DataSourceAsp.java
new file mode 100644
index 0000000..6f7a9f3
--- /dev/null
+++ b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/config/DataSourceAsp.java
@@ -0,0 +1,44 @@
+package com.zhiLian.datasource.config;
+
+import com.zhiLian.common.security.utils.SecurityUtils;
+import com.zhiLian.datasource.DynamicDataSourceHolder;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author DongZl
+ * @description: 数据源切面
+ * @Date 2023-8-2 下午 08:26
+ */
+@Aspect
+@Component
+public class DataSourceAsp {
+
+ @Pointcut("execution(public * com.zhiLian.datasource..*Controller.*(..))")
+ public void pointcut () {
+ }
+
+
+ /**
+ * 的每一個方法執行之前 執行的處理
+ */
+ @Before("pointcut()")
+ public void beforeMethod() {
+ Long storeId = SecurityUtils.getLoginUser().getUserid();
+ DynamicDataSourceHolder.setDynamicDataSourceKey("test_"+storeId);
+ }
+
+
+ /**
+ * 的每一個方法執行之后 執行的處理
+ * 无论正常还是异常终了
+ * 不能接受到返回值
+ */
+ @After("pointcut()")
+ public void afterMethod() {
+ DynamicDataSourceHolder.removeDynamicDataSourceKey();
+ }
+}
diff --git a/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/config/DruidConfig.java b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/config/DruidConfig.java
new file mode 100644
index 0000000..4d8e1ec
--- /dev/null
+++ b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/config/DruidConfig.java
@@ -0,0 +1,71 @@
+package com.zhiLian.datasource.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.zhiLian.datasource.DataSourceInfo;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author DongZl
+ * @description: 数据源配置
+ * @Date 2023-8-1 上午 11:05
+ */
+@Log4j2
+@Configuration
+public class DruidConfig {
+
+
+ private List getDataSourceInfoList(){
+ List databaseNameList = new ArrayList<>(){{
+ add("3306");
+// add("3307");
+ }};
+ return databaseNameList.stream().map(DataSourceInfo::databaseNameBuild).toList();
+ }
+
+ /**
+ * @Description: 根据传递的数据源信息测试数据库连接
+ * @Author Dongzl
+ */
+ public DruidDataSource createDataSourceConnection(DataSourceInfo dataSourceInfo) {
+ DruidDataSource druidDataSource = new DruidDataSource();
+ druidDataSource.setUrl(dataSourceInfo.getUrl());
+ druidDataSource.setUsername(dataSourceInfo.getUserName());
+ druidDataSource.setPassword(dataSourceInfo.getPassword());
+ druidDataSource.setBreakAfterAcquireFailure(true);
+ druidDataSource.setConnectionErrorRetryAttempts(0);
+ try {
+ druidDataSource.getConnection(2000);
+ log.info("{} -> 数据源连接成功", dataSourceInfo.getKey());
+ return druidDataSource;
+ } catch (SQLException throwables) {
+ log.error("数据源 {} 连接失败,用户名:{},密码 {}",dataSourceInfo.getUrl(),dataSourceInfo.getUserName(),dataSourceInfo.getPassword());
+ return null;
+ }
+ }
+
+ @Bean
+ @Primary
+ public DynamicDataSource dynamicDataSource() {
+
+ Map