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组件 搭建项目并 ...
随机推荐
- SpringCloud Hystrix 参数
hystrix.command.default和hystrix.threadpool.default中的default为默认CommandKey Command PropertiesExecution ...
- 验证码识别的免费 OCR
在做接口自动化以及爬虫的过程中,验证码一般是个很烦的存在,其实大厂们已经做好了一些 OCR 供使用,这里介绍一下百度 OCR 的使用方法. 注册并生成应用 1.注册一个百度智能云账号:http://a ...
- springboot mvc自动配置(三)初始化mvc的组件
所有文章 https://www.cnblogs.com/lay2017/p/11775787.html 正文 在springboot mvc自动配置的时候,获得了DispatcherServlet和 ...
- JavaScript流程图(精简版)
网址:https://www.processon.com/view/link/5db4f595e4b0c5553741c271 如果链接失效,请及时反馈(在评论区评论),博主会及时更新
- [Vuex系列] - Module的用法(终篇)
于使用单一状态树,应用的所有状态会集中到一个比较大的对象.当应用变得非常复杂时,store 对象就有可能变得相当臃肿.为了解决以上问题,Vuex 允许我们将 store 分割成模块(module).每 ...
- JS 学习书籍电子版PDF下载
JavaScript权威指南(第6版)(中文版) 链接:https://pan.baidu.com/s/1H1v77UY-yh7oDxonRjd0GA 提取码:r3pu JavaScript DOM编 ...
- vulnhub攻略
https://www.vulnhub.com/entry/21ltr-scene-1,3/ 这个靶机国内https://www.cnblogs.com/hack404/p/11423228.html ...
- 解决wpscan无法更新
如果wpscan无法更新的话 一般的原因都是源或者更新地址无法访问 下面解决 updatedb #先更新一下系统的索引 locate wpscan #定位到wpscan的目录 大概就是updater. ...
- Flutter自定义绘制(1)- 绘制基础
CustomPainter Flutter 中实现绘制的主要是CustomPainter类. 我们一般继承这个类,来使用它: class MyPainter extends CustomPainter ...
- 你不知道的javascript(上卷)读后感(二)
this词法 熟悉ES6语法的开发者,箭头函数在涉及this绑定时的行为和普通函数的行为完全不一致.跟普通this绑定规则不一样,它使用了当前的词法作用域覆盖了this本来的值. 误解 this理解成 ...