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 dataSourceMap = new HashMap<>(); + getDataSourceInfoList().forEach(dataSourceInfo -> { + dataSourceMap.put(dataSourceInfo.getKey(), createDataSourceConnection(dataSourceInfo)); + }); + //设置动态数据源 + DynamicDataSource dynamicDataSource = new DynamicDataSource(); +// dynamicDataSource.setDefaultTargetDataSource(masterDataSource()); + dynamicDataSource.setTargetDataSources(dataSourceMap); + //将数据源信息备份在defineTargetDataSources中 + dynamicDataSource.setDefineTargetDataSources(dataSourceMap); + return dynamicDataSource; + } +} diff --git a/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/config/DynamicDataSource.java b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/config/DynamicDataSource.java new file mode 100644 index 0000000..b189ea6 --- /dev/null +++ b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/config/DynamicDataSource.java @@ -0,0 +1,31 @@ +package com.zhiLian.datasource.config; + +import com.zhiLian.datasource.DynamicDataSourceHolder; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +import java.util.Map; + +/** + * 动态数据源 + * 调用AddDefineDataSource组件的addDefineDynamicDataSource()方法,获取原来targetdatasources的map,并将新的数据源信息添加到map中,并替换targetdatasources中的map + * 切换数据源时可以使用@DataSource(value = "数据源名称"),或者DynamicDataSourceContextHolder.setContextKey("数据源名称") + * @author Dongzl + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DynamicDataSource extends AbstractRoutingDataSource { + //备份所有数据源信息, + private Map defineTargetDataSources; + + /** + * 决定当前线程使用哪个数据源 + */ + @Override + protected Object determineCurrentLookupKey() { + return DynamicDataSourceHolder.getDynamicDataSourceKey(); + } +} diff --git a/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/contents/CommonConstant.java b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/contents/CommonConstant.java new file mode 100644 index 0000000..68aeaff --- /dev/null +++ b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/contents/CommonConstant.java @@ -0,0 +1,18 @@ +package com.zhiLian.datasource.contents; + +/** + * @Description: 动态数据源常量类 + * @Author Dongzl + * @Date 2022/8/18 16:33 + * + */ +public class CommonConstant { + /** + * 默认数据源标识 + */ + public static final String MASTER = "master"; + /** + * 从数据源标识 + */ + public static final String SLAVE = "slave"; +} diff --git a/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/contents/DatasourceContent.java b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/contents/DatasourceContent.java new file mode 100644 index 0000000..3f60831 --- /dev/null +++ b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/contents/DatasourceContent.java @@ -0,0 +1,15 @@ +package com.zhiLian.datasource.contents; + +/** + * @author DongZl + * @description: 数据源常量 + * @Date 2023-8-1 上午 11:02 + */ +public class DatasourceContent { + + public final static String DATASOURCE_URL = "jdbc:mysql://122.51.111.225:{}/zhiLian-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8"; + + public final static String USER_NAME = "root"; + + public final static String PASSWORD = "root"; +} diff --git a/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/util/DataSourceService.java b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/util/DataSourceService.java new file mode 100644 index 0000000..eb56cce --- /dev/null +++ b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/java/com/zhiLian/datasource/util/DataSourceService.java @@ -0,0 +1,44 @@ +package com.zhiLian.datasource.util; + +import com.alibaba.druid.pool.DruidDataSource; +import com.zhiLian.datasource.DataSourceInfo; +import com.zhiLian.datasource.config.DruidConfig; +import com.zhiLian.datasource.config.DynamicDataSource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * @Description: 数据源工具类 + * @Author Dongzl + * @Date 2022/8/18 17:20 + * + */ +@Slf4j +@Component +public class DataSourceService { + + @Autowired + private DruidConfig druidConfig; + + @Resource + private DynamicDataSource dynamicDataSource; + + public void addDataSource(DataSourceInfo dataSourceInfo){ + addDefineDynamicDataSource(druidConfig.createDataSourceConnection(dataSourceInfo), dataSourceInfo.getKey()); + } + + /** + * @Description: 将新增的数据源加入到备份数据源map中 + * @Author Dongzl + */ + public void addDefineDynamicDataSource(DruidDataSource druidDataSource, String dataSourceName){ + Map defineTargetDataSources = dynamicDataSource.getDefineTargetDataSources(); + defineTargetDataSources.put(dataSourceName, druidDataSource); + dynamicDataSource.setTargetDataSources(defineTargetDataSources); + dynamicDataSource.afterPropertiesSet(); + } +} diff --git a/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/resources/banner.txt b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/resources/banner.txt new file mode 100644 index 0000000..0dd5eee --- /dev/null +++ b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/resources/banner.txt @@ -0,0 +1,2 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} diff --git a/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/resources/bootstrap.yml b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..2ea1cd7 --- /dev/null +++ b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/resources/bootstrap.yml @@ -0,0 +1,32 @@ +# Tomcat +server: + port: 9206 + +# Spring +spring: + application: + # 应用名称 + name: zhiLian-datasource + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: 111.229.102.61:8848 + # 命名空间 + namespace: zhiLian + config: + # 配置中心地址 + server-addr: 111.229.102.61:8848 + # 命名空间 + namespace: zhiLian + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} +#logging: +# level: +# com.zhiLian.system.mapper: DEBUG diff --git a/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/resources/logback.xml b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/resources/logback.xml new file mode 100644 index 0000000..81d6cfd --- /dev/null +++ b/zhiLian-cloud-datasource/zhiLian-datasource-service/src/main/resources/logback.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/ZhiLianVehicleApplication.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/ZhiLianVehicleApplication.java index 05bb762..76e1c34 100644 --- a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/ZhiLianVehicleApplication.java +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/ZhiLianVehicleApplication.java @@ -1,11 +1,13 @@ package com.zhiLian.vehicle; +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 @@ -17,7 +19,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableCustomConfig @EnableCustomSwagger2 @EnableMyFeignClients -@SpringBootApplication +@SpringBootApplication(exclude = {DynamicDataSourceAutoConfiguration.class, DataSourceAutoConfiguration.class }) public class ZhiLianVehicleApplication { public static void main (String[] args) { SpringApplication.run(ZhiLianVehicleApplication.class, args); diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/controller/FenceController.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/controller/FenceController.java index 7ad9d99..cf6b73a 100644 --- a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/controller/FenceController.java +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/controller/FenceController.java @@ -26,9 +26,9 @@ import org.springframework.web.bind.annotation.RestController; /** - * 围栏Controller + * 围栏 中心 Controller BingRui.Hou * - * @author muyu + * @author * @date 2024-05-31 */ @RestController diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/controller/GroupController.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/controller/GroupController.java index 5dddc37..7bd4af5 100644 --- a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/controller/GroupController.java +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/controller/GroupController.java @@ -25,7 +25,7 @@ import org.springframework.web.bind.annotation.RestController; /** * 围栏组Controller * - * @author muyu + * @author BingRui.Hou * @date 2024-06-02 */ @RestController diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/controller/VehicleController.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/controller/VehicleController.java index 709a61c..5ea4a10 100644 --- a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/controller/VehicleController.java +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/controller/VehicleController.java @@ -19,7 +19,7 @@ import java.util.List; /** * 车辆录入Controller * - * @author muyu + * @author BingRui.Hou * @date 2024-05-27 */ @RestController diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/ManyDataSource.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/ManyDataSource.java new file mode 100644 index 0000000..e6bdc0b --- /dev/null +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/ManyDataSource.java @@ -0,0 +1,63 @@ +package com.zhiLian.vehicle.datasource; + +import com.alibaba.druid.pool.DruidDataSource; + +import com.zhiLian.vehicle.datasource.config.factory.DruidDataSourceFactory; +import com.zhiLian.vehicle.datasource.domain.DataSourceInfo; +import com.zhiLian.vehicle.datasource.domain.EntInfo; +import com.zhiLian.vehicle.datasource.config.role.DynamicDataSource; +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 ManyDataSource { + + + private List dataSourceInfoList(){ + List databaseNameList = new ArrayList<>(){{ + add(EntInfo.builder() + .entCode("test_1") + .ip("122.51.111.225") + .port(6666) + .build()); + }}; + return databaseNameList; + } + + + + @Bean + @Primary + public DynamicDataSource dynamicDataSource(DruidDataSourceFactory druidDataSourceFactory) { + + //查企业 + Map dataSourceMap = new HashMap<>(); + dataSourceInfoList() + .stream() + .map(entInfo->DataSourceInfo.hostAndPortBuild(entInfo.getEntCode(),entInfo.getIp(),entInfo.getPort())) + .forEach(dataSourceInfo -> { + dataSourceMap.put(dataSourceInfo.getKey(), druidDataSourceFactory.create(dataSourceInfo)); + }); + //设置动态数据源 + DynamicDataSource dynamicDataSource = new DynamicDataSource(); +// dynamicDataSource.setDefaultTargetDataSource(masterDataSource()); + dynamicDataSource.setTargetDataSources(dataSourceMap); + //将数据源信息备份在defineTargetDataSources中 + dynamicDataSource.setDefineTargetDataSources(dataSourceMap); + return dynamicDataSource; + } +} diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/DataSourceAsp.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/DataSourceAsp.java new file mode 100644 index 0000000..b58b76b --- /dev/null +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/DataSourceAsp.java @@ -0,0 +1,42 @@ +package com.zhiLian.vehicle.datasource.config; + +import com.zhiLian.common.security.utils.SecurityUtils; +import com.zhiLian.vehicle.datasource.config.holder.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.vehicle.controller.*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-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/factory/DruidDataSourceFactory.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/factory/DruidDataSourceFactory.java new file mode 100644 index 0000000..1a2644b --- /dev/null +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/factory/DruidDataSourceFactory.java @@ -0,0 +1,50 @@ +package com.zhiLian.vehicle.datasource.config.factory; + + +import com.alibaba.druid.pool.DruidDataSource; +import com.zhiLian.vehicle.datasource.config.role.DynamicDataSource; +import com.zhiLian.vehicle.datasource.domain.DataSourceInfo; +import lombok.extern.log4j.Log4j2; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * BingRui.Hou + * + * @Description 描述 + * @ClassName DruidDataSourceFactory + * @Date 2024/06/04 14:47 + */ +@Log4j2 +@Component +public class DruidDataSourceFactory { + + + /** + * @Description: 根据传递的数据源信息测试数据库连接 + * @Author Dongzl + */ + public DruidDataSource create(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; + } + } +} diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/holder/DynamicDataSourceHolder.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/holder/DynamicDataSourceHolder.java new file mode 100644 index 0000000..20cbd1f --- /dev/null +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/holder/DynamicDataSourceHolder.java @@ -0,0 +1,43 @@ +package com.zhiLian.vehicle.datasource.config.holder; + + +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-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/role/DynamicDataSource.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/role/DynamicDataSource.java new file mode 100644 index 0000000..cc80c91 --- /dev/null +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/config/role/DynamicDataSource.java @@ -0,0 +1,35 @@ +package com.zhiLian.vehicle.datasource.config.role; + +import com.zhiLian.vehicle.datasource.config.holder.DynamicDataSourceHolder; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +import java.util.Map; + +/** + * 动态数据源 + * 调用AddDefineDataSource组件的addDefineDynamicDataSource()方法,获取原来targetdatasources的map,并将新的数据源信息添加到map中,并替换targetdatasources中的map + * 切换数据源时可以使用@DataSource(value = "数据源名称"),或者DynamicDataSourceContextHolder.setContextKey("数据源名称") + * @author Dongzl + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class DynamicDataSource extends AbstractRoutingDataSource { + /** + * 备份所有数据源信息, 指针!! + */ + private Map defineTargetDataSources; + + /** + * 决定当前线程使用哪个数据源 + */ + @Override + protected Object determineCurrentLookupKey() { + return DynamicDataSourceHolder.getDynamicDataSourceKey(); + } +} diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/contents/DatasourceContent.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/contents/DatasourceContent.java new file mode 100644 index 0000000..3531a44 --- /dev/null +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/contents/DatasourceContent.java @@ -0,0 +1,15 @@ +package com.zhiLian.vehicle.datasource.contents; + +/** + * @author DongZl + * @description: 数据源常量 + * @Date 2023-8-1 上午 11:02 + */ +public class DatasourceContent { + + public final static String DATASOURCE_URL = "jdbc:mysql://{}:{}/zhiLian-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8"; + + public final static String USER_NAME = "root"; + + public final static String PASSWORD = "root"; +} diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/domain/DataSourceInfo.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/domain/DataSourceInfo.java new file mode 100644 index 0000000..6b3428c --- /dev/null +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/domain/DataSourceInfo.java @@ -0,0 +1,52 @@ +package com.zhiLian.vehicle.datasource.domain; + + +import com.zhiLian.common.core.utils.StringUtils; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import static com.zhiLian.vehicle.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 hostAndPortBuild(String key,String host, Integer port){ + return DataSourceInfo.builder() + .key(key) + .url(StringUtils.format(DATASOURCE_URL, host,port)) + .password(PASSWORD) + .userName(USER_NAME) + .build(); + } +} diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/domain/EntInfo.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/domain/EntInfo.java new file mode 100644 index 0000000..aa11272 --- /dev/null +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/domain/EntInfo.java @@ -0,0 +1,30 @@ +package com.zhiLian.vehicle.datasource.domain; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * BingRui.Hou + * + * @Description 描述 + * @ClassName EntInfo + * @Date 2024/06/04 14:34 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class EntInfo { + private String entCode; + + //ip + private String ip; + + //端口 + private Integer port; + +} diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/util/DataSourceService.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/util/DataSourceService.java new file mode 100644 index 0000000..408e07a --- /dev/null +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/datasource/util/DataSourceService.java @@ -0,0 +1,48 @@ +package com.zhiLian.vehicle.datasource.util; + +import com.alibaba.druid.pool.DruidDataSource; +import com.zhiLian.vehicle.datasource.ManyDataSource; +import com.zhiLian.vehicle.datasource.config.factory.DruidDataSourceFactory; +import com.zhiLian.vehicle.datasource.domain.DataSourceInfo; +import com.zhiLian.vehicle.datasource.config.role.DynamicDataSource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * @Description: 数据源工具类 + * @Author Dongzl + * @Date 2022/8/18 17:20 + * + */ +@Slf4j +@Component +public class DataSourceService { + + @Autowired + private ManyDataSource druidConfig; + + @Autowired + private DruidDataSourceFactory druidDataSourceFactory; + + @Resource + private DynamicDataSource dynamicDataSource; + + public void addDataSource(DataSourceInfo dataSourceInfo){ + addDefineDynamicDataSource(druidDataSourceFactory.create(dataSourceInfo), dataSourceInfo.getKey()); + } + + /** + * @Description: 将新增的数据源加入到备份数据源map中 + * @Author Dongzl + */ + public void addDefineDynamicDataSource(DruidDataSource druidDataSource, String dataSourceName){ + Map defineTargetDataSources = dynamicDataSource.getDefineTargetDataSources(); + defineTargetDataSources.put(dataSourceName, druidDataSource); + dynamicDataSource.setTargetDataSources(defineTargetDataSources); + dynamicDataSource.afterPropertiesSet(); + } +} diff --git a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/domain/vo/Path.java b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/domain/vo/Path.java index 8d61976..6e5e04f 100644 --- a/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/domain/vo/Path.java +++ b/zhiLian-vehicle/zhiLian-vehicle-service/src/main/java/com/zhiLian/vehicle/domain/vo/Path.java @@ -18,8 +18,14 @@ import lombok.ToString; @NoArgsConstructor @ToString public class Path { + private String Q; + private String R; + private String lng; + private String lat; + } +