【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(9) 角色管理,分配許可權
阿新 • • 發佈:2019-01-18
索引
簡述
今天我們來做角色的管理 和 角色許可權分配
專案準備
我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5
希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。
專案開始
一、新建角色控制器 RoleController 同樣繼承 BaseController
首先,我們來宣告一下需要的介面(注意 xml配置注入 前面文章有詳細步驟 這裡不解釋了)
1、然後我們來修改一下檢視Index ,新增許可權控制
1 [UserAuthorizeAttribute(ModuleAlias = "Role", OperaAction = "View")] 2 public ActionResult Index() 3 { 4 5 return View(); 6 7 }
2、我們來處理一下查詢引數 角色我們是分系統的,所以前臺會有一個系統的選擇,還有關鍵字查詢(這個我們通過BaseController 來傳遞,我們這裡只是定義一個引數傳給檢視,讓搜尋過的關鍵字在文字框中顯示)
先給大家看一下前臺的頁面效果
1 /// <summary>2 /// 載入主頁 3 /// </summary> 4 /// <returns></returns> 5 [UserAuthorizeAttribute(ModuleAlias = "Role", OperaAction = "View")] 6 public ActionResult Index() 7 { 8 try 9 { 10 #region 處理查詢引數 1112 //系統ID 13 string System = Request.QueryString["System"]; 14 ViewData["System"] = System; 15 16 //搜尋的關鍵字(用於輸出給前臺的Input顯示) 17 ViewBag.Search = base.keywords; 18 #endregion 19 20 //輸出使用者所擁有的系統列表到檢視頁 21 ViewData["Systemlist"] = this.SystemManage.LoadSystemInfo(CurrentUser.System_Id); 22 23 //輸出分頁查詢列表 24 return View(BindList(System)); 25 } 26 catch (Exception e) 27 { 28 WriteLog(Common.Enums.enumOperator.Select, "載入角色列表:", e); 29 throw e.InnerException; 30 } 31 }
3、我們待會做檢視頁的時候在處理 ViewData["System"]、ViewData["Systemlist"]和ViewBag.Search
我們先來處理一下 輸出列表 BindList(System) ,新建一個私有方法 private Common.PageInfo BindList(string system) 輸出結果為 Common.PageInfo
1 /// <summary> 2 /// 分頁查詢角色列表 3 /// </summary> 4 private Common.PageInfo BindList(string system) 5 { 6 7 }
4、首先預載入一下基礎資料
1 //基礎資料 2 var query = this.RoleManage.LoadAll(null);
5、傳遞的系統ID(正常來說 如果傳入系統ID 那麼就查詢系統下的角色,如果沒有傳遞就查詢全部系統角色,但是我們這個是分系統控制的,所以,當沒有系統ID傳入的時候,我們查詢使用者可操作的系統的角色)
1 //系統 2 if(!string.IsNullOrEmpty(system)) 3 { 4 int SuperAdminId = Common.Enums.ClsDic.DicRole["超級管理員"]; 5 query = query.Where(p => p.FK_BELONGSYSTEM == system || p.ISCUSTOM == true); 6 } 7 else 8 { 9 query = query.Where(p => this.CurrentUser.System_Id.Any(e => e == p.FK_BELONGSYSTEM)); 10 }
6、關鍵字的查詢(這個keywords是通過BaseController傳遞的)
1 //查詢關鍵字 2 if (!string.IsNullOrEmpty(keywords)) 3 { 4 query = query.Where(p => p.ROLENAME.Contains(keywords)); 5 }
7、排序 分頁
1 //排序 2 query = query.OrderByDescending(p => p.CREATEDATE); 3 //分頁 4 var result = this.RoleManage.Query(query, page, pagesize);
8、要展示的檢視內容
1 var list = result.List.Select(p => new 2 { 3 //以下是檢視需要展示的內容,加動態可迴圈 4 p.CREATEDATE, 5 p.ROLENAME, 6 p.ROLEDESC, 7 USERNAME = p.CREATEPERID, 8 p.ID, 9 SYSNAME = SystemManage.Get(m=>m.ID==p.FK_BELONGSYSTEM).NAME, 10 ISCUSTOMSTATUS = p.ISCUSTOM ? "<i class=\"fa fa-circle text-navy\"></i>" : "<i class=\"fa fa-circle text-danger\"></i>" 11 }).ToList();
9、返回分頁內容列表
1 return new Common.PageInfo(result.Index, result.PageSize, result.Count, Common.JsonConverter.JsonClass(list));
10、完整的方法
1 /// <summary> 2 /// 分頁查詢角色列表 3 /// </summary> 4 private Common.PageInfo BindList(string system) 5 { 6 //基礎資料 7 var query = this.RoleManage.LoadAll(null); 8 //系統 9 if(!string.IsNullOrEmpty(system)) 10 { 11 int SuperAdminId = Common.Enums.ClsDic.DicRole["超級管理員"]; 12 query = query.Where(p => p.FK_BELONGSYSTEM == system || p.ISCUSTOM == true); 13 } 14 else 15 { 16 query = query.Where(p => this.CurrentUser.System_Id.Any(e => e == p.FK_BELONGSYSTEM)); 17 } 18 //查詢關鍵字 19 if (!string.IsNullOrEmpty(keywords)) 20 { 21 query = query.Where(p => p.ROLENAME.Contains(keywords)); 22 } 23 //排序 24 query = query.OrderByDescending(p => p.CREATEDATE); 25 //分頁 26 var result = this.RoleManage.Query(query, page, pagesize); 27 28 var list = result.List.Select(p => new 29 { 30 //以下是檢視需要展示的內容,加動態可迴圈 31 p.CREATEDATE, 32 p.ROLENAME, 33 p.ROLEDESC, 34 USERNAME = p.CREATEPERID, 35 p.ID, 36 SYSNAME = SystemManage.Get(m=>m.ID==p.FK_BELONGSYSTEM).NAME, 37 ISCUSTOMSTATUS = p.ISCUSTOM ? "<i class=\"fa fa-circle text-navy\"></i>" : "<i class=\"fa fa-circle text-danger\"></i>" 38 }).ToList(); 39 40 return new Common.PageInfo(result.Index, result.PageSize, result.Count, Common.JsonConverter.JsonClass(list)); 41 }View Code
11、我們進入檢視頁
首先接收一下 分頁列表內容
1 @{ 2 Layout = "~/Views/Shared/_Layout.cshtml"; 3 } 4 @model Common.PageInfo
12、標題和許可權標籤
1 <div class="ibox-title"> 2 <h5>角色管理</h5> 3 <div class="ibox-tools"> 4 <a class="btn btn-primary btn-xs p210" id="insert" action="add"><i class="fa fa-plus-circle fa-fw"></i> 建立新角色</a> 5 <a class="btn btn-warning btn-xs p210" id="modify" action="edit"><i class="fa fa-pencil fa-fw"></i> 編輯</a> 6 <a class="btn btn-danger btn-xs p210" id="delete" action="remove"><i class="fa fa-trash-o fa-fw"></i> 刪除</a> 7 <a class="btn btn-info btn-xs p210" id="permission" action="allocation"><i class="fa fa-sheqel fa-fw"></i> 分配許可權</a> 8 <a class="reload-link" style="color: #c4c4c4" href="javascript:dig.reload()" data-toggle="tooltip" data-placement="left" title="重新整理"> 9 <i class="fa fa-repeat fa-lg"></i> 10 </a> 11 </div> 12 </div>
13、然後我們建立個查詢表單,當用戶切換系統或輸入關鍵字查詢的時候,重新獲取資料
14、輸出角色列表(這裡做了個判斷,因為超級管理員是我們內建角色,我們不允許使用者修改)
15、分頁
16、新增修改刪除等 Js方法
1 @section scripts{ 2 <script type="text/javascript"> 3 $(function () { 4 //新增新角色 5 $("#insert").click(function () { 6 dig.addPage("新增新角色", "/Sys/role/detail?systemId=" + $("#System").val(), 600, 450, function () { 7 if (this.returnValue == 'yes') { 8 location.reload(); 9 } 10 }); 11 }); 12 //列表選擇修改 13 $('#modify').click(function () { 14 var vals = ''; 15 var num = 0; 16 $('input[name="checkbox_name"]:checked').each(function () { 17 vals = $(this).val(); 18 num++; 19 }); 20 if (!vals) { 21 dig.error("對不起,請選中您要操作的記錄!"); 22 return; 23 } 24 if (num > 1) { 25 dig.error("對不起,每次只能修改一條記錄!"); 26 return; 27 } 28 dig.addPage("編輯角色", "/Sys/role/detail/" + vals, 600, 450, function () { 29 if (this.returnValue == 'yes') { 30 location.reload(); 31 } 32 }); 33 }); 34 //分配許可權 35 $('#permission').click(function () { 36 var vals = ''; 37 var num = 0; 38 $('input[name="checkbox_name"]:checked').each(function () { 39 vals = $(this).val(); 40 num++; 41 }); 42 if (!vals) { 43 dig.error("對不起,請選中您要操作的記錄!"); 44 return; 45 } 46 if (num > 1) { 47 dig.error("對不起,每次只能給一個角色分配許可權!"); 48 return; 49 } 50 dig.addPage('分配許可權', '/Sys/Permission/PerAllocation/?id=' + vals + '&tp=role', 1000, 500, function () { 51 if (this.returnValue == 'yes') { 52 location.reload(); 53 } 54 }); 55 }); 56 }); 57 //跳轉修改 58 function EditRole(n) { 59 dig.addPage("編輯角色", "/Sys/role/detail/" + n, 600, 450, function () { 60 if (this.returnValue == 'yes') { 61 location.reload(); 62 } 63 }); 64 } 65 </script> 66 }View Code
二、新增模組和許可權
1、這樣我們的角色管理首頁列表就完成了,我們前面已經做完了模組管理和許可權管理,我們來新增一下模組
模組管理 → 新增新模組(選擇上級模組 系統管理)或直接點選 系統管理的 [新增子模組] ,注意模組別名
2、新增完模組後,我們重新整理頁面發現沒有展示出來,那是因為還沒有許可權,我們來新增一下許可權
選擇左側角色管理後,我們直接點選初始化許可權,來初始化基本的許可權
3、角色還有個功能就是 為角色分配許可權,所以 我們要新增 擴充套件許可權 - 分配許可權
好了,我們重新進入我們的系統,是不是列表出來了,相應的操作按鈕也都出現了
三、新增修改角色
新增修改儲存這些在前面我們講的很詳細了,都是一個操作方法,我直接把程式碼貼出來,有些注意的地方 我做了註釋
1 /// <summary> 2 /// 載入詳情 3 /// </summary> 4 /// <returns></returns> 5 [UserAuthorizeAttribute(ModuleAlias = "Role", OperaAction = "Detail")] 6 public ActionResult Detail(int? id) 7 { 8 var _entity = new Domain.SYS_ROLE() { ISCUSTOM = false }; 9 10 if(id!=null && id>0) 11 { 12 _entity = RoleManage.Get(p => p.ID == id); 13 } 14 else 15 { 16 if(!string.IsNullOrEmpty(Request.QueryString["systemId"])) 17 { 18 _entity.FK_BELONGSYSTEM = Request.QueryString["systemId"]; 19 } 20 } 21 22 ViewData["Systemlist"] = this.SystemManage.LoadSystemInfo(CurrentUser.System_Id); 23 24 return View(_entity); 25 } 26 /// <summary> 27 /// 儲存角色 28 /// </summary> 29 [UserAuthorizeAttribute(ModuleAlias = "Role", OperaAction = "Add,Edit")] 30 public ActionResult Save(Domain.SYS_ROLE entity) 31 { 32 bool isEdit = false; 33 var json = new JsonHelper() { Msg = "儲存成功", Status = "n" }; 34 try 35 { 36 if (entity != null) 37 { 38 //判斷角色名是否漢字 39 if (System.Text.RegularExpressions.Regex.IsMatch(entity.ROLENAME.Trim(), "^[\u4e00-\u9fa5]+$")) 40 { 41 if (entity.ROLENAME.Length > 36) 42 { 43 json.Msg = "角色名稱最多隻能能包含36個漢字"; 44 return Json(json); 45 } 46 47 //新增 48 if (entity.ID <= 0) 49 { 50 entity.CREATEDATE = DateTime.Now; 51 entity.CREATEPERID = this.CurrentUser.Name; 52 entity.UPDATEDATE = DateTime.Now; 53 entity.UPDATEUSER = this.CurrentUser.Name; 54 } 55 else //修改 56 { 57 entity.UPDATEDATE = DateTime.Now; 58 entity.UPDATEUSER = this.CurrentUser.Name; 59 isEdit = true; 60 } 61 //判斷角色是否重名 62 if (!this.RoleManage.IsExist(p => p.ROLENAME == entity.ROLENAME && p.ID != entity.ID)) 63 { 64 if (isEdit) 65 { 66 //系統更換 刪除所有許可權 67 var _entity = RoleManage.Get(p => p.ID == entity.ID); 68 if (_entity.FK_BELONGSYSTEM != entity.FK_BELONGSYSTEM) 69 { 70 RolePermissionManage.Delete(p => p.ROLEID == _entity.ID); 71 } 72 } 73 if (RoleManage.SaveOrUpdate(entity, isEdit)) 74 { 75 json.Status = "y"; 76 } 77 else 78 { 79 json.Msg = "儲存失敗"; 80 } 81 } 82 else 83 { 84 json.Msg = "角色名" + entity.ROLENAME + "已被使用,請修改角色名稱再提交"; 85 } 86 87 } 88 else 89 { 90 json.Msg = "角色名稱只能包含漢字"; 91 } 92 93 } 94 else 95 { 96 json.Msg = "未找到需要儲存的角色資訊"; 97 } 98 if (isEdit) 99 { 100 WriteLog(Common.Enums.enumOperator.Edit, "修改使用者角色,結果:" + json.Msg, Common.Enums.enumLog4net.INFO); 101 } 102 else 103 { 104 WriteLog(Common.Enums.enumOperator.Add, "新增使用者角色,結果:" + json.Msg, Common.Enums.enumLog4net.INFO); 105 } 106 } 107 catch (Exception e) 108 { 109 json.Msg = "儲存使用者角色發生內部錯誤!"; 110 WriteLog(Common.Enums.enumOperator.None, "儲存使用者角色:", e); 111 } 112 return Json(json); 113 }View Code
四、刪除角色
刪除的時候 我們首先還是要判斷一下 是否是超級管理員,超級管理員角色不允許刪除 然後我們要判斷使用者是否分配了角色
1 /// <summary> 2 /// 刪除角色 3 /// </summary> 4 [UserAuthorizeAttribute(ModuleAlias = "Role", OperaAction = "Remove")] 5 public ActionResult Delete(string idList) 6 { 7 var json = new JsonHelper() { Msg = "刪除角色完畢", Status = "n" }; 8 var id = idList.Trim(',').Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(p => int.Parse(p)).ToList(); 9 if (id.Contains(Common.Enums.ClsDic.DicRole["超級管理員"])) 10 { 11 json.Msg = "刪除失敗,不能刪除系統固有角色!"; 12 WriteLog(Common.Enums.enumOperator.Remove, "刪除使用者角色:" + json.Msg, Common.Enums.enumLog4net.ERROR); 13 return Json(json); 14 } 15 if (this.UserRoleManage.IsExist(p => id.Contains(p.FK_ROLEID))) 16 { 17 json.Msg = "刪除失敗,不能刪除系統中正在使用的角色!"; 18 WriteLog(Common.Enums.enumOperator.Remove, "刪除使用者角色:" + json.Msg, Common.Enums.enumLog4net.ERROR); 19 return Json(json); 20 } 21 try 22