web api+递归树型结构

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using SqlSugar;
using Models;
using WebApplication.Dao;
using System.Text;

namespace WebApplication.Controllers
{
    /// <summary>
    /// 分类接口
    /// </summary>
    public class classificationController : ApiController
    {
        /// <summary>
        /// 获取分类列表(条件查询,分页) http://192.168.2.177:1222/api/classification/GetclassificationListPage?pageIndex=1&pageSize=10&status=2&title=
        /// </summary>
        /// <param name="pageIndex">分页索引</param>
        /// <param name="pageSize">分页大小</param>
        /// <param name="status">状态:0:下线 1:上线  -1:失效,默认传入2获取所有数据</param>
        /// <param name="title"></param>
        /// <returns></returns>
        [Route("api/classification/GetclassificationListPage")]
        [HttpGet]
        public string GetclassificationListPage(int pageIndex, int pageSize, int status, string title)
        {
            try
            {
                using (var db = SugarDao.GetInstance())
                {

                    var qable = db.Queryable<tb_classification>();
                    var dataCountTable = db.Queryable<tb_classification>();

                    if (status != 2)
                    {
                        qable = qable.Where(i => i.status == status);
                        dataCountTable = dataCountTable.Where(i => i.status == status);
                    }
                    if (status == 2)
                    {
                        dataCountTable = dataCountTable.Where(i => i.status != status);
                    }
                    if (!string.IsNullOrEmpty(title))
                    {
                        qable = qable.Where(i => i.title.Contains(title));
                        dataCountTable = dataCountTable.Where(i => i.title.Contains(title));
                    }

                    var data = qable.OrderBy(it => it.createtime, OrderByType.Asc).ToPageList(pageIndex, pageSize);

                    var dataCount = dataCountTable.ToList().Count;

                    if (data.Count > 0)
                    {
                        return SqlSugar.JsonConverter.Serialize(new { Result = 1, Msg = "获取数据成功", Data = data, Count = dataCount });
                    }
                    else
                    {
                        return SqlSugar.JsonConverter.Serialize(new { Result = 1, Msg = "获取数据失败", Data = data, Count = dataCount });
                    }

                }
            }
            catch (Exception ex)
            {
                return SqlSugar.JsonConverter.Serialize(new { Result = 0, Msg = "获取数据失败,原因为:" + ex.Message });
            }
        }

        /// <summary>
        /// 获取分类数据,不分页 http://192.168.2.177:1222/api/classification/GetclassificationList?status=2&title=
        /// </summary>
        /// <param name="status"></param>
        /// <param name="title"></param>
        /// <returns></returns>
        [Route("api/classification/GetclassificationList")]
        [HttpGet]
        public string GetclassificationList(int status, string title)
        {
            try
            {
                using (var db = SugarDao.GetInstance())
                {
                    var qable = db.Queryable<tb_classification>();
                    if (status != 2)
                    {
                        qable = qable.Where(i => i.status == status);
                    }
                    if (!string.IsNullOrEmpty(title))
                    {
                        qable = qable.Where(i => i.title.Contains(title));
                    }
                    var data = qable.OrderBy(it => it.createtime, OrderByType.Asc).ToList();
                    var dataCount = db.Queryable<tb_classification>().Where(it => it.status != status).ToList().Count;
                    if (data.Count > 0)
                    {
                        return SqlSugar.JsonConverter.Serialize(new { Result = 1, Msg = "获取数据成功", Data = data, Count = dataCount });
                    }
                    else
                    {
                        return SqlSugar.JsonConverter.Serialize(new { Result = 1, Msg = "获取数据失败", Data = data, Count = dataCount });
                    }

                }
            }
            catch (Exception ex)
            {
                return SqlSugar.JsonConverter.Serialize(new { Result = 0, Msg = "获取数据失败,原因为:" + ex.Message });
            }
        }

