网站开发中对用户的权限控制显得十分的重要,每个用户都有不同的角色,用户和角色之间是一个多对多的关系,一个用户有多个角色,一个角色也对应着不同的用户。用户在登陆的时候就要根据用户的操作权限来显示菜单导航栏。
1.前台在页面去请求后台的数据
2.后台有相应的Action来处理
后台主要根据用户的Id去数据获取所需要的数据就可以。要首先加载一个根节点再加载子节点。
string _userId = null;
try
{
//未登陆前会抛异常 为将对象引用到实例
_userId = OperatorProvider.Provider.GetCurrent().UserId;
}
catch (Exception)
{
return Content("");
}
var list = new List<SysModule>();
var data = moduleApp.LoadFuncMenuByUserId(_userId);
if (data == null)
{
return Content("");
}
else
{
foreach (var item in data)
{
list.Add(GetRoot(item)); //获取根节点
}
//拼接根节点的
foreach (var item in list)
{
_sb.AppendLine($"<li id = '{item.Id }'>");
_sb.AppendLine($" <a class='dropdown-toggle' href='{item.UrlAddress}' ");
_sb.AppendLine($" data-id='{item.ParentId}'> ");
_sb.AppendLine($" <i class='fa fa-gears'></i><span>{item.Name}</span>");
_sb.AppendLine(" <i class='fa fa-angle-right drop-icon'></i>");
_sb.AppendLine(" </a>");
_sb.AppendLine(" <ul class='submenu' style='display: none;'>");
GetFunc(_userId, item); //加载子节点
_sb.AppendLine(" </ul>");
_sb.AppendLine("</li>");
}
}
return Content(_sb.ToString());
获取根节点的时候需要一个递归即可,这里不做说明。加载完成后拼接完字符串网页返回即可。
当然也可以在页面加载的时候通过ajax请求去获取这些菜单,但是这有一个问题:就是这些菜单是后来追加的,当点击某个功能的时候就会脱离原来的框架显示,解决办法就是在这些菜单加载完成后,重新初始化一下页面,比较麻烦。