谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现

这篇具有很好参考价值的文章主要介绍了谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、总述

1.1 前端思路

1.2 后端思路

二、前端实现

2.1 判断是否能进行拖拽

2.2 收集受影响的节点,提交给服务器

三、后端实现

四、总结


一、总述

这个拖拽功能对于这种树形的列表,整体的搬迁是很方便的。但是其实现却并不是那么的简单。

1.1 前端思路

花样主要体现在前端上面,前端有两个大的部分,一个是使用elementUI提供给我们的api判断是否能够进行拖拽,因为并不是能够随意的拖拽的,因为这个树形列表是三级分类,受到了三级的限制。另外一个部分就是拖拽之后,会有一些节点的信息将发生改变,需要进行收集,然后统一发到后端服务器,进行修改

1.2 后端思路

而后端的话没什么,就一个修改接口就行了。

二、前端实现

当然最开始肯定得开启树形控件的可拖拽功能

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目

默认是未开启的,需要我们手动开启

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目

2.1 判断是否能进行拖拽

完成这个功能需要依靠elementUI提供给我们的api,我下面简单的介绍一下这个api

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目

然后在树形控件的参数那里放上这个参数,并给上一个方法

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目 然后根据它提供给我们的这三个信息来进行判断,最终决定是否能拖拽成功。

这个判断的核心逻辑是:

1. 先计算出被拖拽节点的最大层数

计算方法是:使用打擂台的方式计算出子节点的最大深度,并递归的计算其又子节点的最大深度,得到这个目标节点的子节点的最大深度,但这个只是子节点的最大深度,并不是以被拖拽节点为始发层的最大层数,那么如何计算呢?实际上就是求差,现在求得是总的,我们并不需要前面的那一截了,因为等下我要换地方了,前面的那一截就换了,而被拖拽的那一部分是不变的,那前面的那一部分又该怎样得到呢?

其实就是当前拖拽节点的层级,然后使用子节点的最大深度 - 当前拖拽节点的层数 + 1 就得到了当前被拖拽节点的最大层数。 


1.1 使用打擂台的方式计算出子节点的最大深度

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目

computerMaxLevel(node){
      var childrenNodeList = node.childNodes;
      //console.log("childrenNodeList",childrenNodeList);
      if(childrenNodeList!=null){
        for(let i = 0;i<childrenNodeList.length;i++){
          //console.log(1111);
           if(childrenNodeList[i].level>this.maxLevel){
               this.maxLevel = childrenNodeList[i].level;
           }
           this.computerMaxLevel(childrenNodeList[i]);
        }
      }
    }

2. 计算拖拽后总层数(也就是目标结果)

现在的话拖的一部分已经有了,但是拖到的位置,那里所占据的层数还没有考虑,现在的工作就是加上新地方的层数。

现在的计算得按照不同情况进行计算,因为有两种情况:

2.1 与拖到的目标节点同层级,互为兄弟

那么就是目标节点的父节点的层级  + 刚刚求出的被拖拽节点的最大层数

2.2 是拖到的目标节点的孩子

那么直接就是目标节点的层级 + 刚刚求出的被拖拽节点的最大层数

3. 直接判断

当拖拽后的总层数<=3时,判断方法返回true,拖拽成功

否则拖拽失败

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目

allowDrop(draggingNode, dropNode, type) {
        this.maxLevel = draggingNode.level;
        console.log(draggingNode, dropNode, type);
        this.computerMaxLevel(draggingNode);
        console.log("maxLevel",this.maxLevel);
        var deep = this.maxLevel - draggingNode.level +1;
        console.log("deep",deep);
        if(type == "before"|| type == "next"){
          return (deep + dropNode.parent.level)<=3;
        }else{
          return (deep + dropNode.level)<=3;
        }
    }

2.2 收集受影响的节点,提交给服务器

首先要明白有哪些节点会受到影响。

1. 前序的数据域中数据的定义

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目

一、考虑影响了别人

其实就是影响了兄弟。

