一、需求分析:IUP紅軟基地
1、 頁面結構:
一般的管理系統界面,即頁面分為三個部分,上部是有關公司的圖片信息,左邊是樹形菜單,左邊是具體菜單對應的頁面。
2、 權限分析:結合客戶的意思和實際經驗,將權限分為兩部分:
1》、大權限:即控制不同角色用戶看到不同的樹形菜單,只能看到與該用戶角色對
應的菜單權限
2》、小權限:即使某幾種角色的擁有相同的左菜單權限。但是根據具體的角色再細
分,控制在菜單對應的具體頁面上有不同的增、刪、改、差權限
3、控制Session過時的人性化
二、數據庫設計:
根據以上要求,開始數據庫設計,需要五個表:用戶表、菜單樹表、角色菜單表、頁面表和子頁面表
1、 用戶表:除了包含用戶的基本信息,其中還有一列是‘Role’列,代表該用戶的角
色,或者是用戶類型
2、 菜單樹表:如下圖
其中PageName列就是菜單對應的頁面對應的類的名字,也就是頁面類名
3、 角色菜單表:應該是用戶表和菜單樹表的一個間接中間表,如下圖
該表記錄了不同的用戶類型對應的不同的菜單和菜單連接頁面的增刪改查權限,以后將根據該表來決定用戶的權限。頁面上的增刪改查按鈕的Enable屬性將與這里的表值對應
4、 頁面表和子頁面表:這里為什么說子頁面表,我這里子頁面表的定義是相對頁面表來說的,因為頁面表上有一些增刪改差按鈕,點擊這些按鈕的時候,我讓他轉到(或彈出)另一個頁面去操作,那么這些頁面就成為子頁面。如下圖:
頁面表
子頁面表
三、代碼設計與關鍵代碼實現:
根據以上需求和數據庫信息來實現系統架構設計。
1、做菜單控制比較簡單,僅僅根據sql語句選擇不同角色對應的不同樹而已。
2、控制Session人性化。由于我們不能將session過時的異常信息直接呈現給客戶,弄的客戶一頭霧水,不知所措。我們需要給客戶人性化的 提示信息。
1》 解決方案一:在每個頁面判斷session,這是可以的。但是需要我們在進入每個
頁面的時候都需要判斷,很麻煩,也容易忘記,尤其是公司一個團隊開發(fā)的時候,某個程序員難免會忘記,以造成麻煩。
2》 解決方案二:這也是我自認為最好的解決方案,如果有更好的方案,請將你的方案發(fā)到我的郵箱,我將感激不盡。
也就是我讓每個頁面都繼承一個BasePage類,而該類繼承System.Web.UI.Page。該類需要重寫基類的這個方法protected override void OnLoad(EventArgs e),這個方法的功能是在加載每個頁面前都要先執(zhí)行這個方法,一切的判斷都放在這個方法里面進行,當session過時的時候,就跳到提示頁面,否則進行其他判斷(例如頁面的增刪改查權限)然后響應瀏覽器端的請求。
3、 控制每個頁面的增刪改查權限:由于OnLoad方法的功能,我們將這個操作也放在
這里進行,并且在session沒有過時的情況下(道理很簡單,不再多說)。
1》、我們需要一個權限管理的類UserPrivilege。這個類有一個靜態(tài)字段private static DataTable tablePrivilege,它相當于一個Application類型的全局變量,當第一個用戶登陸進來后就已經初始化。它是一個表,保存了所有用戶類型對應的頁面類名字和響應的增刪改差權限,我么以后的判斷都是對這個變量進行操作。如果某個用戶修改了權限表,那么這個變量也將立即更改
2》、已經基本準備好,但是這時候OnLoad方法里應該怎樣做呢?這里要介紹一個技巧,就是怎樣在獲得派生類的名字呢?其實也很簡單,就是利用this.GetType().Name 來獲取當前成員的名字,但是這個名字與我們的頁面類名是有一點不同的,就是在我們的頁面類名字后加了個‘_aspx’后綴,這個信息對我們來說是很寶貴的,可以據此來獲得類的名字,不在介紹。根據用戶類型(用戶登錄的時候,我們已經將用戶的角色類型保存到session里了)和該頁面類的名字和UserPrivilege類中的靜態(tài)字段tablePrivilege就可以輕松獲得該用戶在該頁面的具體權限。
3》、我們如何把這個權限傳遞給具體的頁面,這時候我們需要在基類中定義一個受保護的抽象方法protected abstract void SetButtonEnable();那么繼承該類的所有頁面都必須實現這個方法,然后基類調用這個方法即可