Merge branch 'dev' into future/flowable

This commit is contained in:
songgaoshuai 2023-12-29 13:43:06 +08:00
commit 9cf9c6a100
48 changed files with 284 additions and 318 deletions

View File

@ -25,7 +25,7 @@
<easyexcel.version>3.3.3</easyexcel.version> <easyexcel.version>3.3.3</easyexcel.version>
<velocity.version>2.3</velocity.version> <velocity.version>2.3</velocity.version>
<satoken.version>1.37.0</satoken.version> <satoken.version>1.37.0</satoken.version>
<mybatis-plus.version>3.5.4</mybatis-plus.version> <mybatis-plus.version>3.5.5</mybatis-plus.version>
<p6spy.version>3.9.1</p6spy.version> <p6spy.version>3.9.1</p6spy.version>
<hutool.version>5.8.22</hutool.version> <hutool.version>5.8.22</hutool.version>
<okhttp.version>4.10.0</okhttp.version> <okhttp.version>4.10.0</okhttp.version>

View File

@ -26,6 +26,7 @@ import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.websocket.utils.WebSocketUtils; import org.dromara.common.websocket.utils.WebSocketUtils;
import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.bo.SysTenantBo; import org.dromara.system.domain.bo.SysTenantBo;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysTenantVo; import org.dromara.system.domain.vo.SysTenantVo;
import org.dromara.system.service.ISysClientService; import org.dromara.system.service.ISysClientService;
import org.dromara.system.service.ISysConfigService; import org.dromara.system.service.ISysConfigService;
@ -81,7 +82,7 @@ public class AuthController {
// 授权类型和客户端id // 授权类型和客户端id
String clientId = loginBody.getClientId(); String clientId = loginBody.getClientId();
String grantType = loginBody.getGrantType(); String grantType = loginBody.getGrantType();
SysClient client = clientService.queryByClientId(clientId); SysClientVo client = clientService.queryByClientId(clientId);
// 查询不到 client client 内不包含 grantType // 查询不到 client client 内不包含 grantType
if (ObjectUtil.isNull(client) || !StringUtils.contains(client.getGrantType(), grantType)) { if (ObjectUtil.isNull(client) || !StringUtils.contains(client.getGrantType(), grantType)) {
log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType); log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType);

View File

@ -4,6 +4,7 @@ package org.dromara.web.service;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.SpringUtils;
import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.domain.vo.LoginVo;
/** /**
@ -18,7 +19,7 @@ public interface IAuthStrategy {
/** /**
* 登录 * 登录
*/ */
static LoginVo login(String body, SysClient client, String grantType) { static LoginVo login(String body, SysClientVo client, String grantType) {
// 授权类型和客户端id // 授权类型和客户端id
String beanName = grantType + BASE_NAME; String beanName = grantType + BASE_NAME;
if (!SpringUtils.containsBean(beanName)) { if (!SpringUtils.containsBean(beanName)) {
@ -31,6 +32,6 @@ public interface IAuthStrategy {
/** /**
* 登录 * 登录
*/ */
LoginVo login(String body, SysClient client); LoginVo login(String body, SysClientVo client);
} }

View File

@ -25,13 +25,10 @@ import org.dromara.common.tenant.exception.TenantException;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SysSocialBo; import org.dromara.system.domain.bo.SysSocialBo;
import org.dromara.system.domain.vo.SysSocialVo; import org.dromara.system.domain.vo.*;
import org.dromara.system.domain.vo.SysTenantVo; import org.dromara.system.mapper.SysDeptMapper;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.ISysPermissionService; import org.dromara.system.service.*;
import org.dromara.system.service.ISysSocialService;
import org.dromara.system.service.ISysTenantService;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -59,6 +56,8 @@ public class SysLoginService {
private final ISysTenantService tenantService; private final ISysTenantService tenantService;
private final ISysPermissionService permissionService; private final ISysPermissionService permissionService;
private final ISysSocialService sysSocialService; private final ISysSocialService sysSocialService;
private final ISysRoleService roleService;
private final SysDeptMapper deptMapper;
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
@ -146,9 +145,12 @@ public class SysLoginService {
loginUser.setUserType(user.getUserType()); loginUser.setUserType(user.getUserType());
loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId())); loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId()));
loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId())); loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId()));
loginUser.setDeptName(ObjectUtil.isNull(user.getDept()) ? "" : user.getDept().getDeptName()); SysDeptVo dept = deptMapper.selectVoById(user.getDeptId());
List<RoleDTO> roles = BeanUtil.copyToList(user.getRoles(), RoleDTO.class); loginUser.setDeptName(ObjectUtil.isNull(dept) ? "" : dept.getDeptName());
loginUser.setRoles(roles); List<SysRoleVo> roles = DataPermissionHelper.ignore(() -> {
return roleService.selectRolesByUserId(user.getUserId());
});
loginUser.setRoles(BeanUtil.copyToList(roles, RoleDTO.class));
return loginUser; return loginUser;
} }

View File

@ -23,6 +23,7 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserMapper;
import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.domain.vo.LoginVo;
@ -44,7 +45,7 @@ public class EmailAuthStrategy implements IAuthStrategy {
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
@Override @Override
public LoginVo login(String body, SysClient client) { public LoginVo login(String body, SysClientVo client) {
EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class); EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class);
ValidatorUtils.validate(loginBody); ValidatorUtils.validate(loginBody);
String tenantId = loginBody.getTenantId(); String tenantId = loginBody.getTenantId();
@ -90,9 +91,7 @@ public class EmailAuthStrategy implements IAuthStrategy {
private SysUserVo loadUserByEmail(String tenantId, String email) { private SysUserVo loadUserByEmail(String tenantId, String email) {
return TenantHelper.dynamic(tenantId, () -> { return TenantHelper.dynamic(tenantId, () -> {
SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>() SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getEmail, email));
.select(SysUser::getEmail, SysUser::getStatus)
.eq(SysUser::getEmail, email));
if (ObjectUtil.isNull(user)) { if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", email); log.info("登录用户:{} 不存在.", email);
throw new UserException("user.not.exists", email); throw new UserException("user.not.exists", email);
@ -100,7 +99,7 @@ public class EmailAuthStrategy implements IAuthStrategy {
log.info("登录用户:{} 已被停用.", email); log.info("登录用户:{} 已被停用.", email);
throw new UserException("user.blocked", email); throw new UserException("user.blocked", email);
} }
return userMapper.selectUserByEmail(email); return user;
}); });
} }

View File

@ -26,6 +26,7 @@ import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.web.config.properties.CaptchaProperties; import org.dromara.common.web.config.properties.CaptchaProperties;
import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserMapper;
import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.domain.vo.LoginVo;
@ -48,7 +49,7 @@ public class PasswordAuthStrategy implements IAuthStrategy {
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
@Override @Override
public LoginVo login(String body, SysClient client) { public LoginVo login(String body, SysClientVo client) {
PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class);
ValidatorUtils.validate(loginBody); ValidatorUtils.validate(loginBody);
String tenantId = loginBody.getTenantId(); String tenantId = loginBody.getTenantId();
@ -109,9 +110,7 @@ public class PasswordAuthStrategy implements IAuthStrategy {
private SysUserVo loadUserByUsername(String tenantId, String username) { private SysUserVo loadUserByUsername(String tenantId, String username) {
return TenantHelper.dynamic(tenantId, () -> { return TenantHelper.dynamic(tenantId, () -> {
SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>() SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, username));
.select(SysUser::getUserName, SysUser::getStatus)
.eq(SysUser::getUserName, username));
if (ObjectUtil.isNull(user)) { if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", username); log.info("登录用户:{} 不存在.", username);
throw new UserException("user.not.exists", username); throw new UserException("user.not.exists", username);
@ -119,7 +118,7 @@ public class PasswordAuthStrategy implements IAuthStrategy {
log.info("登录用户:{} 已被停用.", username); log.info("登录用户:{} 已被停用.", username);
throw new UserException("user.blocked", username); throw new UserException("user.blocked", username);
} }
return userMapper.selectUserByUserName(username); return user;
}); });
} }

View File

