RedisCache.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. package com.xy.redis;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
  4. import com.xy.collections.list.JArrayList;
  5. import com.xy.collections.list.JList;
  6. import com.xy.collections.map.JMap;
  7. import com.xy.consts.CommConsts;
  8. import com.xy.entity.*;
  9. import com.xy.mapper.SysDeptMapper;
  10. import com.xy.mapper.SysMenuMapper;
  11. import com.xy.mapper.SysRoleMapper;
  12. import com.xy.mapper.SysSystemMapper;
  13. import com.xy.utils.*;
  14. import icu.mhb.mybatisplus.plugln.core.JoinLambdaWrapper;
  15. import org.springframework.stereotype.Component;
  16. import org.springframework.web.context.request.RequestContextHolder;
  17. import org.springframework.web.context.request.ServletRequestAttributes;
  18. import javax.servlet.http.HttpServletRequest;
  19. import java.util.ArrayList;
  20. import java.util.List;
  21. /**
  22. * 权限系统redis工具类
  23. */
  24. @Component
  25. public class RedisCache extends AuthorizeUtils {
  26. /**
  27. * 缓存业务系统权限到redis
  28. *
  29. * @param loginId 登录id
  30. */
  31. public static void workCache(Long loginId) {
  32. SysSystemMapper sysSystemMapper = SpringBeanUtils.getBean(SysSystemMapper.class);
  33. SysRoleMapper sysRoleMapper = SpringBeanUtils.getBean(SysRoleMapper.class);
  34. SysDeptMapper sysDeptMapper = SpringBeanUtils.getBean(SysDeptMapper.class);
  35. SysMenuMapper sysMenuMapper = SpringBeanUtils.getBean(SysMenuMapper.class);
  36. RedisService<List<AuthorizeUtils.CacheEntity>> roleMenuRedisService = getRedisService();
  37. //获取登录人所有系统
  38. JoinLambdaWrapper<SysSystem> sysSystemsJoinLambdaWrapper = new JoinLambdaWrapper<>(SysSystem.class)
  39. .eq(SysSystem::getStatus, true)
  40. .innerJoin(SysUserRole.class, SysUserRole::getSysId, SysSystem::getId)
  41. .eq(SysUserRole::getWorkUserId, loginId)
  42. .end();
  43. List<SysSystem> sysSystems = sysSystemMapper.joinSelectList(sysSystemsJoinLambdaWrapper, SysSystem.class);
  44. if (!Emptys.check(sysSystems)) {
  45. return;
  46. }
  47. //获取登录人所有角色
  48. JoinLambdaWrapper<SysRole> sysRoleJoinLambdaWrapper = new JoinLambdaWrapper<>(SysRole.class)
  49. .eq(SysRole::getStatus, true)
  50. .innerJoin(SysUserRole.class, SysUserRole::getRoleId, SysRole::getId)
  51. .eq(SysUserRole::getWorkUserId, loginId)
  52. .end();
  53. List<SysRole> sysRoles = sysRoleMapper.joinSelectList(sysRoleJoinLambdaWrapper, SysRole.class);
  54. JList<Long> sysRoleIds = new JArrayList<>(sysRoles).getProperty(SysRole::getId);
  55. if (sysRoleIds.size() == 0) {
  56. return;
  57. }
  58. //获取登录人所有部门
  59. JoinLambdaWrapper<SysDept> sysDeptJoinLambdaWrapper = new JoinLambdaWrapper<>(SysDept.class)
  60. .eq(SysDept::getStatus, true)
  61. .innerJoin(SysUserDept.class, SysUserDept::getDeptId, SysDept::getId)
  62. .eq(SysUserDept::getWorkUserId, loginId)
  63. .end();
  64. List<SysDept> sysDepts = sysDeptMapper.joinSelectList(sysDeptJoinLambdaWrapper, SysDept.class);
  65. JList<Long> sysDeptsIds = new JArrayList<>(sysDepts).getProperty(SysDept::getId);
  66. //获取登录人所有部门角色
  67. if (sysDeptsIds.size() > 0) {
  68. sysRoleJoinLambdaWrapper = new JoinLambdaWrapper<>(SysRole.class)
  69. .eq(SysRole::getStatus, true)
  70. .innerJoin(SysDeptRole.class, SysDeptRole::getRoleId, SysRole::getId)
  71. .in(SysDeptRole::getDeptId, sysDeptsIds)
  72. .end();
  73. List<SysRole> sysRoles2 = sysRoleMapper.joinSelectList(sysRoleJoinLambdaWrapper, SysRole.class);
  74. JList<Long> sysRoleIds2 = new JArrayList<>(sysRoles2).getProperty(SysRole::getId);
  75. if (sysRoleIds2.size() > 0) {
  76. sysRoleIds.setAll(sysRoleIds2)
  77. .comparing();
  78. sysRoles = new JArrayList<>(sysRoles2).setAll(sysRoles);
  79. }
  80. }
  81. //获取登录人所有角色菜单
  82. JoinLambdaWrapper<SysMenu> sysMenuJoinLambdaWrapper = new JoinLambdaWrapper<>(SysMenu.class)
  83. .eq(SysMenu::getStatus, true)
  84. .innerJoin(SysRoleMenu.class, SysRoleMenu::getMenuId, SysMenu::getId)
  85. .selectAs(cb -> cb
  86. .add(SysRoleMenu::getRoleId)
  87. .add(SysRoleMenu::getSelectAdmin)
  88. )
  89. .in(SysRoleMenu::getRoleId, sysRoleIds)
  90. .end()
  91. .orderByAsc(SysMenu::getOrders);
  92. List<SysMenuJoinSysRoleMenu> sysMenus = sysMenuMapper.joinSelectList(sysMenuJoinLambdaWrapper, SysMenuJoinSysRoleMenu.class);
  93. JMap<Long, List<SysMenuJoinSysRoleMenu>> sysMenuMaps = new JArrayList<>(sysMenus).toMap(SysMenuJoinSysRoleMenu::getRoleId).group();
  94. //删除redis
  95. roleMenuRedisService.removeMap(getKey(loginId));
  96. //循环系统集合
  97. for (SysSystem sysSystem : sysSystems) {
  98. List<AuthorizeUtils.CacheEntity> cacheEntitys = new ArrayList<>();
  99. //系统下角色集合
  100. JList<SysRole> list = new JArrayList<>(sysRoles).filter().eq(SysRole::getSysId, sysSystem.getId()).list();
  101. //循环角色集合
  102. list.forEach(sysRole -> {
  103. //获取角色菜单
  104. List<SysMenuJoinSysRoleMenu> sysMenuJoinSysRoleMenus = sysMenuMaps.get(sysRole.getId());
  105. //封装redis对象
  106. AuthorizeUtils.CacheEntity cacheEntity = new AuthorizeUtils.CacheEntity()
  107. .setRoleId(sysRole.getId())
  108. .setRoleCode(sysRole.getCode())
  109. .setList(sysMenuJoinSysRoleMenus);
  110. cacheEntitys.add(cacheEntity);
  111. });
  112. roleMenuRedisService.setMap(getKey(loginId), sysSystem.getId().toString(), cacheEntitys);
  113. }
  114. }
  115. /**
  116. * 获取当前系统ID
  117. *
  118. * @return
  119. */
  120. public static Long getSystemId() {
  121. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  122. String sysId = request.getHeader(CommConsts.SYS_ID);
  123. return Long.valueOf(sysId);
  124. }
  125. /**
  126. * 获取当前接口uri
  127. *
  128. * @return
  129. */
  130. public static String getUri() {
  131. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  132. return request.getRequestURI();
  133. }
  134. /**
  135. * 判断数据查询权限
  136. *
  137. * @param lambdaQueryWrapper 查询构造器
  138. * @param function 普通查询权限时,条件lambda引用字段
  139. * @return true=管理员数据查询权限 false=普通查询权限
  140. */
  141. public static <T> boolean getDataAuth(Long systemId, LambdaQueryWrapper<T> lambdaQueryWrapper, SFunction<T, ?> function) {
  142. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  143. boolean dataAuth = authByData(systemId, request.getRequestURI());
  144. if (!dataAuth) {
  145. lambdaQueryWrapper.eq(function, getLoginId(Long.class));
  146. return false;
  147. }
  148. return true;
  149. }
  150. /**
  151. * 判断数据查询权限
  152. */
  153. public static <T> boolean getDataAuth(Long systemId) {
  154. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  155. return authByData(systemId, request.getRequestURI());
  156. }
  157. /**
  158. * 获取菜单
  159. *
  160. * @param systemId 系统id
  161. * @return
  162. */
  163. public static List<SysMenuJoinSysRoleMenu> getMenu(Long systemId) {
  164. return getMenu(systemId, getClientType(getToken()));
  165. }
  166. /**
  167. * 获取菜单
  168. *
  169. * @param systemId 系统id
  170. * @param clientType 菜单类型
  171. * @return
  172. */
  173. public static List<SysMenuJoinSysRoleMenu> getMenu(Long systemId, String clientType) {
  174. String token = getToken();
  175. JList<SysMenuJoinSysRoleMenu> sysMenuJoinSysRoleMenus = new JArrayList<>();
  176. //获取redis缓存
  177. List<AuthorizeUtils.CacheEntity> cacheEntities = getRedisService().getMap(getKey(getLoginId(token, Long.class)), systemId.toString());
  178. if (!Emptys.check(cacheEntities)) {
  179. return sysMenuJoinSysRoleMenus;
  180. }
  181. //角色菜单累加
  182. cacheEntities.forEach(cacheEntity -> {
  183. List<SysMenuJoinSysRoleMenu> sysMenuJoinSysRoleMenuss = cacheEntity.getList();
  184. if (Emptys.check(cacheEntity.getList())) {
  185. JList<SysMenuJoinSysRoleMenu> list = new JArrayList<>(sysMenuJoinSysRoleMenuss).filter()
  186. .eq(SysMenuJoinSysRoleMenu::getClientType, clientType)
  187. .list();
  188. if (Emptys.check(list)) {
  189. sysMenuJoinSysRoleMenus.addAll(list);
  190. }
  191. }
  192. });
  193. //去重
  194. return sysMenuJoinSysRoleMenus
  195. .comparing(SysMenuJoinSysRoleMenu::getId)
  196. .asc(SysMenuJoinSysRoleMenu::getOrders);
  197. }
  198. /**
  199. * 获取菜单树
  200. *
  201. * @param systemId 系统id
  202. * @return
  203. */
  204. public static List<SysMenuJoinSysRoleMenu> getMenuTree(Long systemId) {
  205. return getMenuTree(systemId, getClientType(getToken()));
  206. }
  207. /**
  208. * 获取菜单树
  209. *
  210. * @param systemId 系统id
  211. * @param clientType 菜单类型
  212. * @return
  213. */
  214. public static List<SysMenuJoinSysRoleMenu> getMenuTree(Long systemId, String clientType) {
  215. //获取菜单
  216. List<SysMenuJoinSysRoleMenu> menu = getMenu(systemId, clientType);
  217. JList<SysMenuJoinSysRoleMenu> sysMenuJoinSysRoleMenus = new JArrayList<>(menu);
  218. //生成树
  219. JList<SysMenuJoinSysRoleMenu> tops = sysMenuJoinSysRoleMenus.filter().isNull(SysMenuJoinSysRoleMenu::getPaterId).list();
  220. tops.forEach(top -> {
  221. List<SysMenuJoinSysRoleMenu> tree = Beans.tree(top, sysMenuJoinSysRoleMenus, SysMenuJoinSysRoleMenu::getId, SysMenuJoinSysRoleMenu::getPaterId, SysMenuJoinSysRoleMenu::getSonSysMenu);
  222. top.setSonSysMenu(tree);
  223. });
  224. return tops;
  225. }
  226. }