置顶、上移和下移的排序

前端界面如图所示:

首先,想要实现置顶操作,需要在button按钮上添加点击事件(这里使用的是确定框),然后发送ajax请求给后端。

<button type="button" class="btn btn-sm purple" data-id='#(x.id)'>#(x.is_top !=null && x.is_top == 1 ? '非置顶':'置顶')</button>

/*置顶操作*/

$('.purple').confirm('是否要置顶到首页',function(){

var id = $(this).data('id');//通过data-id拿到当前记录

var url = '#(ctx)/admin/homesetting/top';//请求后端的top()方法

ajax({

url:url,

data:{'id':id},//传递参数

autoBlock:true,  //是否自动加载block

},function(){//请求成功执行该函数

window.location.href = '#(ctx)/admin/homesetting/list';

});

},function(){//取消点击的回调函数

    //console.log('取消被点击了...');

});


后端//置顶or非置顶操作

public void top() {

Long id = getLong("id");//拿到该记录的id

if(id == null) {//如果id为空

renderJson(Ret.fail(MSG,"置顶时找不到操作对象"));//返回业务状态以及数据

return ;

}

Ret ret = cmsHomeService.top(id);//调用service层的top(id)函数

renderJson(ret);//返回业务状态及数据

}


service层业务逻辑
public Ret top(Long id) {

int update = Db.update("update cms_home set is_top = 0, update_time=now() where is_top is null");//将cms_home中is_top字段值为null的记录进行修改,则将is_top置0,update_time更新

log.info(StrUtil.format("置顶首页项目时更新置顶标记, result = {}. ", update));//输出日志

CmsHome item = dao.findById(id);//查询该条想要置顶的记录

item.setIsTop( (item.getIsTop() == null || item.getIsTop().compareTo(1) != 0) ? 1 : 0 )//如果该条记录已经置顶,则取消置顶,如果没有置顶,则进行置顶(is_top=1)

  .setUpdateTime(new Date()).setRemark("置顶/取消置顶更新");//更新修改事件,修改备注

boolean update2 = item.update();//提交更新

if (update2) {//如果置顶成功

Db.update("update cms_home set is_top = 0 where is_top = 1 and id != ? ", item.getId()); //置顶只保留一个,取消之前置顶的记录

}

log.info(StrUtil.format("置顶/取消置顶{}, result = {}. ", item.getId(), update2));//输出日志

return update2 ? Ret.ok(MSG, "置顶成功!") : Ret.ok(MSG, "置顶失败!");//返回业务状态

}


上移和下移业务逻辑

前端:<button type="button" class="btn btn-sm blue" data-id='#(x.id)' data-type='down'><i class="icon-arrow-down"></i>下移</button>

<button type="button" class="btn btn-sm purple" data-id='#(x.id)'>#(x.is_top !=null && x.is_top == 1 ? '非置顶':'置顶')</button>

/*上移or下移操作*/

$('.green,.blue').confirm('是否要排序?',function() {

    var id = $(this).data('id');//通过data-id拿到当前记录的id

    var type = $(this).data('type');//拿到当前操作类型,是上移?or下移?

    var url = '#(ctx)/admin/homesetting/updown';//请求路径

  ajax({

        url:url,

        data:{'id':id,'type':type},//传参

        autoBlock:true, // 是否自动加载block

      },function(data) { // ajax请求成功之后的回调函数

      window.location.href = '#(ctx)/admin/homesetting/list'

      });

    },function() { // 取消点击的回调函数

      //console.log('取消被点击了...');

});


上移下移后端逻辑(Conrtoller层)

//排序

public void updown() {

String type = get("type");//拿到当前操作类型,上移or下移

Long id = getLong("id");//拿到当前记录的id

if ( StrKit.isBlank(type) || id==null ) {//字符串小写,如果type为null

renderJson(Ret.fail(MSG, "排序参数不正确!"));

return ;

}

Ret ret = cmsHomeService.upAndDown(id, type);//调用service层

renderJson(ret);//返回业务状态及数据

}


service层业务逻辑

public Ret upAndDown(Long id, String type) {

int update = Db.update("update cms_home set sort_no = id, update_time=now() where sort_no is null");//如果sort_no为null,则将主键赋值给sort_no,并且更新时间

log.info(StrUtil.format("排序首页项目时更新排序番号, result = {}. ", update));//输出log

String sql = "select ch.id,ch.sort_no,ifnull(ch.is_top,0) as is_top from cms_home ch  ORDER BY ch.is_top DESC, ch.sort_no DESC, ch.is_recommend DESC, ch.id DESC";//查询主键id,sort_no,is_top字段,然后进行排序(is_top->sort_no->is_recommand)

List<Record> list = Db.find(sql);//查询

Record pre = null;//存储当前记录的上一条

Record next = null;//存储当前记录的下一条

Record cur = null;//存储当前记录

for (int i = 0; i < list.size(); i++) {//遍历查询的记录

Record r = list.get(i);//拿到一条记录

Long currId = r.getLong("id");//获取到他的id

if (currId.compareTo(id) ==0) { //locate//如果查询到当前记录

if ( i-1 >= 0) {//如果当前记录不为置顶

pre = list.get(i-1);//将他的上一条存到pre

if (pre.getInt("is_top").compareTo(1)==0) { //如果其前一条是置顶状态,不交换

pre = null;//将pre赋值为null

}

}

if (i+1<= list.size()-1) {//

next = list.get(i+1);

if (next.getInt("is_top").compareTo(1)==0) { //如果其后一条是置顶状态,不交换

next = null;

}

}

cur = r;

break;

}

}

if (type.equalsIgnoreCase("up")) { //上移,跟上一条的sort_no互换

if (pre != null) {

swapSortNo( pre, cur , type);

}

} else { //下移,跟下一条的sort_no互换

if (next != null) {

swapSortNo( cur, next ,type);

}

}

return Ret.ok(MSG, "操作成功!");

}

private void swapSortNo(Record r1, Record r2, String type) {

Integer r1SortNo = r1.getInt("sort_no");

Integer r2SortNo = r2.getInt("sort_no");

if (type.equalsIgnoreCase("up")) { //上移后,r2.sortno应该大于r1.sortno

if (r2SortNo.compareTo(r1SortNo)>=0) { //已经是上移后的结果了

return;

}

} else { //下移后,r1.sortno应该小于r2.sortno

if (r1SortNo.compareTo(r2SortNo)<=0) {

return;

}

}

Db.tx(new IAtom() {

@Override

public boolean run() throws SQLException {

CmsHome item1 = dao.findById(r1.getLong("id"));

CmsHome item2 = dao.findById(r2.getLong("id"));

Integer temp = item1.getSortNo();

item1.setSortNo(item2.getSortNo()).setUpdateTime(new Date());

item2.setSortNo(temp).setUpdateTime(new Date());//交换排序番号

boolean result = item1.update() && item2.update();

log.info(StrUtil.format("记录{}<->{}交换排序番号={}", item1.getId(), item2.getId(), result));

return result;

}

});

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容