ztree这个系列的最后一篇,也是ztree功能强大的体现之中的一个——排序功能。

ztree能够实现全部节点之间任意的拖拽排序功能。我这里依据须要实现了仅仅同意同级之间任意拖拽排序,事实上原理都一样,仅仅是范围缩小了一些,多了一些推断而已。以下是每一层的代码。还是採取仅仅贴出功能代码。由于这个拖拽排序功能我感觉非常不错,所以单独拿出一篇博客来展示,也方便理解。

Jsp页面实现功能的js代码例如以下:

     //拖拽前运行
     var dragId;
     function beforeDrag(treeId, treeNodes) {
            for (var i=0,l=treeNodes.length; i<l; i++) {
                   dragId = treeNodes[i].pId;
                 if (treeNodes[i].drag === false) {
                      return false;
                }
           }
            return true;
     }
      //拖拽释放之后运行
     function beforeDrop(treeId, treeNodes, targetNode, moveType) {
             if(targetNode.pId == dragId){
                  var data = {id:treeNodes[0].id,targetId:targetNode.id,moveType:moveType};
                  var confirmVal = false;
                  $.ajax({
                       async: false,
                       type: "post",
                       data:data,
                       url:"<%=request.getContextPath() %>/library/updateLibrarySort/ ",
                       success: function(json){
                             if(json=="success" ){
                                  confirmVal = true;
				  alert('操作成功!');
                             } else{
				  alert('亲,操作失败');
                             }
                       },
                       error: function(){
			     alert('亲,网络有点不给力呀。');
                       }
                  });
                 return confirmVal;
             } else{
		  alert('亲,仅仅能进行同级排序!

');
                  return false;
           }
     }

Controller层代码例如以下:

     /**
     * 更新分类排序
     * @return
     */
     @RequestMapping(value="updateLibrarySort/")
     @ResponseBody
     public String updateLibrarySort(HttpServletRequest request, HttpServletResponse response,LibraryVo libraryVo) {
          String createname=(String) request.getSession().getAttribute(Constants.CURRENT_USER_NAME);
          return libraryService.updateLibrarySort(libraryVo,createname);
     }

service层代码例如以下:

     /**
     * 更新排序
     * @return
     */
     public String updateLibrarySort(LibraryVo libraryVo,String userName){
          int numFlag = 0;
          Library libraryT = libraryMapper.selectByPrimaryKey(libraryVo.getTargetId());//目标分类信息
          Library library = libraryMapper.selectByPrimaryKey(libraryVo.getId());//拖动分类信息
          library.setTarget_order_id(libraryT.getOrder_id());
          library.setUpdate_time(new Date());//设置时间
          library.setUpdate_user(userName);//设置操作人
          libraryT.setUpdate_time(new Date());//设置时间
          libraryT.setUpdate_user(userName);//设置操作人
          Map<String,Object> libraryMap = new  HashMap<String, Object>();//參数集合
          if (libraryVo.getMoveType().equals("prev")) {//向前移动
               libraryMap.put("pid", library.getPid());
               libraryMap.put("order_id", library.getTarget_order_id());
               libraryMap.put("target_order_id", library.getOrder_id());
               List<Library> listLibraryFlag = libraryMapper.findLibraryListByOrderId(libraryMap);
               int order_id = libraryT.getOrder_id() + 1;
               library.setOrder_id(libraryT.getOrder_id());
               libraryT.setOrder_id(order_id);
               for (int i = 0; i < listLibraryFlag.size(); i++) {//更新全部受影响的排序字段
                    Library ly = listLibraryFlag.get(i);
                    if(!(ly.getId()).equals(library.getId()) && !(ly.getId()).equals(libraryT.getId())){
                         ly.setUpdate_time(new Date());
                         ly.setUpdate_user(userName);
                         ly.setOrder_id(ly.getOrder_id()+1);
                         libraryMapper.updateOrderId(ly);//更新其它受影响的分类信息
                    }
               }
               libraryMapper.updateOrderId(library);//更新拖动分类信息
               numFlag = libraryMapper.updateOrderId(libraryT);//更新目标分类信息
          }else if(libraryVo.getMoveType().equals("next")){//向后移动
               libraryMap.put("pid", library.getPid());
               libraryMap.put("order_id", library.getOrder_id());
               libraryMap.put("target_order_id", library.getTarget_order_id());
               List<Library> listLibraryFlag = libraryMapper.findLibraryListByOrderId(libraryMap);
               int order_id = libraryT.getOrder_id();
               library.setOrder_id(order_id);
               libraryT.setOrder_id(order_id - 1);
               for (int i = 0; i < listLibraryFlag.size(); i++) {//更新全部受影响的排序字段
                    Library ly = listLibraryFlag.get(i);
                    if(!(ly.getId()).equals(library.getId()) && !(ly.getId()).equals(libraryT.getId())){
                         ly.setUpdate_time(new Date());
                         ly.setUpdate_user(userName);
                         ly.setOrder_id(ly.getOrder_id() - 1);
                         libraryMapper.updateOrderId(ly);//更新其它受影响的分类信息
                    }
               }
               libraryMapper.updateOrderId(library);//更新拖动分类信息
               numFlag = libraryMapper.updateOrderId(libraryT);//更新目标分类信息
          }else{
               //
          }
          return ServiceUtil.ReturnString(numFlag);
     }

Mapper层代码例如以下

     /**
     * 依据pid、order_id和target_order_id查询全部受影响的信息
     * @param pid
     * @param order_id
     * @param target_order_id
     * @return
     */
     public List<Library> findLibraryListByOrderId(Map<String,Object> library);

     /**
     * 更新
     * @param library
     * @return
     */
     public int updateOrderId(Library library);

相应的xml代码例如以下:

  < sql id= "Base_Column_List" >
    id, pid , name, create_time, update_time, is_delete, update_user, create_user, level_id,
    order_id
  </ sql>
  <!-- 更新order_id -->
  < update id= "updateOrderId" parameterType="Library" >
           update onair_vms_library
            <set >
                update_time = #{update_time},
                update_user = #{update_user},
                order_id = #{order_id}
            </set >
           where id = #{id}
  </ update>

  <!-- 依据 pid、order_id和target_order_id查询全部受影响的信息 -->
  < select id= "findLibraryListByOrderId" resultMap= "BaseResultMap" parameterType ="java.util.Map" >
     select
     <include refid ="Base_Column_List"/>
     from onair_vms_library
     where  order_id between  #{order_id} and  #{target_order_id}  and  pid = #{ pid}
  </ select>

写的一般,不正确的地方欢迎指正,有高效或者更加简便的办法希望可以共享一下,尤其是在排序功能运行保存的时候假设可以不使用循环一条sql能搞定就更加强大了。欢迎大家指点。

ztree使用系列四(ztree实现同级拖拽排序并将排序结果保存数据库)的更多相关文章

  1. JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)

    前言:前天刚写了篇JS组件系列——Bootstrap Table 表格行拖拽,今天接到新的需要,需要在之前表格行拖拽的基础上能够同时拖拽选中的多行.博主用了半天时间研究了下,效果是出来了,但是感觉不尽 ...

  2. MVC小系列(十五)【MVC+ZTree实现对树的CURD及拖拽操作】

    根据上一讲的可以加载一棵大树,这讲讲下如果操作这颗大树 <link href="../../Scripts/JQuery-zTree/css/zTreeStyle/zTreeStyle ...

  3. 爱上MVC3~MVC+ZTree实现对树的CURD及拖拽操作

    回到目录 上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除 ...

  4. JS组件系列——Bootstrap Table 表格行拖拽

    前言:之前一直在研究DDD相关知识,好久没更新JS系列文章了.这两天做了一个简单的业务需求,觉得效果还可以,今天在这里分享给大家,欢迎拍砖~~ 一.业务需求及实现效果 项目涉及到订单模块,那天突然接到 ...

  5. canvas 图片拖拽旋转之二——canvas状态保存(save和restore)

    引言 在上一篇日志“canvas 图片拖拽旋转之一”中,对坐标转换有了比较深入的了解,但是仅仅利用坐标转换实现的拖拽旋转,会改变canvas坐标系的状态,从而影响画布上其他元素的绘制.因此,这个时候需 ...

  6. 【UWP】拖拽列表项的排序功能实现

    在一些允许用户自定义栏目顺序的app(如:凤凰新闻.网易云音乐等),我们可以方便地拖拽列表项来完成列表的重新排序,进而完成对栏目顺序的重排.这个功能很人性化,而实现起来其实很简单(甚至都不用写什么后台 ...

  7. 【转】JS容器拖拽效果,并通过cookie保存拖拽各容器的所在位置

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. dev GridControl实现拖拽

    一.示例说明 以gridControl1和gridControl2为例,从gridControl1拖拽行到gridControl2中去. 二.属性设置 gridControl2.AllowDrop = ...

  9. 使用 Jquery-UI 实现一次拖拽多个选中的元素操作

    项目需要,实现一个拖放操作,要求每次可以拖拽选中的多个元素,释放到目标容器后可排序.考虑了一下,觉得jquery-ui比较合适,毕竟它提供了项目需要的交互性事件机制.拖拽.释放.排序.选择等效果.而在 ...

随机推荐

  1. 12个小技巧,让你高效使用Eclipse

    集成开发环境(IDE)让应用开发更加容易.它们强调语法,让你知道是否你存在编译错误,在众多的其他事情中允许你单步调试代码.像所有的IDE一 样,Eclipse也有快捷键和小工具,这些会让您感觉轻松许多 ...

  2. Apache与Nginx的优缺点比较

    1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下ngin ...

  3. Dapper ORM VS SqlSugar ORM的 8场对决

    CUP和.NET SQL版本不同也会存在少许差距,但不会有质变,下面的测试结果仅供参考 比赛规则 1.统一使用Realse版本的最新 DLL,Realse模式启用程序 2.为了平衡CPU和数据库空闲情 ...

  4. JAVA错误汇总

    1.Slf4J-API版本兼容 问题描述 Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.hel ...

  5. 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集

    4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 57  Solved: 41[Submit][Status][Discuss] ...

  6. Spring + Mybatis 使用 PageHelper 插件分页

    原文:http://www.cnblogs.com/yucongblog/p/5330886.html 先增加maven依赖: <dependency> <groupId>co ...

  7. sqlserver查看被锁表、解锁

    查看别锁表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.d ...

  8. java.net.URL 模拟用户登录网页并维持session

    java.net.URL 模拟用户登录网页并维持session 半成品,并非完全有用 import java.io.BufferedReader; import java.io.InputStream ...

  9. DoTween(HOTween V2) 教程

    DoTween资料 官方网站:http://dotween.demigiant.com/ 下载地址:http://dotween.demigiant.com/download.php 快速开始:htt ...

  10. C#配置系统未能初始化

    如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元素的第一个子元素.",将appSettings放到conf ...