        /// <summary>
        /// 根据id得到对象 http://192.168.2.177:1222/api/classification/GetclassificationModel?id=1
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [Route("api/classification/GetclassificationModel")]
        [HttpGet, HttpPost]
        public string GetclassificationModel(int id)
        {
            try
            {
                using (var db = SugarDao.GetInstance())
                {
                    if (id != 0)
                    {
                        var classification = db.Queryable<tb_classification>().Single(it => it.id == id);
                        if (classification != null)
                        {
                            return SqlSugar.JsonConverter.Serialize(new { Result = 1, Msg = "获取数据成功", Data = classification });
                        }
                        else
                        {
                            return SqlSugar.JsonConverter.Serialize(new { Result = 1, Msg = "获取数据失败", Data = classification });
                        }
                    }
                    else
                    {
                        return SqlSugar.JsonConverter.Serialize(new { Result = 1, Msg = "获取数据失败,无法找到id为:" + id + "的数据", });
                    }

                }
            }
            catch (Exception ex)
            {
                return SqlSugar.JsonConverter.Serialize(new { Result = 0, Msg = "获取数据失败,原因为:" + ex.Message });
            }
        }
        /// <summary>
        /// 新增分类 http://192.168.2.177:1222/api/classification/Postclassification
        /// </summary>
        /// <param name="classification"></param>
        [Route("api/classification/Postclassification")]
        [HttpPost]
        public string Postclassification(tb_classification classification)
        {
            try
            {
                classification.createtime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                using (var db = SugarDao.GetInstance())
                {
                    object result = db.Insert<tb_classification>(classification);
                    if (Convert.ToInt64(result) > 0)
                    {
                        return SqlSugar.JsonConverter.Serialize(new { Result = 1, Msg = "添加成功" });
                    }
                    else
                    {
                        return SqlSugar.JsonConverter.Serialize(new { Result = 0, Msg = "添加失败" });
                    }
                }
            }
            catch (Exception ex)
            {

                return SqlSugar.JsonConverter.Serialize(new { Result = 0, Msg = "添加失败,原因为:" + ex.Message });
            }
        }
        /// <summary>
        /// 修改分类
        /// </summary>
        /// <param name="id"></param>
        /// <param name="value"></param>
        [Route("api/classification/Putclassification")]
        [HttpPost]
        public string Putclassification(tb_classification classification)
        {
            try
            {
                classification.createtime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                using (var db = SugarDao.GetInstance())
                {
                    bool result = db.Update<tb_classification>(classification, it => it.id == classification.id);
                    if (result == true)
                    {
                        return SqlSugar.JsonConverter.Serialize(new { Result = 1, Msg = "更新成功" });
                    }
                    else
                    {
                        return SqlSugar.JsonConverter.Serialize(new { Result = 0, Msg = "更新失败" });
                    }
                }
            }
            catch (Exception ex)
            {
                return SqlSugar.JsonConverter.Serialize(new { Result = 0, Msg = "更新失败,原因为:" + ex.Message });
            }
        }
        /// <summary>
        /// 删除 http://192.168.2.177:1222/api/classification/Deleteclassification?ids=4,5
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [Route("api/classification/Deleteclassification")]
        [HttpGet, HttpPost]
        public string Deleteclassification(string ids)
        {
            try
            {
                string[] input = ids.Split(‘,‘);
                int[] output = Array.ConvertAll<string, int>(input, delegate (string s) { return int.Parse(s); });

                using (var db = SugarDao.GetInstance())
                {
                    bool result = db.Delete<tb_classification, int>(output);
                    if (result == true)
                    {
                        return SqlSugar.JsonConverter.Serialize(new { Result = 1, Msg = "删除成功" });
                    }
                    else
                    {
                        return SqlSugar.JsonConverter.Serialize(new { Result = 0, Msg = "删除失败" });
                    }
                }
            }
            catch (Exception ex)
            {
                return SqlSugar.JsonConverter.Serialize(new { Result = 0, Msg = "删除失败,原因为:" + ex.Message });
            }
        }

        /// <summary>
        /// 更新状态 http://192.168.2.177:1222/api/classification/UpdateStatus?status=0&ids=2,7
        /// </summary>
        /// <param name="status">状态:0:下线 1:上线  -1:失效 </param>
        /// <param name="ids"></param>
        /// <returns></returns>
        [Route("api/classification/UpdateStatus")]
        [HttpGet]
        public string UpdateStatus(int status, string ids)
        {
            try
            {
                string[] input = ids.Split(‘,‘);
                int[] output = Array.ConvertAll<string, int>(input, delegate (string s) { return int.Parse(s); });
                using (var db = SugarDao.GetInstance())
                {
                    bool result = db.Update<tb_classification, int>(new { status = status }, output);
                    if (result == true)
                    {
                        return SqlSugar.JsonConverter.Serialize(new { Result = 1, Msg = "状态更改成功" });
                    }
                    else
                    {
                        return SqlSugar.JsonConverter.Serialize(new { Result = 0, Msg = "状态更改失败" });
                    }
                }
            }
            catch (Exception ex)
            {
                return SqlSugar.JsonConverter.Serialize(new { Result = 0, Msg = "状态更改失败,原因为:" + ex.Message });
            }
        }

