无私分享:从入门到精通ASP.NET MVC从0开始,一起搭框架做项目 角色管理,分配权限

Posted 我来自江湖,江湖却没有关于我的传说...

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无私分享:从入门到精通ASP.NET MVC从0开始,一起搭框架做项目 角色管理,分配权限相关的知识,希望对你有一定的参考价值。

索引

【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 目录索引

简述

今天我们来做角色的管理 和 角色权限分配

项目准备

我们用的工具是: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 = 无私分享:从入门到精通ASP.NET MVC从0开始,一起搭框架做项目 (11)文件管理

无私分享:从入门到精通ASP.NET MVC从0开始,一起搭框架做项目 角色管理,分配权限

无私分享:从入门到精通ASP.NET MVC从0开始,一起搭框架做项目(5.3) 登录功能的实现,丰富数据表建立关联

无私分享:从入门到精通ASP.NET MVC从0开始,一起搭框架做项目 登录界面前端样式和特效

无私分享:从入门到精通ASP.NET MVC从0开始,一起搭框架做项目 控制器基类 主要做登录用户权限认证日志记录等工作

无私分享:从入门到精通ASP.NET MVC从0开始,一起搭框架做项目(7.2) 模块管理,模块的添加修改删除