前端界面如图所示:
首先,想要实现置顶操作,需要在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;
}
});
}