发表于: 2016-12-14 23:19:13
2 2060
问君能有几多愁?恰似一江春水向东流。
今天完成的事情:
角色管理模块
角色与权限的关系:多对多
在entity实体类创建了三个类,分别是
Role(角色) 字段:id、name、status,还有一个set集合保存对应的权限。
RolePrivilegeId(角色权限的id)这个是角色和权限的中间表,字段是角色id和权限id,
RolePrivilege(角色权限)这个表只有一个字段id,因为权限的名称在一个常量类里面,因为在页面上需要显示权限的名称,作者把权限在一个类里面全部设为常量,并用一个map集合进行了封装。优点:当用到权限名称的时候直接把常量拿过来用,并做到只需要修一处控制多处的作用。当然用这些常量的时候只需要在使用的地方使用域对象设置上这个MAP集合。
在*.hbm.xml里面把角色权限表的角色id和权限id设置为联合主键,所以RolePrivilegeId需要实现serializable接口和重写hashcode、equals方法。
这个是需求页面
学习了两个功能,新增和编辑
1.点击新增进去的页面是:
在这个地方最终可以保存用户角色和对应的权限,但是角色和权限不在一张表上,角色和权限是一种多对多的关系,此处简化为一对多,即一个角色对应多个权限。在Role(角色)的实体类里面有一个set的集合保存角色对应的权限,及其getter和setter方法。在配置文件上有role和权限id的配置:
可以进行级联保存,就是可以在一个add()方法下进行角色和权限的保存,
2.点击编辑进入编辑页面(对已经保存的角色进行编辑)
需要数据回显
首先还是需要把权限的集合加载过来
ActionContext.getContext().getContextMap().put("privilegeMap", Constant.PRIVILEGE_MAP);
然后是在listUI界面跳转到editUI界面时会传入roleId,
<a href="javascript:doEdit('<s:property value='roleId'/>')">编辑</a>
根据roleId得到role对象和对应权限
if (role != null && role.getRoleId() != null) {
role = roleService.findObjectById(role.getRoleId());
//处理权限回显
if(role.getRolePrivileges() != null){
privilegeIds = new String[role.getRolePrivileges().size();//这是一个数组
int i = 0;
for(RolePrivilege rp: role.getRolePrivileges()){
privilegeIds[i++] = rp.getId().getCode();
}
}
}
对于我的情况来说,需要理解这些功能的流转情况,以及流转的时候需要传入哪些对象。也就是你得明白学到的技术怎么去应用。所以我把一些理解上有难度的流程贴过来了。
原来我的理解就是从列表页面跳转到编辑页面,进行数据回显再进行编辑
后来我把它想成从列表页面点击编辑按钮,会带着一个role_id(角色id)过去,数据回显会根据id来查找对应的角色还有权限
3.编辑完保存之后又有问题:
如果你编辑的时候改动了权限,那么等你再看的时候改动之前的权限还是存在的,也就是你去除权限没有成功,但是添加权限却成功了。
原因:hibernate将原有的值进行自动回填。
解决的方法是先删除之前的权限,在更新现在的权限。但是这种方法在企业里面肯定不适用的,可以给权限设置一个标志,当权限失效的时候可以吧标志设为false这样会更好。
遇到的问题:我发现hibernate的配置文件有点不好写,还需要多看看这些东西。
明天计划的事情:我只能晚上自习一段时间,这些总结是白天挤时间写出来的。晚上继续跟进项目。
收获:
<s:checkboxlist list="#privilegeMap" name="privilegeIds"></s:checkboxlist> 这个标签可以把集合里面的元素以复选框的形式展示出来
我认为数据库的设计非常重要,感觉收获的不少,但是讲不出来
评论