页面移动排序算法实现
1.思想
我们用这5条记录来进行排序。
记录1,sort:1;记录2,sort:2;记录3,sort:3;记录4,sort:4;记录5,sort:5
页面展示: 记录5 ,记录4 ,记录3 ,记录2 ,记录1
需求1:记录3往上移动
只需要将它与记录4交换sort值 即可。
需求2:记录3往下移动
只需要将它与记录2交换sort值 即可。
需求3:记录3置顶(上移至第一条)
获取最大排序号为5, 然后加1=6, 修改记录3的sort值为6 即可。
需求4:记录3置底(下移至最后一条)
获取最小排序号为1, 然后减1=0, 修改记录3的sort值为0 即可。
1. 每当新增一条记录的时候,sort都会在前一条记录上+1
2. 查询列表 sql 根据排序字段 降序
上移:取上一条记录排序号,将当前记录与上一条记录排序号置换
下移:取下一条记录排序号,将当前记录与下一条记录排序号调换置换
置顶(上移至第一条):获取最大的记录排序号,修改当前记录的排序号为最大排序号+1
置底(下移至最后一条):获取最小的记录排序号,修改当前记录的排序号为最小排序号-1
2.实现步骤
表加字段
sort_no 用于排序
controller
新增需获取最大排序号加1
排序方法
/**
* @param appId 移动的主键
* @param operateType
* @Description: 上移 下移 置顶 置底
* @author sc
* @date 2019年12月10日 下午1:19:10
*/
@Override
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class })
public Result<String> moveOrder(String appId, String operateType) {
return ccmsAppsService.moveOrder(appId,operateType);
}
serv
@Override
public Result<String> moveOrder(String appId, String operateType) {
CcmsApps ccmsApps = ccmsAppsMapper.selectById(appId);
if(null == ccmsApps){
return Result.error(CodeMsg.BIND_ERROR.fillArgs("缺少参数"));
}
Integer sortNo = ccmsApps.getSortNo();
//上移
if(StringUtils.equals(operateType,"up")){
CcmsApps temp= ccmsAppsMapper.selectUpCcmsAppsBysortNo(sortNo);
if(null == temp){
return Result.error(CodeMsg.BIND_ERROR.fillArgs("已到最顶部"));
}
//交换序号
ccmsApps.setSortNo(temp.getSortNo());
temp.setSortNo(sortNo);
ccmsApps.setLastUpdateDate(new Date());
temp.setLastUpdateDate(new Date());
ccmsAppsMapper.updateById(ccmsApps);
ccmsAppsMapper.updateById(temp);
}else if(StringUtils.equals(operateType,"down")){
//下移
CcmsApps temp= ccmsAppsMapper.selectDownCcmsAppsBysortNo(sortNo);
if(null == temp){
return Result.error(CodeMsg.BIND_ERROR.fillArgs("已到最底部"));
}
//交换序号
ccmsApps.setSortNo(temp.getSortNo());
temp.setSortNo(sortNo);
ccmsApps.setLastUpdateDate(new Date());
temp.setLastUpdateDate(new Date());
ccmsAppsMapper.updateById(ccmsApps);
ccmsAppsMapper.updateById(temp);
}
else if(StringUtils.equals(operateType,"top")){
//置顶
Integer sort= ccmsAppsMapper.selectMaxsortNo();
Integer tempSortNo= (sort + 1);
ccmsApps.setSortNo(tempSortNo);
ccmsApps.setLastUpdateDate(new Date());
ccmsAppsMapper.updateById(ccmsApps);
}else if(StringUtils.equals(operateType,"bottom")){
//置底
CcmsApps temp= ccmsAppsMapper.selectCcmsAppsMinsortNo();
if( null == temp){
return Result.error(CodeMsg.BIND_ERROR.fillArgs("已到最底端"));
}
if(StringUtils.equals(temp.getAppId(),ccmsApps.getAppId())){
return Result.error(CodeMsg.BIND_ERROR.fillArgs("已到最底端"));
}
Integer tempSortNo=(temp.getSortNo() - 1);
ccmsApps.setSortNo(tempSortNo);
ccmsApps.setLastUpdateDate(new Date());
ccmsAppsMapper.updateById(ccmsApps);
}
return Result.success(appId);
}
mapper
/**
* 根据排序号 查找上一个 排序号
* @param sortNo
* @return
*/
CcmsApps selectUpCcmsAppsBysortNo(Integer sortNo);
/**
* 根据排序号 查找下一个 排序号
* @param sortNo
* @return
*/
CcmsApps selectDownCcmsAppsBysortNo(Integer sortNo);
/**
* 查找最小排序号
* @return
*/
CcmsApps selectCcmsAppsMinsortNo();
/**
* 查找最大排序号
* @return
*/
Integer selectMaxsortNo();
mapper.xml
<!-- selectUpCcmsAppsBysortNo 根据排序号 查找上一个 排序号-->
<select id="selectUpCcmsAppsBysortNo" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"></include>
from ccms_apps as ccms_apps
where sort_no > #{sortNo} order BY sort_no asc limit 0,1
</select>
<!--selectDownCcmsAppsBysortNo 根据排序号 查找下一个 排序号-->
<select id="selectDownCcmsAppsBysortNo" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"></include>
from ccms_apps as ccms_apps
where sort_no < #{sortNo} order BY sort_no desc limit 0,1
</select>
<!-- selectCcmsAppsMinsortNo 查找最小排序号-->
<select id="selectCcmsAppsMinsortNo" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"></include>
from ccms_apps as ccms_apps
ORDER BY sort_no asc limit 1
</select>
<!-- selectMaxsortNo 查找最大排序号-->
<select id="selectMaxsortNo" resultType="Integer">
select IFNULL(sort_no,0) as sortNo from ccms_apps ORDER BY sort_no desc limit 1
</select>
参考地址
https://blog.csdn.net/lan_qinger/article/details/83028190
https://blog.csdn.net/u010251897/article/details/50836457
https://blog.csdn.net/zhangqiang_accp/article/details/81092638
https://blog.csdn.net/zcczero/article/details/88941277