        string result = string.Empty;
        /// <summary>
        /// 分类树形结构  http://192.168.2.177:1222/api/classification/GetclassificationTree
        /// </summary>
        /// <returns></returns>
        [Route("api/classification/GetclassificationTree")]
        [HttpGet]
        public string GetclassificationTree()
        {

            WebApplication.Controllers.TreeMethod tm = new TreeMethod();

            // 找到所有的父节点
            List<TreeEntity> treeList1 = tm.findAllParents();

            if (treeList1 != null)
            {
                for (int i = 0; i < treeList1.Count; i++)
                {
                    TreeEntity tree = treeList1[i];
                    // 打印父节点
                    result += "|--" + tree.name;
                    // 绑定孩子
                    result+=tm.BindChildByParent(tree.id, "");
                }
            }
            else
            {
                result += "没有数据!";
            }
            return SqlSugar.JsonConverter.Serialize(new { Result = 1, Msg = "获取数据成功",Data= result });
        }
    }
    public class TreeEntity
    {
        public string id { get; set; }
        public string name { get; set; }
        public string pid { get; set; }
    }
    internal class TreeMethod
    {
        /// <summary>
        /// 找到所有的父节点
        /// </summary>
        /// <returns></returns>
        public List<TreeEntity> findAllParents()
        {
            List<TreeEntity> treeList = new List<TreeEntity>();

            using (var db = SugarDao.GetInstance())
            {
                var list = db.Queryable<tb_classification>().Where(it => it.pid == 0 && it.status==1).ToList();
                if (list.Count > 0)
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        TreeEntity myTree = new TreeEntity();
                        myTree.id = list[i].id.ToString();
                        myTree.name = list[i].title;
                        myTree.pid = list[i].pid.ToString();
                        treeList.Add(myTree);
                    }
                }
            }
            return treeList;
        }

        /// <summary>
        /// 根据父节点找到所有的子节点
        /// </summary>
        /// <param name="pid"></param>
        /// <returns></returns>
        public List<TreeEntity> findChildByPid(string pid)
        {
            int p_id = Convert.ToInt32(pid);
            List<TreeEntity> treeList = new List<TreeEntity>();

            using (var db = SugarDao.GetInstance())
            {
                var list = db.Queryable<tb_classification>().Where(it => it.pid == p_id&&it.status==1).ToList();
                if (list.Count > 0)
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        TreeEntity myTree = new TreeEntity();
                        myTree.id = list[i].id.ToString();
                        myTree.name = list[i].title;
                        myTree.pid = list[i].pid.ToString();
                        treeList.Add(myTree);
                    }
                }
            }
            return treeList;
        }
        /// <summary>
        /// 查看是否存在子节点
        /// </summary>
        /// <param name="pid"></param>
        /// <returns></returns>
        public bool HasChild(string pid)
        {
            int p_id = Convert.ToInt32(pid);
            int count = 0;
            bool flag = false;
            using (var db = SugarDao.GetInstance())
            {
                var list = db.Queryable<tb_classification>().Where(it => it.pid == p_id&it.status==1).ToList();

                for (int i = 0; i < list.Count; i++)
                {
                    count++;
                }
                if (count > 0)
                {
                    flag = true;
                }
            }
            return flag;
        }
        string Tree = string.Empty;
        /// <summary>
        /// 使用递归拼接父节点的子节点
        /// </summary>
        /// <param name="pid"></param>
        /// <param name="prefix"></param>
        public string BindChildByParent(string pid, string prefix)
        {

            if (this.HasChild(pid))
            {
                // 得到当前父节点下的所有孩子
                List<TreeEntity> list = this.findChildByPid(pid);
                // 循环打印当前父节点下的孩子
                for (int i = 0; i < list.Count; i++)
                {
                    Tree += "|----" + prefix + list[i].name;
                    if (this.HasChild(list[i].id))
                    {
                        this.BindChildByParent(list[i].id, "--");
                    }
                }
            }
            return Tree;
        }
    }
}

时间: 2024-08-05 07:06:07

web api+递归树型结构的相关文章

ORACLE 递归树型结构统计汇总

