ASP.NET MVC+EF框架+EasyUI實現權限管系列html
(開篇) (1):框架搭建 (2):數據庫訪問層的設計Demo (3):面向接口編程 (4 ):業務邏輯層的封裝 web
(5):前臺Jquery easyUI實現 (6):EF上下文實例管理 (7):DBSession的封裝 (8):DBSession線程內惟一 數據庫
(9):TT摸版的學習 (10):VSS源代碼管理 (11):驗證碼實現和底層修改 (12):實現用戶異步登陸和T4模板 編程
(13):權限設計 (14):主框架搭建 (15):權限數據庫模型和用戶登陸詳細錯誤 (16):用戶註冊的各類驗證 緩存
(17):註冊用戶功能的細節處理 (18):過濾器的使用和批量刪除數據(僞刪除和直接刪除) 框架
(19):用戶信息的修改和瀏覽 (20):多條件模糊查詢和回收站還原的實現 (21):用戶角色權限基本的實現說明異步
(22):爲用戶設置角色 (23):設置角色遺留問題和EasyUI Tabs使用 ide
前言:已經有很長的一段時間沒有寫博客了,主要是這段時間生活有動盪了一下,因此一直沒有顧得過來寫,因此對那些關注我這個系列的博友們說聲對不起,原本打算中途放棄的,由於後面的東西實在很差寫,重點是說了不少,可是博友們看不明白,在好幾個類庫以及控制器和實體之間轉換致使了這樣的結果,可是本身一想幹一件事情咱們就必定要幹完,因此我會堅持寫完這個系列的,這幾天抽空出來,因此繼續咱們權限系列的步伐,但願你們可以支持我,謝謝,若是你們想去下載次項目練習版本的話,能夠去百度搜索:《ASP.NET MVC+EF框架+EasyUI實現權限管理源碼》下載學習,此版本只適用於學習,和如今寫的項目的版本基本不同,但願你們可以對比學習。學習
那麼今天咱們就開始講述權限組的實現和設計吧。網站
(1)經過前面的博客咱們已經基本上完成了項目的用戶,角色和權限的功能,那麼咱們如今纔出現了權限組,那麼咱們的權限組是用來幹什麼的呢?這裏我大體說一下,首先看如圖所示的菜單導航:
(2)如上圖所示,咱們的菜單導航是靜態寫死在HTML中的,那麼這樣的話很不利於咱們項目的維護,當咱們須要添加一個菜單導航的話,咱們只有去HTML中更改了,鑑於上面的需求,因此咱們須要將其變化成動態而且存放在數據庫中,那麼這時候咱們就建立了權限組的數據表來存放這些數據。
(1)首先菜單導航應該跟用戶關聯到一塊,這是爲何呢?由於有的用戶可能有後臺權限管理,網站基本管理欄目,而有的用戶可能沒有網站基本管理欄目,而超級管理員應該含有全部的欄目,那麼這時候咱們就想咱們的菜單導航的欄目(指的是後臺權限管理,網站基本管理,網站開發支持三個欄目分組)怎麼跟用戶和權限去關聯呢?由於菜單導航也是跟權限有關係的,那麼這時候咱們就想咱們的菜單組(權限組)怎麼去設計。
(2)根據上面的描述咱們知道了咱們菜單導航中的分組以及子類都要去存放到數據庫中,那麼咱們怎麼設計咱們的菜單導航跟權限聯繫到一塊呢?
(3)咱們知道咱們菜單導航(菜單組)裏面的數據都對應的有權限,因此咱們就要想那麼咱們的菜單組和菜單項怎麼在模型中設計出來,當咱們用戶登陸到系統的時候即可以直接拿到菜單組合菜單項的數據展現在菜單導航裏面。
(1)可能這裏我寫菜單項和菜單組的話部分人會暈,我這裏解釋一下,菜單項就是菜單組下面的子節點,好比:菜單組是後臺權限管理,而菜單項是後臺權限管理下面的子節點。
(2)這樣的話咱們下來看咱們的這個權限的模型如圖所示:
由於咱們在BasePermission表中是對菜單的整體操做,可是咱們的菜單又分爲菜單組和菜單項,因此這樣的話咱們還須要給這個模型中添加一個標識,這個標識的做用就是區分究竟是菜單組仍是菜單項,用(1,0)標識便可
(3)這樣咱們就設計完了菜單項,那麼下面咱們主要仍是討論如何創建菜單項
(1)那麼根據咱們上述的描述的話,咱們在這裏須要創建一個菜單項管理的數據庫,因此咱們主要分析一下咱們該如何創建這個菜單項的數據庫和這個數據庫和其它的之間的關係。首先我直接上Edmx模型說明這個數據庫和關係,如圖所示:
(2)這裏我首先要陳述兩點,那就是菜單組和菜單項是多對多的關係,從個人模型中能夠看出了又一箇中間表。
(3)菜單組和用戶確定也是有關係的,那麼咱們也能夠想到用戶和菜單組確定也是多對多的關係。
(4)那麼菜單組和角色之間確定也是有關係,咱們能夠想到也是多對多的關係,那麼到這裏咱們的關係就創建完畢了,整個菜單組關聯了全部的項目
(5)若是你們看這個的話我以爲應該看得很模糊,那麼我將數據庫的建立的文檔放在了CSDN上面,你們能夠去下載:下載地址是:
http://download.csdn.net/detail/hanyinglong/5862727
(1)到這裏咱們的數據庫之類的就都已經創建完畢了,至於怎麼創建的,我以爲用過edmx模型的基本都知道,那麼這個部分咱們就算是完成了,下面展現咱們這部分的內容,其實和前面的基本同樣,如圖所示:
(2)那麼下篇博客我說一下如何對這些前面所加入的驗證的東西在項目登陸的時候驗證用戶是否是沒有此權限呢。
(3)本項目以前的源碼下載地址以下:
(4)至於如何在他們的中間創建關係,你們去看個人上上篇博客是如何給他們創建關係的,咱們後續的幾個關係我也就不說了,下篇博客可能要到下週才能寫,我將些咱們如何判斷用戶登陸進來顯示的內容。
(5)後續思路的實現(這個系列就終結了,但願你們理解):
由於當時有事,因此這個系列就擱置了,後來時間長了就懶得去寫了,因此這裏給你們說一下後面的思路,如今前面因此的鋪墊都已經作完了,後面如何查詢出該有的頁面則很簡單了。
(1):首先寫一個過濾器,當用戶手動輸入網址的時候進行判斷這個網址是否該用戶容許訪問,不容許則直接跳轉黃頁,容許則直接跳轉到操做頁面
(2):而後TreeNode的實現
第一步:根據登陸的用戶查詢到角色對應的權限(權限含有頁面)
第二步:根據登陸的用戶查詢到對應的權限(權限含有頁面)
第三步:將第一步和第二步進行Union ALL去除重複則能夠直接拿到該用戶須要看到的頁面
第四步:使用遞歸TreeNode進行循環顯示便可。遞歸的用戶若是你們不會的話去百度一下一大把~~~~
(6)大部分同窗問我說我輸入地址以後如何判斷用戶是否登陸以及用戶是否有訪問該地址的權限,下面我將大綱代碼貼出來,你們看看,代碼以下:
//讀取當前用戶的Session信息 protected ExtendUserInfo UserInfo { get { //從緩存中獲取登陸的信息 return ContextHelper.GetCurrentUser(); } } protected override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); //拿到Session信息 // UserInfo = Session["UserInfo"] as ExtendUserInfo; if (UserInfo == null) { Response.Redirect("/Login/Index"); } //判斷路勁某我的是否可以訪問:構造查詢判斷登陸的用戶可以訪問此時刷新的路勁 }
/// <summary> /// 執行SQL對象返回受影響的行數 /// </summary> /// <param name="strSql">SQL語句</param> /// <param name="parameters">參數</param> /// <returns></returns> public int ExcuteSql(string strSql, object[] parameters) { return EFContextFactory.GetCurrentDbContext().Database.ExecuteSqlCommand(strSql, parameters); } /// <summary> /// 執行SQL對象,返回查詢到的實體集合 /// </summary> /// <typeparam name="T">返回的實體集合</typeparam> /// <param name="strSql">SQL語句</param> /// <param name="parameters">傳遞的參數</param> /// <returns></returns> public IQueryable<T> ExecuteSql<T>(string strSql, object[] parameters) { return EFContextFactory.GetCurrentDbContext().Database.SqlQuery<T>(strSql, parameters).AsQueryable(); } /// <summary> /// 執行SQL對象,返回查詢到的實體集合 /// </summary> /// <typeparam name="T">返回的實體集合</typeparam> /// <param name="strSql">SQL語句</param> /// <returns></returns> public IQueryable<T> ExecuteSql<T>(string strSql) { return EFContextFactory.GetCurrentDbContext().Database.SqlQuery<T>(strSql).AsQueryable(); } /// <summary> /// 執行存儲過程,返回查詢到的實體集合 /// </summary> /// <typeparam name="T">返回的實體集合</typeparam> /// <param name="procSql">存儲過程</param> /// <param name="parameters">參數</param> /// <returns></returns> public IQueryable<T> ExexuteProc<T>(string procSql, object[] parameters) { return EFContextFactory.GetCurrentDbContext().Database.SqlQuery<T>(procSql, parameters).AsQueryable(); } /// <summary> /// 執行存儲過程,返回查詢到的實體集合 /// </summary> /// <typeparam name="T">返回的實體集合</typeparam> /// <param name="procSql">存儲過程</param> /// <returns></returns> public IQueryable<T> ExexuteProc<T>(string procSql) { return EFContextFactory.GetCurrentDbContext().Database.SqlQuery<T>(procSql).AsQueryable(); } /// <summary> /// 執行SQL對象返回受影響的行數 /// </summary> /// <param name="procSql">SQL語句</param> /// <param name="parameters">參數</param> /// <returns></returns> public int ExcuteProc(string procSql, object[] parameters) { return EFContextFactory.GetCurrentDbContext().Database.ExecuteSqlCommand(procSql, parameters); }
(1):完整源碼下載
Kencery返回本系列開篇