权限管理想把权限菜单表做成动态的,就必须在数据库存储菜单和权限信息,也就是所谓的 rbac 权限设计,菜单分为根菜单和子菜单,用户登陆成功跳转到首页,就能看到菜单树,对应的界面,所以需要从后台向前台传递菜单树。
1.在 菜单表中需要添加对应的父级 id 字段
-1 表示是根菜单,需要现在 实体类添加对应子集的 List 字段,然后在 service 层,写分层树型的方法:
然后是 service 层代码:
public HomepageMapper homePageMapper;
// 菜单树实现
@Override
public List<SysMenu> menuTree(HttpServletRequest request) {
String token = request.getHeader("token");
// 获取用户对象
SysUser user = (SysUser) redisUtil.get(token);
// 获取该用户的权限集合
List<SysMenu> menus = homePageMapper.getMenuList(user.getId());
List<SysMenu> results = getTreeMenu(menus);
return results;
}
/**
* 获取菜单树
* @param menus
* @return
*/
private List<SysMenu> getTreeMenu(List<SysMenu> menus) {
List<SysMenu> parents = new ArrayList<>();
for (SysMenu sysMenu : menus) {
if (sysMenu.getMenuParentId() == 0) {
parents.add(sysMenu);
}
}
for (SysMenu parent : parents) {
childMenu(parent, menus);
}
return parents;
}
/**
* 获取子菜单
* @param parent
* @param menus
*/
private void childMenu(SysMenu parent, List<SysMenu> menus) {
for (SysMenu menu : menus) {
if (menu.getMenuParentId().equals(parent.getId())) {
parent.getChildMenu().add(menu);
childMenu(menu, menus);
}
}
}
得到结果:
{
"code": 200,
"msg": "查询成功",
"data": [
{
"id": 16,
"menuName": "用户",
"menuPath": "/user",
"menuParentId": -1,
"authString": "user",
"children": [
{
"id": 3,
"menuName": "展示用户",
"menuPath": "/userowUser",
"menuParentId": 16,
"authString": "showUser",
"children": []
},
{
"id": 4,
"menuName": "添加用户",
"menuPath": "/user/addUser",
"menuParentId": 16,
"authString": "addUser",
"children": []
},
{
"id": 5,
"menuName": "删除用户",
"menuPath": "/user/deleteUser",
"menuParentId": 16,
"authString": "deleteUser",
"children": []
},
{
"id": 6,
"menuName": "修改用户角色",
"menuPath": "/user/updateUserRole",
"menuParentId": 16,
"authString": "updateUserInfo",
"children": []
}
]
},
{
"id": 17,
"menuName": "菜单",
"menuPath": "/menu",
"menuParentId": -1,
"authString": "menu",
"children": [
{
"id": 1,
"menuName": "展示菜单",
"menuPath": "/menuowMenu",
"menuParentId": 17,
"authString": "showMenu",
"children": []
},
{
"id": 11,
"menuName": "添加菜单",
"menuPath": "/menu/addMenu",
"menuParentId": 17,
"authString": "addMenu",
"children": []
},
{
"id": 12,
"menuName": "删除菜单",
"menuPath": "/menu/deleteMenu",
"menuParentId": 17,
"authString": "deleteMenu",
"children": []
},
{
"id": 15,
"menuName": "设置父级菜单",
"menuPath": "/menutParentMenu",
"menuParentId": 17,
"authString": "setParentMenu",
"children": []
}
]
},
{
"id": 18,
"menuName": "角色",
"menuPath": "/role",
"menuParentId": -1,
"authString": "role",
"children": [
{
"id": 2,
"menuName": "展示角色",
"menuPath": "/roleowRole",
"menuParentId": 18,
"authString": "showRole",
"children": []
},
{
"id": 7,
"menuName": "添加角色",
"menuPath": "/role/addRole",
"menuParentId": 18,
"authString": "addRole",
"children": []
},
{
"id": 8,
"menuName": "删除角色",
"menuPath": "/role/deleteRole",
"menuParentId": 18,
"authString": "deleteRole",
"children": []
},
{
"id": 9,
"menuName": "修改角色信息",
"menuPath": "/role/updateRole",
"menuParentId": 18,
"authString": "updateRole",
"children": []
},
{
"id": 10,
"menuName": "添加角色权限",
"menuPath": "/roletRoleAuth",
"menuParentId": 18,
"authString": "setRoleAuth",
"children": []
}
]
}
]
}