蓝云ERP系统项目笔记——权限分配(11)
1、权限系统分析与构建
1.1、需求与实现思路
(1)每个用户登陆进去看到的菜单应该取决于他们所拥有的权限,对于不同的用户,他们进入系统后看到的菜单可能是不同的。
(2)如果对每个用户都去设置权限,操作起来是非常繁琐的。实际中很多用户的权限是一样的。我们把这多个权限合起来,给它一个名称叫角色(有的系统称为“用户组”)。这样我们通过角色设置权限,即一个角色可以有多个权限(菜单项),一个权限也可以被多个角色同时拥有。在这种情况下,角色和权限之间就是典型的多对多关联
(3)每个角色包含了很多权限(菜单),那么用户指定为某种角色,即拥有该角色的权限。实际中一个用户可能同时拥有多种角色,而一个角色又包含了很多个用户。那么用户与角色之间又是典型的多对多关系。
(4)一个标准的权限系统包括哪些表呢?刚才我们提到了用户、角色、权限,这就是三张表。用户与角色的关系是多对多,对于多对多关系,我们通常会使用中间表来存储它们的关系。那么对应的角色与权限的关系,也会有中间表。因此,权限系统涉及的表就有5个了。
1.2、角色管理
代码生成器已经帮我们生成好了
1.3、建立多对多的关联
(1)角色与权限
修改Role实体类,添加属性menus,表示该角色下拥有哪些菜单权限
修改role.hbm.xml,添加多对多关联
(2)用户与角色
修改Emp(用户)实体类,添加属性roles,表示该用户拥有哪些角色
修改emp.hbm.xml文件,添加与角色多对多的关联
2、角色与权限
2.1、需求分析
2.2、认识Tree控件
2.3、代码实现
(1)Tree控件----显示菜单
构建实体类tree
查看API文档:
在erp_entity工程中创建实体类Tree
业务层实现
IRoleBiz添加接口方法readRoleMenus
RoleBiz修改:
引入MenuDao
修改Tree实体类:
添加方法实现
Action层编写
运行测试
前端编写
创建roleMenuSet.html
创建roleMenuSet.js
访问:roleMenuSet.html
(2)Tree控件-读取权限
修改IRoleBiz和RoleBiz的readRoleMenus方法,添加参数uuid为角色编号,并修改该方法:
Action修改
修改roleMenuSet.js的url
访问页面
(3)角色列表
修改页面roleMenuSet.html
效果如图:
修改roleMenuSet.js
(4)实现角色列表与树控件的联动效果
修改roleMenuSet.js
运行结果
(5)保存权限
业务层编写
给IRoleBiz添加updateRoleMenus方法与实现
Action层编写
前端编写
页面修改:
Js修改: 初始化方法中,添加
3、用户角色设置
3.1、需求分析
一个用户可以指定多个角色,实现思路与角色权限设置相同
3.2、代码实现
(1)业务层实现
在IEmpBiz中添加接口方法:
在EmpBiz中实现:
注入RoleDao
(2)修改EmpAction
(3)创建用户角色设置页面empRoleSet.html
(4)创建empRoleSet.js
4、显示权限菜单
4.1、需求及实现思路
要求:用户登陆后只显示他拥有的菜单,多对多关联查询:
涉及到的实体类:
用户 角色 菜单
5个表的查询:
根据用户ID查询该用户所拥有的菜单,多对多关联查询:
用户(EMP) => 角色(ROLE)=> 菜单(MENU)
HQL:
Select m from Emp e join e.roles r join r.menus m where e.uuid=?
4.2、代码实现
(1)根据用户编号查询菜单列表
修改IMenuDao及MenuDao,添加方法:
修改IMenuBiz及MenuBiz,添加方法getMenusByEmpuuid
修改改MenuAction,添加方法:
测试输出结果
数据为数组,且全部都是二级菜单,这种数据格式无法在页面加载成菜单
(2)根据权限显示
思路分析:
菜单clone,只复制该用户下所拥有的菜单,如果有二级菜单的话必须复制其上一级菜单。
修改MenuBiz,增加方法,用于复制Menu
增加readMenusByEmpuuid方法
修改MenuAction中的getMenuTree方法:
5、知识点总结
5.1、 多对多关联设置