无私分享:从入门到精通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 }
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 }
二、添加模块和权限
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开始,一起搭框架做项目 控制器基类 主要做登录用户权限认证日志记录等工作