頁面移動排序算法實現
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