如果想要獲取相關的源碼,筆記,和相關工具,對項目需求的二次開發,可以關注我并私信!!!
四 權限管理(用戶授權)的應用:根據用戶的角色顯示不同用戶的權限菜單
經過上面的與第三方系統的成功的接入,而且在“角色管理”菜單中也對需要授權的角色進行了授權--->給一級菜單和二級菜單授權給了衛生室,那么,接下來就需使用衛生室登錄系統,看看頁面中的導航菜單中是否顯示了添加的一級菜單和二級菜單導航菜單!
簡單說,本節中所要實現的功能是:驗證用戶的權限菜單!就是使用不同的用戶登錄系統,并根據用戶的角色獲取他的權限菜單,并在左側頁面中的導航欄中顯示!
即:根據不同用戶的登錄來顯示不同用戶的菜單!
舉例來說:使用衛生局和衛生室兩個角色分別登錄系統,在導航欄中的權限菜單的顯示也是不同的!
因此,first.jsp頁面中發送的請求中的Menu.json文件可以不需要了!同時,本節的內容需要和第7節的內容分步來實現權限管理的應用的!
該節內容總結就是:
用戶登錄成功后,根據用戶所屬的角色來從數據庫中查出用戶的菜單權限,然后將菜單權限存儲至session中,從而實現不同的用戶登錄,顯示出不同的菜單!
因此,也可以說菜單權限屬于粗顆粒度的權限管理范疇!
1 DAO
1.1 sql語句的編寫(有難度)
再次強調:在寫sql語句之前,必須要對這9張表之間的關系爛熟于心:
這9張表之間的關系可以參考“第三方用戶授權系統表關系.xlsx”文件,或者參考“本系統的權限管理模型”一節中的內容和視頻!!
需求:根據用戶角色獲取該角色下所有的一級和二級菜單。注意:是所有的一級和二級菜單,而不是某個一級菜單下的二級菜單!這樣做是為了節省性能。
主查詢表:權限菜單表bss_sys_module表可以查看所有的一級菜單和二級菜單,它是一個樹形結構。其中parentid字段值為0表示一級菜單,而parentid的值中不為0的都是二級菜單,并且,所有的二級菜單中都有url鏈接地址.
如下圖:
關聯查詢表:角色表、角色系統關系表、角色節點關系表、角色菜單關系表、角色操作關系表。
--查詢某個衛生室下的所有一級和二級菜單 select m1.moduleid menuid, m1.name menuname, m2.moduleid menuid_two, --之所以別名是menuid_two,而不是menuid.是因為mybatis對于結果集中兩個相同的menuid字段是無法實現映射的,雖然這兩個字段的內容相同,但是字段名稱絕對不可以相同。 m2.name menuname_two, m2.url --這里設定m1中存放的是所有的一級菜單,m2中存放的是所有的二級菜單 from bss_sys_module m1, bss_sys_module m2 --自連接條件 where m2.parentid = m1.moduleid and m1.parentid = '0' --表示所有的一級菜單 and m2.parentid != '0' --表示所有的二級菜單 --該條件用來限定某個角色下所有的二級菜單,因此,范圍在m2.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 and bss_sys_roleoperate.rmid = bss_sys_rolemodule.rmid ---假設角色id是衛生室 and bss_sys_role.roleid = '511A6F41419949C38122A94310DADD14') order by m1.showorder, m2.showorder ---排序,showorder字段是排序字段 |
1.2 VO類的定義
VO的定義--->Menu.java
其中定義的:List<Menu> meus屬性中存儲的是二級菜單。
這Menu類中屬性的定義就是一對多的結構定義。(牢記)!
之所以單獨定義一個Menu類,是為了方便直接轉換成json格式的數據,因為頁面中的權限菜單需要使用JSON格式的數量來顯示(這是該系統的開發規范之一)!
(可以參考下面的FirstAction類中的獲取菜單方法usermenu()方法會使用到).
1.3 mapper映射文件的定義(一對多查詢)
因為是一對多的映射,即:一個用戶(角色)對應多個權限菜單,所以必須使用resultMap實現映射。
關于該映射文件中各個屬性的含義,請參考“mybatis的高級知識.doc”文檔!!!!
在SysuserMapperCustom.xml映射文件中添加如下內容:顏色加深加粗的都是添加的內容。
<!-- 一對多映射 -->
<resultMap id="findMenuByroleidResultMap" type="yycg.base.pojo.vo.Menu">
<!-- column=”menuid”表示唯一的數據庫查詢語句中的主鍵。因為在sql語句的結果集中,mybatis會自動把結果集中的menuid主鍵字段相同的記錄進行合并 。-->
<id column=