package com.tievd.cube.modules.system.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.tievd.cube.commons.constant.CacheConst; import com.tievd.cube.commons.constant.CommonConst; import com.tievd.cube.commons.exception.CubeAppException; import com.tievd.cube.modules.system.entity.SysPermission; import com.tievd.cube.modules.system.entity.SysPermissionDataRule; import com.tievd.cube.modules.system.mapper.SysDepartPermissionMapper; import com.tievd.cube.modules.system.mapper.SysDepartRolePermissionMapper; import com.tievd.cube.modules.system.mapper.SysPermissionMapper; import com.tievd.cube.modules.system.mapper.SysRolePermissionMapper; import com.tievd.cube.modules.system.model.TreeModel; import com.tievd.cube.modules.system.service.ISysPermissionDataRuleService; import com.tievd.cube.modules.system.service.ISysPermissionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @Service public class SysPermissionServiceImpl extends ServiceImpl implements ISysPermissionService { @Autowired private ISysPermissionDataRuleService permissionDataRuleService; @Autowired private SysRolePermissionMapper sysRolePermissionMapper; @Autowired private SysDepartPermissionMapper sysDepartPermissionMapper; @Autowired private SysDepartRolePermissionMapper sysDepartRolePermissionMapper; @Override public List queryListByParentId(String parentId) { return baseMapper.queryListByParentId(parentId); } /** * 真实删除 */ @Override @Transactional @CacheEvict(value = CacheConst.SYS_DATA_PERMISSIONS_CACHE, allEntries = true) public void deletePermission(String id) throws CubeAppException { SysPermission sysPermission = this.getById(id); if (sysPermission == null) { throw new CubeAppException("未找到菜单信息"); } String pid = sysPermission.getParentId(); if (StrUtil.isNotEmpty(pid)) { long count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, pid)); if (count == 1) { //若父节点无其他子节点,则该父节点是叶子节点 baseMapper.setMenuLeaf(pid, 1); } } baseMapper.deleteById(id); // 该节点可能是子节点但也可能是其它节点的父节点,所以需要级联删除 this.removeChildrenBy(sysPermission.getId()); //关联删除 Map map = new HashMap<>(); map.put("permission_id", id); //删除数据规则 this.deletePermRuleByPermId(id); //删除角色授权表 sysRolePermissionMapper.deleteByMap(map); //删除部门权限表 sysDepartPermissionMapper.deleteByMap(map); //删除部门角色授权 sysDepartRolePermissionMapper.deleteByMap(map); } /** * 根据父id删除其关联的子节点数据 */ public void removeChildrenBy(String parentId) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); // 封装查询条件parentId为主键, query.eq(SysPermission::getParentId, parentId); // 查出该主键下的所有子级 List permissionList = this.list(query); if (permissionList != null && permissionList.size() > 0) { String id; // id long num; // 查出的子级数量 // 如果查出的集合不为空, 则先删除所有 this.remove(query); // 再遍历刚才查出的集合, 根据每个对象,查找其是否仍有子级 for (SysPermission sysPermission : permissionList) { id = sysPermission.getId(); Map map = new HashMap<>(); map.put("permission_id", id); //删除数据规则 this.deletePermRuleByPermId(id); //删除角色授权表 sysRolePermissionMapper.deleteByMap(map); //删除部门权限表 sysDepartPermissionMapper.deleteByMap(map); //删除部门角色授权 sysDepartRolePermissionMapper.deleteByMap(map); num = this.count(new LambdaQueryWrapper().eq(SysPermission::getParentId, id)); // 如果有, 则递归 if (num > 0) { this.removeChildrenBy(id); } } } } /** * 逻辑删除 */ @Override @CacheEvict(value = CacheConst.SYS_DATA_PERMISSIONS_CACHE, allEntries = true) public void deletePermissionLogical(String id) throws CubeAppException { SysPermission sysPermission = this.getById(id); if (sysPermission == null) { throw new CubeAppException("未找到菜单信息"); } String pid = sysPermission.getParentId(); long count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, pid)); if (count == 1) { //若父节点无其他子节点,则该父节点是叶子节点 baseMapper.setMenuLeaf(pid, 1); } sysPermission.setDelFlag(1); this.updateById(sysPermission); } @Override @CacheEvict(value = CacheConst.SYS_DATA_PERMISSIONS_CACHE, allEntries = true) public void addPermission(SysPermission sysPermission) throws CubeAppException { //---------------------------------------------------------------------- //判断是否是一级菜单,是的话清空父菜单 if (CommonConst.MENU_TYPE_0.equals(sysPermission.getMenuType())) { sysPermission.setParentId(null); } //---------------------------------------------------------------------- String pid = sysPermission.getParentId(); if (StrUtil.isNotEmpty(pid)) { //设置父节点不为叶子节点 baseMapper.setMenuLeaf(pid, 0); } sysPermission.setCreateTime(new Date()); sysPermission.setDelFlag(0); sysPermission.setLeaf(true); this.save(sysPermission); } @Override @CacheEvict(value = CacheConst.SYS_DATA_PERMISSIONS_CACHE, allEntries = true) public void editPermission(SysPermission sysPermission) throws CubeAppException { SysPermission p = this.getById(sysPermission.getId()); //TODO 该节点判断是否还有子节点 if (p == null) { throw new CubeAppException("未找到菜单信息"); } else { sysPermission.setUpdateTime(new Date()); //---------------------------------------------------------------------- //Step1.判断是否是一级菜单,是的话清空父菜单ID if (CommonConst.MENU_TYPE_0.equals(sysPermission.getMenuType())) { sysPermission.setParentId(""); } //Step2.判断菜单下级是否有菜单,无则设置为叶子节点 long count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, sysPermission.getId())); if (count == 0) { sysPermission.setLeaf(true); } //---------------------------------------------------------------------- this.updateById(sysPermission); //如果当前菜单的父菜单变了,则需要修改新父菜单和老父菜单的,叶子节点状态 String pid = sysPermission.getParentId(); if ((StrUtil.isNotEmpty(pid) && !pid.equals(p.getParentId())) || StrUtil.isEmpty(pid) && StrUtil.isNotEmpty(p.getParentId())) { //a.设置新的父菜单不为叶子节点 baseMapper.setMenuLeaf(pid, 0); //b.判断老的菜单下是否还有其他子菜单,没有的话则设置为叶子节点 long cc = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, p.getParentId())); if (cc == 0) { if (StrUtil.isNotEmpty(p.getParentId())) { baseMapper.setMenuLeaf(p.getParentId(), 1); } } } } } @Override public List queryByUser(String username) { return baseMapper.queryByUser(username); } /** * 根据permissionId删除其关联的SysPermissionDataRule表中的数据 */ @Override public void deletePermRuleByPermId(String id) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(SysPermissionDataRule::getPermissionId, id); long countValue = this.permissionDataRuleService.count(query); if (countValue > 0) { this.permissionDataRuleService.remove(query); } } /** * 获取模糊匹配规则的数据权限URL */ @Override @Cacheable(value = CacheConst.SYS_DATA_PERMISSIONS_CACHE) public List queryPermissionUrlWithStar() { return baseMapper.queryPermissionUrlWithStar(); } @Override public boolean hasPermission(String username, SysPermission sysPermission) { int count = baseMapper.queryCountByUsername(username, sysPermission); return count > 0; } @Override public boolean hasPermission(String username, String url) { SysPermission sysPermission = new SysPermission(); sysPermission.setUrl(url); int count = baseMapper.queryCountByUsername(username, sysPermission); return count > 0; } @Override public int queryCountByUsername(String username, SysPermission sysPermission) { return baseMapper.queryCountByUsername(username, sysPermission); } }