我們之前的做法是:
不管什么類型的用戶登錄:醫院,衛生局等顯示的左側菜單都是一樣的。我們在這篇文章里面就要實現不同的用戶登錄時顯示的菜單是不同的.
我們先介紹數據庫中的那幾張表:那幾張表和第三方系統有關。

這幾張表對應的是

我們要查的是一個角色的菜單和菜單下的二級菜單:
我們先去看菜單表:

我們看到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登錄之后:效果如下:

只顯示了超級管理員的菜單,別的菜單都不顯示了。
測試通過。
