我在测试中,发现jeecg2.0中的菜单权限控制具有缺陷,即如果某个二级菜单不选择,则一级菜单在界面上无法显示,查看程序,发现在保存角色权限时,使用的是combotree控件,当一个子树下面的叶子没有全部选择时,父级菜单不会被选中,不会保存到权限表中,这样在查询时,上级就不会被查询到。在west.jsp页面中,是判断一个菜单的cpid值=0作为一级菜单显示,这样就会存在丢失现象,根据这个现象,我再UserAction.java中的changeUserAuths方法中增加如下内容:
//获取上级auths
//判断所有的菜单,对应的顶级上级菜单(cpid=0的菜单)也存在
List<Auth> auths = sessionInfo.getAuths();
List<Auth> as = new ArrayList<Auth>();
Menu m2 = new Menu();
m2.setId("0");
List<Menu> menus = menuService.treegrid(m2);
for (Auth a:auths){
if ("0".equals(a.getCid()) || "0".equals(a.getCpid())) continue;
System.out.println("1auth "+a.getCid()+" "+a.getCname());
boolean flag = false;
for (Auth b:auths){
if (a.getCpid().equals(b.getCid())) {
flag = true;
break;
}
}
System.out.println("2auth "+a.getCid()+" "+a.getCname());
if (flag == false){
for (Menu m:menus){
if (a.getCpid().equals(m.getCid())){
boolean flag2 = true;
for (Auth t:as){
if (t.getCid().equals(m.getCid())){
flag2 = false;
break;
}
}
if (flag2 == false) break;
Auth e = new Auth();
//----------------------------
//菜单权限
e.setCid(m.getCid());
//----------------------------
e.setCname(m.getCname());
e.setCurl(m.getCurl());
e.setCiconCls(m.getCiconcls());
e.setCpid(m.getCpid());
e.setCpname("cjg");
as.add(e);
System.out.println("3auth "+e.getCid()+" "+e.getCname());
}
}
}
}
for (Auth a:as) auths.add(a);
System.out.println("get auths");
增加被丢失的一级菜单,保证菜单能正常、正确显示。