fix 迁移后系统问题修改
parent
a5129fdc25
commit
ba417747c5
|
|
@ -207,7 +207,7 @@ mybatis-plus:
|
||||||
mapUnderscoreToCamelCase: true
|
mapUnderscoreToCamelCase: true
|
||||||
# MyBatis 自动映射策略
|
# MyBatis 自动映射策略
|
||||||
# NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射
|
# NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射
|
||||||
autoMappingBehavior: PARTIAL
|
autoMappingBehavior: FULL
|
||||||
# MyBatis 自动映射时未知列或未知属性处理策
|
# MyBatis 自动映射时未知列或未知属性处理策
|
||||||
# NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息
|
# NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息
|
||||||
autoMappingUnknownColumnBehavior: NONE
|
autoMappingUnknownColumnBehavior: NONE
|
||||||
|
|
@ -300,3 +300,17 @@ seata:
|
||||||
server-addr: ${spring.cloud.nacos.server-addr}
|
server-addr: ${spring.cloud.nacos.server-addr}
|
||||||
group: ${spring.cloud.nacos.discovery.group}
|
group: ${spring.cloud.nacos.discovery.group}
|
||||||
namespace: ${spring.profiles.active}
|
namespace: ${spring.profiles.active}
|
||||||
|
|
||||||
|
# 多租户配置
|
||||||
|
tenant:
|
||||||
|
# 是否开启
|
||||||
|
enable: true
|
||||||
|
# 排除表
|
||||||
|
excludes:
|
||||||
|
- sys_menu
|
||||||
|
- sys_tenant
|
||||||
|
- sys_tenant_package
|
||||||
|
- sys_role_dept
|
||||||
|
- sys_role_menu
|
||||||
|
- sys_user_post
|
||||||
|
- sys_user_role
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ security:
|
||||||
- /auth/smsLogin
|
- /auth/smsLogin
|
||||||
- /auth/xcxLogin
|
- /auth/xcxLogin
|
||||||
- /auth/register
|
- /auth/register
|
||||||
|
- /auth/tenant/list
|
||||||
- /resource/sms/code
|
- /resource/sms/code
|
||||||
- /*/v3/api-docs
|
- /*/v3/api-docs
|
||||||
- /csrf
|
- /csrf
|
||||||
|
|
@ -54,7 +55,7 @@ spring:
|
||||||
- id: ruoyi-gen
|
- id: ruoyi-gen
|
||||||
uri: lb://ruoyi-gen
|
uri: lb://ruoyi-gen
|
||||||
predicates:
|
predicates:
|
||||||
- Path=/code/**
|
- Path=/tool/**
|
||||||
filters:
|
filters:
|
||||||
- StripPrefix=1
|
- StripPrefix=1
|
||||||
# 系统模块
|
# 系统模块
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package org.dromara.auth.controller;
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.apache.dubbo.config.annotation.DubboReference;
|
import org.apache.dubbo.config.annotation.DubboReference;
|
||||||
|
import org.dromara.auth.domain.convert.TenantVoConvert;
|
||||||
import org.dromara.auth.domain.vo.LoginTenantVo;
|
import org.dromara.auth.domain.vo.LoginTenantVo;
|
||||||
import org.dromara.auth.domain.vo.LoginVo;
|
import org.dromara.auth.domain.vo.LoginVo;
|
||||||
import org.dromara.auth.domain.vo.TenantListVo;
|
import org.dromara.auth.domain.vo.TenantListVo;
|
||||||
|
|
@ -12,14 +13,16 @@ import org.dromara.auth.form.RegisterBody;
|
||||||
import org.dromara.auth.form.SmsLoginBody;
|
import org.dromara.auth.form.SmsLoginBody;
|
||||||
import org.dromara.auth.service.SysLoginService;
|
import org.dromara.auth.service.SysLoginService;
|
||||||
import org.dromara.common.core.domain.R;
|
import org.dromara.common.core.domain.R;
|
||||||
import org.dromara.common.core.utils.MapstructUtils;
|
|
||||||
import org.dromara.common.core.utils.StreamUtils;
|
import org.dromara.common.core.utils.StreamUtils;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
import org.dromara.common.tenant.helper.TenantHelper;
|
||||||
import org.dromara.system.api.RemoteTenantService;
|
import org.dromara.system.api.RemoteTenantService;
|
||||||
import org.dromara.system.api.domain.vo.RemoteTenantVo;
|
import org.dromara.system.api.domain.vo.RemoteTenantVo;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.NotBlank;
|
||||||
|
|
@ -104,7 +107,7 @@ public class TokenController {
|
||||||
/**
|
/**
|
||||||
* 登出方法
|
* 登出方法
|
||||||
*/
|
*/
|
||||||
@DeleteMapping("logout")
|
@PostMapping("logout")
|
||||||
public R<Void> logout() {
|
public R<Void> logout() {
|
||||||
sysLoginService.logout();
|
sysLoginService.logout();
|
||||||
return R.ok();
|
return R.ok();
|
||||||
|
|
@ -128,7 +131,7 @@ public class TokenController {
|
||||||
@GetMapping("/tenant/list")
|
@GetMapping("/tenant/list")
|
||||||
public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception {
|
public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception {
|
||||||
List<RemoteTenantVo> tenantList = remoteTenantService.queryList();
|
List<RemoteTenantVo> tenantList = remoteTenantService.queryList();
|
||||||
List<TenantListVo> voList = MapstructUtils.convert(tenantList, TenantListVo.class);
|
List<TenantListVo> voList = TenantVoConvert.INSTANCE.convertList(tenantList);
|
||||||
// 获取域名
|
// 获取域名
|
||||||
String host = new URL(request.getRequestURL().toString()).getHost();
|
String host = new URL(request.getRequestURL().toString()).getHost();
|
||||||
// 根据域名进行筛选
|
// 根据域名进行筛选
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
package org.dromara.auth.domain.convert;
|
||||||
|
|
||||||
|
import org.dromara.auth.domain.vo.TenantListVo;
|
||||||
|
import org.dromara.system.api.domain.vo.RemoteTenantVo;
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 租户vo转换器
|
||||||
|
* @author zhujie
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface TenantVoConvert {
|
||||||
|
|
||||||
|
TenantVoConvert INSTANCE = Mappers.getMapper(TenantVoConvert.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RemoteTenantVoToTenantListVo
|
||||||
|
* @param remoteTenantVo 待转换对象
|
||||||
|
* @return 转换后对象
|
||||||
|
*/
|
||||||
|
TenantListVo convert(RemoteTenantVo remoteTenantVo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RemoteTenantVoToTenantListVo
|
||||||
|
* @param remoteTenantVo 待转换对象
|
||||||
|
* @return 转换后对象
|
||||||
|
*/
|
||||||
|
List<TenantListVo> convertList(List<RemoteTenantVo> remoteTenantVo);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -3,7 +3,12 @@ package org.dromara.common.idempotent.aspectj;
|
||||||
import cn.dev33.satoken.SaManager;
|
import cn.dev33.satoken.SaManager;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.crypto.SecureUtil;
|
import cn.hutool.crypto.SecureUtil;
|
||||||
import org.dromara.common.core.constant.Constants;
|
import org.aspectj.lang.JoinPoint;
|
||||||
|
import org.aspectj.lang.annotation.AfterReturning;
|
||||||
|
import org.aspectj.lang.annotation.AfterThrowing;
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.aspectj.lang.annotation.Before;
|
||||||
|
import org.dromara.common.core.constant.GlobalConstants;
|
||||||
import org.dromara.common.core.domain.R;
|
import org.dromara.common.core.domain.R;
|
||||||
import org.dromara.common.core.exception.ServiceException;
|
import org.dromara.common.core.exception.ServiceException;
|
||||||
import org.dromara.common.core.utils.JsonUtils;
|
import org.dromara.common.core.utils.JsonUtils;
|
||||||
|
|
@ -12,11 +17,6 @@ import org.dromara.common.core.utils.ServletUtils;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
import org.dromara.common.redis.utils.RedisUtils;
|
||||||
import org.aspectj.lang.JoinPoint;
|
|
||||||
import org.aspectj.lang.annotation.AfterReturning;
|
|
||||||
import org.aspectj.lang.annotation.AfterThrowing;
|
|
||||||
import org.aspectj.lang.annotation.Aspect;
|
|
||||||
import org.aspectj.lang.annotation.Before;
|
|
||||||
import org.springframework.validation.BindingResult;
|
import org.springframework.validation.BindingResult;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
|
@ -55,7 +55,7 @@ public class RepeatSubmitAspect {
|
||||||
|
|
||||||
submitKey = SecureUtil.md5(submitKey + ":" + nowParams);
|
submitKey = SecureUtil.md5(submitKey + ":" + nowParams);
|
||||||
// 唯一标识(指定key + url + 消息头)
|
// 唯一标识(指定key + url + 消息头)
|
||||||
String cacheRepeatKey = Constants.REPEAT_SUBMIT_KEY + url + submitKey;
|
String cacheRepeatKey = GlobalConstants.REPEAT_SUBMIT_KEY + url + submitKey;
|
||||||
String key = RedisUtils.getCacheObject(cacheRepeatKey);
|
String key = RedisUtils.getCacheObject(cacheRepeatKey);
|
||||||
if (key == null) {
|
if (key == null) {
|
||||||
RedisUtils.setCacheObject(cacheRepeatKey, "", Duration.ofMillis(interval));
|
RedisUtils.setCacheObject(cacheRepeatKey, "", Duration.ofMillis(interval));
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,14 @@
|
||||||
package org.dromara.common.log.event;
|
package org.dromara.common.log.event;
|
||||||
|
|
||||||
|
import cn.hutool.http.useragent.UserAgent;
|
||||||
|
import cn.hutool.http.useragent.UserAgentUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.dubbo.config.annotation.DubboReference;
|
import org.apache.dubbo.config.annotation.DubboReference;
|
||||||
|
import org.dromara.common.core.constant.Constants;
|
||||||
import org.dromara.common.core.utils.BeanCopyUtils;
|
import org.dromara.common.core.utils.BeanCopyUtils;
|
||||||
|
import org.dromara.common.core.utils.ServletUtils;
|
||||||
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
|
import org.dromara.common.core.utils.ip.AddressUtils;
|
||||||
import org.dromara.system.api.RemoteLogService;
|
import org.dromara.system.api.RemoteLogService;
|
||||||
import org.dromara.system.api.domain.bo.RemoteLogininforBo;
|
import org.dromara.system.api.domain.bo.RemoteLogininforBo;
|
||||||
import org.dromara.system.api.domain.bo.RemoteOperLogBo;
|
import org.dromara.system.api.domain.bo.RemoteOperLogBo;
|
||||||
|
|
@ -9,12 +16,15 @@ import org.springframework.context.event.EventListener;
|
||||||
import org.springframework.scheduling.annotation.Async;
|
import org.springframework.scheduling.annotation.Async;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 异步调用日志服务
|
* 异步调用日志服务
|
||||||
*
|
*
|
||||||
* @author ruoyi
|
* @author ruoyi
|
||||||
*/
|
*/
|
||||||
@Component
|
@Component
|
||||||
|
@Slf4j
|
||||||
public class LogEventListener {
|
public class LogEventListener {
|
||||||
|
|
||||||
@DubboReference
|
@DubboReference
|
||||||
|
|
@ -33,8 +43,46 @@ public class LogEventListener {
|
||||||
@Async
|
@Async
|
||||||
@EventListener
|
@EventListener
|
||||||
public void saveLogininfor(LogininforEvent logininforEvent) {
|
public void saveLogininfor(LogininforEvent logininforEvent) {
|
||||||
RemoteLogininforBo sysLogininfor = BeanCopyUtils.copy(logininforEvent, RemoteLogininforBo.class);
|
HttpServletRequest request = logininforEvent.getRequest();
|
||||||
remoteLogService.saveLogininfor(sysLogininfor);
|
final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
|
||||||
|
final String ip = ServletUtils.getClientIP(request);
|
||||||
|
|
||||||
|
String address = AddressUtils.getRealAddressByIP(ip);
|
||||||
|
StringBuilder s = new StringBuilder();
|
||||||
|
s.append(getBlock(ip));
|
||||||
|
s.append(address);
|
||||||
|
s.append(getBlock(logininforEvent.getUsername()));
|
||||||
|
s.append(getBlock(logininforEvent.getStatus()));
|
||||||
|
s.append(getBlock(logininforEvent.getMessage()));
|
||||||
|
// 打印信息到日志
|
||||||
|
log.info(s.toString(), logininforEvent.getArgs());
|
||||||
|
// 获取客户端操作系统
|
||||||
|
String os = userAgent.getOs().getName();
|
||||||
|
// 获取客户端浏览器
|
||||||
|
String browser = userAgent.getBrowser().getName();
|
||||||
|
// 封装对象
|
||||||
|
RemoteLogininforBo logininfor = new RemoteLogininforBo();
|
||||||
|
logininfor.setTenantId(logininforEvent.getTenantId());
|
||||||
|
logininfor.setUserName(logininforEvent.getUsername());
|
||||||
|
logininfor.setIpaddr(ip);
|
||||||
|
logininfor.setLoginLocation(address);
|
||||||
|
logininfor.setBrowser(browser);
|
||||||
|
logininfor.setOs(os);
|
||||||
|
logininfor.setMsg(logininforEvent.getMessage());
|
||||||
|
// 日志状态
|
||||||
|
if (StringUtils.equalsAny(logininforEvent.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
|
||||||
|
logininfor.setStatus(Constants.SUCCESS);
|
||||||
|
} else if (Constants.LOGIN_FAIL.equals(logininforEvent.getStatus())) {
|
||||||
|
logininfor.setStatus(Constants.FAIL);
|
||||||
|
}
|
||||||
|
remoteLogService.saveLogininfor(logininfor);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getBlock(Object msg) {
|
||||||
|
if (msg == null) {
|
||||||
|
msg = "";
|
||||||
|
}
|
||||||
|
return "[" + msg + "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,12 @@ package org.dromara.common.mybatis.handler;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.http.HttpStatus;
|
import cn.hutool.http.HttpStatus;
|
||||||
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
|
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.ibatis.reflection.MetaObject;
|
||||||
import org.dromara.common.core.exception.ServiceException;
|
import org.dromara.common.core.exception.ServiceException;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
|
||||||
import org.dromara.common.core.web.domain.BaseEntity;
|
import org.dromara.common.core.web.domain.BaseEntity;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.system.api.model.LoginUser;
|
import org.dromara.system.api.model.LoginUser;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.apache.ibatis.reflection.MetaObject;
|
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
|
@ -31,12 +30,12 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
|
||||||
? baseEntity.getCreateTime() : new Date();
|
? baseEntity.getCreateTime() : new Date();
|
||||||
baseEntity.setCreateTime(current);
|
baseEntity.setCreateTime(current);
|
||||||
baseEntity.setUpdateTime(current);
|
baseEntity.setUpdateTime(current);
|
||||||
String username = StringUtils.isNotBlank(baseEntity.getCreateBy())
|
Long userId = ObjectUtil.isNotNull(baseEntity.getCreateBy())
|
||||||
? baseEntity.getCreateBy() : getLoginUsername();
|
? baseEntity.getCreateBy() : getLoginId();
|
||||||
// 当前已登录 且 创建人为空 则填充
|
// 当前已登录 且 创建人为空 则填充
|
||||||
baseEntity.setCreateBy(username);
|
baseEntity.setCreateBy(userId);
|
||||||
// 当前已登录 且 更新人为空 则填充
|
// 当前已登录 且 更新人为空 则填充
|
||||||
baseEntity.setUpdateBy(username);
|
baseEntity.setUpdateBy(userId);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
|
throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
|
||||||
|
|
@ -51,10 +50,10 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
|
||||||
Date current = new Date();
|
Date current = new Date();
|
||||||
// 更新时间填充(不管为不为空)
|
// 更新时间填充(不管为不为空)
|
||||||
baseEntity.setUpdateTime(current);
|
baseEntity.setUpdateTime(current);
|
||||||
String username = getLoginUsername();
|
Long userId = getLoginId();
|
||||||
// 当前已登录 更新人填充(不管为不为空)
|
// 当前已登录 更新人填充(不管为不为空)
|
||||||
if (StringUtils.isNotBlank(username)) {
|
if (ObjectUtil.isNotNull(userId)) {
|
||||||
baseEntity.setUpdateBy(username);
|
baseEntity.setUpdateBy(userId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
@ -65,7 +64,7 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
|
||||||
/**
|
/**
|
||||||
* 获取登录用户名
|
* 获取登录用户名
|
||||||
*/
|
*/
|
||||||
private String getLoginUsername() {
|
private Long getLoginId() {
|
||||||
LoginUser loginUser;
|
LoginUser loginUser;
|
||||||
try {
|
try {
|
||||||
loginUser = LoginHelper.getLoginUser();
|
loginUser = LoginHelper.getLoginUser();
|
||||||
|
|
@ -73,7 +72,7 @@ public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
|
||||||
log.warn("自动注入警告 => 用户未登录");
|
log.warn("自动注入警告 => 用户未登录");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return ObjectUtil.isNotNull(loginUser) ? loginUser.getUsername() : null;
|
return ObjectUtil.isNotNull(loginUser) ? loginUser.getUserId() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,12 +52,6 @@
|
||||||
<artifactId>ruoyi-common-redis</artifactId>
|
<artifactId>ruoyi-common-redis</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>cn.dev33</groupId>
|
|
||||||
<artifactId>sa-token-spring-boot-starter</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package org.dromara.common.tenant.helper;
|
package org.dromara.common.tenant.helper;
|
||||||
|
|
||||||
import cn.dev33.satoken.context.SaHolder;
|
import cn.dev33.satoken.context.SaHolder;
|
||||||
import cn.dev33.satoken.spring.SpringMVCUtil;
|
|
||||||
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.convert.Convert;
|
||||||
import com.alibaba.ttl.TransmittableThreadLocal;
|
import com.alibaba.ttl.TransmittableThreadLocal;
|
||||||
import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
|
import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
|
||||||
|
|
@ -14,6 +13,7 @@ import org.dromara.common.core.utils.SpringUtils;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
import org.dromara.common.redis.utils.RedisUtils;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
|
import org.springframework.web.context.request.RequestContextHolder;
|
||||||
|
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
|
@ -85,7 +85,7 @@ public class TenantHelper {
|
||||||
* 如果为非web环境 那么只在当前线程内生效
|
* 如果为非web环境 那么只在当前线程内生效
|
||||||
*/
|
*/
|
||||||
public static void setDynamic(String tenantId) {
|
public static void setDynamic(String tenantId) {
|
||||||
if (!SpringMVCUtil.isWeb()) {
|
if (!isWeb()) {
|
||||||
TEMP_DYNAMIC_TENANT.set(tenantId);
|
TEMP_DYNAMIC_TENANT.set(tenantId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -100,7 +100,7 @@ public class TenantHelper {
|
||||||
* 如果为非web环境 那么只在当前线程内生效
|
* 如果为非web环境 那么只在当前线程内生效
|
||||||
*/
|
*/
|
||||||
public static String getDynamic() {
|
public static String getDynamic() {
|
||||||
if (!SpringMVCUtil.isWeb()) {
|
if (!isWeb()) {
|
||||||
return TEMP_DYNAMIC_TENANT.get();
|
return TEMP_DYNAMIC_TENANT.get();
|
||||||
}
|
}
|
||||||
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
||||||
|
|
@ -117,7 +117,7 @@ public class TenantHelper {
|
||||||
* 清除动态租户
|
* 清除动态租户
|
||||||
*/
|
*/
|
||||||
public static void clearDynamic() {
|
public static void clearDynamic() {
|
||||||
if (!SpringMVCUtil.isWeb()) {
|
if (!isWeb()) {
|
||||||
TEMP_DYNAMIC_TENANT.remove();
|
TEMP_DYNAMIC_TENANT.remove();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -137,4 +137,11 @@ public class TenantHelper {
|
||||||
return tenantId;
|
return tenantId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否web环境
|
||||||
|
*/
|
||||||
|
private static boolean isWeb() {
|
||||||
|
return RequestContextHolder.getRequestAttributes() != null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ import java.util.List;
|
||||||
@Validated
|
@Validated
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/system/tenant")
|
@RequestMapping("/tenant")
|
||||||
public class SysTenantController extends BaseController {
|
public class SysTenantController extends BaseController {
|
||||||
|
|
||||||
private final ISysTenantService tenantService;
|
private final ISysTenantService tenantService;
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ import java.util.List;
|
||||||
@Validated
|
@Validated
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/system/tenant/package")
|
@RequestMapping("/tenant/package")
|
||||||
public class SysTenantPackageController extends BaseController {
|
public class SysTenantPackageController extends BaseController {
|
||||||
|
|
||||||
private final ISysTenantPackageService tenantPackageService;
|
private final ISysTenantPackageService tenantPackageService;
|
||||||
|
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
package org.dromara.system.domain;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 当前在线会话
|
|
||||||
*
|
|
||||||
* @author Lion Li
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public class SysUserOnline {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 会话编号
|
|
||||||
*/
|
|
||||||
private String tokenId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 部门名称
|
|
||||||
*/
|
|
||||||
private String deptName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户名称
|
|
||||||
*/
|
|
||||||
private String userName;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 登录IP地址
|
|
||||||
*/
|
|
||||||
private String ipaddr;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 登录地址
|
|
||||||
*/
|
|
||||||
private String loginLocation;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 浏览器类型
|
|
||||||
*/
|
|
||||||
private String browser;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 操作系统
|
|
||||||
*/
|
|
||||||
private String os;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 登录时间
|
|
||||||
*/
|
|
||||||
private Long loginTime;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -127,6 +127,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
|
||||||
*/
|
*/
|
||||||
private LoginUser buildLoginUser(SysUserVo userVo) {
|
private LoginUser buildLoginUser(SysUserVo userVo) {
|
||||||
LoginUser loginUser = new LoginUser();
|
LoginUser loginUser = new LoginUser();
|
||||||
|
loginUser.setTenantId(userVo.getTenantId());
|
||||||
loginUser.setUserId(userVo.getUserId());
|
loginUser.setUserId(userVo.getUserId());
|
||||||
loginUser.setDeptId(userVo.getDeptId());
|
loginUser.setDeptId(userVo.getDeptId());
|
||||||
loginUser.setUsername(userVo.getUserName());
|
loginUser.setUsername(userVo.getUserName());
|
||||||
|
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
package org.dromara.system.service;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 通用 数据权限 服务
|
|
||||||
*
|
|
||||||
* @author Lion Li
|
|
||||||
*/
|
|
||||||
public interface ISysDataScopeService {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取角色自定义权限
|
|
||||||
*
|
|
||||||
* @param roleId 角色id
|
|
||||||
* @return 部门id组
|
|
||||||
*/
|
|
||||||
String getRoleCustom(Long roleId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取部门及以下权限
|
|
||||||
*
|
|
||||||
* @param deptId 部门id
|
|
||||||
* @return 部门id组
|
|
||||||
*/
|
|
||||||
String getDeptAndChild(Long deptId);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
package org.dromara.system.service.impl;
|
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
|
||||||
import cn.hutool.core.convert.Convert;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.dromara.common.core.utils.StreamUtils;
|
|
||||||
import org.dromara.common.mybatis.helper.DataBaseHelper;
|
|
||||||
import org.dromara.system.domain.SysDept;
|
|
||||||
import org.dromara.system.domain.SysRoleDept;
|
|
||||||
import org.dromara.system.mapper.SysDeptMapper;
|
|
||||||
import org.dromara.system.mapper.SysRoleDeptMapper;
|
|
||||||
import org.dromara.system.service.ISysDataScopeService;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 数据权限 实现
|
|
||||||
* <p>
|
|
||||||
* 注意: 此Service内不允许调用标注`数据权限`注解的方法
|
|
||||||
* 例如: deptMapper.selectList 此 selectList 方法标注了`数据权限`注解 会出现循环解析的问题
|
|
||||||
*
|
|
||||||
* @author Lion Li
|
|
||||||
*/
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@Service("sdss")
|
|
||||||
public class SysDataScopeServiceImpl implements ISysDataScopeService {
|
|
||||||
|
|
||||||
private final SysRoleDeptMapper roleDeptMapper;
|
|
||||||
private final SysDeptMapper deptMapper;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getRoleCustom(Long roleId) {
|
|
||||||
List<SysRoleDept> list = roleDeptMapper.selectList(
|
|
||||||
new LambdaQueryWrapper<SysRoleDept>()
|
|
||||||
.select(SysRoleDept::getDeptId)
|
|
||||||
.eq(SysRoleDept::getRoleId, roleId));
|
|
||||||
if (CollUtil.isNotEmpty(list)) {
|
|
||||||
return StreamUtils.join(list, rd -> Convert.toStr(rd.getDeptId()));
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDeptAndChild(Long deptId) {
|
|
||||||
List<SysDept> deptList = deptMapper.selectList(new LambdaQueryWrapper<SysDept>()
|
|
||||||
.select(SysDept::getDeptId)
|
|
||||||
.apply(DataBaseHelper.findInSet(deptId, "ancestors")));
|
|
||||||
List<Long> ids = StreamUtils.toList(deptList, SysDept::getDeptId);
|
|
||||||
ids.add(deptId);
|
|
||||||
List<SysDept> list = deptMapper.selectList(new LambdaQueryWrapper<SysDept>()
|
|
||||||
.select(SysDept::getDeptId)
|
|
||||||
.in(SysDept::getDeptId, ids));
|
|
||||||
if (CollUtil.isNotEmpty(list)) {
|
|
||||||
return StreamUtils.join(list, d -> Convert.toStr(d.getDeptId()));
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package org.dromara.system.service.impl;
|
package org.dromara.system.service.impl;
|
||||||
|
|
||||||
import cn.dev33.satoken.context.SaHolder;
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
|
@ -8,13 +7,9 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.dromara.common.core.constant.CacheConstants;
|
|
||||||
import org.dromara.common.core.constant.CacheNames;
|
import org.dromara.common.core.constant.CacheNames;
|
||||||
import org.dromara.common.core.exception.ServiceException;
|
import org.dromara.common.core.exception.ServiceException;
|
||||||
import org.dromara.common.core.service.DictService;
|
|
||||||
import org.dromara.common.core.utils.MapstructUtils;
|
import org.dromara.common.core.utils.MapstructUtils;
|
||||||
import org.dromara.common.core.utils.SpringUtils;
|
|
||||||
import org.dromara.common.core.utils.StreamUtils;
|
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
|
|
@ -36,7 +31,6 @@ import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 字典 业务层处理
|
* 字典 业务层处理
|
||||||
|
|
@ -45,7 +39,7 @@ import java.util.stream.Collectors;
|
||||||
*/
|
*/
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Service
|
@Service
|
||||||
public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService {
|
public class SysDictTypeServiceImpl implements ISysDictTypeService {
|
||||||
|
|
||||||
private final SysDictTypeMapper baseMapper;
|
private final SysDictTypeMapper baseMapper;
|
||||||
private final SysDictDataMapper dictDataMapper;
|
private final SysDictDataMapper dictDataMapper;
|
||||||
|
|
@ -209,60 +203,4 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
|
||||||
return !exist;
|
return !exist;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据字典类型和字典值获取字典标签
|
|
||||||
*
|
|
||||||
* @param dictType 字典类型
|
|
||||||
* @param dictValue 字典值
|
|
||||||
* @param separator 分隔符
|
|
||||||
* @return 字典标签
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked cast")
|
|
||||||
@Override
|
|
||||||
public String getDictLabel(String dictType, String dictValue, String separator) {
|
|
||||||
// 优先从本地缓存获取
|
|
||||||
List<SysDictDataVo> datas = (List<SysDictDataVo>) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType);
|
|
||||||
if (ObjectUtil.isNull(datas)) {
|
|
||||||
datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType);
|
|
||||||
SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas);
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, String> map = StreamUtils.toMap(datas, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel);
|
|
||||||
if (StringUtils.containsAny(dictValue, separator)) {
|
|
||||||
return Arrays.stream(dictValue.split(separator))
|
|
||||||
.map(v -> map.getOrDefault(v, StringUtils.EMPTY))
|
|
||||||
.collect(Collectors.joining(separator));
|
|
||||||
} else {
|
|
||||||
return map.getOrDefault(dictValue, StringUtils.EMPTY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据字典类型和字典标签获取字典值
|
|
||||||
*
|
|
||||||
* @param dictType 字典类型
|
|
||||||
* @param dictLabel 字典标签
|
|
||||||
* @param separator 分隔符
|
|
||||||
* @return 字典值
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked cast")
|
|
||||||
@Override
|
|
||||||
public String getDictValue(String dictType, String dictLabel, String separator) {
|
|
||||||
// 优先从本地缓存获取
|
|
||||||
List<SysDictDataVo> datas = (List<SysDictDataVo>) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType);
|
|
||||||
if (ObjectUtil.isNull(datas)) {
|
|
||||||
datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType);
|
|
||||||
SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas);
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, String> map = StreamUtils.toMap(datas, SysDictDataVo::getDictLabel, SysDictDataVo::getDictValue);
|
|
||||||
if (StringUtils.containsAny(dictLabel, separator)) {
|
|
||||||
return Arrays.stream(dictLabel.split(separator))
|
|
||||||
.map(l -> map.getOrDefault(l, StringUtils.EMPTY))
|
|
||||||
.collect(Collectors.joining(separator));
|
|
||||||
} else {
|
|
||||||
return map.getOrDefault(dictLabel, StringUtils.EMPTY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,11 @@
|
||||||
package org.dromara.system.service.impl;
|
package org.dromara.system.service.impl;
|
||||||
|
|
||||||
import cn.hutool.http.useragent.UserAgent;
|
|
||||||
import cn.hutool.http.useragent.UserAgentUtil;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.common.core.constant.Constants;
|
|
||||||
import org.dromara.common.core.utils.MapstructUtils;
|
import org.dromara.common.core.utils.MapstructUtils;
|
||||||
import org.dromara.common.core.utils.ServletUtils;
|
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.core.utils.ip.AddressUtils;
|
|
||||||
import org.dromara.common.log.event.LogininforEvent;
|
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.system.domain.SysLogininfor;
|
import org.dromara.system.domain.SysLogininfor;
|
||||||
|
|
@ -19,11 +13,8 @@ import org.dromara.system.domain.bo.SysLogininforBo;
|
||||||
import org.dromara.system.domain.vo.SysLogininforVo;
|
import org.dromara.system.domain.vo.SysLogininforVo;
|
||||||
import org.dromara.system.mapper.SysLogininforMapper;
|
import org.dromara.system.mapper.SysLogininforMapper;
|
||||||
import org.dromara.system.service.ISysLogininforService;
|
import org.dromara.system.service.ISysLogininforService;
|
||||||
import org.springframework.context.event.EventListener;
|
|
||||||
import org.springframework.scheduling.annotation.Async;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -41,49 +32,6 @@ public class SysLogininforServiceImpl implements ISysLogininforService {
|
||||||
|
|
||||||
private final SysLogininforMapper baseMapper;
|
private final SysLogininforMapper baseMapper;
|
||||||
|
|
||||||
/**
|
|
||||||
* 记录登录信息
|
|
||||||
*
|
|
||||||
* @param logininforEvent 登录事件
|
|
||||||
*/
|
|
||||||
@Async
|
|
||||||
@EventListener
|
|
||||||
public void recordLogininfor(LogininforEvent logininforEvent) {
|
|
||||||
HttpServletRequest request = logininforEvent.getRequest();
|
|
||||||
final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
|
|
||||||
final String ip = ServletUtils.getClientIP(request);
|
|
||||||
|
|
||||||
String address = AddressUtils.getRealAddressByIP(ip);
|
|
||||||
StringBuilder s = new StringBuilder();
|
|
||||||
s.append(getBlock(ip));
|
|
||||||
s.append(address);
|
|
||||||
s.append(getBlock(logininforEvent.getUsername()));
|
|
||||||
s.append(getBlock(logininforEvent.getStatus()));
|
|
||||||
s.append(getBlock(logininforEvent.getMessage()));
|
|
||||||
// 打印信息到日志
|
|
||||||
log.info(s.toString(), logininforEvent.getArgs());
|
|
||||||
// 获取客户端操作系统
|
|
||||||
String os = userAgent.getOs().getName();
|
|
||||||
// 获取客户端浏览器
|
|
||||||
String browser = userAgent.getBrowser().getName();
|
|
||||||
// 封装对象
|
|
||||||
SysLogininforBo logininfor = new SysLogininforBo();
|
|
||||||
logininfor.setTenantId(logininforEvent.getTenantId());
|
|
||||||
logininfor.setUserName(logininforEvent.getUsername());
|
|
||||||
logininfor.setIpaddr(ip);
|
|
||||||
logininfor.setLoginLocation(address);
|
|
||||||
logininfor.setBrowser(browser);
|
|
||||||
logininfor.setOs(os);
|
|
||||||
logininfor.setMsg(logininforEvent.getMessage());
|
|
||||||
// 日志状态
|
|
||||||
if (StringUtils.equalsAny(logininforEvent.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) {
|
|
||||||
logininfor.setStatus(Constants.SUCCESS);
|
|
||||||
} else if (Constants.LOGIN_FAIL.equals(logininforEvent.getStatus())) {
|
|
||||||
logininfor.setStatus(Constants.FAIL);
|
|
||||||
}
|
|
||||||
// 插入数据
|
|
||||||
insertLogininfor(logininfor);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getBlock(Object msg) {
|
private String getBlock(Object msg) {
|
||||||
if (msg == null) {
|
if (msg == null) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue