递归获取菜单、权限

 /// <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; }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值