public class MenuStructure { public string ModelCode; public string Title; public string Icon; public string Url; public string ParentID; public List<MenuStructure> Children = new List<MenuStructure>(); }
其中GetMenuListStructure()方法就是根据用户名获取菜单列表结构,我这里用户名在数据库中是唯一的,在这里注意一点比较麻烦的是根据类可以看出菜单是有父菜单子菜单的所以方法中需要有两个循环去添加。
三、菜单权限
也就是操作权限,比如某一按钮的操作权限。首先我们把所有关于按钮的操作权限存放到一个类中,(有更好的方法请向我推荐谢谢)
public class Menus { public static int gongdan = 503000000;//任务工单 }
然后我们需要操作权限的按钮所在的页面的Controllers(加载页面)中存到ViewBag里,如下:
public ActionResult Index() {H9C.PMS.BLL.RBAC.Permission pm = new BLL.RBAC.Permission(); ViewBag.IsReportPlan = pm.IsRoleHavePermissions(Roles.Shigongduizhang, Menus.gongdan, base.UserSessionModel, Menus.GongdanReportPlanByShiGongTeamer); //上报施工计划 return View(); }
/// <summary> /// 判断某权限是否在获取某角色权限的列表中 /// </summary> /// <param></param> /// <param></param> /// <param></param> /// <param></param> /// <returns></returns> public bool IsRoleHavePermissions(Guid roleId, int modelCode, UserSessionModel userSessionModel, int permissionCode) { List<PermissionModel> permissionModelList = this.GetRolePermissionList(roleId, modelCode, userSessionModel); if (permissionModelList == null) { return false; } foreach (var o in permissionModelList) { if (o.PCode == permissionCode) { return true; } } return false; }
/// <summary> /// 获取某角色权限的列表 /// </summary> /// <param></param> /// <param></param> /// <param></param> /// <returns></returns> public List<PermissionModel> GetRolePermissionList(Guid roleId, int modelCode, UserSessionModel userSessionModel) { foreach (var o in userSessionModel.RoleList) { if (o.RoleID == roleId) { List<Model.RBAC.PermissionModel> permissionList = this.PermissionList(roleId, modelCode); return permissionList; } } return null; }
/// <summary> /// 获取某菜单某角色下具有的权限 /// </summary> /// <param></param> /// <param></param> /// <returns></returns> public List<PermissionModel> PermissionList(Guid roleId, int menuId) { List<PermissionModel> pmList = new List<PermissionModel>(); using (RBACContext connEF = new RBACContext()) { Sys_Role_Model_Permissions srmp = connEF.Sys_Role_Model_Permissions.FirstOrDefault(o => o.ModelID == menuId && o.RoleId == roleId); if (srmp != null) { string permissions = srmp.PermissionIDs; if (!string.IsNullOrWhiteSpace(permissions)) { string[] pids = permissions.Split(new char[] { '|' }); for (int i = 0; i < pids.Length; i++) { if (!string.IsNullOrWhiteSpace(pids[i])) { pmList.Add(new PermissionModel() { ModelCode = menuId, PCode = Convert.ToInt32(pids[i]), PName ="" }); } } } } } return pmList; }
最后一个方法中运用到了EF根据菜单以及角色获取某菜单某角色下具有的权限
前台就非常简单的:
@if (ViewBag.IsReportPlan == true) { @: <a href="#" iconcls="icon-add">按钮</a> }
四、尾声
总结一下,就是首先要有一个菜单管理的模块,它不但可以管理菜单还可以管理菜单中的权限以及每个角色关于菜单的权限,然后就是后台的控制,上面权限Model中存的权重,指的是每一角色都有权重,每一个用户都有他的最大权重,根据这个权重我们就可以做很多条件的控制,简单的说也是为了方便吧。
第一篇技术文档,文笔还需要多锻炼,以后会试着多写博文,不会写文档的码农不是好程序员。