首页
在验证登陆后进入首页进行了数据请求
getInfo
* @return 用户信息
*/
@GetMapping("getInfo")
public AjaxResult getInfo()
{
//SecurityContextHolder 在session中获取登陆的用户信息
SysUser user = SecurityUtils.getLoginUser().getUser();
// 角色集合 获取角色集合
Set<String> roles = permissionService.getRolePermission(user);
// 权限集合 获取权限集合
Set<String> permissions = permissionService.getMenuPermission(user);
//向前端返回ajax格式的统一返回体和信息
AjaxResult ajax = AjaxResult.success();
ajax.put("user", user);
ajax.put("roles", roles);
ajax.put("permissions", permissions);
return ajax;
}
Set<String> roles = permissionService.getRolePermission(user);
Set<String> permissions = permissionService.getMenuPermission(user);
首先判断用户角色是否为admin 进行判断。 接下来判断角色是否为多角色 或 无角色 ,如果为多角色,则进行每个角色的权限查询和set 再 将所有的权限进行集合记录。 如果无角色,根据id进行菜单权限的查询(因为这菜单的权限可能并不与角色挂钩!也需要进行查询选择)
{
"msg": "操作成功",
"code": 200,
"permissions": [
"*:*:*"
],
"roles": [
"admin"
],
"user": {
"searchValue": null,
"createBy": "admin",
"createTime": "2022-08-18 10:29:06",
"updateBy": null,
"updateTime": null,
"remark": "管理员",
"params": {
},
"userId": 1,
"deptId": 103,
"userName": "admin",
"nickName": "依",
"email": "m",
"phonenumber": "",
"sex": "1",
"avatar": "",
"password": "$2a$10$7JB720yubVSZvUI0rEqiBE8ByOhJIrdAu2",
"status": "0",
"delFlag": "0",
"loginIp": "127.9.0.1",
"loginDate": "2022-10-10T09:19:45.000+08:00",
"dept": {
"searchValue": null,
"createBy": null,
"createTime": null,
"updateBy": null,
"updateTime": null,
"remark": null,
"params": {
},
"deptId": 103,
"parentId": 101,
"ancestors": "0,100,101",
"deptName": "研发部门",
"orderNum": 1,
"leader": "若依",
"phone": null,
"email": null,
"status": "0",
"delFlag": null,
"parentName": null,
"children": [
]
},
"roles": [
{
"searchValue": null,
"createBy": null,
"createTime": null,
"updateBy": null,
"updateTime": null,
"remark": null,
"params": {
},
"roleId": 1,
"roleName": "超级管理员",
"roleKey": "admin",
"roleSort": "1",
"dataScope": "1",
"menuCheckStrictly": false,
"deptCheckStrictly": false,
"status": "0",
"delFlag": null,
"flag": false,
"menuIds": null,
"deptIds": null,
"permissions": null,
"admin": true
}
],
"roleIds": null,
"postIds": null,
"roleId": null,
"admin": true
}
}
以上就是查询的 roles 和 permissions
getRouter
这个比较绕与要进行画图和数据进行结合
路由对象,设置的是vue的菜单设计格式
selectMenuTreeAll()
方法进行获取对应用户的对应权限的菜单信息(根据角色的信息判断用户的菜单问题)
getChildPerms(menus, 0)
这里开始设计父子节点
/**
* 根据父节点的ID获取所有子节点
*
* @param list 分类表
* @param parentId 传入的父节点ID
* @return String
*/
public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId)
{
List<SysMenu> returnList = new ArrayList<SysMenu>();
for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext();)
{
SysMenu t = (SysMenu) iterator.next();
// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
if (t.getParentId() == parentId)
{
recursionFn(list, t);
returnList.add(t);
}
}
return returnList;
}
/**
* 递归列表
*
* @param list
* @param t
*/
这里无线递归根据传入的菜单 t 在 list 里面查询出来他的子列表
private void recursionFn(List<SysMenu> list, SysMenu t)
{
// 得到子节点列表
List<SysMenu> childList = getChildList(list, t);
t.setChildren(childList);
for (SysMenu tChild : childList)
{
if (hasChild(list, tChild))
{
recursionFn(list, tChild);
}
}
}
/**
* 得到子节点列表
*/
private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t)
{
List<SysMenu> tlist = new ArrayList<SysMenu>();
Iterator<SysMenu> it = list.iterator();
while (it.hasNext())
{
SysMenu n = (SysMenu) it.next();
if (n.getParentId().longValue() == t.getMenuId().longValue())
{
tlist.add(n);
}
}
return tlist;
}
/**
* 判断是否有子节点
*/
private boolean hasChild(List<SysMenu> list, SysMenu t)
{
return getChildList(list, t).size() > 0;
}
菜单树分析
在弄清楚菜单树之前我们需要先了解它是通过菜单的父子列表来进行设计的
**根据路由接口的设计和方法的顺序,我们可以分析到 在生成菜单树之前,需要先对列表进行父子分析和归类 进行逻辑化的集合 menuService.selectMenuTreeByUserId(userId)
通过对父子菜单的分析和集合分类我们可以得到多级列表的一个列表集合 然后就可以根据有序的多级列表集合进行最后的整合和set 将前端路由需要的数据 添加进去 返回前端json格式 menuService.buildMenus(menus)
**
父子集合的逻辑原理
首先我们通过SysMenuServiceImpl
类下的 selectMenuTreeByUserId()
方法进行当前用户所可以访问到的菜单集合(首先判断是否是admin 是否进行 全部菜单 或 byid的方法)
**在返回时,调用 SysMenuServiceImpl
类下的 getChildPerms(List<SysMenu> list, int parentId)
方法 这个方法将顶级菜单定义好,然后判断当前菜单集合里面的菜单是否是顶级菜单,在定位到顶级菜单后 遍历该父节点的全部子节点 **
private void recursionFn(List<SysMenu> list, SysMenu t)
{
// 得到子节点列表
List<SysMenu> childList = getChildList(list, t);
t.setChildren(childList);
for (SysMenu tChild : childList)
{
if (hasChild(list, tChild))
{
recursionFn(list, tChild);
}
}
}
我们调用这个递归方法 recursionFn(List<SysMenu> list, SysMenu t)
首先通过方法内部的 getChildList(list, t)
获取当前菜单的子菜单 然后hasChild()
判断子菜单是否含有子菜单 进行recursionFn()方法的递归,直到 hasChild(list, tChild) == false
结束
getChildList() 方法分析
将获取的全部的菜单列表 的 parentid 和 当前菜单的menuId 进行比对 当菜单的父菜单就是当前的菜单id 那就将当前的菜单添加进子菜单集合 最终返回 统一增加和处理
hasChild 方法分析
**通过调用 getChildList()
获得子菜单列表的返回值 判断当前菜单是否有子菜单 **