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<IPage<SysPermission>> queryPageList(SysPermission sysPermission, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) {
|
|
Result<IPage<SysPermission>> result = new Result<IPage<SysPermission>>();
|
QueryWrapper<SysPermission> queryWrapper = new QueryWrapper<SysPermission>(sysPermission);
|
Page<SysPermission> page = new Page<SysPermission>(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<SysPermission> 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<SysPermission> add(@RequestBody SysPermission permission) {
|
|
Result<SysPermission> result = new Result<SysPermission>();
|
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<SysPermission> edit(@RequestBody SysPermission permission) {
|
|
Result<SysPermission> 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<SysPermission> delete(@RequestParam(name = "id", required = true) String id) {
|
|
Result<SysPermission> 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<SysPermission> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
|
|
Result<SysPermission> 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<SysPermission> queryById(@RequestParam(name = "id", required = true) String id) {
|
|
Result<SysPermission> result = new Result<SysPermission>();
|
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<List<SysPermissionTree>> getSystemMenuList() {
|
|
long start = System.currentTimeMillis();
|
Result<List<SysPermissionTree>> result = new Result<>();
|
try {
|
LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();
|
query.eq(SysPermission::getMenuType, CommonConstant.MENU_TYPE_0);
|
query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0);
|
query.orderByAsc(SysPermission::getSortNo);
|
List<SysPermission> list = sysPermissionService.list(query);
|
List<SysPermissionTree> sysPermissionTreeList = new ArrayList<SysPermissionTree>();
|
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<List<SysPermissionTree>> getSystemSubmenu(@RequestParam("parentId") String parentId) {
|
|
Result<List<SysPermissionTree>> result = new Result<>();
|
try {
|
LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();
|
query.eq(SysPermission::getParentId, parentId);
|
query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0);
|
query.orderByAsc(SysPermission::getSortNo);
|
List<SysPermission> list = sysPermissionService.list(query);
|
List<SysPermissionTree> sysPermissionTreeList = new ArrayList<SysPermissionTree>();
|
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<JSONObject> result = new Result<JSONObject>();
|
try {
|
List<SysPermission> 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<SysPermission> query = new LambdaQueryWrapper<SysPermission>();
|
query.eq(SysPermission::getDelFlag, CommonConstant.DEL_FLAG_0);
|
query.eq(SysPermission::getMenuType, CommonConstant.MENU_TYPE_2);
|
List<SysPermission> 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<List<TreeModel>> queryAsync(@RequestParam(name = "pid", required = false) Integer parentId) {
|
|
Result<List<TreeModel>> result = new Result<>();
|
try {
|
List<TreeModel> 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<String> 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<Integer> 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<SysPermissionTree> treeList, List<SysPermission> 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<TreeModel> treeList, List<SysPermission> 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<SysPermission> 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<SysPermission> 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<SysPermission> 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;
|
}
|
}
|
|
}
|