package com.youlai.system.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.system.common.constant.SecurityConstants; import com.youlai.system.mapper.SysRoleMenuMapper; import com.youlai.system.model.bo.RolePermsBO; import com.youlai.system.model.entity.SysRoleMenu; import com.youlai.system.service.SysRoleMenuService; 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 * @since 2.5.0 */ @Service @RequiredArgsConstructor @Slf4j public class SysRoleMenuServiceImpl extends ServiceImpl implements SysRoleMenuService { private final RedisTemplate redisTemplate; /** * 初始化权限缓存 */ @PostConstruct public void initRolePermsCache() { log.info("初始化权限缓存... "); refreshRolePermsCache(); } /** * 刷新权限缓存 */ @Override public void refreshRolePermsCache() { // 清理权限缓存 redisTemplate.opsForHash().delete(SecurityConstants.ROLE_PERMS_PREFIX, "*"); List list = this.baseMapper.getRolePermsList(null); if (CollectionUtil.isNotEmpty(list)) { list.forEach(item -> { String roleCode = item.getRoleCode(); Set perms = item.getPerms(); if (CollectionUtil.isNotEmpty(perms)) { redisTemplate.opsForHash().put(SecurityConstants.ROLE_PERMS_PREFIX, roleCode, perms); } }); } } /** * 刷新权限缓存 */ @Override public void refreshRolePermsCache(String roleCode) { // 清理权限缓存 redisTemplate.opsForHash().delete(SecurityConstants.ROLE_PERMS_PREFIX, 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(SecurityConstants.ROLE_PERMS_PREFIX, roleCode, perms); } } } /** * 刷新权限缓存 (角色编码变更时调用) */ @Override public void refreshRolePermsCache(String oldRoleCode, String newRoleCode) { // 清理旧角色权限缓存 redisTemplate.opsForHash().delete(SecurityConstants.ROLE_PERMS_PREFIX, 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(SecurityConstants.ROLE_PERMS_PREFIX, 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); } }