1.查询菜单节点下所有子节点id

List<sys_module> menus = new List<sys_module>() { };

public async Task<PostResult<int>> DeleteModule(int? id)
{
return await Task.Run(() =>
{
var cnt = 1;
var childids = new List<int?>() { id };
var list = db.Queryable<sys_module>().Where(c => c.isdel == "N").ToList();
foreach (var item in list.FindAll(c => c.parentid == id))
{
menus.Add(item);
FillMenu(item, list);
}
foreach (var i in menus)
{
childids.Add(i.id);
}
if (childids.Any())
{
cnt = db.Updateable<sys_module>().UpdateColumns(c => new sys_module() { isdel = "Y" }).Where(c => childids.Contains(c.id)).ExecuteCommand();
}
return new PostResult<int>
{
data = cnt,
msg = "success"
};
});
}

private void FillMenu(sys_module node, List<sys_module> list)
{
foreach (var i in list.FindAll(i => i.parentid == node.id))
{
menus.Add(i);
FillMenu(i, list);
}
}

2.查询用户授权的菜单树,(根据用户角色,查询角色关联的菜单树)

<hr />

private Tuple<List<string>, List<SysMenuTree>, List<string>> GetModel(sys_user user)
{
var roles = new List<string> { "管理员", "普通用户" };//用户角色
var menutrees = new List<SysMenuTree> { };//用户菜单树
var permissions = new List<string> { "user_add", "user_edit" };//接口授权标识

var relations = db.Queryable<sys_relevance>().Where(c => c.isdel == "N").ToList();
var userroles = relations.Where(c => c.key.Equals("UserRole") &amp;&amp; c.firstid == user.id).Select(c => c.secondid).ToList();
roles = db.Queryable<sys_role>().Where(c => c.isdel == "N" &amp;&amp; userroles.Contains(c.id)).Select(c => c.name).ToList();

var rolemenus = relations.Where(c => c.key.Equals("RoleModule") &amp;&amp; userroles.Contains(c.firstid)).Select(c => c.secondid).ToList();
var menus = db.Queryable<sys_module>().Where(c => c.isdel == "N" &amp;&amp; c.status == "Y" &amp;&amp; rolemenus.Contains(c.id)).ToList(); ;

permissions = menus.Where(c => !string.IsNullOrEmpty(c.authorize)).Select(c => c.authorize).Distinct().ToList();

var list = menus.FindAll(c => c.type != 2);
var trees = new List<SysMenuTree>() { };
foreach (var i in list.FindAll(c => c.parentid == -1))
{
var nodel = new SysMenuTree() { id = i.id, name = i.name, parentid = i.parentid, icon = i.icon, url = i.url, path = i.path };
trees.Add(nodel);
FillTree(nodel, list);
}
menutrees = trees;

return Tuple.Create(roles, menutrees, permissions);
}

private void FillTree(SysMenuTree node, List<sys_module> list)
{
if (list.Any(m => m.parentid == node.id))
{
node.subMenus = new List<SysMenuTree>() { };
}
foreach (var i in list.FindAll(i => i.parentid == node.id))
{
var subnode = new SysMenuTree()
{
id = i.id,
name = i.name,
parentid = i.parentid,
icon = i.icon,
url = i.url,
path = i.path,
};
node.subMenus.Add(subnode);
FillTree(subnode, list);
}
}

