1. 程式人生 > >【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(9) 角色管理,分配許可權

【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(9) 角色管理,分配許可權

索引

簡述

今天我們來做角色的管理 和 角色許可權分配

專案準備

我們用的工具是: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 處理查詢引數 11
12 //系統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