package com.zsElectric.boot.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zsElectric.boot.common.constant.RedisConstants; import com.zsElectric.boot.system.mapper.RoleMenuMapper; import com.zsElectric.boot.system.model.bo.RolePermsBO; import com.zsElectric.boot.system.model.entity.RoleMenu; import com.zsElectric.boot.system.service.RoleMenuService; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.List; import java.util.Set; /** * 角色菜单服务实现类 * * @author Ray.Hao * @since 2.5.0 */ @Service @RequiredArgsConstructor @Slf4j public class RoleMenuServiceImpl extends ServiceImpl implements RoleMenuService { private final RedisTemplate redisTemplate; /** * 初始化权限缓存 */ @PostConstruct public void initRolePermsCache() { log.info("========== 初始化权限缓存开始 =========="); refreshRolePermsCache(); log.info("========== 初始化权限缓存完成 =========="); } /** * 刷新权限缓存 */ @Override public void refreshRolePermsCache() { // 清理权限缓存(删除整个 hash key) redisTemplate.delete(RedisConstants.System.ROLE_PERMS); log.info("已清理Redis权限缓存, key: {}", RedisConstants.System.ROLE_PERMS); List list = this.baseMapper.getRolePermsList(null); log.info("从数据库查询到的角色权限数据: {} 条", list != null ? list.size() : 0); if (CollectionUtil.isNotEmpty(list)) { list.forEach(item -> { String roleCode = item.getRoleCode(); Set perms = item.getPerms(); log.info("角色[{}]的权限列表: {}", roleCode, perms); if (CollectionUtil.isNotEmpty(perms)) { redisTemplate.opsForHash().put(RedisConstants.System.ROLE_PERMS, roleCode, perms); log.info("已缓存角色[{}]的权限到Redis, 权限数量: {}", roleCode, perms.size()); } }); } else { log.warn("数据库中未查询到任何角色权限数据!请检查 sys_role、sys_menu、sys_role_menu 表数据"); } } /** * 刷新权限缓存 */ @Override public void refreshRolePermsCache(String roleCode) { // 清理权限缓存 redisTemplate.opsForHash().delete(RedisConstants.System.ROLE_PERMS, roleCode); List list = this.baseMapper.getRolePermsList(roleCode); if (CollectionUtil.isNotEmpty(list)) { RolePermsBO rolePerms = list.get(0); if (rolePerms == null) { return; } Set perms = rolePerms.getPerms(); if (CollectionUtil.isNotEmpty(perms)) { redisTemplate.opsForHash().put(RedisConstants.System.ROLE_PERMS, roleCode, perms); } } } /** * 刷新权限缓存 (角色编码变更时调用) */ @Override public void refreshRolePermsCache(String oldRoleCode, String newRoleCode) { // 清理旧角色权限缓存 redisTemplate.opsForHash().delete(RedisConstants.System.ROLE_PERMS, oldRoleCode); // 添加新角色权限缓存 List list = this.baseMapper.getRolePermsList(newRoleCode); if (CollectionUtil.isNotEmpty(list)) { RolePermsBO rolePerms = list.get(0); if (rolePerms == null) { return; } Set perms = rolePerms.getPerms(); redisTemplate.opsForHash().put(RedisConstants.System.ROLE_PERMS, newRoleCode, perms); } } /** * 获取角色权限集合 * * @param roles 角色编码集合 * @return 权限集合 */ @Override public Set getRolePermsByRoleCodes(Set roles) { return this.baseMapper.listRolePerms(roles); } /** * 获取角色拥有的菜单ID集合 * * @param roleId 角色ID * @return 菜单ID集合 */ @Override public List listMenuIdsByRoleId(Long roleId) { return this.baseMapper.listMenuIdsByRoleId(roleId); } }