@ -23,6 +23,7 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserMapper;
import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.domain.vo.LoginVo;
@ -44,7 +45,7 @@ public class SmsAuthStrategy implements IAuthStrategy {
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
@Override @Override
public LoginVo login(String body, SysClient client) { public LoginVo login(String body, SysClientVo client) {
SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class); SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class);
ValidatorUtils.validate(loginBody); ValidatorUtils.validate(loginBody);
String tenantId = loginBody.getTenantId(); String tenantId = loginBody.getTenantId();
@ -90,9 +91,7 @@ public class SmsAuthStrategy implements IAuthStrategy {
private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) { private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) {
return TenantHelper.dynamic(tenantId, () -> { return TenantHelper.dynamic(tenantId, () -> {
SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>() SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getPhonenumber, phonenumber));
.select(SysUser::getPhonenumber, SysUser::getStatus)
.eq(SysUser::getPhonenumber, phonenumber));
if (ObjectUtil.isNull(user)) { if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", phonenumber); log.info("登录用户:{} 不存在.", phonenumber);
throw new UserException("user.not.exists", phonenumber); throw new UserException("user.not.exists", phonenumber);
@ -100,7 +99,7 @@ public class SmsAuthStrategy implements IAuthStrategy {
log.info("登录用户:{} 已被停用.", phonenumber); log.info("登录用户:{} 已被停用.", phonenumber);
throw new UserException("user.blocked", phonenumber); throw new UserException("user.blocked", phonenumber);
} }
return userMapper.selectUserByPhonenumber(phonenumber); return user;
}); });
} }

View File

