test:(rabbit,多数据源)

dev
zhang xu 2024-06-10 22:39:17 +08:00
parent ff1a0b7028
commit e3da3d1b4b
20 changed files with 513 additions and 41 deletions

View File

@ -51,6 +51,9 @@ public class SysUser extends BaseEntity {
@Excel(name = "登录名称")
private String userName;
@Excel(name = "企业id")
private Long enterpriseId;
/**
*
*/
@ -333,6 +336,7 @@ public class SysUser extends BaseEntity {
.append("userId", getUserId())
.append("deptId", getDeptId())
.append("userName", getUserName())
.append("enterpriseId", getEnterpriseId())
.append("nickName", getNickName())
.append("email", getEmail())
.append("phonenumber", getPhonenumber())

View File

@ -0,0 +1,10 @@
package com.muyu.common.system.remote;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 21:14
*/
public interface RemoEntInfoService {
}

View File

@ -39,4 +39,8 @@ public interface RemoteLogService {
*/
@PostMapping("/logininfor")
public Result<Boolean> saveLogininfor (@RequestBody SysLogininfor sysLogininfor, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}

View File

@ -7,10 +7,13 @@ import com.muyu.common.system.domain.SysRole;
import com.muyu.common.system.domain.SysUser;
import com.muyu.common.system.remote.factory.RemoteUserFallbackFactory;
import com.muyu.common.system.domain.LoginUser;
import com.muyu.domain.datasources.EntInfo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
*
*
@ -34,10 +37,22 @@ public interface RemoteUserService {
@PostMapping("/user")
public Result add (@Validated @RequestBody SysUser user);
@GetMapping("/list")
public Result<List<EntInfo>> list();
@PostMapping
public Result addRole (@Validated @RequestBody SysRole role);
@GetMapping("selectUserById")
public Result selectUserById (Long userId);
/**
*
*

View File

@ -5,11 +5,14 @@ import com.muyu.common.system.domain.SysRole;
import com.muyu.common.system.remote.RemoteUserService;
import com.muyu.common.system.domain.SysUser;
import com.muyu.common.system.domain.LoginUser;
import com.muyu.domain.datasources.EntInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
/**
*
*
@ -33,11 +36,21 @@ public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserServ
return Result.error("获取用户失败:{}", throwable.getMessage());
}
@Override
public Result<List<EntInfo>> list() {
return Result.error("获取失败");
}
@Override
public Result addRole(SysRole role) {
return Result.error("获取用户失败:{}", throwable.getMessage());
}
@Override
public Result selectUserById(Long userId) {
return Result.error("获取用户失败:{}", throwable.getMessage());
}
@Override
public Result<Boolean> registerUserInfo (SysUser sysUser, String source) {

View File

@ -0,0 +1,34 @@
package com.muyu.domain.datasources;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 20:40
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@TableName("etn_info")
public class EntInfo {
@TableId(type = IdType.AUTO)
private Long id;
private String entCode;
private String ip;
private Long port;
}

View File

@ -0,0 +1,36 @@
package com.muyu.networking.controller;
import com.muyu.common.core.domain.Result;
import com.muyu.domain.datasources.EntInfo;
import com.muyu.networking.service.EntInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 20:55
*/
@RestController
@RequestMapping("/entInfo")
public class EntInfoController {
@Autowired
private EntInfoService entInfoService;
@GetMapping("/list")
public Result<List<EntInfo>> list() {
List<EntInfo> list = entInfoService.list();
return Result.success(list);
}
@PostMapping("/add")
public Result add(@RequestBody EntInfo entInfo) {
entInfoService.save(entInfo);
return Result.success();
}
}

View File

@ -0,0 +1,15 @@
package com.muyu.networking.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.muyu.domain.datasources.EntInfo;
import org.apache.ibatis.annotations.Mapper;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 20:57
*/
@Mapper
public interface EntInfoMapper extends BaseMapper<EntInfo> {
}

View File

@ -0,0 +1,13 @@
package com.muyu.networking.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.muyu.domain.datasources.EntInfo;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 20:55
*/
public interface EntInfoService extends IService<EntInfo> {
}

View File

@ -0,0 +1,21 @@
package com.muyu.networking.service.impl;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.muyu.domain.Enterprise;
import com.muyu.domain.datasources.EntInfo;
import com.muyu.networking.mapper.EntInfoMapper;
import com.muyu.networking.mapper.EnterpriseMapper;
import com.muyu.networking.service.EntInfoService;
import com.muyu.networking.service.EnterpriseService;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 20:56
*/
public class EntInfoServiceImpl extends ServiceImpl<EntInfoMapper, EntInfo> implements EntInfoService {
}

View File

@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.muyu.common.core.domain.Result;
import com.muyu.common.core.utils.DateUtils;
import com.muyu.common.security.utils.SecurityUtils;
import com.muyu.common.system.domain.LoginUser;
import com.muyu.common.system.domain.SysRole;
import com.muyu.common.system.domain.SysUser;
import com.muyu.common.system.remote.RemoteUserService;
@ -26,8 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.IllegalFormatCodePointException;
import java.util.List;
import java.util.UUID;
@ -42,6 +42,10 @@ import java.util.UUID;
@DS("networking")
public class EnterpriseServiceImpl extends ServiceImpl<EnterpriseMapper,Enterprise> implements EnterpriseService
{
@Autowired
private RemoteUserService remoteUserService;
@Autowired(required = false)
private EnterpriseMapper enterpriseMapper;
@ -66,24 +70,21 @@ public class EnterpriseServiceImpl extends ServiceImpl<EnterpriseMapper,Enterpr
@Override
public List<Enterprise> selectEnterpriseList(Enterprise enterprise)
{
//
// SysUser sysUser = SysUser.builder()
// .entId(enterprise.getId())
// .build();
enterprise.setEnterpriseName("admin");
if (enterprise.getEnterpriseName().equals("admin")){
if (SecurityUtils.isAdmin(SecurityUtils.getUserId())) {
return enterpriseMapper.selectEnterpriseList(enterprise);
}
LambdaQueryWrapper<Enterprise> lambdaQueryWrapper = new LambdaQueryWrapper<>() {{
eq(Enterprise::getId, enterprise.getId());
SysUser sysUser = SysUser.builder().userName(SecurityUtils.getUsername()).build();
//判断 不是管理员登录 自能看自己的企业
LambdaQueryWrapper<Enterprise> lambdaQueryWrapper = new LambdaQueryWrapper<>(){{
eq(Enterprise::getEnterpriseName, sysUser.getUserName());
}};
//
return enterpriseMapper.selectList(lambdaQueryWrapper);
}
@Autowired
private RemoteUserService remoteUserService;
/**
*
*
@ -99,26 +100,16 @@ public class EnterpriseServiceImpl extends ServiceImpl<EnterpriseMapper,Enterpr
enterprise.setStatus("1");
enterprise.setCertification("0");
enterprise.setOpenAdd("0");
SysRole.builder().roleId(2L).build();
SysUser sysUser = SysUser.builder().userName(
enterprise.getEnterpriseName())
.password("admin")
.roleId(2L)
.entId(enterprise.getId())
.roleId(2L)
.nickName(enterprise.getEnterpriseName()).
userType(String.valueOf(enterprise.getId()))
.build();
// Datasource datasource = new Datasource();
// Datasource root = Datasource.builder()
// .ip("115.159.67.205")
// .password("sal75-z")
// .database(sysUser.getUserName())
// .username("root")
// .build();
// DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
// dynamicRoutingDataSource.createDataSource(root);
Result add = remoteUserService.add(sysUser);
return enterpriseMapper.insertEnterprise(enterprise);
return enterpriseMapper.insertEnterprise(enterprise);
}
/**
*
@ -269,23 +260,6 @@ public class EnterpriseServiceImpl extends ServiceImpl<EnterpriseMapper,Enterpr
// }
// }
}

View File

@ -67,6 +67,13 @@ public class SysUserController extends BaseController {
return getDataTable(list);
}
@GetMapping("selectUserById")
public Result selectUserById (Long userId) {
SysUser user = userService.selectUserById(userId);
return success(user);
}
@Log(title = "用户管理", businessType = BusinessType.EXPORT)
@RequiresPermissions("system:user:export")
@PostMapping("/export")

View File

@ -0,0 +1,57 @@
package com.muyu.vehicle.config;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 20:28
*/
@Component
public class ConfirmCallbackConfig implements RabbitTemplate.ConfirmCallback{
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* @PostContructspringspring
* @PostConstruct bean
* @PreDestory bean
*/
@PostConstruct
public void init() {
rabbitTemplate.setConfirmCallback(this);
}
/**
*
*
* @param correlationData
* @param ack
* @param cause
*/
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
if (ack) {
// 消息投递到 broker 的状态true表示成功
System.out.println("消息发送成功!");
} else {
// 发送异常
System.out.println("发送异常原因 = " + cause);
// TODO 可以将消息 内容 以及 失败的原因 记录到 日志表中
}
}
}

View File

@ -0,0 +1,51 @@
package com.muyu.vehicle.myDatasource.aspect;
import com.muyu.common.security.utils.SecurityUtils;
import com.muyu.common.system.domain.SysUser;
import com.muyu.common.system.remote.RemoteUserService;
import com.muyu.vehicle.myDatasource.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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 20:02
*/
@Aspect
@Component
public class DataSourceAsp {
@Autowired
private RemoteUserService remoteUserService;
@Pointcut("execution(public * com.car.client.controller.*Controller.*(..))")
public void pointcut() {
}
/**
*
*/
@Before("pointcut()")
public void beforeMethod() {
Long userid = SecurityUtils.getLoginUser().getUserid();
SysUser sysUser = (SysUser) remoteUserService.selectUserById(userid).getData();
DynamicDataSourceHolder.setDynamicDataSourceKey("ent_" + sysUser.getEnterpriseId());
}
/**
*
*
*
*/
@After("pointcut()")
public void afterMethod() {
DynamicDataSourceHolder.removeDynamicDataSourceKey();
}
}

View File

@ -0,0 +1,18 @@
package com.muyu.vehicle.myDatasource.constants;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 20:01
*/
public class DatasourceConstant {
public final static String DATASOURCE_URL = "jdbc:mysql://{}:{}/car_networking?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8";
public final static String USER_NAME = "root";
public final static String PASSWORD = "wxl@123";
}

View File

@ -0,0 +1,42 @@
package com.muyu.vehicle.myDatasource.domain;
import com.muyu.common.core.utils.StringUtils;
import com.muyu.vehicle.myDatasource.constants.DatasourceConstant;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 19:55
*/
@AllArgsConstructor
@Data
@NoArgsConstructor
@Builder
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(DatasourceConstant.DATASOURCE_URL, host, port))
.password(DatasourceConstant.PASSWORD)
.userName(DatasourceConstant.USER_NAME)
.build();
}
}

View File

@ -0,0 +1,28 @@
package com.muyu.vehicle.myDatasource.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 19:57
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class EnterpriseInfo {
private String entCode;
private String ip;
private String port;
}

View File

@ -0,0 +1,40 @@
package com.muyu.vehicle.myDatasource.factory;
import com.alibaba.druid.pool.DruidDataSource;
import com.muyu.vehicle.myDatasource.domain.DataSourceInfo;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import java.sql.SQLException;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 20:01
*/
@Log4j2
@Component
public class DruidDataSourceFactory {
/**
*
*/
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;
}
}
}

View File

@ -0,0 +1,43 @@
package com.muyu.vehicle.myDatasource.holder;
import lombok.extern.log4j.Log4j2;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 20:00
*/
@Log4j2
public class DynamicDataSourceHolder {
/**
*
*/
private static final ThreadLocal<String> 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();
}
}

View File

@ -0,0 +1,47 @@
package com.muyu.vehicle.myDatasource.rule;
import com.alibaba.druid.pool.DruidDataSource;
import com.muyu.vehicle.myDatasource.holder.DynamicDataSourceHolder;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import java.util.Map;
/**
* @ClassDescription:
* @JdkVersion: 17
* @Author: zhangxu
* @Created: 2024/6/10 19:55
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
/**
*
*/
private Map<Object, Object> defineTargetDataSources;
/**
*
*/
public boolean hashKey(String key) {
return defineTargetDataSources.containsKey(key);
}
/**
*
*
* @param key
* @param value
*/
public void put(String key, DruidDataSource value) {
defineTargetDataSources.put(key, value);
this.afterPropertiesSet();
}
/**
* 线使
*/
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceHolder.getDynamicDataSourceKey();
}
}