tnblog
首页
视频
资源
登录

使用递归算法,递归解析树形结构

13071人阅读 2020/1/10 18:06 总访问:423859 评论:1 收藏:0 手机
分类: .NET Core


在我们做权限管理的树形分布是,前台用的layui 框架,由于当时我们的树形层次只有两级。

试问,假如我们的层次有几十或上百的级的时候,难道我们也用那么多foreach循环吗?显然不科学。

今天我们就用看上去简单,却很实用的递归算法,解析树形结构。

一,新建一个.net core 的mvc项目


新建好项目后,不能像以前一样直接在新建项中添加ef了,需要用命令在添加ef的依赖


注意:所以依赖注入的命令不要放在项目里,要选择放入自己需要生成数据的类库里。



二,需要使用工具的Nuget包管理器添加EF的依赖。

  1. Install-Package Microsoft.EntityFrameworkCore.SqlServer -version 2.1.0


三.如果是使用db first模型,需要根据数据库生成model,就还需要使用命令添加两个依赖

  1. Install-Package Microsoft.EntityFrameworkCore.Tools -version 2.1.0 
  2. Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design

四.相关依赖注入成功之后,就可以再根据一个命令从数据库生成model了

  1. Scaffold-DbContext "Server=.;Database=mydb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

  注意:这里的Database=数据库的名称


五.生成数据之后,新建一个tree控制器,实现递归解析


权限sqlserver数据库的层级数据如下:

1,在项目自身的models里新建一个TreeModel类:

  1. namespace WebAppTree.Models
  2. {
  3.     public class TreeModel
  4.     {
  5.         public string id { getset; }
  6.         public string title { getset; }
  7.         public List<TreeModel> children = new List<TreeModel>();
  8.     }
  9. }


2,在tree控制器封装一个递归的方法(需传递三个参数),代码如下:

  1. /// <summary>
  2.         /// 递归函数
  3.         /// </summary>
  4.         public void ParseTree(List<Department> departmentList, List<TreeModel> treeModels,int?  parentId)
  5.         {
  6.             //找当前层级下级(如果ParentId==null 就是第一级)
  7.             List<Department> Result= departmentList.Where(a => a.ParentId == parentId).ToList();
  8.             foreach (Department item in Result)
  9.             {
  10.                 TreeModel treeModel = new TreeModel();
  11.                 treeModel.id = item.Id;
  12.                 treeModel.title = item.DepartmentName;
  13.                 treeModels.Add(treeModel);
  14.                 //递归
  15.                 ParseTree(departmentList,treeModel.children,Convert.ToInt32(treeModel.id));
  16.             }
  17.         }

3,get请求,封装一个返回json数据的方法,代码如下:

  1. [HttpGet]
  2.         public JsonResult GetTreeData()
  3.         {
  4.             mydbContext mydbContexts = new mydbContext();
  5.             List<Department> departmentList = mydbContexts.Department.ToList();
  6.             List<TreeModel> treeModels = new List<TreeModel>();
  7.             ParseTree(departmentList,treeModels,null);
  8.             return Json(treeModels);
  9.         }


4,调试项目的该方法,返回了数据,就说明得到递归方法解析数据成功。


5,现在我们在tree/index,使用layui框架,调用数据,解析明确的树形结构

官网下载layui插件之后,放在wwwroot的lib目录下。



前台调用js,css等,在layui官网复制树形结构图代码,如下;

  1. @{
  2.     ViewData["Title"] = "Index";
  3. }
  4. <link href="~/lib/layui/css/layui.css" rel="stylesheet" />
  5. <script src="~/lib/layui/layui.js"></script>
  6. <script src="~/lib/jquery/dist/jquery.js"></script>
  7. <div id="test12" class="demo-tree-more" style="margin-top:60px;"></div>
  8. <script>
  9.     layui.use(['tree''util'], function ({
  10.         var tree = layui.tree
  11.             , layer = layui.layer
  12.             , util = layui.util
  13.         $.get('/tree/GetTreeData'function (data{
  14.      
  15.         //基本演示
  16.         tree.render({
  17.             elem'#test12'
  18.             , data: data
  19.             , showCheckboxtrue  //是否显示复选框
  20.             , id'demoId1'
  21.             , isJumptrue //是否允许点击节点时弹出新窗口跳转
  22.             , clickfunction (obj{
  23.                 var data = obj.data;  //获取当前点击的节点数据
  24.                 layer.msg('状态:' + obj.state + '<br>节点数据:' + JSON.stringify(data));
  25.             }
  26.             });
  27.         })
  28.     });
  29. </script>


6,绑定数据之后,我们就运行该视图,就可以看到树形解析的层级关系了。


现在大家可以在数据库添加一条 特殊按摩节点下的一条数据,然后刷新页面,就会逐层展开下级啦。


由于我这里数据提前添加了的,所以截图上已经存在该数据,喜欢的朋友可以自己测试哦。

喜欢的话可以加收藏哇,



评价

默认昵称

2021/12/15 15:35:56

 mydbContext mydbContexts = new mydbContext();上下文不存在咋解决


你之所以觉得时间一年比一年过得快,是因为时间对你一年比一年重要。
排名
6
文章
6
粉丝
16
评论
8
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术