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. Android学习系列(11)--App列表之拖拽ListView(下)

    接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法.     在这个方法中我们主要是处理 ...

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

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

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

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

  5. MVC+ZTree实现对树的CURD及拖拽操作

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

  6. ztree插件的使用及列表项拖拽的实现(jQuery)+异步加载节点数据

    为了实现如图所示的树状结构图,并使列表项可拖动到盒子里,研究了ztree这个插件的使用,并仔细研究了列表项的拖动事件.完成了预期需求,对jQuery的运用得到了提高.这个插件的功能非常强大,除了基本的 ...

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

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

  8. Android学习系列(10)--App列表之拖拽ListView(上)

     研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨.      鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. ...

  9. 开发Canvas 绘画应用(四):实现拖拽绘画

    在开发Canvas绘画应用(三):实现对照绘画中,我们实现了视图引导的第一部分,这一篇我们来完成第二部分,即将图片直接拖到画布上进行绘画. ✁ 拖放如何实现? [拖放的基本概念]:创建一个绝对定位的元 ...

随机推荐

  1. pick定理:面积=内部整数点数+边上整数点数/2-1

    //pick定理:面积=内部整数点数+边上整数点数/2-1 // POJ 2954 #include <iostream> #include <cstdio> #include ...

  2. 设计模式 工厂-Factory

    在开始笔记之前先推荐一个网站:http://design-patterns.readthedocs.org/zh_CN/latest/index.html 网站对每一个Pattern都有详尽的解说.并 ...

  3. MVC linq To SQL更新数据库操作

    首先在视图中提交数据,使用Html.BeginForm() @using(Html.BeginForm()) { @Html.EditorForModel() //编辑模板.控制器中传过来的数据 &l ...

  4. JQuery发送Put、Delete请求 - 摘自网络

    DELETE: $.ajax({ url: '/script.cgi', type: 'DELETE', success: function(result) { // Do something wit ...

  5. 【多线程】Java线程面试题 Top 50(转载)

    Java线程面试题 Top 50 原文链接:http://www.importnew.com/12773.html   本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎 ...

  6. 摄影初学者挑选相机的常见问题 FAQ

    数码相机一次次降价,越来越多的人加入摄影的行列,照相器材还是一个比较专业的领域,并非简单的参数比一下高低就可以知道好坏,很多朋友往往了解了好久还没弄清孰优孰劣,在购机前踌躇半天拿不定主意,我收集了被问 ...

  7. POJ 3616 Milking Time (排序+dp)

    题目链接:http://poj.org/problem?id=3616 有头牛产奶n小时(n<=1000000),但必须在m个时间段内取奶,给定每个时间段的起始时间和结束时间以及取奶质量 且两次 ...

  8. Flipping Parentheses(CSU1542 线段树)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1542 赛后发现这套题是2014东京区域赛的题目,看了排名才发现自己有多low  = =! 题目大意 ...

  9. CCF 201312-3 最大的矩形 (暴力,离散化)

    问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3 ...

  10. Linux下的Crontab应用

    crontab是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动.关闭这个服务: /sbin/servic ...