/// <summary>
/// 递归获取用户菜单
/// </summary>
/// <param name="list"></param>
/// <param name="pid"></param>
/// <returns></returns>
private List<MenusInfo> GetMenuTree(List<MenusInfo> list, int pid)
{
List<MenusInfo> tree = new List<MenusInfo>();
List<MenusInfo> children = list.Where(m => m.ParentId == pid).ToList(); //从第一级根节点开始
if (children.Count > 0)
{
foreach (var item in children)
{
string key = item.Link.Substring(item.Link.LastIndexOf("/") + 1);
MenusInfo itemMenu = new MenusInfo()
{
Id = item.Id,
MenuName = item.MenuName,
ParentId = item.ParentId,
Link = item.Link,
Icon = item.Icon,
Way = item.Way,
ModuleName = key,
isChecked = item.isChecked,
Children = GetMenuTree(list, item.Id)
};
tree.Add(itemMenu);
}
}
return tree;
}
/// <summary>
/// 作者:马鹏
/// 创建时间:2021-09-06
/// 名称:查询用户菜单和权限
/// </summary>
public Tuple<List<MenusInfo>, Dictionary<string, object>> GetUserMenuList(int UserID, int ProjectID)
{
var settingLogic = this._serviceProvider.GetService<SettingLogic>();//逻辑层调用逻辑层
List<MenusInfo> list = rBAContract.GetUserMenuList(UserID, ProjectID);//查询用户菜单
List<MenuPermissions> menulist = rBAContract.GetUserMenuPermissions(UserID, ProjectID);//查询用户菜单权限
var pidList = list.Select(m => m.ParentId).ToList();
var permissionsList = settingLogic.Permissions.Where(w => w.Status == 1).ToList();//查询权限配置表的集合
//查询所有菜单
var menuList = settingLogic.Menus.Where(s => s.IsValid == true).OrderBy(s => s.OrderCol).Select(s => new MenusInfo()
{
Id = s.Id,
MenuName = s.MenuName,
ParentId = s.ParentId,
Link = s.MenSite,
Icon = s.Icon,
Way = s.Way,
MenuLevel = s.MenuLevel
}).ToList();
//var parentList = menuList?.Where(w => pidList.Contains(w.Id)).Select(s => new MenusInfo()// && w.MenuState == 1
//{
// Id = s.Id,
// MenuName = s.MenuName,
// ParentId = s.ParentId,
// Link = s.MenSite,
// Icon = s.Icon,
// Way = s.Way,
// //MenuLevel = s.MenuLevel
//});
//list.AddRange(parentList);//添加父菜单
//list = list.GroupBy(x => new { x.Id, x.MenuName, x.ParentId, x.Link, x.Icon, x.Way })
// .Select(g => new MenusInfo()
// {
// Id = g.Key.Id,
// MenuName = g.Key.MenuName,
// ParentId = g.Key.ParentId,
// Link = g.Key.Link,
// Icon = g.Key.Icon,
// Way = g.Key.Way
// }).ToList();
int pid = list != null && list.Count > 0 ? list.OrderBy(o => o.MenuLevel).OrderBy(o => o.ParentId).FirstOrDefault().ParentId : 0;
list = GetMenuTree(list, pid);
//循环组装菜单对应的权限
Dictionary<string, object> dic = new Dictionary<string, object>();
var menuPList = menuList.Where(w => menulist.Select(s => s.MenuId).ToList().Contains(w.Id)).ToList().Select(s => new MenusInfo()
{
Id = s.Id,
MenuName = s.MenuName,
ParentId = s.ParentId,
Link = s.Link,
Icon = s.Icon,
Way = s.Way,
MenuLevel = s.MenuLevel
});
foreach (var item in menuPList)
{
//string key = item.Link.Substring(item.Link.LastIndexOf("/") + 1);
string key = item.Id.ToString();
MenuPermissions model = menulist.FirstOrDefault(w => w.MenuId == item.Id);
if (model != null)
{
var pcode = model.PermissionCodes.Split(',').ToList();
var innerP = permissionsList.Where(w => pcode.Contains(w.ActionCode)).ToList();
var outP = permissionsList.Where(w => !pcode.Contains(w.ActionCode)).ToList();
var res = GerMenuPermissions(innerP, outP);
if (!dic.ContainsKey(key))
{
dic.Add(key, res);
}
}
}
return new Tuple<List<MenusInfo>, Dictionary<string, object>>(list, dic);
}
/// <summary>
/// 作者:马鹏
/// 创建时间:2021-09-09
/// 名称:查询角色菜单和权限勾选状态
/// </summary>
public Tuple<List<MenusInfo>, Dictionary<string, object>> GetRoleMenuListAndStatus(int RoleID, int ProjectID)
{
var settingLogic = this._serviceProvider.GetService<SettingLogic>();//逻辑层调用逻辑层
List<MenusInfo> list = rBAContract.GetRoleMenuList(RoleID, ProjectID);//查询角色菜单
List<Entities.RolePermissions> roleMenuList = settingLogic.ReadRolePermissions.Where(w => w.RoleId == RoleID && !string.IsNullOrWhiteSpace(w.PermissionCodes)).ToList();//查询单个角色菜单权限
var pidList = list.Select(m => m.ParentId).ToList();
var cidList = list.Select(m => m.Id).ToList();
var permissionsList = settingLogic.Permissions.Where(w => w.Status == 1).ToList();//查询权限配置表的集合
//查询所有菜单
var menuList = settingLogic.Menus.Where(s => s.IsValid == true).OrderBy(s => s.OrderCol).Select(s => new MenusInfo()
{
Id = s.Id,
MenuName = s.MenuName,
ParentId = s.ParentId,
Link = s.MenSite,
Icon = s.Icon,
Way = s.Way,
MenuLevel = s.MenuLevel
}).ToList();
//int maxMenuLevel = menuList.OrderByDescending(o => o.MenuLevel).FirstOrDefault().MenuLevel;//查新最底层ID,用于显示菜单权限
int pid = menuList != null && menuList.Count > 0 ? menuList.OrderBy(o => o.MenuLevel).OrderBy(o => o.ParentId).FirstOrDefault().ParentId : 0;
//var allId = pidList.Union(cidList);
var hasroleMenuList = menuList.Where(w => cidList.Contains(w.Id)).ToList();
var noroleMenuList = menuList.Where(w => !cidList.Contains(w.Id)).ToList();
hasroleMenuList.ForEach(f => { f.isChecked = true; });//有权限勾选
noroleMenuList.ForEach(f => { f.isChecked = false; });//没有权限不勾选
//遍历所有菜单如果子节点有一个勾选的话,父节点就勾选
menuList.ForEach(m =>
{
var model = hasroleMenuList.Find(f => f.ParentId == m.Id && f.isChecked);
if (model is not null)
{
m.isChecked = true;
}
});
list = GetMenuTree(menuList, pid);
//循环组装菜单对应的权限
Dictionary<string, object> dicList = new Dictionary<string, object>();
#region 显示有权限的菜单(显示打勾的)
//var menuPList = menuList.Where(w => roleMenuList.Select(s => s.MenuId).ToList().Contains(w.Id)).ToList().Select(s => new MenusInfo()
//{
// Id = s.Id,
// MenuName = s.MenuName,
// ParentId = s.ParentId,
// Link = s.Link,
// Icon = s.Icon,
// Way = s.Way,
// MenuLevel = s.MenuLevel
//});
//foreach (var item in menuPList)
//{
// string key = item.Link.Substring(item.Link.LastIndexOf("/") + 1);
// Entities.RolePermissions model = roleMenuList.FirstOrDefault(w => w.MenuId == item.Id);
// if (model != null)
// {
// var pcode = model.PermissionCodes.Split(',').ToList();
// var innerP = permissionsList.Where(w => pcode.Contains(w.ActionCode)).ToList();
// var outP = permissionsList.Where(w => !pcode.Contains(w.ActionCode)).ToList();
// Dictionary<string, object> dic = new Dictionary<string, object>();
// var res = GerRoleMenuPermissions(innerP, outP, permissionsList);
// dicList.Add(key, res);
// }
//}
#endregion
//------------------------显示所有菜单(有权限的打勾)-------------------//
foreach (var item in menuList)
{
//没有子节点就添加按钮权限,有子节点的就不添加
var hasParent = menuList.Find(f => f.ParentId == item.Id) != null;
if (hasParent)
{
continue;
}
//key有重复所以暂时改id作为key
//string key = item.Link.Substring(item.Link.LastIndexOf("/") + 1);
string key = item.Id.ToString();
Entities.RolePermissions model = roleMenuList.FirstOrDefault(w => w.MenuId == item.Id);
var menuNameList = new List<string>();//用来存储菜单权限集合
if (model != null)
{
var pcode = model.PermissionCodes.Split(',').ToList();
var innerP = permissionsList.Where(w => pcode.Contains(w.ActionCode)).ToList();
menuNameList = innerP.Select(s => s.Name).ToList();
var res = GerRoleMenuPermissions(menuNameList, permissionsList);
dicList.Add(key, res);
}
else
{
//角色没有菜单权限添加一个菜单ID权限code集合为空
var res = GerRoleMenuPermissions(menuNameList, permissionsList);
dicList.Add(key, res);
}
}
return new Tuple<List<MenusInfo>, Dictionary<string, object>>(list, dicList);
}
/// <summary>
/// 菜单类model
/// </summary>
public class MenusInfo
{
/// <summary>
/// Id 添加时可不用传值,更改数据时必须传值
/// </summary>
public int Id { get; set; }
/// <summary>
/// 菜单名称
/// </summary>
public string MenuName { get; set; } = string.Empty;
/// <summary>
/// 父级Id
/// </summary>
public int ParentId { get; set; } = 0;
/// <summary>
/// 菜单路径
/// </summary>
public string Link { get; set; } = string.Empty;
/// <summary>
/// 菜单图标
/// </summary>
public string Icon { get; set; } = string.Empty;
/// <summary>
/// 方式
/// </summary>
public string Way { get; set; }
/// <summary>
/// 用户Id
/// </summary>
//public int UserID { get; set; } = 0;
/// <summary>
/// 子节点
/// </summary>
public List<MenusInfo> Children { get; set; }
/// <summary>
/// 菜单层级
/// </summary>
public int MenuLevel { get; set; }
/// <summary>
/// 二级菜单对应的权限列表
/// </summary>
public string ModuleName { get; set; }
/// <summary>
/// 是否有权限是勾选,否不勾选
/// </summary>
public bool isChecked { get; set; }
}