修改权限,包括给该角色添加权限和删除权限。
添加删除权限,此处使用jquery,调用后台Action中的方法。
初步功能性测试,代码如下:
//jquery添加删除权限(修改权限)
function permission(chk) {
var roleId = <%=roleId%>;
var menuId = chk.id;
$.get("permissionAction!grantPermission?roleId=" + roleId + "&menuId=" + menuId + "¶m=" + chk.checked, function(data, status){
});
}
Action中的方法:
/**
* 授权
*/
public void grantPermission() {
int roleId = Integer.parseInt(request.getParameter("roleId"));
int menuId = Integer.parseInt(request.getParameter("menuId"));
boolean param = Boolean.parseBoolean(request.getParameter("param"));
//角色
LinkedHashMap<String, String> orderBy = new LinkedHashMap<String, String>();
orderBy.put("roleId", "DESC");
Role role = (Role)commonQueryBean.queryAllForList(Role.class, new String[] {"roleId"}, orderBy, roleId).get(0);
Set<Menu> menuSet = role.getMenus();
if (param == true) {
//菜单
LinkedHashMap<String, String> orderBy2 = new LinkedHashMap<String, String>();
orderBy2.put("menuId", "DESC");
Menu menu = (Menu)commonQueryBean.queryAllForList(Menu.class, new String[] {"menuId"}, orderBy2, menuId).get(0);
menuSet.add(menu);
role.setMenus(menuSet);
commonModifyBean.modifyObject(role, roleId);
} else {
for (Iterator iterator = menuSet.iterator(); iterator.hasNext();) {
Menu menu2 = (Menu) iterator.next();
if (menu2.getMenuId() == menuId) {
menuSet.remove(menu2);
}
}
role.setMenus(menuSet);
commonModifyBean.modifyObject(role, roleId);
}
}
(1)ajax & jquery
ajax 即“Asynchronous JavaScript and XML”(异步JavaScript和XML)是一种技术的称呼。
jquery 封装了javascript ,实现许多现成的方法供调用,方便了开发。更有利于服务器与用户的交流。是实现ajax的 精简利器。
同样的还有extjs高度封装,比较庞大,但是减少更多的工作量。
(2)jquery的get请求,调用后台method
(3)Action授权方法编码完成,测试出现bug,Set循环时报LazyInitializationException,懒加载初始化错误。
/**
* 菜单集合
*/
@ManyToMany(cascade=CascadeType.PERSIST,fetch = FetchType.EAGER)
@JoinTable(name="T_Role_Menu",joinColumns={@JoinColumn(name="roleid",referencedColumnName="roleid")},
inverseJoinColumns={@JoinColumn(name="menuid",referencedColumnName="menuid")})
private Set<Menu> menus;
FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。
比方User类有两个属性,name跟address,登录后用户名是需要显示出来的,此属性用到的几率极大,要马上到数据库查,用急加载;而用户地址大多数情况下不需要显示出来,只有在查看用户资料是才需要显示,需要用了才查数据库,用懒加载就好了。所以,并不是一登录就把用户的所有资料都加载到对象中,于是有了这两种加载模式。
(4)完善性判断
添加子的同时添加父,删除父菜单的时候提示“存在子菜单,不能删除父菜单”。
后修改如下:
//jquery添加删除权限(修改权限)
function permission(chk) {
var roleId = <%=roleId%>;
var menuId = chk.id;
if(chk.checked == true) {
//子选父必选,添加子同时添加父
addParent(chk.value);
$.get("permissionAction!grantPermission?roleId=" + roleId + "&menuId=" + menuId + "¶m=true", function(data, status){
});
} else {
//存在子菜单,不能删除父菜单
if(!delSon(menuId)) {
chk.checked = true;
} else {
$.get("permissionAction!grantPermission?roleId=" + roleId + "&menuId=" + menuId + "¶m=false", function(data, status){
});
}
}
}
//判断是否可以删除菜单,存在子菜单则不能删除
function delSon(menuId) {
var dd = document.getElementsByName("checkbox");
for(i=0; i<dd.length; i++) {
if(menuId == dd[i].value) {
alert("请先删除子菜单!");
return false;
}
}
return true;
}
//递归,循环添加父
function addParent(chkValue) {
var pNode = document.getElementById(chkValue);
if(pNode!=null){
pNode.checked = true;
$.get("permissionAction!grantPermission?roleId=" + roleId + "&menuId=" + pNode.id + "¶m=true", function(data, status){
});
addParent(pNode.value);
}
}