区域平台统计报表,省--市--区 汇总,还有各级医院,汇总与列表要在一个列表显示. 用到ORACLE 会话时临时表  GLOBAL TEMPORARY TABLE     ON COMMIT PRESERVE ROWS; 递归树: START WITH P.PARENTORG = 'ROOT'               CONNECT BY PRIOR P.ORGCODE = P.PARENTORG; WITH 连续嵌套 记录一下便于查阅. CREATE OR REPLACE PACKAGE

Mysql树型结构2种方式及相互转换

Mysql实现树型结构,数据库上常见有2种方式:领接表.预排序遍历树(MPTT). 领接表方式-- 主要依赖于一个 parent 字段,用于指向上级节点,将相邻的上下级节点连接起来,id 为自动递增自动,parent_id 为上级节点的 id. 领接表方式的优点在于容易理解,代码也比较简单明了.缺点则是递归中的 SQL 查询会导致负载变大,特别是需要处理比较大型的树状结构的时候,查询语句会随着层级的增加而增加,WEB 应用的瓶颈基本都在数据库方面,所以这是一个比较致命的缺点,直接导致树结构的扩展

通用的树型类,可以生成任何树型结构

<?php namespace Vendor\Tree; /** * 通用的树型类,可以生成任何树型结构 */ class Tree { /** * 生成树型结构所需要的2维数组 * @var array */ public $arr = array(); /** * 生成树型结构所需修饰符号,可以换成图片 * @var array */ public $icon = array('│', '├', '└'); public $nbsp = " "; private $str =

树型结构

树型结构的基本概念 对大量的输入数据,链表的线性访问时间太慢,不宜使用.本文探讨另外一种重要的数据结构----树,其大部分时间可以保证操作的运行平均时间复杂度为O(logN),第一部分先来看一下树的一些预备知识. 首先看一下树形结构的样子,下图代表的是树型结构的一般形态: 由上图看得出树是一些节点的集合,总结一下树的一些基本概念: 1.结点:树中的数据元素都称之为结点 2.根:最上面的结点称之为根,一颗树只有一个根且由根发展而来,从另外一个角度来说,每个结点都可以认为是其子树的根 3.父亲:结点

dzzoffice的树型结构用户管理设计

在DzzOffice1.1的开发中,针对用户使用群体重新设计了,机构.部门.用户管理应用. 传统OA,企业相关程序,一般是设置机构-设置部门-设置职位-添加用户这样的步骤.每个步骤分为不同的管理界面.用户管理采用列表的形式,每页显示10条.20条或更多.用户的管理,移动等操作会在不同的界面中切换.感觉操作过程会很繁琐,显示也不直观. DzzOffice主要针对几人至几百人的中小型团队和企业使用设计,要实现的功能目标主要是: 便捷增 删 移 机构.部门.子部门 便捷增 删 移 用户 批量导入用户

数据结构中常用树型结构简介

B树.B-树.B+树.B*树.红黑树rbtree 二叉排序树.trie树Double Array 字典查找树 B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中:否则,如果查询关键字比结点关键字小,就进入左儿子:如果比结点关键字大,就进入右儿子:如果左儿子或右儿子的指针为空,则报

ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现

很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构.这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地订阅来自于某个渠道的事件消息,并对接收到的消息进行处理,于此同时,它还能够向该渠道发送事件消息,以便订阅该事件消息的消费者能够对消息数据做进一步处理.让我们回顾一下微服务之间通信的几种方式,分为同步和异步两种.同步通信最常见的就是RESTful API,而且非常简单轻量,一个Request/Resp

ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很长的路要走.今天,我们就研究一下在事件处理器中,对象生命周期的管理问题. 事实上,不仅仅是在事件处理器中,我们需要关心对象的生命周期,在整个ASP.NET Core Web API的应用程序里,我们需要理解并仔细推敲被注册到IoC容器中的服务,它们的生命周期应该是个怎样的情形,这也是服务端应用程序设

在Silverlight中使用HierarchicalDataTemplate为TreeView实现递归树状结构

将实体绑定到TreeView控件,实现树状结构的显示,如下图所示.这个功能通过HierarchicalDataTemplate实现. ? 1. 业务实体 作为举例,我定义了一个大家都很熟悉的Folder类型,即文件夹.我们都知道,文件夹又可以包含子文件夹,而且可以多层嵌套.所以,这是一个递归的结构体. public class Folder { public string Name { get; set; } public ObservableCollection<Folder> Folder