刚到公司没多长时间就开始接触MVC到现在不能说懂了,只能说到达会用这个层次吧,感觉MVC用来写Web还是很强大的,层次清晰。
今天我来写写关于权限管理这一块,自我感觉网站的权限主要分为菜单权限和角色权限,首先说角色权限,比较简单不同角色可以看到不同页面这就是角色权限,菜单权限也可以说是操作权限,就是具体到某一个按钮,或某一个下拉框的查看权限或使用权限。
二、角色权限
1.用户角色
首先来角色权限,每个用户有着多样不同的角色,一对多的关系。
2.菜单管理
在菜单管理中我们就可以这样管理,某一菜单,那一角色可以看到就打上√这样比较容易控制。
3.数据库
再来看数据库中,要有角色的表以及用户与角色关系表。
再就是角色与菜单的关系表,其中PermissionIDs字段为操作权限以|隔开。
4.用户登录
当用户登录时我们就可以根据登陆人的ID取到他的所有角色存到Session中,并根据登录人查出相应的菜单。
//角色基本信息 SqlHelperParameter sqlHelperParameterRole = new SqlHelperParameter(); sqlHelperParameterRole.Add("UserId", dtUserRow["UserId"].ToString()); DataTable dtRole = SqlHelper.ExecuteDataTable(@" select Sys_Roles.RoleId, Sys_Roles.RoleName, Sys_Roles.Weight from ( select UserId,RoleId from Sys_UsersInRoles where UserId =@UserId ) as a left join Sys_Roles on a.RoleId = Sys_Roles.RoleId", sqlHelperParameterRole); int dtRoleCount = dtRole.Rows.Count; RoleWeightMax = int.MaxValue; for (int i = 0; i < dtRoleCount; i++) { RolesSession rs = new RolesSession(); rs.RoleID = Guid.Parse(dtRole.Rows[i]["RoleId"].ToString()); rs.RoleName = dtRole.Rows[i]["RoleName"].ToString(); rs.Weight = Convert.ToInt32(dtRole.Rows[i]["Weight"]); if (RoleWeightMax > rs.Weight) { RoleWeightMax = rs.Weight; } RoleList.Add(rs); }
public class RolesSession { public Guid RoleID { get; set; } public string RoleName { get; set; } //权重 public int Weight { get; set; } }
前台代码:
<div data-options="region:'west',split:true" title="导航菜单"> <div data-options="fit:true,border:false"> @H9C.PMS.BLL.LogOn.MenuList.GetMenu(ViewBag.UserName) </div> </div>
控制器:
public static MvcHtmlString GetMenu(string userName) { Menu menu = new Menu(); MenuStructure ms = menu.GetMenuListStructure(userName); if (ms != null) { ms.Children.Remove(ms.Children.FirstOrDefault(o => o.ModelCode == "0" && o.ParentID == "0")); } return new MvcHtmlString(MenuNav("0", ms)); } private static string MenuNav(string menuCode, MenuStructure menuStruc) { if (menuStruc == null) { return "<div>没有可用菜单</div>"; } List<MenuStructure> list = menuStruc.Children.Where(m => m.ParentID == menuCode).ToList(); StringBuilder sbMenu = new StringBuilder(); foreach (var item in list) { if (item.ParentID == "0") { sbMenu.Append("<div title=https://www.jb51.net/article/\"" + item.Title + "https://www.jb51.net/article/\" style=https://www.jb51.net/article/\"overflow: auto;\">"); sbMenu.Append("<ul id=https://www.jb51.net/article/\"menu" + item.ParentID + "https://www.jb51.net/article/\" class=https://www.jb51.net/article/\"easyui-tree\" animate=https://www.jb51.net/article/\"true\" dnd=https://www.jb51.net/article/\"true\">"); sbMenu.Append("<li>"); } else { sbMenu.Append("<ul id=https://www.jb51.net/article/\"menu" + item.ParentID + "https://www.jb51.net/article/\" class=https://www.jb51.net/article/\"easyui-tree\" animate=https://www.jb51.net/article/\"true\" dnd=https://www.jb51.net/article/\"true\">"); if (item.Children.Count == 0) { sbMenu.Append("<li>"); } else { sbMenu.Append("<li state=https://www.jb51.net/article/\"closed\">"); } } sbMenu.Append("<span>"); if (item.Url == "https://www.jb51.net/") { sbMenu.Append("<a class=https://www.jb51.net/article/\"e-submenu\" href=https://www.jb51.net/article/\"javascript:void(0);\" title=https://www.jb51.net/article/\"" + item.Title + "https://www.jb51.net/article/\" >"); } else { string tabsIcon = "14"; if (!string.IsNullOrWhiteSpace(item.Icon)) { tabsIcon = item.Icon.Replace("/Content/images/", "").Replace(".png", ""); } sbMenu.Append("<a class=https://www.jb51.net/article/\"e-submenu\" href=https://www.jb51.net/article/\"#\" onclick=https://www.jb51.net/article/\"addTab('" + item.Url + "','" + item.Title + "')\" >"); sbMenu.Append("<img src=https://www.jb51.net/article/\"" + item.Icon + "https://www.jb51.net/article/\" >"); } sbMenu.Append("" + item.Title + ""); sbMenu.Append("</a></span>"); if (IsExistParent(item.ModelCode, item)) { sbMenu.Append(MenuNav(item.ModelCode, item)); } sbMenu.Append("</li>"); sbMenu.Append("</ul>"); if (item.ParentID == "0") { sbMenu.Append("</div>"); } } return sbMenu.ToString(); } private static bool IsExistParent(string modelCode, MenuStructure menuModels) { var query = menuModels.Children.FirstOrDefault(m => m.ParentID == modelCode); if (query == null) { return false; } return true; }
菜单类: