ASP.NET MVC+EF框架+EasyUI實現權限管系列
(開篇) (1):框架搭建 (2):數據庫訪問層的設計Demo (3):面向接口編程 (4 ):業務邏輯層的封裝
(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):用戶角色權限基本的實現說明
前言: 這個系列的博客已經半個月沒寫了,這半個月一直在忙其他的事情,這里對那些關注我項目進度的人說聲對不起,讓你們久等了,但是寫到這里的話我們的項目已經基本差不多完成了,后面就剩下一少部分內容需要我們完善一下,現在開始我們繼續將這個系列完成,爭取能夠在這個月月底之前完成,今天我們就要說一下為用戶設置角色,因為我們是權限系統,所以每個用戶都會對應的有相應的角色。
1.為用戶設置角色
(1)在權限系統中,用戶表和角色表本來就是多對多的關系,所以我們這里要為一個用戶設置角色,和角色也可以對應的有多個用戶,這里我們為用戶設置角色的思路如下
(2)首先,我們為用戶設置角色的話,添加一個設置角色的按鈕,然后當我我們單擊按鈕的時候只能確定給一個用戶設置角色,如果選擇了多個的話則提示錯誤,然后我們就可以打開一個頁面,頁面上面則會循環顯示出來所有的角色信息供用戶選擇,說到這里想必大家清楚了思路,那么請看實現的效果如圖所示:

(3)如上圖所示,就是我們給用戶設置角色的頁面,那么下面我們開始討論它的實現思路以及主要的代碼實現,下面我們開始說明這個的實現思路。
2.為用戶設置角色頁面實現
(1)首先我們實現當我們單擊設置角色的時候只能選擇一個選項並且彈出層的思路,這里我們使用另外一種彈出層的思路,也就是直接彈出一個頁面而不是一個div,那么下面我們就詳細的論述這個實現。
(2)首先我們添加一個設置角色的按鈕,這個的代碼就不寫了,和以前的增刪改查一樣,然后在設置角色的代碼中實現為用戶設置角色的方法,SetUserRole(),
那么這個方法的代碼如下所示(View層下面的UserInfo文件夾下的Index.cshtml):
1 //設置用戶角色 2 3 function SetUserRole() { 4 5 var rows = $("#test").datagrid("getSelections"); 6 7 if (rows.length != 1) { 8 9 $.messager.alert('提示消息', '必須選擇一條用戶信息!'); 10 11 return; 12 13 } 14 15 //處理彈出設置角色的對話框 16 17 $("#DivSetUserRole").dialog('open').dialog('setTitle', '給用戶設置角色'); 18 19 //將彈出的框里面的東西設置到為用戶設置角色的頁面 frameSetRole 20 21 $("#frameSetRole").attr("src", "/UserInfo/SetRole/" + rows[0].ID); 22 23 } 24 25 <!------------------------設置用戶角色信息----------------------------------> 26 27 <div id="DivSetUserRole" class="easyui-dialog" style="width:500px;height:380px;padding:10px 20px" closed="true" 28 29 resizable="true" modal="true"> 30 31 <iframe id="frameSetRole" src="/welcome.html" scrolling="no" frameborder="0" width="100%" height="100%"> 32 33 </iframe> 34 35 </div>
注釋:上述代碼中實現了提示我們只能選擇一條信息,並且彈出層的信息,而且指向了我們的彈出層的路徑的實現,
(3)從上面的指向我們可以看出src的屬性指向了UserInfo控制器下面的SetRole方法,那么UserInfo控制器下面的SetRole方法的實現,代碼中都詳細的寫了注釋,我在這里就不再多說了,大家看看就都明白了,代碼如下所示:
1 /// <summary> 2 3 /// 為用戶設置角色 4 5 /// </summary> 6 7 /// <param name="ID">獲取當前選擇的用戶的ID</param> 8 9 /// <returns>返回根據這個ID查到的用戶信息</returns> 10 11 public ActionResult SetRole(int ID) 12 13 { 14 15 var currentSetRoleUser = _userInfoService.LoadEntities(c => c.ID == ID).FirstOrDefault(); 16 17 //把當前要設置角色的用戶傳遞到前台 18 19 ViewData.Model = currentSetRoleUser; 20 21 //前台需要所有的角色的信息,這時候我們就需要引用到所有的角色信息,便要定義角色類型 22 23 //得到枚舉中的沒有被刪除的信息 24 25 int deleteNorMal = (int)DeletionStateCodeEnum.Normal; 26 27 var allRoles = _roleInfoService.LoadEntities(c => c.DeletionStateCode == deleteNorMal).ToList(); 28 29 //動態的MVC特性,傳遞角色的全部信息 30 31 ViewBag.AllRoles = allRoles; 32 33 //往前台傳遞用戶已經關聯了的角色信息 34 35 ViewBag.ExtIsRoleIDS = (from r in currentSetRoleUser.R_UserInfo_Role //當前用戶和角色中間表的集合數據 36 37 select r.RoleID).ToList(); 38 39 return View(); 40 41 }
(4).當我們實現了上述代碼的時候,這時候我們就需要為SetRole方法添加視圖,來顯示我們查到的用戶信息,角色信息,以及用戶和角色的關聯信息,那么添加視圖的過程如下,首先我們在SetRole方法上面右鍵添加視圖,然后在里面我們直接選擇創建強類型的視圖,選擇一定的信息之后,如圖所示:

(5).最后就會得到我們選擇的這個用戶的信息,但是因為這個只是簡單的得到我們所傳遞到前台的用戶的信息,所以這里我們還需要修改前台HTML的代碼,得到用戶信息,角色信息和用戶角色的關系,然后使用MVC自帶的發送異步請求的方法給后台發送設置角色的異步方法,如圖所示:
1 <body> 2 3 <div> 4 5 <fieldset> 6 7 <legend>給用戶:<font size="5px" color="blue">@Model.UserName </font>設置角色</legend> 8 9 @{ 10 11 //設置角色發送異步請求 12 13 using(Ajax.BeginForm("SetRole","UserInfo",new AjaxOptions {OnSuccess="afterSetRole"},new {id="frmSetRole"})) 14 15 { 16 17 //隱藏域,用來給后台傳遞用戶的ID 18 19 <input type="hidden" name="HideUserID" value="@Model.ID" /> 20 21 var allRoles=(List<LYZJ.UserLimitMVC.Model.BaseRole>)ViewBag.AllRoles; 22 23 //那到前台傳遞過來的是否選中的數據 24 25 var extIsRoleIds=( List<int>)ViewBag.ExtIsRoleIDS; 26 27 28 29 for (int i = 0; i < allRoles.Count; i++) 30 31 { 32 33 //拼接出來選中的ID傳遞到后台去 34 35 if(i==3) 36 37 { 38 39 <br /><br /> 40 41 } 42 43 string roleStr = "sru_" + allRoles[i].ID; 44 45 <!-- 判斷當前角色有沒有加入到當前用戶里面去,如果加進去默認是選中,否則默認沒選中 --> 46 47 if(extIsRoleIds.Contains(allRoles[i].ID)) 48 49 { 50 51 <input type="checkbox" checked="checked" value="@roleStr" name="@roleStr" /> 52 53 } 54 55 else 56 57 { 58 59 <input type="checkbox" name="@roleStr" value="@roleStr" /> 60 61 } 62 63 <label for="@roleStr">@allRoles[i].Realname</label><span> </span> 64 65 } 66 67 <br /><br /> 68 69 <div style="text-align:center;"> 70 71 <input type="submit" value="設置角色" /> 72 73 </div> 74 75 } 76 77 } 78 79 </fieldset> 80 81 </div> 82 83 </body>
(6)在上述代碼中我們使用了MVC發送異步請求到控制器中去執行方法,所以我們需要引入MVC中執行異步請求的Jquery庫,如下所示:
1 <!--添加發送異步請求到后台的引用,MVC實現--> 2 3 <script src="@Url.Content("~/Content/JqueryEasyUI/jquery-1.8.0.min.js")"></script> 4 5 <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script> 6 7 <script type="text/javascript"> 8 9 function afterSetRole() { 10 11 //調用父容器的一個方法,關閉對話框 12 13 window.parent.afterSetRole(); 14 15 } 16 17 </script>
注解:在這里我們寫了JavaScript中的方法afterSetRole,它調用了父容器中德afterSetRole方法,父容器是UserInfo控制器下面的Index.cshtml,代碼如下:
1 //設置角色成功之后執行的方法 2 3 function afterSetRole() { 4 5 $.messager.alert("提示信息", "設置角色成功"); 6 7 $("#DivSetUserRole").dialog('close'); 8 9 }
(7).根據上面的HTML代碼(SetRole.cshtml),我們使用了MVC封裝的發送異步請求的方法給控制器(UserInfo控制器)發送了一個HTTPPost的SetRole方法來給用戶設置角色,這里我們在控制器中的SetRole方法的代碼如下:
1 /// <summary> 2 3 /// 給用戶設置角色 4 5 /// </summary> 6 7 /// <returns></returns> 8 9 [HttpPost] 10 11 public ActionResult SetRole() 12 13 { 14 15 //首先獲取設置角色的用戶ID,查詢出用戶的信息 16 17 int userID = Request["HideUserID"] == null ? 0 : int.Parse(Request["HideUserID"]); 18 19 var currentSetUser = _userInfoService.LoadEntities(c => c.ID == userID).FirstOrDefault(); 20 21 if (currentSetUser != null) 22 23 { 24 25 //給當前用戶設置角色,從前台拿到所有的 角色 sru_3,從請求的表單里面拿到所有的以sru_開頭的key。 26 27 //第一種方法 28 29 //foreach (var allKey in Request.Form.AllKeys) 30 31 //{ 32 33 //} 34 35 //第二種寫法 36 37 var allKeys = from key in Request.Form.AllKeys 38 39 where key.StartsWith("sru_") 40 41 select key; 42 43 //首先頂一個list集合存放傳遞過來的key,也就是角色的ID 44 45 List<int> roleIDs = new List<int>(); 46 47 //循環將角色的ID加入到集合中 48 49 if (userID > 0) 50 51 { 52 53 foreach (var key in allKeys) 54 55 { 56 57 roleIDs.Add(int.Parse(key.Replace("sru_", ""))); 58 59 } 60 61 } 62 63 _userInfoService.SetBaseUserRole(userID, roleIDs,Session["UserInfo"] as BaseUser); 64 65 } 66 67 return Content("OK"); 68 69 }
(8).根據上述代碼我們可以看到在上面代碼中我們重寫了一個方法SetBaseUserRole方法,這個方法的實現以及怎么書寫我在前面都已經說過了類似的東西了,所以這里我只是貼出來它的實現代碼,代碼如下:
1 /// <summary> 2 3 /// 執行對用戶設置角色的封裝 4 5 /// </summary> 6 7 /// <param name="userID">用戶ID</param> 8 9 /// <param name="roleIDs">角色集合的ID</param> 10 11 /// <param name="userInfo">傳遞過去用戶登錄的session</param> 12 13 /// <returns>返回是否執行成功的標志</returns> 14 15 public bool SetBaseUserRole(int userID, List<int> roleIDs, BaseUser userInfo) 16 17 { 18 19 //首先根據傳遞過來的userID判斷用戶是否存在 20 21 var currentUserInfo = _DbSession.BaseUserRepository.LoadEntities(c => c.ID == userID).FirstOrDefault(); 22 23 if (currentUserInfo == null) 24 25 { 26 27 return false; 28 29 } 30 31 //首先獲取到角色表中的所有信息返回 32 33 var listRoles = currentUserInfo.R_UserInfo_Role.ToList(); 34 35 foreach (var t in listRoles) 36 37 { 38 39 _DbSession.R_User_RoleRepository.DeleteEntity(t); 40 41 } 42 43 //真正的刪除了這個用戶下面的所有的數據 44 45 _DbSession.SaveChanges(); 46 47 //然后重新給這個用戶賦予權限 48 49 foreach (var roleID in roleIDs) 50 51 { 52 53 //給用戶批量插入角色,在中間表中,這里需要改成一個批量提交添加數據的 54 55 var rUserInfoRole = new R_User_Role 56 57 { 58 59 RoleID = roleID, 60 61 UserID = userID, 62 63 CreateOn = DateTime.Parse(DateTime.Now.ToString()) 64 65 }; 66 67 var user = userInfo; 68 69 rUserInfoRole.CreateUserID = user.Code; 70 71 rUserInfoRole.CreateBy = user.UserName; 72 73 _DbSession.R_User_RoleRepository.AddEntity(rUserInfoRole); 74 75 } 76 77 //執行真正的添加 78 79 _DbSession.SaveChanges(); 80 81 return true; 82 83 }
3.為用戶設置角色完成
(1)通過上述代碼我們實現了為用戶設置角色,雖然還有點小Bug,但是我們的功能基本都實現了,我們可以很容易的為用戶設置角色,一些bug的修改我們在后面還會再次的說明,樣例如圖所示:

(2)如圖所示,當我們單擊確定之后可以實現設置角色,然后我們再次打開的時候角色已經設置成功,樣子如上圖所示。
4.小結
(1)這篇博客我們基本都在說明為用戶設置角色的實現效果,文章寫的稍微有點亂,大家如果對照代碼看的話我覺得應該沒什么難度,希望關注這個系統的朋友能夠對我現在所實現的功能給出一些建議,我在這里謝謝大家了。
(2)另外為用戶設置角色,為權限設置角色的實現效果一樣,我也在這里就不多說如何為權限設置角色了。
(3)最后我們感謝大家的閱讀,希望大家在以后的學習中能夠更加的進步,謝謝大家了。
源碼下載
(1):完整源碼下載
Kencery返回本系列開篇
