页面移动排序算法实现

页面移动排序算法实现

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

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