RoleMenuServiceImpl.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package com.zsElectric.boot.system.service.impl;
  2. import cn.hutool.core.collection.CollectionUtil;
  3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4. import com.zsElectric.boot.common.constant.RedisConstants;
  5. import com.zsElectric.boot.system.mapper.RoleMenuMapper;
  6. import com.zsElectric.boot.system.model.bo.RolePermsBO;
  7. import com.zsElectric.boot.system.model.entity.RoleMenu;
  8. import com.zsElectric.boot.system.service.RoleMenuService;
  9. import jakarta.annotation.PostConstruct;
  10. import lombok.RequiredArgsConstructor;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.springframework.data.redis.core.RedisTemplate;
  13. import org.springframework.stereotype.Service;
  14. import java.util.List;
  15. import java.util.Set;
  16. /**
  17. * 角色菜单服务实现类
  18. *
  19. * @author Ray.Hao
  20. * @since 2.5.0
  21. */
  22. @Service
  23. @RequiredArgsConstructor
  24. @Slf4j
  25. public class RoleMenuServiceImpl extends ServiceImpl<RoleMenuMapper, RoleMenu> implements RoleMenuService {
  26. private final RedisTemplate<String, Object> redisTemplate;
  27. /**
  28. * 初始化权限缓存
  29. */
  30. @PostConstruct
  31. public void initRolePermsCache() {
  32. log.info("========== 初始化权限缓存开始 ==========");
  33. refreshRolePermsCache();
  34. log.info("========== 初始化权限缓存完成 ==========");
  35. }
  36. /**
  37. * 刷新权限缓存
  38. */
  39. @Override
  40. public void refreshRolePermsCache() {
  41. // 清理权限缓存(删除整个 hash key)
  42. redisTemplate.delete(RedisConstants.System.ROLE_PERMS);
  43. log.info("已清理Redis权限缓存, key: {}", RedisConstants.System.ROLE_PERMS);
  44. List<RolePermsBO> list = this.baseMapper.getRolePermsList(null);
  45. log.info("从数据库查询到的角色权限数据: {} 条", list != null ? list.size() : 0);
  46. if (CollectionUtil.isNotEmpty(list)) {
  47. list.forEach(item -> {
  48. String roleCode = item.getRoleCode();
  49. Set<String> perms = item.getPerms();
  50. log.info("角色[{}]的权限列表: {}", roleCode, perms);
  51. if (CollectionUtil.isNotEmpty(perms)) {
  52. redisTemplate.opsForHash().put(RedisConstants.System.ROLE_PERMS, roleCode, perms);
  53. log.info("已缓存角色[{}]的权限到Redis, 权限数量: {}", roleCode, perms.size());
  54. }
  55. });
  56. } else {
  57. log.warn("数据库中未查询到任何角色权限数据!请检查 sys_role、sys_menu、sys_role_menu 表数据");
  58. }
  59. }
  60. /**
  61. * 刷新权限缓存
  62. */
  63. @Override
  64. public void refreshRolePermsCache(String roleCode) {
  65. // 清理权限缓存
  66. redisTemplate.opsForHash().delete(RedisConstants.System.ROLE_PERMS, roleCode);
  67. List<RolePermsBO> list = this.baseMapper.getRolePermsList(roleCode);
  68. if (CollectionUtil.isNotEmpty(list)) {
  69. RolePermsBO rolePerms = list.get(0);
  70. if (rolePerms == null) {
  71. return;
  72. }
  73. Set<String> perms = rolePerms.getPerms();
  74. if (CollectionUtil.isNotEmpty(perms)) {
  75. redisTemplate.opsForHash().put(RedisConstants.System.ROLE_PERMS, roleCode, perms);
  76. }
  77. }
  78. }
  79. /**
  80. * 刷新权限缓存 (角色编码变更时调用)
  81. */
  82. @Override
  83. public void refreshRolePermsCache(String oldRoleCode, String newRoleCode) {
  84. // 清理旧角色权限缓存
  85. redisTemplate.opsForHash().delete(RedisConstants.System.ROLE_PERMS, oldRoleCode);
  86. // 添加新角色权限缓存
  87. List<RolePermsBO> list = this.baseMapper.getRolePermsList(newRoleCode);
  88. if (CollectionUtil.isNotEmpty(list)) {
  89. RolePermsBO rolePerms = list.get(0);
  90. if (rolePerms == null) {
  91. return;
  92. }
  93. Set<String> perms = rolePerms.getPerms();
  94. redisTemplate.opsForHash().put(RedisConstants.System.ROLE_PERMS, newRoleCode, perms);
  95. }
  96. }
  97. /**
  98. * 获取角色权限集合
  99. *
  100. * @param roles 角色编码集合
  101. * @return 权限集合
  102. */
  103. @Override
  104. public Set<String> getRolePermsByRoleCodes(Set<String> roles) {
  105. return this.baseMapper.listRolePerms(roles);
  106. }
  107. /**
  108. * 获取角色拥有的菜单ID集合
  109. *
  110. * @param roleId 角色ID
  111. * @return 菜单ID集合
  112. */
  113. @Override
  114. public List<Long> listMenuIdsByRoleId(Long roleId) {
  115. return this.baseMapper.listMenuIdsByRoleId(roleId);
  116. }
  117. }