package cn.besteam.modules.system.controller; import cn.besteam.common.api.vo.Result; import cn.besteam.common.constant.CannotDeleteRoleEnum; import cn.besteam.common.constant.CommonConstant; import cn.besteam.common.constant.ErrorCode; import cn.besteam.common.exception.BusinessException; import cn.besteam.common.util.MD5Util; import cn.besteam.common.util.oConvertUtils; import cn.besteam.modules.shiro.authc.util.EnvUtils; import cn.besteam.modules.system.biz.SysPermissionBiz; import cn.besteam.modules.system.entity.SysPermission; import cn.besteam.modules.system.entity.SysRole; import cn.besteam.modules.system.service.ISysPermissionService; import cn.besteam.modules.system.service.ISysRolePermissionService; import cn.besteam.modules.system.service.ISysRoleService; import cn.besteam.modules.system.service.ISysUserRoleService; import cn.besteam.modules.system.util.PermissionDataUtil; import cn.besteam.modules.system.vo.SysPermissionTree; import cn.besteam.modules.system.vo.TreeModel; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; /** * @Title: Controller * @Description: 菜单权限 * @author: besteam * @date: 2020-04-17 * @version: V1.0 */ @RestController @RequestMapping("/system/sysPermission") @Slf4j @Api(description = "菜单权限") public class SysPermissionController { @Autowired private ISysPermissionService sysPermissionService; @Autowired private ISysRolePermissionService sysRolePermissionService; @Autowired private SysPermissionBiz sysPermissionBiz; @Autowired private ISysRoleService roleService; @Autowired private ISysUserRoleService sysUserRoleService; /** * 分页列表查询 * * @param sysPermission * @param pageNo * @param pageSize * @param req * @return */ @GetMapping(value = "/list") @ApiOperation(value = "获取菜单权限数据列表", notes = "获取所有菜单权限数据列表", produces = "application/json") public Result> queryPageList(SysPermission sysPermission, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { Result> result = new Result>(); QueryWrapper queryWrapper = new QueryWrapper(sysPermission); Page page = new Page(pageNo, pageSize); //排序逻辑 处理 String column = req.getParameter("column"); String order = req.getParameter("order"); if (oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { if ("asc".equals(order)) { queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); } else { queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); } } IPage pageList = sysPermissionService.page(page, queryWrapper); result.setSuccess(true); result.setResult(pageList); return result; } /** * 添加菜单 * * @param permission * @return */ @RequestMapping(value = "/add", method = RequestMethod.POST) @ApiOperation("添加菜单") public Result add(@RequestBody SysPermission permission) { Result result = new Result(); try { permission = PermissionDataUtil.intelligentProcessData(permission); sysPermissionService.addPermission(permission); result.success("添加成功!"); } catch (Exception e) { log.error(e.getMessage(), e); result.error500("操作失败"); } return result; } /** * 编辑菜单 * * @param permission * @return */ @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST}) @ApiOperation("编辑菜单") public Result edit(@RequestBody SysPermission permission) { Result result = new Result<>(); try { permission = PermissionDataUtil.intelligentProcessData(permission); sysPermissionService.editPermission(permission); result.success("修改成功!"); } catch (Exception e) { log.error(e.getMessage(), e); result.error500("操作失败"); } return result; } /** * 删除菜单 * * @param id * @return */ @RequestMapping(value = "/delete", method = RequestMethod.DELETE) @ApiOperation("删除菜单") public Result delete(@RequestParam(name = "id", required = true) String id) { Result result = new Result<>(); try { sysPermissionService.deletePermission(Integer.valueOf(id)); result.success("删除成功!"); } catch (Exception e) { log.error(e.getMessage(), e); result.error500(e.getMessage()); } return result; } /** * 批量删除菜单 * * @param ids * @return */ @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) @ApiOperation("批量删除菜单") public Result deleteBatch(@RequestParam(name = "ids", required = true) String ids) { Result result = new Result<>(); try { String[] arr = ids.split(","); for (String id : arr) { if (oConvertUtils.isNotEmpty(id)) { sysPermissionService.deletePermission(Integer.valueOf(id)); } } result.success("删除成功!"); } catch (Exception e) { log.error(e.getMessage(), e); result.error500("删除成功!"); } return result; } /** * 通过id查询 * * @param id * @return */ @GetMapping(value = "/queryById") @ApiOperation(value = "通过id查询菜单权限", notes = "通过id查询菜单权限", produces = "application/json") public Result queryById(@RequestParam(name = "id", required = true) String id) { Result result = new Result(); SysPermission sysPermission = sysPermissionService.getById(id); if (sysPermission == null) { result.error500("未找到对应实体"); } else { result.setResult(sysPermission); result.setSuccess(true); } return result; } /** * 系统菜单列表(一级菜单) * * @return */ @RequestMapping(value = "/getSystemMenuList", method = RequestMethod.GET) @ApiOperation("系统菜单列表(一级菜单)") public Result> getSystemMenuList() { long start = System.currentTimeMillis(); Result> result = new Result<>(); try { LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(SysPermission::getMenuType, CommonConstant.MENU_TYPE_0); query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0); query.orderByAsc(SysPermission::getSortNo); List list = sysPermissionService.list(query); List sysPermissionTreeList = new ArrayList(); for (SysPermission sysPermission : list) { SysPermissionTree sysPermissionTree = new SysPermissionTree(sysPermission); sysPermissionTreeList.add(sysPermissionTree); } result.setResult(sysPermissionTreeList); result.setSuccess(true); } catch (Exception e) { log.error(e.getMessage(), e); } log.info("======获取一级菜单数据=====耗时:" + (System.currentTimeMillis() - start) + "毫秒"); return result; } /** * 查询子菜单 * * @param parentId * @return */ @RequestMapping(value = "/getSystemSubmenu", method = RequestMethod.GET) @ApiOperation("查询子菜单") public Result> getSystemSubmenu(@RequestParam("parentId") String parentId) { Result> result = new Result<>(); try { LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(SysPermission::getParentId, parentId); query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0); query.orderByAsc(SysPermission::getSortNo); List list = sysPermissionService.list(query); List sysPermissionTreeList = new ArrayList(); for (SysPermission sysPermission : list) { SysPermissionTree sysPermissionTree = new SysPermissionTree(sysPermission); sysPermissionTreeList.add(sysPermissionTree); } result.setResult(sysPermissionTreeList); result.setSuccess(true); } catch (Exception e) { log.error(e.getMessage(), e); } return result; } /** * 查询用户拥有的菜单权限和按钮权限(根据TOKEN) * * @return */ @RequestMapping(value = "/getUserPermissionByToken", method = RequestMethod.GET) @ApiOperation("查询用户拥有的菜单权限和按钮权限(根据TOKEN)") public Result getUserPermissionByToken() { Result result = new Result(); try { List metaList = sysPermissionService.queryByUser(EnvUtils.getUser().getAccount()); //添加默认菜单 JSONObject json = new JSONObject(); JSONArray menujsonArray = new JSONArray(); if (CollectionUtils.isEmpty(metaList)) { result.setResult(json); result.success("查询成功"); } this.getPermissionJsonArray(menujsonArray, metaList, null); JSONArray authjsonArray = new JSONArray(); this.getAuthJsonArray(authjsonArray, metaList); //查询所有的权限 LambdaQueryWrapper query = new LambdaQueryWrapper(); query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0); query.eq(SysPermission::getMenuType, CommonConstant.MENU_TYPE_2); List allAuthList = sysPermissionService.list(query); JSONArray allauthjsonArray = new JSONArray(); this.getAllAuthJsonArray(allauthjsonArray, allAuthList); //路由菜单 json.put("menu", menujsonArray); //按钮权限 json.put("auth", authjsonArray); //全部权限配置(按钮权限,访问权限) json.put("allAuth", allauthjsonArray); result.setResult(json); result.success("查询成功"); } catch (Exception e) { result.error500("查询失败:" + e.getMessage()); log.error(e.getMessage(), e); } return result; } /** * 异步加载数据节点 * * @return */ @RequestMapping(value = "/queryListAsync", method = RequestMethod.GET) public Result> queryAsync(@RequestParam(name = "pid", required = false) Integer parentId) { Result> result = new Result<>(); try { List list = sysPermissionService.queryListByParentId(parentId); if (list == null || list.size() <= 0) { result.error500("未找到角色信息"); } else { result.setResult(list); result.setSuccess(true); } } catch (Exception e) { log.error(e.getMessage(), e); } return result; } @ApiOperation(value = "角色管理-查询角色授权") @RequestMapping(value = "/queryRolePermission", method = RequestMethod.GET) public Result queryRolePermission(@RequestParam(name = "roleId") String roleId) { return Result.ok(sysPermissionBiz.queryRolePermission(roleId)); } @ApiOperation(value = "角色管理-保存角色授权") @RequestMapping(value = "/saveRolePermission", method = RequestMethod.POST) @Transactional(rollbackFor = Exception.class) public Result saveRolePermission(@RequestBody JSONObject json) { boolean hasPermission = sysUserRoleService.hasPermission(EnvUtils.getUser().getId(), "role:permission:menu"); if (!hasPermission) { throw new BusinessException(ErrorCode.ERR_500, "无操作权限"); } long start = System.currentTimeMillis(); Result result = new Result<>(); try { Integer roleId = json.getInteger("roleId"); SysRole sysRole = roleService.getById(roleId); if (sysRole == null) { return Result.error("角色不存在"); } if (CannotDeleteRoleEnum.SET.contains(sysRole.getRoleName())) { return Result.error("此角色权限不可编辑"); } List roleTypeList = sysUserRoleService.getRoleTypeList(EnvUtils.getUser().getId()); if (CollectionUtils.isEmpty(roleTypeList)) { throw new BusinessException(ErrorCode.ERR_500, "无操作权限"); } if (!roleTypeList.contains(sysRole.getType())) { throw new BusinessException(ErrorCode.ERR_500, "无操作权限"); } String permissionIds = json.getString("permissionIds"); String lastPermissionIds = json.getString("lastpermissionIds"); this.sysRolePermissionService.saveRolePermission(roleId, permissionIds, lastPermissionIds); result.success("保存成功!"); log.info("======角色授权成功=====耗时:" + (System.currentTimeMillis() - start) + "毫秒"); } catch (Exception e) { result.error500("授权失败!"); log.error(e.getMessage(), e); } return result; } private void getTreeList(List treeList, List metaList, SysPermissionTree temp) { for (SysPermission permission : metaList) { Integer tempPid = permission.getParentId(); SysPermissionTree tree = new SysPermissionTree(permission); if (temp == null && oConvertUtils.isEmpty(tempPid)) { treeList.add(tree); if (!tree.getIsLeaf()) { getTreeList(treeList, metaList, tree); } } else if (temp != null && tempPid != null && tempPid.equals(temp.getId())) { temp.getChildren().add(tree); if (!tree.getIsLeaf()) { getTreeList(treeList, metaList, tree); } } } } private void getTreeModelList(List treeList, List metaList, TreeModel temp) { for (SysPermission permission : metaList) { Integer tempPid = permission.getParentId(); TreeModel tree = new TreeModel(permission); if (temp == null && oConvertUtils.isEmpty(tempPid)) { treeList.add(tree); if (!tree.getIsLeaf()) { getTreeModelList(treeList, metaList, tree); } } else if (temp != null && tempPid != null && tempPid.equals(temp.getKey())) { temp.getChildren().add(tree); if (!tree.getIsLeaf()) { getTreeModelList(treeList, metaList, tree); } } } } /** * 获取权限JSON数组 * * @param jsonArray */ private void getAllAuthJsonArray(JSONArray jsonArray, List allList) { JSONObject json = null; for (SysPermission permission : allList) { json = new JSONObject(); json.put("action", permission.getPerms()); json.put("status", permission.getStatus()); json.put("type", permission.getPermsType()); json.put("describe", permission.getName()); jsonArray.add(json); } } /** * 获取权限JSON数组 * * @param jsonArray * @param metaList */ private void getAuthJsonArray(JSONArray jsonArray, List metaList) { for (SysPermission permission : metaList) { if (permission.getMenuType() == null) { continue; } JSONObject json = null; if (permission.getMenuType().equals(CommonConstant.MENU_TYPE_2) && CommonConstant.STATUS_1.equals(permission.getStatus())) { json = new JSONObject(); json.put("action", permission.getPerms()); json.put("type", permission.getPermsType()); json.put("describe", permission.getName()); jsonArray.add(json); } } } /** * 获取菜单JSON数组 * * @param jsonArray * @param metaList * @param parentJson */ private void getPermissionJsonArray(JSONArray jsonArray, List metaList, JSONObject parentJson) { for (SysPermission permission : metaList) { if (permission.getMenuType() == null) { continue; } String tempPid = String.valueOf(permission.getParentId()); JSONObject json = getPermissionJsonObject(permission); if (json == null) { continue; } if (parentJson == null && oConvertUtils.isEmpty(tempPid)) { jsonArray.add(json); if (!permission.getIsLeaf()) { getPermissionJsonArray(jsonArray, metaList, json); } } else if (parentJson != null && oConvertUtils.isNotEmpty(tempPid) && tempPid.equals(parentJson.getString("id"))) { // 类型( 0:一级菜单 1:子菜单 2:按钮 ) if (permission.getMenuType().equals(CommonConstant.MENU_TYPE_2)) { JSONObject metaJson = parentJson.getJSONObject("meta"); if (metaJson.containsKey("permissionList")) { metaJson.getJSONArray("permissionList").add(json); } else { JSONArray permissionList = new JSONArray(); permissionList.add(json); metaJson.put("permissionList", permissionList); } // 类型( 0:一级菜单 1:子菜单 2:按钮 ) } else if (permission.getMenuType().equals(CommonConstant.MENU_TYPE_1) || permission.getMenuType().equals(CommonConstant.MENU_TYPE_0)) { if (parentJson.containsKey("children")) { parentJson.getJSONArray("children").add(json); } else { JSONArray children = new JSONArray(); children.add(json); parentJson.put("children", children); } if (!permission.getIsLeaf()) { getPermissionJsonArray(jsonArray, metaList, json); } } } } } /** * 根据菜单配置生成路由json * * @param permission * @return */ private JSONObject getPermissionJsonObject(SysPermission permission) { JSONObject json = new JSONObject(); // 类型(0:一级菜单 1:子菜单 2:按钮) if (permission.getMenuType().equals(CommonConstant.MENU_TYPE_2)) { return null; } else if (permission.getMenuType().equals(CommonConstant.MENU_TYPE_0) || permission.getMenuType().equals(CommonConstant.MENU_TYPE_1)) { json.put("id", permission.getId()); if (permission.getIsRoute()) { json.put("route", "1");// 表示生成路由 } else { json.put("route", "0");// 表示不生成路由 } if (isWWWHttpUrl(permission.getUrl())) { json.put("path", MD5Util.MD5Encode(permission.getUrl(), "utf-8")); } else { json.put("path", permission.getUrl()); } // 重要规则:路由name (通过URL生成路由name,路由name供前端开发,页面跳转使用) if (oConvertUtils.isNotEmpty(permission.getComponentName())) { json.put("name", permission.getComponentName()); } else { json.put("name", urlToRouteName(permission.getUrl())); } // 是否隐藏路由,默认都是显示的 if (permission.getHidden()) { json.put("hidden", true); } // 聚合路由 if (permission.getAlwaysShow()) { json.put("alwaysShow", true); } json.put("component", permission.getComponent()); JSONObject meta = new JSONObject(); // 由用户设置是否缓存页面 用布尔值 if (permission.getKeepAlive()) { meta.put("keepAlive", true); } else { meta.put("keepAlive", false); } //外链菜单打开方式 if (permission.getInternalOrExternal()) { meta.put("internalOrExternal", true); } else { meta.put("internalOrExternal", false); } meta.put("title", permission.getName()); if (oConvertUtils.isEmpty(permission.getParentId())) { // 一级菜单跳转地址 json.put("redirect", permission.getRedirect()); if (oConvertUtils.isNotEmpty(permission.getIcon())) { meta.put("icon", permission.getIcon()); } } else { if (oConvertUtils.isNotEmpty(permission.getIcon())) { meta.put("icon", permission.getIcon()); } } if (isWWWHttpUrl(permission.getUrl())) { meta.put("url", permission.getUrl()); } json.put("meta", meta); } return json; } /** * 判断是否外网URL 例如: http://localhost:8080/jeecg-boot/swagger-ui.html#/ 支持特殊格式: {{ * window._CONFIG['domianURL'] }}/druid/ {{ JS代码片段 }},前台解析会自动执行JS代码片段 * * @return */ private boolean isWWWHttpUrl(String url) { if (url != null && (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("{{"))) { return true; } return false; } /** * 通过URL生成路由name(去掉URL前缀斜杠,替换内容中的斜杠‘/’为-) 举例: URL = /isystem/role RouteName = * isystem-role * * @return */ private String urlToRouteName(String url) { if (oConvertUtils.isNotEmpty(url)) { if (url.startsWith("/")) { url = url.substring(1); } url = url.replace("/", "-"); // 特殊标记 url = url.replace(":", "@"); return url; } else { return null; } } }