c#递归读取菜单树的更多相关文章

  1. Mybatis通过colliection属性递归获取菜单树

    1.现有商品分类数据表category结构如下,三个字段都为varchar类型 2.创建商品分类对应的数据Bean /** * */ package com.xdw.dao; import java. ...

  2. java从数据库读取菜单,递归生成菜单树

    首先看一下菜单的样子 根据这个样子我们定义菜单类 public class Menu { // 菜单id private String id; // 菜单名称 private String name; ...

  3. java递归构建菜单树

    package testSimple; import java.util.ArrayList; import java.util.List; public class BuildTree { publ ...

  4. React + Antd Menu组件实现菜单树

    准备好两个变量,一个用来保存平级菜单列表,一个用来保存遍历后的菜单树. 推荐后端返回平级菜单树,假如菜单比较多,可以直接结合find方法找到菜单,做搜索功能很省事. const [menuList, ...

  5. C# 递归读取XML菜单数据

    在博客园注册了有4年了,很遗憾至今仍未发表过博客,趁周末有空发表第一篇博客.小生不才,在此献丑了! 最近在研究一些关于C#的一些技术,纵观之前的开发项目的经验,做系统时显示系统菜单的功能总是喜欢把数据 ...

  6. 以正确的姿势实现一棵JavaScript菜单树

    菜单树是常见的前端特效, 一般长下面这样 还有各种形态的变种, 有长这样的 也有长这样的 尽管这些菜单的相貌都不尽相同, 在功能实现的本质上却都是相同的.实现程序的大致流程如下 读取服务器端的菜单数据 ...

  7. vue中组件之间的相互调用,及通用后台管理系统左侧菜单树的迭代生成

    由于本人近期开始学习使用vue搭建一个后端管理系统的前端项目,在左侧生成菜单树的时候遇到了一些问题.在这里记录下 分析:由于本人设定的菜单可以使多级结构,直接使用vue的v-for 遍历并不是很方便. ...

  8. bootstrap treeview实现菜单树

    本博客,介绍通过Bootstrap的treeview插件实现菜单树的功能. treeview链接:http://www.htmleaf.com/Demo/201502141380.html ORM框架 ...

  9. vue+element-ui实现无限级动态菜单树

    使用vue+element-ui实现无限级动态菜单 该案例实现主要使用递归的思想,递归对新人来容易迷惑的是自己调用自己,直到满足条件为止,接下来我们就一步一步实现一个动态多级菜单vue组件 搭建项目并 ...

随机推荐

  1. 帝国cms“建立目录不成功,请检查目录权限”的解决方法

    就这个看似简单的问题我折腾了两天,百度看产生这个问题的原因有很多也很宽泛,大部分说的是初始化内置数据,但我出现“建立目录不成功,请检查目录权限”的原因估计只有少部分人会遇到. 内置初始化数据是你上传文 ...

  2. XML-RPC-3XML-RPC 与 XML-RPC 服务器类

    http://codeigniter.org.cn/user_guide/libraries/xmlrpc.html XML-RPC 与 XML-RPC 服务器类 CodeIgniter 的 XML- ...

  3. c#基础知识梳理(四)

    上期回顾 - https://www.cnblogs.com/liu-jinxin/p/10826971.html 一.类 当你定义一个类时,你定义了一个数据类型的蓝图.这实际上并没有定义任何的数据, ...

  4. map自定义键值类型

    map自定义键值类型 改变Map的默认比较方式 https://www.cnblogs.com/zjfdlut/archive/2011/08/12/2135698.html 大家知道,STL中的ma ...

  5. vue中使用ts后,父组件获取执行子组件方法报错问题

    一.问题产生背景: 子组件的一个方法: update () { this.$nextTick(() => { this.ul_slots.forEach((ul, cur_slots_index ...

  6. Array + two points leetcode.16 - 3Sum Closest

    题面 Given an array nums of n integers and an integer target, find three integers in nums such that th ...

  7. 如何用HAProxy+Nginx实现负载均衡

    一.什么是HAProxy HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点, ...

  8. mysql使用GTID跳过事务

    GTID跳过有两种方法,一种是普通的跳过一个事务的方法,另外一个是在基于主库搭建新的slave的时候.一.普通跳过一个事务的方法.通过show slave status\G找到冲突的GTID号.然后执 ...

  9. 全文检索引擎在Django中的使用

    Haystack 1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsear ...

  10. Insufficient space for shared memory file 解决办法

    Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file:   /tmp/hsperfd ...