国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

MVC網(wǎng)站開發(fā)之權(quán)限管理篇

2024-07-10 12:54:44
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

網(wǎng)站開發(fā)的最終目的是為了在前端顯示給諸多客戶瀏覽,然而開發(fā)網(wǎng)頁(yè)卻是非常繁雜的,別著急,下面是錯(cuò)新技術(shù)頻道小編帶給大家的MVC網(wǎng)站開發(fā)之權(quán)限管理篇,一起來(lái)學(xué)習(xí)一下吧!

一、前言

剛到公司沒多長(zhǎng)時(shí)間就開始接觸MVC到現(xiàn)在不能說懂了,只能說到達(dá)會(huì)用這個(gè)層次吧,感覺MVC用來(lái)寫Web還是很強(qiáng)大的,層次清晰。

今天我來(lái)寫寫關(guān)于權(quán)限管理這一塊,自我感覺網(wǎng)站的權(quán)限主要分為菜單權(quán)限和角色權(quán)限,首先說角色權(quán)限,比較簡(jiǎn)單不同角色可以看到不同頁(yè)面這就是角色權(quán)限,菜單權(quán)限也可以說是操作權(quán)限,就是具體到某一個(gè)按鈕,或某一個(gè)下拉框的查看權(quán)限或使用權(quán)限。

二、角色權(quán)限

1.用戶角色

首先來(lái)角色權(quán)限,每個(gè)用戶有著多樣不同的角色,一對(duì)多的關(guān)系。

2.菜單管理

在菜單管理中我們就可以這樣管理,某一菜單,那一角色可以看到就打上√這樣比較容易控制。

3.數(shù)據(jù)庫(kù)

再來(lái)看數(shù)據(jù)庫(kù)中,要有角色的表以及用戶與角色關(guān)系表。

再就是角色與菜單的關(guān)系表,其中PermissionIDs字段為操作權(quán)限以|隔開。

4.用戶登錄

當(dāng)用戶登錄時(shí)我們就可以根據(jù)登陸人的ID取到他的所有角色存到Session中,并根據(jù)登錄人查出相應(yīng)的菜單。?

//角色基本信息   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; }  //權(quán)重  public int Weight { get; set; } }

前臺(tái)代碼:

 <div data-options="region:'west',split:true" title="導(dǎo)航菜單" style="width: 200px; padding1: 1px; overflow: hidden;" id="left_nav"> <div class="easyui-accordion" 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=/"" + item.Title + "/" style=/"overflow: auto;/">");     sbMenu.Append("<ul id=/"menu" + item.ParentID + "/" class=/"easyui-tree/" animate=/"true/" dnd=/"true/">");     sbMenu.Append("<li>");    }    else    {     sbMenu.Append("<ul id=/"menu" + item.ParentID + "/" class=/"easyui-tree/" animate=/"true/" dnd=/"true/">");     if (item.Children.Count == 0)     {      sbMenu.Append("<li>");     }     else     {      sbMenu.Append("<li state=/"closed/">");     }    }    sbMenu.Append("<span>");    if (item.Url == "/")    {     sbMenu.Append("<a class=/"e-submenu/" href=/"javascript:void(0);/" title=/"" + item.Title + "/" >");    }    else    {     string tabsIcon = "14";     if (!string.IsNullOrWhiteSpace(item.Icon))     {      tabsIcon = item.Icon.Replace("/Content/images/", "").Replace(".png", "");     }     sbMenu.Append("<a class=/"e-submenu/" href=/"#/" onclick=/"addTab('" + item.Url + "','" + item.Title + "')/" >");     sbMenu.Append("<img src=/"" + item.Icon + "/" >");    }    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;  }

菜單類:?

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()方法就是根據(jù)用戶名獲取菜單列表結(jié)構(gòu),我這里用戶名在數(shù)據(jù)庫(kù)中是唯一的,在這里注意一點(diǎn)比較麻煩的是根據(jù)類可以看出菜單是有父菜單子菜單的所以方法中需要有兩個(gè)循環(huán)去添加。?

三、菜單權(quán)限
也就是操作權(quán)限,比如某一按鈕的操作權(quán)限。首先我們把所有關(guān)于按鈕的操作權(quán)限存放到一個(gè)類中,(有更好的方法請(qǐng)向我推薦謝謝)

public class Menus {  public static int gongdan = 503000000;//任務(wù)工單 } 

然后我們需要操作權(quán)限的按鈕所在的頁(yè)面的Controllers(加載頁(yè)面)中存到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); //上報(bào)施工計(jì)劃   return View();  }
/// <summary>  /// 判斷某權(quán)限是否在獲取某角色權(quán)限的列表中  /// </summary>  /// <param name="roleId"></param>  /// <param name="modelCode"></param>  /// <param name="userSessionModel"></param>  /// <param name="permissionCode"></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>  /// 獲取某角色權(quán)限的列表  /// </summary>  /// <param name="roleId"></param>  /// <param name="modelCode"></param>  /// <param name="userSessionModel"></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>  /// 獲取某菜單某角色下具有的權(quán)限  /// </summary>  /// <param name="modelId"></param>  /// <param name="menuId"></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;  }

最后一個(gè)方法中運(yùn)用到了EF根據(jù)菜單以及角色獲取某菜單某角色下具有的權(quán)限
前臺(tái)就非常簡(jiǎn)單的:?

@if (ViewBag.IsReportPlan == true)  {   @:??    <a href="#" class="easyui-linkbutton l-btn"     iconcls="icon-add">按鈕</a>   } 

通過錯(cuò)新技術(shù)頻道小編為大家介紹的MVC網(wǎng)站開發(fā)之權(quán)限管理篇,大家也可以嘗試上面的介紹進(jìn)行操作,也可以節(jié)省一段時(shí)間哦。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 保山市| 贵定县| 达州市| 玛纳斯县| 宜昌市| 普陀区| 赤城县| 葫芦岛市| 河西区| 双峰县| 随州市| 紫阳县| 绵竹市| 甘肃省| 仙桃市| 嵊泗县| 铁力市| 固阳县| 台东县| 南岸区| 襄樊市| 石嘴山市| 清丰县| 加查县| 神池县| 通江县| 搜索| 丹巴县| 来宾市| 武冈市| 九寨沟县| 新龙县| 米泉市| 沛县| 滁州市| 德昌县| 昆明市| 永胜县| 仲巴县| 永胜县| 蕲春县|