ASP.NET MVC+EF框架+EasyUI實現權限管系列javascript
(開篇) (1):框架搭建 (2):數據庫訪問層的設計Demo (3):面向接口編程 (4 ):業務邏輯層的封裝 html
(5):前臺Jquery easyUI實現 (6):EF上下文實例管理 (7):DBSession的封裝 (8):DBSession線程內惟一 java
(9):TT摸版的學習 (10):VSS源代碼管理 (11):驗證碼實現和底層修改 (12):實現用戶異步登陸和T4模板 jquery
(13):權限設計 (14):主框架搭建 (15):權限數據庫模型和用戶登陸詳細錯誤 (16):用戶註冊的各類驗證 web
(17):註冊用戶功能的細節處理 (18):過濾器的使用和批量刪除數據(僞刪除和直接刪除) ajax
(19):用戶信息的修改和瀏覽 (20):多條件模糊查詢和回收站還原的實現 (21):用戶角色權限基本的實現說明數據庫
前言: 這個系列的博客已經半個月沒寫了,這半個月一直在忙其餘的事情,這裏對那些關注我項目進度的人說聲對不起,讓大家久等了,可是寫到這裏的話咱們的項目已經基本差很少完成了,後面就剩下一少部份內容須要咱們完善一下,如今開始咱們繼續將這個系列完成,爭取可以在這個月月底以前完成,今天咱們就要說一下爲用戶設置角色,由於咱們是權限系統,因此每一個用戶都會對應的有相應的角色。編程
1.爲用戶設置角色session
(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返回本系列開篇