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. Tree Generator™ CodeForces - 1149C (线段树,括号序列)

    大意: 给定括号序列, 每次询问交换两个括号, 求括号树的直径. 用[ZJOI2007]捉迷藏的方法维护即可. #include <iostream> #include <algor ...

  2. Luogu4022 CTSC2012熟悉的文章(广义后缀自动机+二分答案+动态规划+单调队列)

    对作文库中的串建出广义SAM,然后显然可以二分答案,二分之后考虑暴力dp,设f[i]为前i位最长匹配长度,显然有f[i]=max(f[i-1],f[j]+i-j) (i-j>=l&&am ...

  3. 怎样解决Chrome浏览器因为禁止音频自动播放所造成的视频无法自动播放且报错: Uncaught (in promise) DOMException的问题

    这个问题是谷歌基于用户体验方面的考虑, 对页面加载时自动播放的音频作了限制, 试想一下, 如果你打开某个页面就立刻自动播放某种不可描述的声音, 那体验想必是十分酸爽. 尽管这个设定是针对音频的, 但实 ...

  4. 洛谷 P1307 数字反转

    链接:https://www.luogu.org/problem/P1307 题目: 题目描述 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否 ...

  5. 浅谈.NET中的类型和装箱、拆箱原理

    谈到装箱拆箱,大概的意思就是值类型和引用类型的相互转换呗---值类型到引用类型叫装箱,反之则叫拆箱.这当然没有问题,可是你只知道这么多,那么建议你花点时间看看楼主这篇文章 1. .NET中的类型 为了 ...

  6. 百度定位SDK 返回error code : 162 latitude : 4.9E-324 lontitude : 4.9E-324

    Android应用使用百度定位SDK 返回error code : 162 latitude : 4.9E-324 lontitude : 4.9E-324 在使用百度定位SDK时遇到一个非常郁闷的问 ...

  7. leetcode-104.二叉树最大深度 · BTree + 递归

    easy 题就不详细叙述题面和样例了,见谅. 题面 统计二叉树的最大深度. 算法 递归搜索二叉树,返回左右子树的最大深度. 源码 class Solution { public: int maxDep ...

  8. Trie 树(字典树)

    [动画]看动画轻松理解「Trie树」 读音 Trie这个名字取自“retrieval”,检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词. 虽然发音与「Tree」一致,但为了将这种 ...

  9. 自定义flask转换器

    自定义flask转换器 以匹配手机号为例: # 1. 定义自己的转换器 class MobileConverter(BaseConverter): def __init__(self, url_map ...

  10. 04 Windows编程——Unicode

    VS 2017下源码 #include<stdio.h> int main() { char ASC_a = 'a'; char *ASC_str = "hello"; ...