標籤:class poj 實現 指定 tom custom body https 127.0.0.1
我們之前的做法是:
不管什麼類型的使用者登入:醫院,衛生局等顯示的左側菜單都是一樣的。我們在這篇文章裡面就要實現不同的使用者登入時顯示的菜單是不同的.
我們先介紹資料庫中的那幾張表:那幾張表和第三方系統有關。
這幾張表對應的是
我們要查的是一個角色的菜單和菜單下的二級菜單:
我們先去看菜單表:
我們看到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 m2where 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 m2where m1.parentid=‘0‘--保證查出來的是一級菜單and m2.parentid!=‘0‘--保證查出來的是二級菜單and m2.parentid=m1.moduleid--查出一級菜單下的二級菜單and m2.moduleidin(--角色範圍內的菜單select bss_sys_rolemodule.moduleid from bss_sys_role,bss_sys_rolesys,bss_sys_rolenode,bss_sys_rolemodule,bss_sys_roleoperatewhere 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--節點下的modeland bss_sys_rolemodule.rmid=bss_sys_roleoperate.rmidand 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 m2where m1.parentid=‘0‘--保證查出來的是一級菜單and m2.parentid!=‘0‘--保證查出來的是二級菜單and m2.parentid=m1.moduleid--查出一級菜單下的二級菜單and m2.moduleidin(--角色範圍內的菜單select bss_sys_rolemodule.moduleid from bss_sys_role,bss_sys_rolesys,bss_sys_rolenode,bss_sys_rolemodule,bss_sys_roleoperatewhere 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--節點下的modeland bss_sys_rolemodule.rmid=bss_sys_roleoperate.rmidand 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登入之後:效果如下:
只顯示了超級管理員的菜單,別的菜單都不顯示了。
測試通過。
052醫學項目-模組五:使用權限設定-實現根據使用者顯示不同的菜單