mysql查询结果拼接树结构(树节点的移动)

思路:单表内查询全部数据,在业务层内递归拼接树结构。

前端用的是element的Tree 树形控件:

树结构实体:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TreeSelect implements Serializable { /**
* 所需参数跟前端商讨,参数名跟前端确认一下,我的就是两个前端没统一后面还重加了个
*/ private static final long serialVersionUID = -1370015781272165366L; private Long id; private Long pid; private String label; /**
* 排序,树节点移动需要
*/
private int sno; @ApiModelProperty(value = "是否启用,0禁用,1正常")
private int status; /**
* 子级,下一级节点
*/
private List<TreeSelect> subordinate; }

业务层拼接树:

    @Override
public Object getSysClassifyItemTree(Long versionId) {
//查询出全部数据
List<TreeSelect> sysClassifyItemList = classifyMapper.getAll(versionId); Map<Long, List<TreeSelect>> collect = sysClassifyItemList.stream().collect(Collectors.groupingBy(TreeSelect::getPid));
List<TreeSelect> list = collect.get(0L);
List<TreeSelect> items = new ArrayList<>();
if (null == list) {
//在没有数据的时候,给前端返回一个虚拟节点方便展示,操作
TreeSelect sss = new TreeSelect(0l, "虚拟节点", 0l);
items.add(sss);
return JSON.toJSON(items).toString();
}
for (TreeSelect sysClassifyItem : collect.get(0L)) {
buildTree(sysClassifyItem, collect);
}
//如果这个树需要一个固定的父节点,new一个TreeSelect对象 f,把拼出来的树塞到f的subordinate也就是子级。
return JSON.toJSON(list).toString();
} /**
* 拼接树
*/
private void buildTree(TreeSelect sysClassifyItem, Map<Long, List<TreeSelect>> collect) {
if (null == sysClassifyItem || null == collect.get(sysClassifyItem.getId())) {
return;
}
sysClassifyItem.setSubordinate(collect.get(sysClassifyItem.getId()));
for (TreeSelect classifyItem : collect.get(sysClassifyItem.getId())) {
buildTree(classifyItem, collect);
}
}

下来是树节点的移动,也就是上移下移(提出到上层节点跟插入到子级节点就不放了,单纯的修改而已)

在移动的时候我们需要知道自己的位置和要移动到的位置,也就是目标位置

移动节点实体:

@Data
public class MoveNode implements Serializable {
private static final long serialVersionUID = 8370232720686896563L; private Long parentId;
private Long sno;//排序,节点当前位置
private Long targetSno;//目标位置
private Long id; }

业务层:

@Override
public boolean moveUp(MoveNode moveNode) { //判断节点是上移还是下移
if (moveNode.getMoveSno() > moveNode.getSno()) {
if (structureMapper.moveDownA(moveNode) == -1 || structureMapper.move(moveNode) == -1) {
return false;
}
} else if (moveNode.getMoveSno() < moveNode.getSno()) {
if (structureMapper.moveUpA(moveNode) == -1 || structureMapper.move(moveNode) == -1) {
return false;
}
}
return true;
}

mapper:

<!--上移我们需要以目标位置到自身位置的前一个位置为区间给每个节点的顺序都往后调一位-->
<update id="moveUpA">
UPDATE SYS_TEAM
<set>
WEIGHT = WEIGHT + 1
</set>
<where>
<if test="parentId != null">and UNITID = #{parentId}</if>
<if test="moveSno != null and sno != null">and WEIGHT BETWEEN #{moveSno} and #{sno}-1</if>
</where>
</update> <!--下移就刚好相反,我们需要以自身位置的后一个位置到目标位置为区间给每个节点的顺序都往前调一位-->
<update id="moveDownA">
UPDATE SYS_TEAM
<set>
WEIGHT = WEIGHT - 1
</set>
<where>
<if test="parentId != null">and UNITID = #{parentId}</if>
<if test="moveSno != null and sno != null">and WEIGHT BETWEEN #{sno}+1 and #{moveSno}</if>
</where>
</update> <!--每次移动后将自身位置替换为目标位置-->
<update id="move">
UPDATE SYS_TEAM
<set>
<if test="moveSno != null">WEIGHT = #{moveSno}</if>
</set>
<where>
<if test="parentId != null">and UNITID = #{parentId}</if>
<if test="sno != null">and WEIGHT = #{sno}</if>
<if test="id != null">and ID = #{id}</if>
</where>
</update>

看下图,移动这里有个问题是前端无法拿到准确的位置,因为element的可拖拽树每个节点有after,before两条线,绑定的是这个节点自身的属性,也就是说两个节点之间有两条线,这就导致c节点在移动到A——B之间时可能会放到a2的这条线导致目标位置拿成了A的位置。即我本身是想将c移动到B的上方,结果是变成了A的上方,同理下移的时候A移动到B的下面,不小心就变成了C的下面。我在网上看有其他的tree控件是可以解决的,前端怕改的地方太多引起别的问题,一直没动。不知道大家有没有遇到过,怎么解决的呢?

