package org.jeecg.modules.system.service.impl; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.system.entity.SysPermission; import org.jeecg.modules.system.entity.SysPermissionDataRule; import org.jeecg.modules.system.mapper.SysDepartPermissionMapper; import org.jeecg.modules.system.mapper.SysDepartRolePermissionMapper; import org.jeecg.modules.system.mapper.SysPermissionMapper; import org.jeecg.modules.system.mapper.SysRolePermissionMapper; import org.jeecg.modules.system.model.TreeModel; import org.jeecg.modules.system.service.ISysPermissionDataRuleService; import org.jeecg.modules.system.service.ISysPermissionService; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; /** *

* 菜单权限表 服务实现类 *

* * @Author scott * @since 2018-12-21 */ @Service public class SysPermissionServiceImpl extends ServiceImpl implements ISysPermissionService { @Resource private SysPermissionMapper sysPermissionMapper; @Resource private ISysPermissionDataRuleService permissionDataRuleService; @Resource private SysRolePermissionMapper sysRolePermissionMapper; @Resource private SysDepartPermissionMapper sysDepartPermissionMapper; @Resource private SysDepartRolePermissionMapper sysDepartRolePermissionMapper; @Override public List queryListByParentId(String parentId) { return sysPermissionMapper.queryListByParentId(parentId); } /** * 真实删除 */ @Override @Transactional @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true) public void deletePermission(String id) throws JeecgBootException { SysPermission sysPermission = this.getById(id); if(sysPermission==null) { throw new JeecgBootException("未找到菜单信息"); } String pid = sysPermission.getParentId(); if(oConvertUtils.isNotEmpty(pid)) { int count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, pid)); if(count==1) { //若父节点无其他子节点,则该父节点是叶子节点 this.sysPermissionMapper.setMenuLeaf(pid, 1); } } sysPermissionMapper.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删除其关联的子节点数据 * * @return */ 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 int num = 0; // 查出的子级数量 // 如果查出的集合不为空, 则先删除所有 this.remove(query); // 再遍历刚才查出的集合, 根据每个对象,查找其是否仍有子级 for (int i = 0, len = permissionList.size(); i < len; i++) { id = permissionList.get(i).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 = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true) //@CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true,condition="#sysPermission.menuType==2") public void deletePermissionLogical(String id) throws JeecgBootException { SysPermission sysPermission = this.getById(id); if(sysPermission==null) { throw new JeecgBootException("未找到菜单信息"); } String pid = sysPermission.getParentId(); int count = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, pid)); if(count==1) { //若父节点无其他子节点,则该父节点是叶子节点 this.sysPermissionMapper.setMenuLeaf(pid, 1); } sysPermission.setDelFlag(1); this.updateById(sysPermission); } @Override @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true) public void addPermission(SysPermission sysPermission) throws JeecgBootException { //---------------------------------------------------------------------- //判断是否是一级菜单,是的话清空父菜单 if(CommonConstant.MENU_TYPE_0.equals(sysPermission.getMenuType())) { sysPermission.setParentId(null); } //---------------------------------------------------------------------- String pid = sysPermission.getParentId(); if(oConvertUtils.isNotEmpty(pid)) { //设置父节点不为叶子节点 this.sysPermissionMapper.setMenuLeaf(pid, 0); } sysPermission.setCreateTime(new Date()); sysPermission.setDelFlag(0); sysPermission.setLeaf(true); this.save(sysPermission); } @Override @CacheEvict(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE,allEntries=true) public void editPermission(SysPermission sysPermission) throws JeecgBootException { SysPermission p = this.getById(sysPermission.getId()); //TODO 该节点判断是否还有子节点 if(p==null) { throw new JeecgBootException("未找到菜单信息"); }else { sysPermission.setUpdateTime(new Date()); //---------------------------------------------------------------------- //Step1.判断是否是一级菜单,是的话清空父菜单ID if(CommonConstant.MENU_TYPE_0.equals(sysPermission.getMenuType())) { sysPermission.setParentId(""); } //Step2.判断菜单下级是否有菜单,无则设置为叶子节点 int 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((oConvertUtils.isNotEmpty(pid) && !pid.equals(p.getParentId())) || oConvertUtils.isEmpty(pid)&&oConvertUtils.isNotEmpty(p.getParentId())) { //a.设置新的父菜单不为叶子节点 this.sysPermissionMapper.setMenuLeaf(pid, 0); //b.判断老的菜单下是否还有其他子菜单,没有的话则设置为叶子节点 int cc = this.count(new QueryWrapper().lambda().eq(SysPermission::getParentId, p.getParentId())); if(cc==0) { if(oConvertUtils.isNotEmpty(p.getParentId())) { this.sysPermissionMapper.setMenuLeaf(p.getParentId(), 1); } } } } } @Override public List queryByUser(String username) { return this.sysPermissionMapper.queryByUser(username); } /** * 根据permissionId删除其关联的SysPermissionDataRule表中的数据 */ @Override public void deletePermRuleByPermId(String id) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(SysPermissionDataRule::getPermissionId, id); int countValue = this.permissionDataRuleService.count(query); if(countValue > 0) { this.permissionDataRuleService.remove(query); } } /** * 获取模糊匹配规则的数据权限URL */ @Override @Cacheable(value = CacheConstant.SYS_DATA_PERMISSIONS_CACHE) public List queryPermissionUrlWithStar() { return this.baseMapper.queryPermissionUrlWithStar(); } @Override public boolean hasPermission(String username, SysPermission sysPermission) { int count = baseMapper.queryCountByUsername(username,sysPermission); if(count>0){ return true; }else{ return false; } } @Override public boolean hasPermission(String username, String url) { SysPermission sysPermission = new SysPermission(); sysPermission.setUrl(url); int count = baseMapper.queryCountByUsername(username,sysPermission); if(count>0){ return true; }else{ return false; } } }