頁面移動排序算法實現

頁面移動排序算法實現

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 &gt; #{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  &lt; #{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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章