c#递归读取菜单树
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") && c.firstid == user.id).Select(c => c.secondid).ToList();
roles = db.Queryable<sys_role>().Where(c => c.isdel == "N" && userroles.Contains(c.id)).Select(c => c.name).ToList();
var rolemenus = relations.Where(c => c.key.Equals("RoleModule") && userroles.Contains(c.firstid)).Select(c => c.secondid).ToList();
var menus = db.Queryable<sys_module>().Where(c => c.isdel == "N" && c.status == "Y" && 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#递归读取菜单树的更多相关文章
- Mybatis通过colliection属性递归获取菜单树
1.现有商品分类数据表category结构如下,三个字段都为varchar类型 2.创建商品分类对应的数据Bean /** * */ package com.xdw.dao; import java. ...
- java从数据库读取菜单,递归生成菜单树
首先看一下菜单的样子 根据这个样子我们定义菜单类 public class Menu { // 菜单id private String id; // 菜单名称 private String name; ...
- java递归构建菜单树
package testSimple; import java.util.ArrayList; import java.util.List; public class BuildTree { publ ...
- React + Antd Menu组件实现菜单树
准备好两个变量,一个用来保存平级菜单列表,一个用来保存遍历后的菜单树. 推荐后端返回平级菜单树,假如菜单比较多,可以直接结合find方法找到菜单,做搜索功能很省事. const [menuList, ...
- C# 递归读取XML菜单数据
在博客园注册了有4年了,很遗憾至今仍未发表过博客,趁周末有空发表第一篇博客.小生不才,在此献丑了! 最近在研究一些关于C#的一些技术,纵观之前的开发项目的经验,做系统时显示系统菜单的功能总是喜欢把数据 ...
- 以正确的姿势实现一棵JavaScript菜单树
菜单树是常见的前端特效, 一般长下面这样 还有各种形态的变种, 有长这样的 也有长这样的 尽管这些菜单的相貌都不尽相同, 在功能实现的本质上却都是相同的.实现程序的大致流程如下 读取服务器端的菜单数据 ...
- vue中组件之间的相互调用,及通用后台管理系统左侧菜单树的迭代生成
由于本人近期开始学习使用vue搭建一个后端管理系统的前端项目,在左侧生成菜单树的时候遇到了一些问题.在这里记录下 分析:由于本人设定的菜单可以使多级结构,直接使用vue的v-for 遍历并不是很方便. ...
- bootstrap treeview实现菜单树
本博客,介绍通过Bootstrap的treeview插件实现菜单树的功能. treeview链接:http://www.htmleaf.com/Demo/201502141380.html ORM框架 ...
- vue+element-ui实现无限级动态菜单树
使用vue+element-ui实现无限级动态菜单 该案例实现主要使用递归的思想,递归对新人来容易迷惑的是自己调用自己,直到满足条件为止,接下来我们就一步一步实现一个动态多级菜单vue组件 搭建项目并 ...
随机推荐
- Ubuntu部署ftp服务器
Ubuntu 16.04 FTP服务器安装及配置 FTP File Transfer Protocol文件传输协议,两台计算机传送文件的协议,客户端可以通过FTP命令从服务器下载,上传文件,修 ...
- 基于Docker的Kafka部署
一 准备 1.1 安装docker-dompose #部署 sudo curl -L "https://github.com/docker/compose/releases/download ...
- oracle查询十分钟之前的数据
select * from TABLE as of timestamp sysdate - 10/1440 t WHERE ColName='1111'; TABLE:表名 WHERE:查询子句 sy ...
- HTTP method GET is not supported by this URL
Servlet eroor:HTTP method GET is not supported by this URL 错误提示: type: Status report message: HTTP m ...
- springboot启动流程(一)构造SpringApplication实例对象
所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 启动入口 本文是springboot启动流程的第一篇,涉及的内容是SpringApplicat ...
- epoll、mysql概念及简单操作
epoll 程序阻塞的过程 假设我们目前运行了三个进程A B C ,如果他们都在处于运行态,那就会被加到一个运行队列中 进程A正在运行socket程序 在linux中有句话,万物皆文件,socket对 ...
- line 352 Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow
OpenCV 使用 createtrackerbar()报错问题 Error Error: Assertion failed (size.width>0 && size.heig ...
- 1.NIO概述
/*Java NIO 简介*/ java NIO (New IO)是从 java1.4版本开始引入的一个新的IO API,可以替代标准的 java IO API (jdk1.7又对其进行了改进, 称为 ...
- zabbix主动模式和被动模式
目录 一. 理论概述 二.总结 一. 理论概述 整个zabbix监控过程当中,对于agent来说有两种递交监控项信息的模式:主动模式和被动模式 主动模式 agent向server主动请求对应监控项列表 ...
- ES extended_stats 函数
在进行ES聚合分析的时候,发现了一个非常有用的函数,extended_stats,可以对聚合的结果进行更近一步的分析 ,常见的 count sum avg min max 等都可以一目了然 GET ...