遇到的情况是:在做导航菜单那块时,发现数据库里将权限表设计成一张了,此时再改数据库会牵一发而动全身,如果直接用递归的方式将权限封装成树,那么会将增删查之类的权限也变成导航菜单的一部分,也就是说查出来的“删除用户”、“添加角色”等权限也会出现在children里。
解决方法:在递归时,将查出来的所有权限结果过滤,将增删改等子功能放在一个单独的list里(下文中的permitFunc中)。
具体做法:
- 给数据库的权限表增加字段isMenu,用来区别是否是导航菜单(1表示是导航菜单,0表示不能出现在导航菜单的权限功能),还是增删改等功能,如下(请忽略父子关系的不合理):
2. 写sql语句,一个是用来查询某用户的导航菜单(即isMenu是1),另一个是用来查该用户的其他权限(即isMenu是0),如下:
3. 将用户的导航菜单全部查出来,并排序:
目前的menuList如下:
4. 按照前端所需的树结构存放,并将将查出来的所有权限结果过滤,将增删改等子功能放在一个单独的list(permitFunc)里:
findTree里是这样的:
/**
* 将数据库中查询到的菜单list转为菜单树list
*
* @param allMenu
* @return
*/
private Map<String, Object> findTree(List<Permission> allMenu,String userName) {
Map<String, Object> data = new HashMap<String, Object>();
try {//查询所有菜单
//根节点
List<NavigatMenuVo> rootMenu = new ArrayList<NavigatMenuVo>();
for (Permission nav : allMenu) {
NavigatMenuVo navigatMenuVo = new NavigatMenuVo();
Integer ss = nav.getPid();