我们之前的做法是:
不管什么类型的用户登录:医院,卫生局等显示的左侧菜单都是一样的。我们在这篇文章里面就要实现不同的用户登录时显示的菜单是不同的.
我们先介绍数据库中的那几张表:那几张表和第三方系统有关。
这几张表对应的是
我们要查的是一个角色的菜单和菜单下的二级菜单:
我们先去看菜单表:
我们看到bss_sys_module就是菜单表(模块表):
这个表里面存放了一级和二级菜单。我们要把一级和二级菜单都查出来:
select m1.moduleid,m1.name,m2.moduleid menuid_two,m2.name menuname_two,m2.url from bss_sys_module m1,bss_sys_module m2 where m1.parentid='0'--保证查出来的是一级菜单 and m2.parentid!='0'--保证查出来的是二级菜单 and m2.parentid=m1.moduleid--查出一级菜单下的二级菜单
结果:
但是我我们要查的是:角色下的模块,所以最终的sql我们要这么写:
select m1.moduleid,m1.name,m2.moduleid menuid_two,m2.name menuname_two,m2.url from bss_sys_module m1,bss_sys_module m2 where m1.parentid='0'--保证查出来的是一级菜单 and m2.parentid!='0'--保证查出来的是二级菜单 and m2.parentid=m1.moduleid--查出一级菜单下的二级菜单 and m2.moduleid in( --角色范围内的菜单 select bss_sys_rolemodule.moduleid from bss_sys_role,bss_sys_rolesys,bss_sys_rolenode,bss_sys_rolemodule,bss_sys_roleoperate where bss_sys_role.roleid=bss_sys_rolesys.roleid--知道角色在哪个系统. and bss_sys_rolenode.rsid=bss_sys_rolesys.rsid--根据系统查找节点 and bss_sys_rolemodule.rnid=bss_sys_rolenode.rnid--节点下的model and bss_sys_rolemodule.rmid=bss_sys_roleoperate.rmid and bss_sys_role.roleid='A1657D9C6C7D47B59A99132A5ACE1A2E' --指定查卫生局 ) order by m1.showorder,m2.showorder
查询结果:
这就是卫生局的模块权限。
同理我们看一下供货商的菜单权限:
select m1.moduleid,m1.name,m2.moduleid menuid_two,m2.name menuname_two,m2.url from bss_sys_module m1,bss_sys_module m2 where m1.parentid='0'--保证查出来的是一级菜单 and m2.parentid!='0'--保证查出来的是二级菜单 and m2.parentid=m1.moduleid--查出一级菜单下的二级菜单 and m2.moduleid in( --角色范围内的菜单 select bss_sys_rolemodule.moduleid from bss_sys_role,bss_sys_rolesys,bss_sys_rolenode,bss_sys_rolemodule,bss_sys_roleoperate where bss_sys_role.roleid=bss_sys_rolesys.roleid--知道角色在哪个系统. and bss_sys_rolenode.rsid=bss_sys_rolesys.rsid--根据系统查找节点 and bss_sys_rolemodule.rnid=bss_sys_rolenode.rnid--节点下的model and bss_sys_rolemodule.rmid=bss_sys_roleoperate.rmid and bss_sys_role.roleid='DD5E37F61B4D4D79BE84C3B8FCEDDAF0' --指定查供货商 ) order by m1.showorder,m2.showorder
结果如下:
写好了sql 我们就要写Mapper.
这里涉及到一个问题:我们看一级菜单对应着好几个二级菜单,也就是一对多的关系,所以我们在做映射时要注意了,我们之前在学习mybatis是学习过Mybatis的一对多的查询,
我们这里就用这个方法。用resultMap .
<!-- "menus"指的是Menu类里面的属性List<menu> menus。因为在select 语句中返回了五个查询结果,我们要把 这五个返回结果一一映射好。这里就是在做映射。 column表示的是数据库里面的列,而property表示的是yycg.base.pojo.vo.menu这个类里面的属性 --> <resultMap id="findMenuByroleidResultMap" type="yycg.base.pojo.vo.Menu"> <id column="menuid" property="menuid" />----这个表示的是主键,表示menuid相同的就合并 <result column="menuname" property="menuname" /> <collection property="menus" ofType="yycg.base.vo.Menu"> <result column="menuid_two" property="menuid" /> <result column="menuname_two" property="menuname" /> <result column="url" property="url" /> </collection> </resultMap>
<!-- 根据角色获取菜单(一、二级) --> <select id="findMenuByroleid" parameterType="java.lang.String" resultMap="findMenuByroleidResultMap" > select m1.moduleid menuid, m1.name menuname, m2.moduleid menuid_two, m2.name menuname_two, m2.url from bss_sys_module m1, bss_sys_module m2 where m2.parentid = m1.moduleid and m1.parentid = '0' and m2.parentid != '0' and m2.moduleid in( <!--角色范围内的菜单 --> select bss_sys_rolemodule.moduleid from bss_sys_role,bss_sys_rolesys,bss_sys_rolenode,bss_sys_rolemodule,bss_sys_roleoperate where bss_sys_role.roleid=bss_sys_rolesys.roleid and bss_sys_rolenode.rsid=bss_sys_rolesys.rsid and bss_sys_rolemodule.rnid=bss_sys_rolenode.rnid and bss_sys_roleoperate.rmid=bss_sys_rolemodule.rmid and bss_sys_role.roleid=#{roleid} ) order by m1.showorder,m2.showorder </select>
我们写好了Dao层之后,我们来写Service层:
//取出角色id因为用户的groupid就是用户的角色id,所以可以直接从 //数据字典里面得到groupid也就是角色id String roleid=systemConfigService.findDictinfoByDictcode("s01", sysuser.getGroupid()).getRemark(); activeUser.setSysmc(sysmc); //根据角色id获取菜单 //这里涉及到一个点我们取出来的是一个list但是我们却要存在一个Menu里面 //这个怎么弄,我们再设计json时就是考虑到了这一点:menus:[ //] List<Menu> menu_list = sysuserMapperCustom.findMenuByroleid(roleid); Menu menu = new Menu(); menu.setMenus(menu_list); activeUser.setMenu(menu);//将用户菜单存入用户身份对象中
//根据角色id获取菜单
//这里在取Menu的时候,涉及到一个难点我们取出来的是一个list但是我们却要存在一个Menu里面
//这个怎么弄,我们再设计json时就是考虑到了这一点:menus:[
//]
Service写好了之后,我们来写Action.
/** * * 获得菜单菜单,并转换成json */ @RequestMapping("/usermenu") public @ResponseBody Menu usermenu(HttpServletRequest request)throws Exception { HttpSession session=request.getSession(); ActiveUser activeUser=(ActiveUser)session.getAttribute(Config.ACTIVEUSER_KEY); return activeUser.getMenu(); }
我们在浏览器的url中输入http://127.0.0.1:8080/yycgproject/usermenu.action就得到了json数据。
最后在页面上做修改:
var _menus; $(function() {//预加载方法 //通过ajax请求菜单 $.ajax({ url : '${baseurl}usermenu.action', type : 'POST', dataType : 'json', success : function(data) { _menus = data; initMenu(_menus);//解析json数据,将菜单生成 }, error : function(msg) { alert('菜单加载异常!'); } });
测试:用admin登录之后:效果如下:
只显示了超级管理员的菜单,别的菜单都不显示了。
测试通过。