如果说被拖拽节点与目标节点经拖拽后互为兄弟关系的话,那么就会影响到其他兄弟的排序顺序,因为现在多加了一个节点,势必这个新增节点之后的节点顺序都要向后推一位。(这些兄弟就需要收集起来

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目

当然如果被拖拽节点与目标节点经拖拽后互为父子关系的话,那么就改变了目标节点的子节点的那些兄弟。

二、考虑影响了自己

被拖拽节点拖拽后,到其他父节点上面去了,因此被拖拽节点的父节点也发生了改变,另外被拖拽节点的层级也将发生变化,其被拖拽节点的子节点的父节点不会变,还是被拖拽节点,可是其子节点的层级肯定发生了改变,其子节点的字节点的层级也发生了改变,因此需要递归操作

总的来说标红的三处地方就是需要提交到服务器的节点,但是并不是需要提供节点的完整信息,而是提供需要修改的信息即可:

1. 对于那些兄弟节点,提供兄弟节点的 id和 排序值就可以了,根据id主键进行修改

2. 对于那个被拖拽节点,需要提供被拖拽节点的 id、父节点、还有最新的层级

3. 对于其被拖拽节点的字节点,需要提供其节点的id 以及节点最新的层级即可

最后将这三部分的节点,提交给服务器就行了。

思路我说了,最后代码进一步的简洁,我已经说的很明白了,在截图中,这里为什么和我刚刚说了有点不一样,就是那个sort字段为什么任何时候都需要加上这个,是因为其实数据库本来全是0的,正是靠这个算法才赋上值,当然这里也不全面,只涉及到修改了的部分,详细的代码参考如下:

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目

handleDrop(draggingNode, dropNode, dropType){
      //受影响的数组
       var nodes = null;
       if(dropType == "before" || dropType == "next"){
          nodes = dropNode.parent.childNodes;
          this.pCid = dropNode.parent.data.catId==undefined?0:dropNode.parent.data.catId;
       }else{
          nodes = dropNode.childNodes;
          this.pCid = dropNode.data.catId;
       }
       console.log("nodes",nodes);
       for(let i=0;i<nodes.length;i++){
          if(nodes[i].data.catId == draggingNode.data.catId){
              this.updateNodes.push({catId:nodes[i].data.catId,sort:i,parentCid:this.pCid,level:nodes[i].level})
              if(nodes[i].data.level != nodes[i].level){
                //因为被拖拽的节点的层级发生了改变,因此其子节点的层级也会跟着改变
                 this.updateChirenLevel(nodes[i]);
              }  
          }else{
            this.updateNodes.push({catId:nodes[i].data.catId,sort:i})
          }
       }
       console.log("updateNodes",this.updateNodes);
    },
    //修改子节点的level
    updateChirenLevel(node){
       if(node.childNodes!=null && node.childNodes.length>0){
          for(let i=0;i<node.childNodes.length;i++){
             this.updateNodes.push({catId:node.childNodes[i].data.catId,level:node.childNodes[i].level,sort:i});
             this.updateChirenLevel(node.childNodes[i]);
          }
       }
    },

最终将需要更新的节点数组作为请求参数提交给后端,在后端修改即可

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目 谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目

三、后端实现

后端的话很简单,就一个修改接口,使用MP的方法,根据主键进行批量修改。 

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现,谷粒商城,SpringBoot,vue,spring boot,vue,项目

 /**
     * 批量修改商品分类信息
     */
    @ApiOperation("批量修改商品分类信息")
    @Log(title = "批量修改商品分类信息",businessType = BusinessType.UPDATE)
    @PutMapping("/batchUpdateCategory")
    public AjaxResult batchEdit(@RequestBody List<Category> categoryList){
        return toAjax(categoryService.updateBatchById(categoryList));
    }

四、总结

其实总的来说只要想清楚了,其实还是很简单的。

这里关键是前端的逻辑稍微有那么点复杂,有写算法题的那味了,但是仔细一想还是挺简单的。

主要是关系,还有数量关系等,比如说求被拖拽节点的最大层数,需要用到数量计算表达式

其实就是一个减法,用子节点的最大深度减去被拖拽节点的层数  + 1 即可求得其被拖拽节点的最大层数,有了这个最大层数然后再配合目标那里的层数,按照不同的条件进行相加,最后总的层数不就出来了吗?有了总层数当然是否能拖拽就好判断了。

另外还有就是搬过来之后会导致一些节点的信息发送改变,此时就需要收集起来,发给后端,再后端进行修改,这里关键是想明白到底哪些节点修改了,需要收集哪些属性,其实也是很简单的,想清楚就好了。文章来源地址https://www.toymoban.com/news/detail-623465.html

到了这里,关于谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 谷粒商城笔记+踩坑(9)——上架商品spu到ES索引库

    导航: 谷粒商城笔记+踩坑汇总篇 目录 1、ES回顾 2、ES整合商品上架  2.1、分析 2.2、创建sku的es索引库 2.2.1、两种索引库设计方案分析 2.2.2、最终选用的索引库方案,nested类型 2.3、SkuEsModel模型类 2.4、【库存模块】库存量查询 2.5、【查询模块】保存ES文档 2.5.1、常量类 2.5.2、

    2024年02月05日
    浏览(52)
  • 谷粒商城第十一天-完善商品分组(主要添上关联属性)

    目录 一、总述 二、前端部分 2.1 改良前端获取分组列表接口及其调用 2.2 添加关联的一整套逻辑 三、后端部分 四、总结 前端部分和之前的商品品牌添加分类差不多。 也是修改一下前端的分页获取列表的接口,还有就是加上关联的那一套逻辑,包括基本构件的引入、数据域的

    2024年02月13日
    浏览(58)
  • 【七天入门数据库】第七天 MySQL的事务管理

    【七天入门数据库】第一天 MySQL的安装部署 【七天入门数据库】第二天 数据库理论基础 【七天入门数据库】第三天 MySQL的库表操作 【七天入门数据库】第四天 数据操作语言DML 【七天入门数据库】第五天 MySQL的备份恢复 【七天入门数据库】第六天 MySQL的视图与索引 【七天

    2024年02月15日
    浏览(56)
  • 谷粒商城第十天-获取分类属性分组(前端组件抽取&父子组件交互)

    目录 一、总述 1.1 前端思路 1.2 后端思路 二、前端部分 2.1 将分类树前端代码抽取成一个组件 2.2 使用elementUI的组件实现左右组件功能 2.3 使用事件机制进行组件通信 三、后端部分 四、总结 说一下今天需要实现一个什么样子的功能: 很简单,就是在属性分组的那个页面,左

    2024年02月14日
    浏览(51)
  • 001-谷粒商城-微服务剖析

    还是很强的,该有的都有 SpringCloudAlibaba组件包括 Sentinel Nacos RocketMQ Seata 搭配SpringCloudAlibaba组件 OpenFeign GateWay Ribbn gateway使用了SpringWebFlux,前几天研究到,为什么springboot不直接使用SpringWebFlux, 还是依然使用tomcat的servelet,内部NIO进行处理请求。 Spring WebFlux 使用 Reactor库来实现

    2024年04月16日
    浏览(64)
  • 谷粒商城-订单服务

    目录 商城业务-订单服务-RabbitMQ延时队列 商城业务-订单服务-延时队列定时关单模拟 商城业务-订单服务-创建业务交换机队列 商城业务-订单服务-监听库存解锁 商城业务-订单服务-库存解锁逻辑 商城业务-订单服务-库存自动解锁完成 商城业务-订单服务-测试库存自动解锁 商城

    2023年04月08日
    浏览(47)
  • 谷粒商城第十二天-基本属性&销售属性管理功能的实现

    目录 一、总述 二、前端部分 三、后端部分 四、总结 前端的话,依旧是直接使用老师给的。 前端的话还是那些增删改查,业务复杂一点的话,无非就是设计到多个字段多个表的操作,当然这是后端的事了,前端这里不做深究,走一下流程,知道哪些数据,需要绑定哪些事件

    2024年02月13日
    浏览(44)
  • Spring Boot + Vue的网上商城之商品分类

    在网上商城中,商品分类是非常重要的一个功能,它可以帮助用户更方便地浏览和筛选商品。本文将介绍如何使用Spring Boot和Vue来实现商品分类的功能,包括一级分类和二级分类的管理以及前台按分类浏览商品的实现。 数据库设计:设计商品分类表和商品表,商品分类表包含

    2024年02月09日
    浏览(50)
  • 2023最新谷粒商城笔记之支付服务篇(全文总共13万字,超详细)

    这里我们是使用的支付宝进行支付,所以需要调用支付宝的相关API,下面来了解一下怎样使用支付宝进行线上支付。 支付宝开放平台传送门: 支付宝开放平台 网站支付DEMO传送门: 手机网站支付 DEMO | 网页移动应用 RSA、加密加签、密钥等 对称加密 对称加密 :发送方和接收

    2024年02月09日
    浏览(55)
  • 谷粒商城P139集——云服务器frp内网穿透+nginx

    我注册的域名是第一年14元的 (1)购买域名并备案 (2)域名解析 测试:如域名为gulimall.com 则在浏览器中输入 gulimall.com:9200 (前提是9200端口已经开放) (1)下载 wget https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_amd64.tar.gz 云服务器下载linux版本注意frps的配置即可

    2024年02月09日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包