mysql查询结果拼接树结构(树节点的移动)的更多相关文章

  1. 认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法。元素、属性和文本的树结构(节点树)。

    认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面代码 ...

  2. MySQL查询性能优化(精)

    MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...

  3. MySQL查询计划 key_len计算方法

    本文首先介绍了MySQL的查询计划中ken_len的含义:然后介绍了key_len的计算方法:最后通过一个伪造的例子,来说明如何通过key_len来查看联合索引有多少列被使用. key_len的含义 ...

  4. MongoDB 及 Mysql 背后的 B/B+树

    索引是数据库常见的数据结构,每个后台开发人员都应该对索引背后的数据结构有所了解. 本文通过分析B-Tree及B-/+Tree数据结构及索引性能分析及磁盘存取原理尝试着回答一下问题: 为什么B-Tree ...

  5. 170727、MySQL查询性能优化

    MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...

  6. 面试题:MySQL索引为什么用B+树?

    面试题:MySQL索引为什么用B+树? 前言 讲到索引,第一反应肯定是能提高查询效率.例如书的目录,想要查找某一章节,会先从目录中定位.如果没有目录,那么就需要将所有内容都看一遍才能找到. 索引的设计 ...

  7. MySQL 树形索引结构 B树 B+树

    MySQL 树形索引结构 B树 B+树   如何评估适合索引的数据结构 索引的本质是一种数据结构 内存只是临时存储,容量有限且容易丢失数据.因此我们需要将数据放在硬盘上. 在硬盘上进行查询时也就产生了 ...

  8. MySQL索引结构之B+树索引(面)

    首先要明白索引(index)是在存储引擎(storage engine)层面实现的,而不是server层面.不是所有的存储引擎都支持所有的索引类型.即使多个存储引擎支持某一索引类型,它们的实现和行为也 ...

  9. 彻底搞懂MySQL为什么要使用B+树索引

    目录 MySQL的存储结构 表存储结构 B+树索引结构 B+树页节点结构 为什么要用B+树索引 二叉树 多叉树 B树 B+树 搞懂这个问题之前,我们首先来看一下,MySQL表的存储结构 MySQL的存 ...

  10. Mysql 查询练习

    Mysql 查询练习 ---创建班级表 create table class( cid int auto_increment primary key, caption ) )engine=innodb ...

随机推荐

  1. Springboot_maven多环境配置

    开发过程中总是需要多环境配置,而Spring自带的方式不是那么优秀,可以利用maven来帮助做到 可以再pom.xml中配置profiles来做到 打包命令: mvn clean package -P ...

  2. 这份数据安全自查checklist请拿好,帮你补齐安全短板的妙招全在里面!

    企业数据安全自查Checklist! 快来对照表单,看看你的数据安全及格了吗? 一.京东云安全Checklist建议 京东云安全拥有业界领先的安全研究团队,经过多年实践与经验积累,京东云已面向不同业务 ...

  3. Vim使用技巧(持续更新)

    好记性不如烂笔头,在这里记录一些Vim使用技巧 vim配置 "拷贝同步到系统剪切板" set clipboard=unnamed "显示行号" set nu & ...

  4. [Python]-tqdm模块-给for循环加上进度条

    import tqdm 使用tqdm模块,可以在漫长的for循环加上一个进度条,显示当前进度百分比. 将tqdm写在迭代器之外即可:tqdm(iterator) for i in tqdm(range ...

  5. Grafana 入门知识介绍

    通过[Configuration]>[Plugins]添加插件 通过[Configuration]>[Data Sources]添加数据源(分析对象) 通过[Server Admin]&g ...

  6. Fluentd采集示例

    Fluentd通过读取配置文件来加载各插件,日志经由各插件的处理完成输入到输出的整个路由. 本文通过一个最简单的示例来说明配置文件的结构.td-agent.conf默认位于/etc/td-agent/ ...

  7. 7M与N的数学运算

    m=eval(input()) n=eval(input()) a=m+n b=m*n c=m**n d=m%n e=max(m,n) print(a,b,c,d,e)

  8. 洛谷P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G (tarjan缩点)

    在本题中很明显,给你一个有向图,要用tarjan缩点. 缩点后,一头牛要受到所有牛的欢迎,那么该点的出度要为0,这是容易证明的:如果该点还有出度,比如a连向b,那么a不受到b的欢迎.所以我们要找出度为 ...

  9. Docker容器虚拟化

    Docker容器虚拟化 目录 Docker容器虚拟化 虚拟化网络 单节点容器间通信 不同节点容器间通信 虚拟化网络 Network Namespace 是 Linux 内核提供的功能,是实现网络虚拟化 ...

  10. Springboot 之 Filter 实现超大响应 JSON 数据压缩

    简介 项目中,请求时发送超大 json 数据外:响应时也有可能返回超大 json数据.上一篇实现了请求数据的 gzip 压缩.本篇通过 filter 实现对响应 json 数据的压缩. 先了解一下以下 ...