@ -25,6 +25,7 @@ import org.dromara.common.social.utils.SocialUtils;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysSocialVo; import org.dromara.system.domain.vo.SysSocialVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserMapper;
@ -59,7 +60,7 @@ public class SocialAuthStrategy implements IAuthStrategy {
* @param client 客户端信息 * @param client 客户端信息
*/ */
@Override @Override
public LoginVo login(String body, SysClient client) { public LoginVo login(String body, SysClientVo client) {
SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class); SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class);
ValidatorUtils.validate(loginBody); ValidatorUtils.validate(loginBody);
AuthResponse<AuthUser> response = SocialUtils.loginAuth( AuthResponse<AuthUser> response = SocialUtils.loginAuth(
@ -114,9 +115,7 @@ public class SocialAuthStrategy implements IAuthStrategy {
private SysUserVo loadUser(String tenantId, Long userId) { private SysUserVo loadUser(String tenantId, Long userId) {
return TenantHelper.dynamic(tenantId, () -> { return TenantHelper.dynamic(tenantId, () -> {
SysUser user = userMapper.selectOne(new LambdaQueryWrapper<SysUser>() SysUserVo user = userMapper.selectVoById(userId);
.select(SysUser::getUserName, SysUser::getStatus)
.eq(SysUser::getUserId, userId));
if (ObjectUtil.isNull(user)) { if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", ""); log.info("登录用户:{} 不存在.", "");
throw new UserException("user.not.exists", ""); throw new UserException("user.not.exists", "");
@ -124,7 +123,7 @@ public class SocialAuthStrategy implements IAuthStrategy {
log.info("登录用户:{} 已被停用.", ""); log.info("登录用户:{} 已被停用.", "");
throw new UserException("user.blocked", ""); throw new UserException("user.blocked", "");
} }
return userMapper.selectUserByUserName(user.getUserName()); return user;
}); });
} }

View File

@ -12,6 +12,7 @@ import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.domain.vo.LoginVo;
import org.dromara.web.service.IAuthStrategy; import org.dromara.web.service.IAuthStrategy;
@ -31,7 +32,7 @@ public class XcxAuthStrategy implements IAuthStrategy {
private final SysLoginService loginService; private final SysLoginService loginService;
@Override @Override
public LoginVo login(String body, SysClient client) { public LoginVo login(String body, SysClientVo client) {
XcxLoginBody loginBody = JsonUtils.parseObject(body, XcxLoginBody.class); XcxLoginBody loginBody = JsonUtils.parseObject(body, XcxLoginBody.class);
ValidatorUtils.validate(loginBody); ValidatorUtils.validate(loginBody);
// xcxCode 小程序调用 wx.login 授权后获取 // xcxCode 小程序调用 wx.login 授权后获取

View File

@ -94,6 +94,11 @@
<artifactId>ip2region</artifactId> <artifactId>ip2region</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -35,6 +35,11 @@ public interface CacheNames {
*/ */
String SYS_TENANT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_tenant#30d"; String SYS_TENANT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_tenant#30d";
/**
* 客户端
*/
String SYS_CLIENT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_client#30d";
/** /**
* 用户账户 * 用户账户
*/ */

View File

@ -0,0 +1,57 @@
package org.dromara.common.core.context;
import com.alibaba.ttl.TransmittableThreadLocal;
import java.util.HashMap;
import java.util.Map;
/**
* 线程持有类
*
* @author Michelle.Chung
*/
public class ThreadLocalHolder {
/**
* 初始化 (支持异步)
*/
private static final ThreadLocal<Map<String, Object>> THREAD_LOCAL = TransmittableThreadLocal.withInitial(HashMap::new);
/**
* 设置值
*
* @param key
* @param value
*/
public static <T> void set(String key, T value) {
THREAD_LOCAL.get().put(key, value);
}
/**
* 获取值
*
* @param key
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T get(String key) {
return (T) THREAD_LOCAL.get().get(key);
}
/**
* 移除值
*
* @param key
*/
public static void remove(String key) {
THREAD_LOCAL.get().remove(key);
}
/**
* 清空值
*/
public static void clear() {
THREAD_LOCAL.remove();
}
}

View File

@ -5,6 +5,7 @@ import cn.hutool.core.util.ArrayUtil;
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.GlobalConstants; import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.context.ThreadLocalHolder;
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.MessageUtils; import org.dromara.common.core.utils.MessageUtils;
@ -36,7 +37,7 @@ import java.util.StringJoiner;
@Aspect @Aspect
public class RepeatSubmitAspect { public class RepeatSubmitAspect {
private static final ThreadLocal<String> KEY_CACHE = new ThreadLocal<>(); private static final String KEY_CACHE = "keyCache";
@Before("@annotation(repeatSubmit)") @Before("@annotation(repeatSubmit)")
public void doBefore(JoinPoint point, RepeatSubmit repeatSubmit) throws Throwable { public void doBefore(JoinPoint point, RepeatSubmit repeatSubmit) throws Throwable {
@ -59,7 +60,7 @@ public class RepeatSubmitAspect {
// 唯一标识指定key + url + 消息头 // 唯一标识指定key + url + 消息头
String cacheRepeatKey = GlobalConstants.REPEAT_SUBMIT_KEY + url + submitKey; String cacheRepeatKey = GlobalConstants.REPEAT_SUBMIT_KEY + url + submitKey;
if (RedisUtils.setObjectIfAbsent(cacheRepeatKey, "", Duration.ofMillis(interval))) { if (RedisUtils.setObjectIfAbsent(cacheRepeatKey, "", Duration.ofMillis(interval))) {
KEY_CACHE.set(cacheRepeatKey); ThreadLocalHolder.set(KEY_CACHE, cacheRepeatKey);
} else { } else {
String message = repeatSubmit.message(); String message = repeatSubmit.message();
if (StringUtils.startsWith(message, "{") && StringUtils.endsWith(message, "}")) { if (StringUtils.startsWith(message, "{") && StringUtils.endsWith(message, "}")) {
@ -82,9 +83,10 @@ public class RepeatSubmitAspect {
if (r.getCode() == R.SUCCESS) { if (r.getCode() == R.SUCCESS) {
return; return;
} }
RedisUtils.deleteObject(KEY_CACHE.get()); String cacheKey = ThreadLocalHolder.get(KEY_CACHE);
RedisUtils.deleteObject(cacheKey);
} finally { } finally {
KEY_CACHE.remove(); ThreadLocalHolder.remove(KEY_CACHE);
} }
} }
} }
@ -97,8 +99,9 @@ public class RepeatSubmitAspect {
*/ */
@AfterThrowing(value = "@annotation(repeatSubmit)", throwing = "e") @AfterThrowing(value = "@annotation(repeatSubmit)", throwing = "e")
public void doAfterThrowing(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Exception e) { public void doAfterThrowing(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Exception e) {
RedisUtils.deleteObject(KEY_CACHE.get()); String cacheKey = ThreadLocalHolder.get(KEY_CACHE);
KEY_CACHE.remove(); RedisUtils.deleteObject(cacheKey);
ThreadLocalHolder.remove(KEY_CACHE);
} }
/** /**

View File

@ -27,11 +27,6 @@
<artifactId>ruoyi-common-json</artifactId> <artifactId>ruoyi-common-json</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -4,7 +4,7 @@ import cn.hutool.core.lang.Dict;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.ttl.TransmittableThreadLocal; import org.dromara.common.core.context.ThreadLocalHolder;
import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.ServletUtils;
import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.SpringUtils;
@ -49,9 +49,9 @@ public class LogAspect {
/** /**
* 算操作消耗时间 * key
*/ */
private static final ThreadLocal<StopWatch> TIME_THREADLOCAL = new TransmittableThreadLocal<>(); private static final String LOG_STOP_WATCH_KEY = "logStopwatch";
/** /**
* 处理请求前执行 * 处理请求前执行
@ -59,7 +59,7 @@ public class LogAspect {
@Before(value = "@annotation(controllerLog)") @Before(value = "@annotation(controllerLog)")
public void boBefore(JoinPoint joinPoint, Log controllerLog) { public void boBefore(JoinPoint joinPoint, Log controllerLog) {
StopWatch stopWatch = new StopWatch(); StopWatch stopWatch = new StopWatch();
TIME_THREADLOCAL.set(stopWatch); ThreadLocalHolder.set(LOG_STOP_WATCH_KEY, stopWatch);
stopWatch.start(); stopWatch.start();
} }
@ -112,7 +112,7 @@ public class LogAspect {
// 处理设置注解上的参数 // 处理设置注解上的参数
getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
// 设置消耗时间 // 设置消耗时间
StopWatch stopWatch = TIME_THREADLOCAL.get(); StopWatch stopWatch = ThreadLocalHolder.get(LOG_STOP_WATCH_KEY);
stopWatch.stop(); stopWatch.stop();
operLog.setCostTime(stopWatch.getTime()); operLog.setCostTime(stopWatch.getTime());
// 发布事件保存数据库 // 发布事件保存数据库
@ -122,7 +122,7 @@ public class LogAspect {
log.error("异常信息:{}", exp.getMessage()); log.error("异常信息:{}", exp.getMessage());
exp.printStackTrace(); exp.printStackTrace();
} finally { } finally {
TIME_THREADLOCAL.remove(); ThreadLocalHolder.remove(LOG_STOP_WATCH_KEY);
} }
} }

View File

@ -1,12 +1,9 @@
package org.dromara.common.mybatis.config; package org.dromara.common.mybatis.config;
import cn.hutool.core.net.NetUtil; import cn.hutool.core.net.NetUtil;
import com.baomidou.mybatisplus.autoconfigure.DdlApplicationRunner;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
import com.baomidou.mybatisplus.extension.ddl.IDdl;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
@ -14,21 +11,16 @@ import org.dromara.common.core.factory.YmlPropertySourceFactory;
import org.dromara.common.mybatis.handler.InjectionMetaObjectHandler; import org.dromara.common.mybatis.handler.InjectionMetaObjectHandler;
import org.dromara.common.mybatis.interceptor.PlusDataPermissionInterceptor; import org.dromara.common.mybatis.interceptor.PlusDataPermissionInterceptor;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource; import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.util.List;
/** /**
* mybatis-plus配置类(下方注释有插件介绍) * mybatis-plus配置类(下方注释有插件介绍)
* *
* @author Lion Li * @author Lion Li
*/ */
@EnableTransactionManagement(proxyTargetClass = true) @EnableTransactionManagement(proxyTargetClass = true)
@AutoConfiguration(before = MybatisPlusAutoConfiguration.class)
@MapperScan("${mybatis-plus.mapperPackage}") @MapperScan("${mybatis-plus.mapperPackage}")
@PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class) @PropertySource(value = "classpath:common-mybatis.yml", factory = YmlPropertySourceFactory.class)
public class MybatisPlusConfig { public class MybatisPlusConfig {
@ -108,9 +100,4 @@ public class MybatisPlusConfig {
* https://baomidou.com/pages/2a45ff/ * https://baomidou.com/pages/2a45ff/
*/ */
@Bean
public DdlApplicationRunner ddlApplicationRunner(@Autowired(required = false) List<IDdl> ddlList) {
return new DdlApplicationRunner(ddlList);
}
} }

View File

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.dromara.common.core.context.ThreadLocalHolder;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;

View File

@ -1,7 +1,5 @@
package org.dromara.common.satoken.utils; package org.dromara.common.satoken.utils;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.context.model.SaStorage;
import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
@ -11,6 +9,7 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.constant.UserConstants;
import org.dromara.common.core.context.ThreadLocalHolder;
import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.enums.UserType; import org.dromara.common.core.enums.UserType;
@ -47,11 +46,10 @@ public class LoginHelper {
* @param model 配置参数 * @param model 配置参数
*/ */
public static void login(LoginUser loginUser, SaLoginModel model) { public static void login(LoginUser loginUser, SaLoginModel model) {
SaStorage storage = SaHolder.getStorage(); ThreadLocalHolder.set(LOGIN_USER_KEY, loginUser);
storage.set(LOGIN_USER_KEY, loginUser); ThreadLocalHolder.set(TENANT_KEY, loginUser.getTenantId());
storage.set(TENANT_KEY, loginUser.getTenantId()); ThreadLocalHolder.set(USER_KEY, loginUser.getUserId());
storage.set(USER_KEY, loginUser.getUserId()); ThreadLocalHolder.set(DEPT_KEY, loginUser.getDeptId());
storage.set(DEPT_KEY, loginUser.getDeptId());
model = ObjectUtil.defaultIfNull(model, new SaLoginModel()); model = ObjectUtil.defaultIfNull(model, new SaLoginModel());
StpUtil.login(loginUser.getLoginId(), StpUtil.login(loginUser.getLoginId(),
model.setExtra(TENANT_KEY, loginUser.getTenantId()) model.setExtra(TENANT_KEY, loginUser.getTenantId())
@ -161,10 +159,10 @@ public class LoginHelper {
public static Object getStorageIfAbsentSet(String key, Supplier<Object> handle) { public static Object getStorageIfAbsentSet(String key, Supplier<Object> handle) {
try { try {
Object obj = SaHolder.getStorage().get(key); Object obj = ThreadLocalHolder.get(key);
if (ObjectUtil.isNull(obj)) { if (ObjectUtil.isNull(obj)) {
obj = handle.get(); obj = handle.get();
SaHolder.getStorage().set(key, obj); ThreadLocalHolder.set(key, obj);
} }
return obj; return obj;
} catch (Exception e) { } catch (Exception e) {

View File

@ -4,10 +4,13 @@ import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.interceptor.SaInterceptor; import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.ServletUtils;
import org.dromara.common.core.utils.SpringUtils; 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.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.core.context.ThreadLocalHolder;
import org.dromara.common.security.config.properties.SecurityProperties; import org.dromara.common.security.config.properties.SecurityProperties;
import org.dromara.common.security.handler.AllUrlHandler; import org.dromara.common.security.handler.AllUrlHandler;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -38,35 +41,44 @@ public class SecurityConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) { public void addInterceptors(InterceptorRegistry registry) {
// 注册路由拦截器自定义验证规则 // 注册路由拦截器自定义验证规则
registry.addInterceptor(new SaInterceptor(handler -> { registry.addInterceptor(new SaInterceptor(handler -> {
AllUrlHandler allUrlHandler = SpringUtils.getBean(AllUrlHandler.class); AllUrlHandler allUrlHandler = SpringUtils.getBean(AllUrlHandler.class);
// 登录验证 -- 排除多个路径 // 登录验证 -- 排除多个路径
SaRouter SaRouter
// 获取所有的 // 获取所有的
.match(allUrlHandler.getUrls()) .match(allUrlHandler.getUrls())
// 对未排除的路径进行检查 // 对未排除的路径进行检查
.check(() -> { .check(() -> {
// 检查是否登录 是否有token // 检查是否登录 是否有token
StpUtil.checkLogin(); StpUtil.checkLogin();
// 检查 header param 里的 clientid token 里的是否一致 // 检查 header param 里的 clientid token 里的是否一致
String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY); String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY);
String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY); String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY);
String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString(); String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString();
if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) { if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) {
// token 无效 // token 无效
throw NotLoginException.newInstance(StpUtil.getLoginType(), throw NotLoginException.newInstance(StpUtil.getLoginType(),
"-100", "客户端ID与Token不匹配", "-100", "客户端ID与Token不匹配",
StpUtil.getTokenValue()); StpUtil.getTokenValue());
} }
// 有效率影响 用于临时测试 // 保存用户信息
// if (log.isDebugEnabled()) { ThreadLocalHolder.set(LoginHelper.LOGIN_USER_KEY, LoginHelper.getLoginUser());
// log.info("剩余有效时间: {}", StpUtil.getTokenTimeout());
// log.info("临时有效时间: {}", StpUtil.getTokenActivityTimeout());
// }
}); // 有效率影响 用于临时测试
})).addPathPatterns("/**") // if (log.isDebugEnabled()) {
// log.info("剩余有效时间: {}", StpUtil.getTokenTimeout());
// log.info("临时有效时间: {}", StpUtil.getTokenActivityTimeout());
// }
});
})
{
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
ThreadLocalHolder.remove(LoginHelper.LOGIN_USER_KEY);
}
}).addPathPatterns("/**")
// 排除不需要拦截的路径 // 排除不需要拦截的路径
.excludePathPatterns(securityProperties.getExcludes()); .excludePathPatterns(securityProperties.getExcludes());
} }

View File

@ -26,11 +26,6 @@
<artifactId>ruoyi-common-redis</artifactId> <artifactId>ruoyi-common-redis</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,15 +1,14 @@
package org.dromara.common.tenant.helper; package org.dromara.common.tenant.helper;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import com.alibaba.ttl.TransmittableThreadLocal;
import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.context.ThreadLocalHolder;
import org.dromara.common.core.utils.SpringUtils; 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;
@ -28,7 +27,7 @@ public class TenantHelper {
private static final String DYNAMIC_TENANT_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "dynamicTenant"; private static final String DYNAMIC_TENANT_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "dynamicTenant";
private static final ThreadLocal<String> TEMP_DYNAMIC_TENANT = new TransmittableThreadLocal<>(); private static final String TENANT_ID_KEY = "tempDynamicTenant";
/** /**
* 租户功能是否启用 * 租户功能是否启用
@ -89,12 +88,12 @@ public class TenantHelper {
return; return;
} }
if (!isLogin()) { if (!isLogin()) {
TEMP_DYNAMIC_TENANT.set(tenantId); ThreadLocalHolder.set(TENANT_ID_KEY, tenantId);
return; return;
} }
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
RedisUtils.setCacheObject(cacheKey, tenantId); RedisUtils.setCacheObject(cacheKey, tenantId);
SaHolder.getStorage().set(cacheKey, tenantId); ThreadLocalHolder.set(cacheKey, tenantId);
} }
/** /**
@ -107,15 +106,15 @@ public class TenantHelper {
return null; return null;
} }
if (!isLogin()) { if (!isLogin()) {
return TEMP_DYNAMIC_TENANT.get(); return ThreadLocalHolder.get(TENANT_ID_KEY);
} }
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
String tenantId = (String) SaHolder.getStorage().get(cacheKey); String tenantId = ThreadLocalHolder.get(cacheKey);
if (StringUtils.isNotBlank(tenantId)) { if (StringUtils.isNotBlank(tenantId)) {
return tenantId; return tenantId;
} }
tenantId = RedisUtils.getCacheObject(cacheKey); tenantId = RedisUtils.getCacheObject(cacheKey);
SaHolder.getStorage().set(cacheKey, tenantId); ThreadLocalHolder.set(cacheKey, tenantId);
return tenantId; return tenantId;
} }
@ -127,12 +126,12 @@ public class TenantHelper {
return; return;
} }
if (!isLogin()) { if (!isLogin()) {
TEMP_DYNAMIC_TENANT.remove(); ThreadLocalHolder.remove(TENANT_ID_KEY);
return; return;
} }
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
RedisUtils.deleteObject(cacheKey); RedisUtils.deleteObject(cacheKey);
SaHolder.getStorage().delete(cacheKey); ThreadLocalHolder.remove(cacheKey);
} }
/** /**

View File

@ -57,11 +57,6 @@
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-crypto</artifactId> <artifactId>hutool-crypto</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -2,7 +2,7 @@ package org.dromara.common.web.interceptor;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import com.alibaba.ttl.TransmittableThreadLocal; import org.dromara.common.core.context.ThreadLocalHolder;
import org.dromara.common.core.utils.SpringUtils; 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.json.utils.JsonUtils; import org.dromara.common.json.utils.JsonUtils;
@ -30,7 +30,7 @@ public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor {
private final String prodProfile = "prod"; private final String prodProfile = "prod";
private final TransmittableThreadLocal<StopWatch> invokeTimeTL = new TransmittableThreadLocal<>(); private final String STOP_WATCH_KEY = "stopwatch";
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
@ -56,7 +56,7 @@ public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor {
} }
StopWatch stopWatch = new StopWatch(); StopWatch stopWatch = new StopWatch();
invokeTimeTL.set(stopWatch); ThreadLocalHolder.set(STOP_WATCH_KEY, stopWatch);
stopWatch.start(); stopWatch.start();
} }
return true; return true;
@ -70,10 +70,10 @@ public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor {
@Override @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
if (!prodProfile.equals(SpringUtils.getActiveProfile())) { if (!prodProfile.equals(SpringUtils.getActiveProfile())) {
StopWatch stopWatch = invokeTimeTL.get(); StopWatch stopWatch = ThreadLocalHolder.get(STOP_WATCH_KEY);
stopWatch.stop(); stopWatch.stop();
log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime()); log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime());
invokeTimeTL.remove(); ThreadLocalHolder.clear();
} }
} }

View File

@ -439,7 +439,7 @@ const submitForm = () => {
} else { } else {
await add${BusinessName}(form.value).finally(() => buttonLoading.value = false); await add${BusinessName}(form.value).finally(() => buttonLoading.value = false);
} }
proxy?.#[[$modal]]#.msgSuccess("修改成功"); proxy?.#[[$modal]]#.msgSuccess("操作成功");
dialog.visible = false; dialog.visible = false;
await getList(); await getList();
} }

View File

@ -97,7 +97,7 @@ public class SysClientController extends BaseController {
@Log(title = "客户端管理", businessType = BusinessType.UPDATE) @Log(title = "客户端管理", businessType = BusinessType.UPDATE)
@PutMapping("/changeStatus") @PutMapping("/changeStatus")
public R<Void> changeStatus(@RequestBody SysClientBo bo) { public R<Void> changeStatus(@RequestBody SysClientBo bo) {
return toAjax(sysClientService.updateUserStatus(bo.getId(), bo.getStatus())); return toAjax(sysClientService.updateUserStatus(bo.getClientId(), bo.getStatus()));
} }
/** /**

View File

@ -19,6 +19,7 @@ import org.dromara.system.domain.vo.ProfileVo;
import org.dromara.system.domain.vo.SysOssVo; import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysOssService; import org.dromara.system.service.ISysOssService;
import org.dromara.system.service.ISysRoleService;
import org.dromara.system.service.ISysUserService; import org.dromara.system.service.ISysUserService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
@ -40,6 +41,7 @@ import java.util.Arrays;
public class SysProfileController extends BaseController { public class SysProfileController extends BaseController {
private final ISysUserService userService; private final ISysUserService userService;
private final ISysRoleService roleService;
private final ISysOssService ossService; private final ISysOssService ossService;
/** /**
@ -48,10 +50,11 @@ public class SysProfileController extends BaseController {
@GetMapping @GetMapping
public R<ProfileVo> profile() { public R<ProfileVo> profile() {
SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); SysUserVo user = userService.selectUserById(LoginHelper.getUserId());
user.setRoles(roleService.selectRolesByUserId(user.getUserId()));
ProfileVo profileVo = new ProfileVo(); ProfileVo profileVo = new ProfileVo();
profileVo.setUser(user); profileVo.setUser(user);
profileVo.setRoleGroup(userService.selectUserRoleGroup(user.getUserName())); profileVo.setRoleGroup(userService.selectUserRoleGroup(user.getUserId()));
profileVo.setPostGroup(userService.selectUserPostGroup(user.getUserName())); profileVo.setPostGroup(userService.selectUserPostGroup(user.getUserId()));
return R.ok(profileVo); return R.ok(profileVo);
} }

View File

@ -116,6 +116,7 @@ public class SysUserController extends BaseController {
if (ObjectUtil.isNull(user)) { if (ObjectUtil.isNull(user)) {
return R.fail("没有权限访问用户数据!"); return R.fail("没有权限访问用户数据!");
} }
user.setRoles(roleService.selectRolesByUserId(user.getUserId()));
userInfoVo.setUser(user); userInfoVo.setUser(user);
userInfoVo.setPermissions(loginUser.getMenuPermission()); userInfoVo.setPermissions(loginUser.getMenuPermission());
userInfoVo.setRoles(loginUser.getRolePermission()); userInfoVo.setRoles(loginUser.getRolePermission());
@ -142,7 +143,7 @@ public class SysUserController extends BaseController {
if (ObjectUtil.isNotNull(userId)) { if (ObjectUtil.isNotNull(userId)) {
SysUserVo sysUser = userService.selectUserById(userId); SysUserVo sysUser = userService.selectUserById(userId);
userInfoVo.setUser(sysUser); userInfoVo.setUser(sysUser);
userInfoVo.setRoleIds(StreamUtils.toList(sysUser.getRoles(), SysRoleVo::getRoleId)); userInfoVo.setRoleIds(roleService.selectRoleListByUserId(userId));
userInfoVo.setPostIds(postService.selectPostListByUserId(userId)); userInfoVo.setPostIds(postService.selectPostListByUserId(userId));
} }
return R.ok(userInfoVo); return R.ok(userInfoVo);
@ -241,8 +242,9 @@ public class SysUserController extends BaseController {
@SaCheckPermission("system:user:query") @SaCheckPermission("system:user:query")
@GetMapping("/authRole/{userId}") @GetMapping("/authRole/{userId}")
public R<SysUserInfoVo> authRole(@PathVariable Long userId) { public R<SysUserInfoVo> authRole(@PathVariable Long userId) {
userService.checkUserDataScope(userId);
SysUserVo user = userService.selectUserById(userId); SysUserVo user = userService.selectUserById(userId);
List<SysRoleVo> roles = roleService.selectRolesByUserId(userId); List<SysRoleVo> roles = roleService.selectRolesAuthByUserId(userId);
SysUserInfoVo userInfoVo = new SysUserInfoVo(); SysUserInfoVo userInfoVo = new SysUserInfoVo();
userInfoVo.setUser(user); userInfoVo.setUser(user);
userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin()));

View File

@ -32,7 +32,7 @@ public interface SysDeptMapper extends BaseMapperPlus<SysDept, SysDeptVo> {
@DataPermission({ @DataPermission({
@DataColumn(key = "deptName", value = "dept_id") @DataColumn(key = "deptName", value = "dept_id")
}) })
SysDeptVo selectDeptById(Long deptId); long countDeptById(Long deptId);
/** /**
* 根据角色ID查询部门树信息 * 根据角色ID查询部门树信息

View File

@ -13,20 +13,12 @@ import java.util.List;
*/ */
public interface SysPostMapper extends BaseMapperPlus<SysPost, SysPostVo> { public interface SysPostMapper extends BaseMapperPlus<SysPost, SysPostVo> {
/**
* 根据用户ID获取岗位选择框列表
*
* @param userId 用户ID
* @return 选中岗位ID列表
*/
List<Long> selectPostListByUserId(Long userId);
/** /**
* 查询用户所属岗位组 * 查询用户所属岗位组
* *
* @param userName 用户名 * @param userId 用户ID
* @return 结果 * @return 结果
*/ */
List<SysPostVo> selectPostsByUserName(String userName); List<SysPostVo> selectPostsByUserId(Long userId);
} }

View File

@ -3,12 +3,12 @@ package org.dromara.system.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.annotation.DataColumn; import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.vo.SysRoleVo; import org.dromara.system.domain.vo.SysRoleVo;
import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@ -51,21 +51,12 @@ public interface SysRoleMapper extends BaseMapperPlus<SysRole, SysRoleVo> {
*/ */
List<SysRoleVo> selectRolePermissionByUserId(Long userId); List<SysRoleVo> selectRolePermissionByUserId(Long userId);
/**
* 根据用户ID获取角色选择框列表
*
* @param userId 用户ID
* @return 选中角色ID列表
*/
List<Long> selectRoleListByUserId(Long userId);
/** /**
* 根据用户ID查询角色 * 根据用户ID查询角色
* *
* @param userName 用户名 * @param userId 用户ID
* @return 角色列表 * @return 角色列表
*/ */
List<SysRoleVo> selectRolesByUserName(String userName); List<SysRoleVo> selectRolesByUserId(Long userId);
} }

View File

@ -61,41 +61,11 @@ public interface SysUserMapper extends BaseMapperPlus<SysUser, SysUserVo> {
}) })
Page<SysUserVo> selectUnallocatedList(@Param("page") Page<SysUser> page, @Param(Constants.WRAPPER) Wrapper<SysUser> queryWrapper); Page<SysUserVo> selectUnallocatedList(@Param("page") Page<SysUser> page, @Param(Constants.WRAPPER) Wrapper<SysUser> queryWrapper);
/**
* 通过用户名查询用户
*
* @param userName 用户名
* @return 用户对象信息
*/
SysUserVo selectUserByUserName(String userName);
/**
* 通过手机号查询用户
*
* @param phonenumber 手机号
* @return 用户对象信息
*/
SysUserVo selectUserByPhonenumber(String phonenumber);
/**
* 通过邮箱查询用户
*
* @param email 邮箱
* @return 用户对象信息
*/
SysUserVo selectUserByEmail(String email);
/**
* 通过用户ID查询用户
*
* @param userId 用户ID
* @return 用户对象信息
*/
@DataPermission({ @DataPermission({
@DataColumn(key = "deptName", value = "d.dept_id"), @DataColumn(key = "deptName", value = "dept_id"),
@DataColumn(key = "userName", value = "u.user_id") @DataColumn(key = "userName", value = "user_id")
}) })
SysUserVo selectUserById(Long userId); long countUserById(Long userId);
@Override @Override
@DataPermission({ @DataPermission({

View File

@ -25,7 +25,7 @@ public interface ISysClientService {
/** /**
* 查询客户端信息基于客户端id * 查询客户端信息基于客户端id
*/ */
SysClient queryByClientId(String clientId); SysClientVo queryByClientId(String clientId);
/** /**
* 查询客户端管理列表 * 查询客户端管理列表
@ -50,7 +50,7 @@ public interface ISysClientService {
/** /**
* 修改状态 * 修改状态
*/ */
int updateUserStatus(Long id, String status); int updateUserStatus(String clientId, String status);
/** /**
* 校验并批量删除客户端管理信息 * 校验并批量删除客户端管理信息

View File

@ -35,6 +35,14 @@ public interface ISysRoleService {
*/ */
List<SysRoleVo> selectRolesByUserId(Long userId); List<SysRoleVo> selectRolesByUserId(Long userId);
/**
* 根据用户ID查询角色列表(包含被授权状态)
*
* @param userId 用户ID
* @return 角色列表
*/
List<SysRoleVo> selectRolesAuthByUserId(Long userId);
/** /**
* 根据用户ID查询角色权限 * 根据用户ID查询角色权限
* *
@ -180,4 +188,5 @@ public interface ISysRoleService {
int insertAuthUsers(Long roleId, Long[] userIds); int insertAuthUsers(Long roleId, Long[] userIds);
void cleanOnlineUserByRole(Long roleId); void cleanOnlineUserByRole(Long roleId);
} }

View File

@ -68,18 +68,18 @@ public interface ISysUserService {
/** /**
* 根据用户ID查询用户所属角色组 * 根据用户ID查询用户所属角色组
* *
* @param userName 用户名 * @param userId 用户ID
* @return 结果 * @return 结果
*/ */
String selectUserRoleGroup(String userName); String selectUserRoleGroup(Long userId);
/** /**
* 根据用户ID查询用户所属岗位组 * 根据用户ID查询用户所属岗位组
* *
* @param userName 用户名 * @param userId 用户ID
* @return 结果 * @return 结果
*/ */
String selectUserPostGroup(String userName); String selectUserPostGroup(Long userId);
/** /**
* 校验用户名称是否唯一 * 校验用户名称是否唯一

View File

@ -7,6 +7,7 @@ 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 lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
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;
@ -16,6 +17,8 @@ import org.dromara.system.domain.bo.SysClientBo;
import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.mapper.SysClientMapper; import org.dromara.system.mapper.SysClientMapper;
import org.dromara.system.service.ISysClientService; import org.dromara.system.service.ISysClientService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Collection; import java.util.Collection;
@ -48,9 +51,10 @@ public class SysClientServiceImpl implements ISysClientService {
/** /**
* 查询客户端管理 * 查询客户端管理
*/ */
@Cacheable(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId")
@Override @Override
public SysClient queryByClientId(String clientId) { public SysClientVo queryByClientId(String clientId) {
return baseMapper.selectOne(new LambdaQueryWrapper<SysClient>().eq(SysClient::getClientId, clientId)); return baseMapper.selectVoOne(new LambdaQueryWrapper<SysClient>().eq(SysClient::getClientId, clientId));
} }
/** /**
@ -105,6 +109,7 @@ public class SysClientServiceImpl implements ISysClientService {
/** /**
* 修改客户端管理 * 修改客户端管理
*/ */
@CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#bo.clientId")
@Override @Override
public Boolean updateByBo(SysClientBo bo) { public Boolean updateByBo(SysClientBo bo) {
SysClient update = MapstructUtils.convert(bo, SysClient.class); SysClient update = MapstructUtils.convert(bo, SysClient.class);
@ -116,12 +121,13 @@ public class SysClientServiceImpl implements ISysClientService {
/** /**
* 修改状态 * 修改状态
*/ */
@CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId")
@Override @Override
public int updateUserStatus(Long id, String status) { public int updateUserStatus(String clientId, String status) {
return baseMapper.update(null, return baseMapper.update(null,
new LambdaUpdateWrapper<SysClient>() new LambdaUpdateWrapper<SysClient>()
.set(SysClient::getStatus, status) .set(SysClient::getStatus, status)
.eq(SysClient::getId, id)); .eq(SysClient::getClientId, clientId));
} }
/** /**
@ -134,6 +140,7 @@ public class SysClientServiceImpl implements ISysClientService {
/** /**
* 批量删除客户端管理 * 批量删除客户端管理
*/ */
@CacheEvict(cacheNames = CacheNames.SYS_CLIENT, allEntries = true)
@Override @Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) { if (isValid) {

View File

@ -83,6 +83,7 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), SysDept::getParentId, bo.getParentId()); lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), SysDept::getParentId, bo.getParentId());
lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName()); lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName());
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus()); lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus());
lqw.orderByAsc(SysDept::getAncestors);
lqw.orderByAsc(SysDept::getParentId); lqw.orderByAsc(SysDept::getParentId);
lqw.orderByAsc(SysDept::getOrderNum); lqw.orderByAsc(SysDept::getOrderNum);
lqw.orderByAsc(SysDept::getDeptId); lqw.orderByAsc(SysDept::getDeptId);
@ -221,8 +222,7 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
if (LoginHelper.isSuperAdmin()) { if (LoginHelper.isSuperAdmin()) {
return; return;
} }
SysDeptVo dept = baseMapper.selectDeptById(deptId); if (baseMapper.countDeptById(deptId) == 0) {
if (ObjectUtil.isNull(dept)) {
throw new ServiceException("没有权限访问部门数据!"); throw new ServiceException("没有权限访问部门数据!");
} }
} }

View File

@ -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;
@ -9,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.core.constant.CacheConstants; 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.context.ThreadLocalHolder;
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.service.DictService;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
@ -221,10 +221,10 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
@Override @Override
public String getDictLabel(String dictType, String dictValue, String separator) { public String getDictLabel(String dictType, String dictValue, String separator) {
// 优先从本地缓存获取 // 优先从本地缓存获取
List<SysDictDataVo> datas = (List<SysDictDataVo>) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType); List<SysDictDataVo> datas = ThreadLocalHolder.get(CacheConstants.SYS_DICT_KEY + dictType);
if (ObjectUtil.isNull(datas)) { if (ObjectUtil.isNull(datas)) {
datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType);
SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas); ThreadLocalHolder.set(CacheConstants.SYS_DICT_KEY + dictType, datas);
} }
Map<String, String> map = StreamUtils.toMap(datas, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); Map<String, String> map = StreamUtils.toMap(datas, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel);
@ -249,10 +249,10 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
@Override @Override
public String getDictValue(String dictType, String dictLabel, String separator) { public String getDictValue(String dictType, String dictLabel, String separator) {
// 优先从本地缓存获取 // 优先从本地缓存获取
List<SysDictDataVo> datas = (List<SysDictDataVo>) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType); List<SysDictDataVo> datas = ThreadLocalHolder.get(CacheConstants.SYS_DICT_KEY + dictType);
if (ObjectUtil.isNull(datas)) { if (ObjectUtil.isNull(datas)) {
datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType);
SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas); ThreadLocalHolder.set(CacheConstants.SYS_DICT_KEY + dictType, datas);
} }
Map<String, String> map = StreamUtils.toMap(datas, SysDictDataVo::getDictLabel, SysDictDataVo::getDictValue); Map<String, String> map = StreamUtils.toMap(datas, SysDictDataVo::getDictLabel, SysDictDataVo::getDictValue);

View File

@ -17,6 +17,7 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysClient;
import org.dromara.system.domain.SysLogininfor; import org.dromara.system.domain.SysLogininfor;
import org.dromara.system.domain.bo.SysLogininforBo; import org.dromara.system.domain.bo.SysLogininforBo;
import org.dromara.system.domain.vo.SysClientVo;
import org.dromara.system.domain.vo.SysLogininforVo; import org.dromara.system.domain.vo.SysLogininforVo;
import org.dromara.system.mapper.SysClientMapper; import org.dromara.system.mapper.SysClientMapper;
import org.dromara.system.mapper.SysLogininforMapper; import org.dromara.system.mapper.SysLogininforMapper;
@ -61,7 +62,7 @@ public class SysLogininforServiceImpl implements ISysLogininforService {
final String ip = ServletUtils.getClientIP(request); final String ip = ServletUtils.getClientIP(request);
// 客户端信息 // 客户端信息
String clientid = request.getHeader(LoginHelper.CLIENT_KEY); String clientid = request.getHeader(LoginHelper.CLIENT_KEY);
SysClient client = null; SysClientVo client = null;
if (StringUtils.isNotBlank(clientid)) { if (StringUtils.isNotBlank(clientid)) {
client = clientService.queryByClientId(clientid); client = clientService.queryByClientId(clientid);
} }

View File

@ -9,6 +9,7 @@ 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;
import org.dromara.system.domain.SysNotice; import org.dromara.system.domain.SysNotice;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SysNoticeBo; import org.dromara.system.domain.bo.SysNoticeBo;
import org.dromara.system.domain.vo.SysNoticeVo; import org.dromara.system.domain.vo.SysNoticeVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
@ -68,7 +69,7 @@ public class SysNoticeServiceImpl implements ISysNoticeService {
lqw.like(StringUtils.isNotBlank(bo.getNoticeTitle()), SysNotice::getNoticeTitle, bo.getNoticeTitle()); lqw.like(StringUtils.isNotBlank(bo.getNoticeTitle()), SysNotice::getNoticeTitle, bo.getNoticeTitle());
lqw.eq(StringUtils.isNotBlank(bo.getNoticeType()), SysNotice::getNoticeType, bo.getNoticeType()); lqw.eq(StringUtils.isNotBlank(bo.getNoticeType()), SysNotice::getNoticeType, bo.getNoticeType());
if (StringUtils.isNotBlank(bo.getCreateByName())) { if (StringUtils.isNotBlank(bo.getCreateByName())) {
SysUserVo sysUser = userMapper.selectUserByUserName(bo.getCreateByName()); SysUserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, bo.getCreateByName()));
lqw.eq(SysNotice::getCreateBy, ObjectUtil.isNotNull(sysUser) ? sysUser.getUserId() : null); lqw.eq(SysNotice::getCreateBy, ObjectUtil.isNotNull(sysUser) ? sysUser.getUserId() : null);
} }
lqw.orderByAsc(SysNotice::getNoticeId); lqw.orderByAsc(SysNotice::getNoticeId);

View File

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
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;
@ -92,7 +93,8 @@ public class SysPostServiceImpl implements ISysPostService {
*/ */
@Override @Override
public List<Long> selectPostListByUserId(Long userId) { public List<Long> selectPostListByUserId(Long userId) {
return baseMapper.selectPostListByUserId(userId); List<SysPostVo> list = baseMapper.selectPostsByUserId(userId);
return StreamUtils.toList(list, SysPostVo::getPostId);
} }
/** /**

View File

@ -92,6 +92,17 @@ public class SysRoleServiceImpl implements ISysRoleService {
*/ */
@Override @Override
public List<SysRoleVo> selectRolesByUserId(Long userId) { public List<SysRoleVo> selectRolesByUserId(Long userId) {
return baseMapper.selectRolesByUserId(userId);
}
/**
* 根据用户ID查询角色列表(包含被授权状态)
*
* @param userId 用户ID
* @return 角色列表
*/
@Override
public List<SysRoleVo> selectRolesAuthByUserId(Long userId) {
List<SysRoleVo> userRoles = baseMapper.selectRolePermissionByUserId(userId); List<SysRoleVo> userRoles = baseMapper.selectRolePermissionByUserId(userId);
List<SysRoleVo> roles = selectRoleAll(); List<SysRoleVo> roles = selectRoleAll();
for (SysRoleVo role : roles) { for (SysRoleVo role : roles) {
@ -141,7 +152,8 @@ public class SysRoleServiceImpl implements ISysRoleService {
*/ */
@Override @Override
public List<Long> selectRoleListByUserId(Long userId) { public List<Long> selectRoleListByUserId(Long userId) {
return baseMapper.selectRoleListByUserId(userId); List<SysRoleVo> list = baseMapper.selectRolesByUserId(userId);
return StreamUtils.toList(list, SysRoleVo::getRoleId);
} }
/** /**

View File

@ -141,7 +141,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
*/ */
@Override @Override
public SysUserVo selectUserByUserName(String userName) { public SysUserVo selectUserByUserName(String userName) {
return baseMapper.selectUserByUserName(userName); return baseMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, userName));
} }
/** /**
@ -152,7 +152,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
*/ */
@Override @Override
public SysUserVo selectUserByPhonenumber(String phonenumber) { public SysUserVo selectUserByPhonenumber(String phonenumber) {
return baseMapper.selectUserByPhonenumber(phonenumber); return baseMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getPhonenumber, phonenumber));
} }
/** /**
@ -163,18 +163,18 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
*/ */
@Override @Override
public SysUserVo selectUserById(Long userId) { public SysUserVo selectUserById(Long userId) {
return baseMapper.selectUserById(userId); return baseMapper.selectVoById(userId);
} }
/** /**
* 查询用户所属角色组 * 查询用户所属角色组
* *
* @param userName 用户名 * @param userId 用户ID
* @return 结果 * @return 结果
*/ */
@Override @Override
public String selectUserRoleGroup(String userName) { public String selectUserRoleGroup(Long userId) {
List<SysRoleVo> list = roleMapper.selectRolesByUserName(userName); List<SysRoleVo> list = roleMapper.selectRolesByUserId(userId);
if (CollUtil.isEmpty(list)) { if (CollUtil.isEmpty(list)) {
return StringUtils.EMPTY; return StringUtils.EMPTY;
} }
@ -184,12 +184,12 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
/** /**
* 查询用户所属岗位组 * 查询用户所属岗位组
* *
* @param userName 用户名 * @param userId 用户ID
* @return 结果 * @return 结果
*/ */
@Override @Override
public String selectUserPostGroup(String userName) { public String selectUserPostGroup(Long userId) {
List<SysPostVo> list = postMapper.selectPostsByUserName(userName); List<SysPostVo> list = postMapper.selectPostsByUserId(userId);
if (CollUtil.isEmpty(list)) { if (CollUtil.isEmpty(list)) {
return StringUtils.EMPTY; return StringUtils.EMPTY;
} }
@ -261,7 +261,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
if (LoginHelper.isSuperAdmin()) { if (LoginHelper.isSuperAdmin()) {
return; return;
} }
if (ObjectUtil.isNull(baseMapper.selectUserById(userId))) { if (baseMapper.countUserById(userId) == 0) {
throw new ServiceException("没有权限访问用户数据!"); throw new ServiceException("没有权限访问用户数据!");
} }
} }

View File

@ -11,8 +11,8 @@
select * from sys_dept ${ew.getCustomSqlSegment} select * from sys_dept ${ew.getCustomSqlSegment}
</select> </select>
<select id="selectDeptById" resultMap="SysDeptResult"> <select id="countDeptById" resultType="Long">
select * from sys_dept where del_flag = '0' and dept_id = #{deptId} select count(*) from sys_dept where del_flag = '0' and dept_id = #{deptId}
</select> </select>
<select id="selectDeptListByRoleId" resultType="Long"> <select id="selectDeptListByRoleId" resultType="Long">

View File

@ -7,20 +7,12 @@
<resultMap type="org.dromara.system.domain.vo.SysPostVo" id="SysPostResult"> <resultMap type="org.dromara.system.domain.vo.SysPostVo" id="SysPostResult">
</resultMap> </resultMap>
<select id="selectPostListByUserId" parameterType="Long" resultType="Long"> <select id="selectPostsByUserId" parameterType="Long" resultMap="SysPostResult">
select p.post_id select p.post_id, p.post_name, p.post_code
from sys_post p from sys_post p
left join sys_user_post up on up.post_id = p.post_id left join sys_user_post up on up.post_id = p.post_id
left join sys_user u on u.user_id = up.user_id left join sys_user u on u.user_id = up.user_id
where u.user_id = #{userId} where u.user_id = #{userId}
</select> </select>
<select id="selectPostsByUserName" parameterType="String" resultMap="SysPostResult">
select p.post_id, p.post_name, p.post_code
from sys_post p
left join sys_user_post up on up.post_id = p.post_id
left join sys_user u on u.user_id = up.user_id
where u.user_name = #{userName}
</select>
</mapper> </mapper>

View File

@ -40,23 +40,17 @@
WHERE r.del_flag = '0' and sur.user_id = #{userId} WHERE r.del_flag = '0' and sur.user_id = #{userId}
</select> </select>
<select id="selectRoleListByUserId" parameterType="Long" resultType="Long"> <select id="selectRolesByUserId" parameterType="Long" resultMap="SysRoleResult">
select r.role_id
from sys_role r
left join sys_user_role sur on sur.role_id = r.role_id
left join sys_user u on u.user_id = sur.user_id
where u.user_id = #{userId}
</select>
<select id="selectRolesByUserName" parameterType="String" resultMap="SysRoleResult">
select r.role_id, select r.role_id,
r.role_name, r.role_name,
r.role_key, r.role_key,
r.role_sort r.role_sort,
r.data_scope,
r.status
from sys_role r from sys_role r
left join sys_user_role sur on sur.role_id = r.role_id left join sys_user_role sur on sur.role_id = r.role_id
left join sys_user u on u.user_id = sur.user_id left join sys_user u on u.user_id = sur.user_id
WHERE r.del_flag = '0' and u.user_name = #{userName} WHERE r.del_flag = '0' and sur.user_id = #{userId}
</select> </select>
<select id="selectRoleById" resultMap="SysRoleResult"> <select id="selectRoleById" resultMap="SysRoleResult">

View File

@ -9,7 +9,6 @@
<id property="userId" column="user_id"/> <id property="userId" column="user_id"/>
<result property="deptId" column="dept_id"/> <result property="deptId" column="dept_id"/>
<association property="dept" column="dept_id" resultMap="deptResult"/> <association property="dept" column="dept_id" resultMap="deptResult"/>
<collection property="roles" javaType="java.util.List" resultMap="RoleResult"/>
</resultMap> </resultMap>
<resultMap id="deptResult" type="org.dromara.system.domain.vo.SysDeptVo"> <resultMap id="deptResult" type="org.dromara.system.domain.vo.SysDeptVo">
@ -19,52 +18,6 @@
<result property="createTime" column="dept_create_time"/> <result property="createTime" column="dept_create_time"/>
</resultMap> </resultMap>
<resultMap id="RoleResult" type="org.dromara.system.domain.vo.SysRoleVo">
<id property="roleId" column="role_id"/>
<result property="status" column="role_status"/>
<result property="createTime" column="role_create_time"/>
</resultMap>
<sql id="selectUserVo">
select u.user_id,
u.tenant_id,
u.dept_id,
u.user_name,
u.nick_name,
u.user_type,
u.email,
u.avatar,
u.phonenumber,
u.password,
u.sex,
u.status,
u.del_flag,
u.login_ip,
u.login_date,
u.create_by,
u.create_time,
u.remark,
d.dept_id,
d.parent_id,
d.ancestors,
d.dept_name,
d.order_num,
d.leader,
d.status as dept_status,
d.email as dept_email,
d.create_time as dept_cteate_time,
r.role_id,
r.role_name,
r.role_key,
r.role_sort,
r.data_scope,
r.status as role_status
from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
left join sys_user_role sur on u.user_id = sur.user_id
left join sys_role r on r.role_id = sur.role_id
</sql>
<select id="selectPageUserList" resultMap="SysUserResult"> <select id="selectPageUserList" resultMap="SysUserResult">
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
@ -103,24 +56,8 @@
${ew.getCustomSqlSegment} ${ew.getCustomSqlSegment}
</select> </select>
<select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult"> <select id="countUserById" resultType="Long">
<include refid="selectUserVo"/> select count(*) from sys_user where del_flag = '0' and user_id = #{userId}
where u.del_flag = '0' and u.user_name = #{userName}
</select>
<select id="selectUserByPhonenumber" parameterType="String" resultMap="SysUserResult">
<include refid="selectUserVo"/>
where u.del_flag = '0' and u.phonenumber = #{phonenumber}
</select>
<select id="selectUserByEmail" parameterType="String" resultMap="SysUserResult">
<include refid="selectUserVo"/>
where u.del_flag = '0' and u.email = #{email}
</select>
<select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
<include refid="selectUserVo"/>
where u.del_flag = '0' and u.user_id = #{userId}
</select> </select>

View File

@ -249,33 +249,33 @@ GO
INSERT sys_user VALUES (4, N'000000', 102, N'test1', N'仅本人 密码666666', N'sys_user', N'', N'', N'0', NULL, N'$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', N'0', N'0', N'127.0.0.1', getdate(), 103, 1, getdate(), 4, getdate(), NULL); INSERT sys_user VALUES (4, N'000000', 102, N'test1', N'仅本人 密码666666', N'sys_user', N'', N'', N'0', NULL, N'$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', N'0', N'0', N'127.0.0.1', getdate(), 103, 1, getdate(), 4, getdate(), NULL);
GO GO
INSERT sys_menu VALUES (5, N'测试菜单', 0, 5, N'demo', NULL, 1, 0, N'M', N'0', N'0', NULL, N'star', 103, 1, getdate(), NULL, NULL, N''); INSERT sys_menu VALUES (5, N'测试菜单', 0, 5, N'demo', NULL, N'', 1, 0, N'M', N'0', N'0', NULL, N'star', 103, 1, getdate(), NULL, NULL, N'');
GO GO
INSERT sys_menu VALUES (1500, N'测试单表', 5, 1, N'demo', N'demo/demo/index', 1, 0, N'C', N'0', N'0', N'demo:demo:list', N'#', 103, 1, getdate(), NULL, NULL, N'测试单表菜单'); INSERT sys_menu VALUES (1500, N'测试单表', 5, 1, N'demo', N'demo/demo/index', N'', 1, 0, N'C', N'0', N'0', N'demo:demo:list', N'#', 103, 1, getdate(), NULL, NULL, N'测试单表菜单');
GO GO
INSERT sys_menu VALUES (1501, N'测试单表查询', 1500, 1, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:query', N'#', 103, 1, getdate(), NULL, NULL, N''); INSERT sys_menu VALUES (1501, N'测试单表查询', 1500, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:query', N'#', 103, 1, getdate(), NULL, NULL, N'');
GO GO
INSERT sys_menu VALUES (1502, N'测试单表新增', 1500, 2, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:add', N'#', 103, 1, getdate(), NULL, NULL, N''); INSERT sys_menu VALUES (1502, N'测试单表新增', 1500, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:add', N'#', 103, 1, getdate(), NULL, NULL, N'');
GO GO
INSERT sys_menu VALUES (1503, N'测试单表修改', 1500, 3, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:edit', N'#', 103, 1, getdate(), NULL, NULL, N''); INSERT sys_menu VALUES (1503, N'测试单表修改', 1500, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:edit', N'#', 103, 1, getdate(), NULL, NULL, N'');
GO GO
INSERT sys_menu VALUES (1504, N'测试单表删除', 1500, 4, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:remove', N'#', 103, 1, getdate(), NULL, NULL, N''); INSERT sys_menu VALUES (1504, N'测试单表删除', 1500, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:remove', N'#', 103, 1, getdate(), NULL, NULL, N'');
GO GO
INSERT sys_menu VALUES (1505, N'测试单表导出', 1500, 5, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:export', N'#', 103, 1, getdate(), NULL, NULL, N''); INSERT sys_menu VALUES (1505, N'测试单表导出', 1500, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:demo:export', N'#', 103, 1, getdate(), NULL, NULL, N'');
GO GO
INSERT sys_menu VALUES (1506, N'测试树表', 5, 1, N'tree', N'demo/tree/index', 1, 0, N'C', N'0', N'0', N'demo:tree:list', N'#', 103, 1, getdate(), NULL, NULL, N'测试树表菜单'); INSERT sys_menu VALUES (1506, N'测试树表', 5, 1, N'tree', N'demo/tree/index', N'', 1, 0, N'C', N'0', N'0', N'demo:tree:list', N'#', 103, 1, getdate(), NULL, NULL, N'测试树表菜单');
GO GO
INSERT sys_menu VALUES (1507, N'测试树表查询', 1506, 1, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:query', N'#', 103, 1, getdate(), NULL, NULL, N''); INSERT sys_menu VALUES (1507, N'测试树表查询', 1506, 1, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:query', N'#', 103, 1, getdate(), NULL, NULL, N'');
GO GO
INSERT sys_menu VALUES (1508, N'测试树表新增', 1506, 2, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:add', N'#', 103, 1, getdate(), NULL, NULL, N''); INSERT sys_menu VALUES (1508, N'测试树表新增', 1506, 2, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:add', N'#', 103, 1, getdate(), NULL, NULL, N'');
GO GO
INSERT sys_menu VALUES (1509, N'测试树表修改', 1506, 3, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:edit', N'#', 103, 1, getdate(), NULL, NULL, N''); INSERT sys_menu VALUES (1509, N'测试树表修改', 1506, 3, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:edit', N'#', 103, 1, getdate(), NULL, NULL, N'');
GO GO
INSERT sys_menu VALUES (1510, N'测试树表删除', 1506, 4, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:remove', N'#', 103, 1, getdate(), NULL, NULL, N''); INSERT sys_menu VALUES (1510, N'测试树表删除', 1506, 4, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:remove', N'#', 103, 1, getdate(), NULL, NULL, N'');
GO GO
INSERT sys_menu VALUES (1511, N'测试树表导出', 1506, 5, N'#', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:export', N'#', 103, 1, getdate(), NULL, NULL, N''); INSERT sys_menu VALUES (1511, N'测试树表导出', 1506, 5, N'#', N'', N'', 1, 0, N'F', N'0', N'0', N'demo:tree:export', N'#', 103, 1, getdate(), NULL, NULL, N'');
GO GO
INSERT sys_role VALUES (3, N'000000', N'本部门及以下', N'test1', 3, N'4', 1, 1, N'0', N'0', 103, 1, getdate(), 1, NULL, NULL); INSERT sys_role VALUES (3, N'000000', N'本部门及以下', N'test1', 3, N'4', 1, 1, N'0', N'0', 103, 1, getdate(), 1, NULL, NULL);