在项目中有时候难免会遇上这种商品排序的需求,当然,别的排序也是一样的原理,如下图
现在给我的要求是做到点击↑就把商品网上移动,点击↓就把商品往下移动,其实原理就是互换位置了,每个商品对应一个sortNum(排序码),展示这个列表的时候是在SQL语句中根据sortNum进行排序,正序或者倒序,思路就是点↑的时候把上下的排序码互换位置,点击↓的原理也是如此
如果仅仅是想实现这样最简单的上下排序那么非常的容易,按照上面这个思路进行操作就行,但是我这个还有别的要求,还需要考虑到删除商品的情况
删除商品会让那个商品对应的sortNum也变成空,这样会在后期的排序中出现问题,所以在你的代码中得做些判断,即使某个排序码后面一位不见了,比如第一个商品排序码是1,后面的商品是2,这个时候如果删除了第二个商品,那么第一个商品后面就变成3了,所以需要加个递归的查询,他后面如果是空,在后面还是空,就需要递归查询直到不为空的时候!
还有注意的地方是第一个商品肯定不能继续网上移动了,最后一个肯定也不能继续往下!
我的代码如下
@ResponseBody
@RequestMapping("/sortUp")
public AjaxResult sortUp(Integer id) {//获取到点击排序的那个商品id
Goods goods = service.findById(id);//根据id查询到对应的商品
Integer sortNum = goods.getSortNum();//获取对应的排序码
Integer integer = Md.selectOne(FIND_SORTFIRST, null, Integer.class);//==select sortNum from t_goods where deleteKey=1 and sortNum is not null order by sortNum
if(sortNum<=integer){
return null;
}
if (sortNum > 1) {
Integer upNum = 1;
ListgoodsList = this.getList(sortNum-1, false);
for (Goods g : goodsList) {
upNum = g.getSortNum();
g.setSortNum(goods.getSortNum() );
service.update(g);
}
goods.setSortNum(upNum);
boolean flag = service.update(goods);
if (flag) {
return success("操作成功");
} else {
return error("操作失败");
}
} else {
return error("此商品不能往上移动!");
}
}
@ResponseBody
@RequestMapping("/sortDown")
public AjaxResult sortDown(Integer id) {//获取到点击排序的那个商品id
Goods goods = service.findById(id);
Integer integer = Md.selectOne(FIND_SORT, null, Integer.class);//==select sortNum from t_goods where deleteKey=1 and sortNum is not null order by sortNum desc
Integer sortNum = goods.getSortNum();
if (sortNum < 0) {
return null;
}
if(sortNum>=integer){
return null;
}
Integer dowmSortNum = 1;
ListgoodsList = this.getList(sortNum + 1, true);
for (Goods g : goodsList) {
dowmSortNum = g.getSortNum();
g.setSortNum(goods.getSortNum());
service.update(g);
}
goods.setSortNum(dowmSortNum);
boolean flag = service.update(goods);
if (flag) {
return success("操作成功");
} else {
return error("操作失败");
}
}
public ListgetList(Integer dowmSortNum, boolean f) {
ListgoodsList = service.findBy("sortNum=#{sortNum} and deleteKey=1", getData("sortNum", dowmSortNum));//deletKey=1代表有效的数据,sortNum是排序的号码
if (dowmSortNum == 0) {
return null;
}
if (goodsList == null || goodsList.size() == 0) {
if (f) {
dowmSortNum = dowmSortNum + 1;
} else {
dowmSortNum = dowmSortNum - 1;
}
return this.getList(dowmSortNum, f);
}
return goodsList;
}
具体的还是要根据实际情况来判断!