package cn.cetc54.platform.base.controller.manage; import cn.cetc54.platform.base.utils.VoUtil; import cn.cetc54.platform.base.vo.MenuVo; import cn.cetc54.platform.core.common.constant.CommonConstant; import cn.cetc54.platform.core.common.redis.RedisTemplateHelper; import cn.cetc54.platform.core.common.utils.ResultUtil; import cn.cetc54.platform.core.common.utils.SecurityUtil; import cn.cetc54.platform.core.common.vo.Result; import cn.cetc54.platform.core.config.security.permission.MySecurityMetadataSource; import cn.cetc54.platform.core.entity.Permission; import cn.cetc54.platform.core.entity.RolePermission; import cn.cetc54.platform.core.entity.User; import cn.cetc54.platform.core.service.PermissionService; import cn.cetc54.platform.core.service.RolePermissionService; import cn.cetc54.platform.core.service.mybatis.IPermissionService; import cn.hutool.core.util.StrUtil; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; /** * @author Exrick */ @Slf4j @RestController @Api(description = "菜单/权限管理接口") @RequestMapping("/platform/permission") @CacheConfig(cacheNames = "permission") @Transactional public class PermissionController { @Autowired private PermissionService permissionService; @Autowired private RolePermissionService rolePermissionService; @Autowired private IPermissionService iPermissionService; @Autowired private StringRedisTemplate redisTemplate; @Autowired private RedisTemplateHelper redisTemplateHelper; @Autowired private SecurityUtil securityUtil; @Autowired private MySecurityMetadataSource mySecurityMetadataSource; @RequestMapping(value = "/getMenuList", method = RequestMethod.GET) @ApiOperation(value = "获取用户页面菜单数据") public Result> getAllMenuList(){ List menuList = new ArrayList<>(); // 读取缓存 User u = securityUtil.getCurrUser(); String key = "permission::userMenuList:" + u.getId(); String v = redisTemplate.opsForValue().get(key); if(StrUtil.isNotBlank(v)){ menuList = new Gson().fromJson(v, new TypeToken>(){}.getType()); return new ResultUtil>().setData(menuList); } // 用户所有权限 已排序去重 List list = iPermissionService.findByUserId(u.getId()); // 筛选0级页面 for(Permission p : list){ if(CommonConstant.PERMISSION_NAV.equals(p.getType())&& CommonConstant.LEVEL_ZERO.equals(p.getLevel())){ menuList.add(VoUtil.permissionToMenuVo(p)); } } // 筛选一级页面 List firstMenuList = new ArrayList<>(); for(Permission p : list){ if(CommonConstant.PERMISSION_PAGE.equals(p.getType())&& CommonConstant.LEVEL_ONE.equals(p.getLevel())){ firstMenuList.add(VoUtil.permissionToMenuVo(p)); } } // 筛选二级页面 List secondMenuList = new ArrayList<>(); for(Permission p : list){ if(CommonConstant.PERMISSION_PAGE.equals(p.getType())&& CommonConstant.LEVEL_TWO.equals(p.getLevel())){ secondMenuList.add(VoUtil.permissionToMenuVo(p)); } } // 筛选二级页面拥有的按钮权限 List buttonPermissions = new ArrayList<>(); for(Permission p : list){ if(CommonConstant.PERMISSION_OPERATION.equals(p.getType())&& CommonConstant.LEVEL_THREE.equals(p.getLevel())){ buttonPermissions.add(VoUtil.permissionToMenuVo(p)); } } // 匹配二级页面拥有权限 for(MenuVo m : secondMenuList){ List permTypes = new ArrayList<>(); for(MenuVo me : buttonPermissions){ if(m.getId().equals(me.getParentId())){ permTypes.add(me.getButtonType()); } } m.setPermTypes(permTypes); } // 匹配一级页面拥有二级页面 for(MenuVo m : firstMenuList){ List secondMenu = new ArrayList<>(); for(MenuVo me : secondMenuList){ if(m.getId().equals(me.getParentId())){ secondMenu.add(me); } } m.setChildren(secondMenu); } // 匹配0级页面拥有一级页面 for(MenuVo m : menuList){ List firstMenu = new ArrayList<>(); for(MenuVo me : firstMenuList){ if(m.getId().equals(me.getParentId())){ firstMenu.add(me); } } m.setChildren(firstMenu); } // 缓存 redisTemplate.opsForValue().set(key, new Gson().toJson(menuList), 15L, TimeUnit.DAYS); return new ResultUtil>().setData(menuList); } @RequestMapping(value = "/getAllList", method = RequestMethod.GET) @ApiOperation(value = "获取权限菜单树") @Cacheable(key = "'allList'") public Result> getAllList(){ // 0级 List list0 = permissionService.findByLevelOrderBySortOrder(CommonConstant.LEVEL_ZERO); for(Permission p0 : list0){ // 一级 List list1 = permissionService.findByParentIdOrderBySortOrder(p0.getId()); p0.setChildren(list1); // 二级 for(Permission p1 : list1){ List children1 = permissionService.findByParentIdOrderBySortOrder(p1.getId()); p1.setChildren(children1); // 三级 for(Permission p2 : children1){ List children2 = permissionService.findByParentIdOrderBySortOrder(p2.getId()); p2.setChildren(children2); } } } return new ResultUtil>().setData(list0); } @RequestMapping(value = "/add", method = RequestMethod.POST) @ApiOperation(value = "添加") @CacheEvict(key = "'menuList'") public Result add(Permission permission){ // 判断拦截请求的操作权限按钮名是否已存在 if(CommonConstant.PERMISSION_OPERATION.equals(permission.getType())){ List list = permissionService.findByTitle(permission.getTitle()); if(list!=null&&list.size()>0){ return new ResultUtil().setErrorMsg("名称已存在"); } } Permission u = permissionService.save(permission); //重新加载权限 mySecurityMetadataSource.loadResourceDefine(); //手动删除缓存 redisTemplate.delete("permission::allList"); return new ResultUtil().setData(u); } @RequestMapping(value = "/edit", method = RequestMethod.POST) @ApiOperation(value = "编辑") public Result edit(Permission permission){ // 判断拦截请求的操作权限按钮名是否已存在 if(CommonConstant.PERMISSION_OPERATION.equals(permission.getType())){ // 若名称修改 Permission p = permissionService.get(permission.getId()); if(!p.getTitle().equals(permission.getTitle())){ List list = permissionService.findByTitle(permission.getTitle()); if(list!=null&&list.size()>0){ return new ResultUtil().setErrorMsg("名称已存在"); } } } Permission u = permissionService.update(permission); // 重新加载权限 mySecurityMetadataSource.loadResourceDefine(); // 手动批量删除缓存 Set keysUser = redisTemplateHelper.keys("user:" + "*"); redisTemplate.delete(keysUser); Set keysUserMenu = redisTemplateHelper.keys("permission::userMenuList:*"); redisTemplate.delete(keysUserMenu); redisTemplate.delete("permission::allList"); return new ResultUtil().setData(u); } @RequestMapping(value = "/delByIds", method = RequestMethod.POST) @ApiOperation(value = "批量通过id删除") @CacheEvict(key = "'menuList'") public Result delByIds(@RequestParam String[] ids){ for(String id:ids){ List list = rolePermissionService.findByPermissionId(id); if(list!=null&&list.size()>0){ return ResultUtil.error("删除失败,包含正被角色使用关联的菜单或权限"); } } for(String id:ids){ permissionService.delete(id); } // 重新加载权限 mySecurityMetadataSource.loadResourceDefine(); // 手动删除缓存 redisTemplate.delete("permission::allList"); return ResultUtil.success("批量通过id删除数据成功"); } @RequestMapping(value = "/search", method = RequestMethod.GET) @ApiOperation(value = "搜索菜单") public Result> searchPermissionList(@RequestParam String title){ List list = permissionService.findByTitleLikeOrderBySortOrder("%"+title+"%"); return new ResultUtil>().setData(list); } }