Pre Merge pull request !161 from zhf/fix_role_cache

This commit is contained in:
zhf 2022-03-22 01:35:29 +00:00 committed by Gitee
commit b4f88c983f
7 changed files with 69 additions and 11 deletions

View File

@ -1,22 +1,25 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ObjectUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.mapper.SysUserRoleMapper;
import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.SysLoginService;
import com.ruoyi.system.service.SysPermissionService; import com.ruoyi.system.service.SysPermissionService;
import io.swagger.annotations.*; import io.swagger.annotations.*;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -25,6 +28,7 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* 角色信息 * 角色信息
@ -41,6 +45,8 @@ public class SysRoleController extends BaseController {
private final ISysRoleService roleService; private final ISysRoleService roleService;
private final ISysUserService userService; private final ISysUserService userService;
private final SysPermissionService permissionService; private final SysPermissionService permissionService;
private final SysUserRoleMapper sysUserRoleMapper;
private final SysLoginService loginService;
@ApiOperation("查询角色信息列表") @ApiOperation("查询角色信息列表")
@SaCheckPermission("system:role:list") @SaCheckPermission("system:role:list")
@ -104,12 +110,19 @@ public class SysRoleController extends BaseController {
if (roleService.updateRole(role) > 0) { if (roleService.updateRole(role) > 0) {
// 更新缓存用户权限 // 更新缓存用户权限
LoginUser loginUser = getLoginUser(); List<Long> userIdList = sysUserRoleMapper.selectList(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getRoleId, role.getRoleId()))
SysUser sysUser = userService.selectUserById(loginUser.getUserId()); .stream().map(SysUserRole::getUserId).collect(Collectors.toList());
if (ObjectUtil.isNotNull(sysUser) && !sysUser.isAdmin()) { userService.selectUserByUserIds(userIdList).forEach(sysUser -> {
loginUser.setMenuPermission(permissionService.getMenuPermission(sysUser)); // 存储在saToken的用户key值
LoginHelper.setLoginUser(loginUser); String userId = sysUser.getUserType() + StrUtil.COLON + sysUser.getUserId();
} // 获取对应用户的token
String token = StpUtil.getTokenValueByLoginId(userId);
if (StrUtil.isBlank(token)) {
return;
}
// 更新用户缓存
LoginHelper.setLoginUserByToken(token, loginService.buildLoginUser(sysUser));
});
return R.ok(); return R.ok();
} }
return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员");

View File

@ -61,6 +61,13 @@ public class LoginHelper {
StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
} }
/**
* 根据token修改不同用户的缓存
*/
public static void setLoginUserByToken(String token, LoginUser loginUser) {
StpUtil.getTokenSessionByToken(token).set(LOGIN_USER_KEY, loginUser);
}
/** /**
* 获取用户(多级缓存) * 获取用户(多级缓存)
*/ */

View File

@ -76,4 +76,12 @@ public interface SysUserMapper extends BaseMapperPlus<SysUserMapper, SysUser, Sy
*/ */
SysUser selectUserById(Long userId); SysUser selectUserById(Long userId);
/**
* 根据用户编号查询用户
*
* @param userIdList 用户编号
* @return 用户列表
*/
List<SysUser> selectUserByUserIdList(@Param("userIdList") List<Long> userIdList);
} }

View File

@ -200,4 +200,12 @@ public interface ISysUserService {
*/ */
int deleteUserByIds(Long[] userIds); int deleteUserByIds(Long[] userIds);
/**
* 根据用户编号查询用户
*
* @param userIdList 用户编号
* @return 用户列表
*/
List<SysUser> selectUserByUserIds(List<Long> userIdList);
} }

View File

@ -139,7 +139,7 @@ public class SysLoginService {
/** /**
* 构建登录用户 * 构建登录用户
*/ */
private LoginUser buildLoginUser(SysUser user) { public LoginUser buildLoginUser(SysUser user) {
LoginUser loginUser = new LoginUser(); LoginUser loginUser = new LoginUser();
loginUser.setUserId(user.getUserId()); loginUser.setUserId(user.getUserId());
loginUser.setDeptId(user.getDeptId()); loginUser.setDeptId(user.getDeptId());

View File

@ -488,4 +488,15 @@ public class SysUserServiceImpl implements ISysUserService {
return baseMapper.deleteBatchIds(ids); return baseMapper.deleteBatchIds(ids);
} }
/**
* 根据用户编号查询用户
*
* @param userIdList 用户编号
* @return 用户列表
*/
@Override
public List<SysUser> selectUserByUserIds(List<Long> userIdList) {
return baseMapper.selectUserByUserIdList(userIdList);
}
} }

View File

@ -126,5 +126,16 @@
where u.del_flag = '0' and u.user_id = #{userId} where u.del_flag = '0' and u.user_id = #{userId}
</select> </select>
<select id="selectUserByUserIdList" parameterType="list" resultMap="SysUserResult">
<include refid="selectUserVo"/>
where u.del_flag = '0'
<if test="userIdList != null and userIdList.size > 0">
and u.user_id in
<foreach collection="userIdList" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
</select>
</mapper> </mapper>