拖拽排序后台設計與實現


前言

項目中有一個需求是拖拽排序,將類似卡片的東西拖拽重新排列
有以下幾個需求:

  • 允許更改元素的排序
  • 允許新增數據,並更新現有排序
  • 允許刪除數據,並更新現有排序
實現思路
一、全量更新元素位置法

適用場景:排序元素數量較少,對於大量數據排序不適用
原理:每一個元素擁有一個字段,表示元素當前排序的位置,通過前端排序,將排好的元素位置,一次性發送到后端。然后,后端統一更新所有元素的位置
具體實現:
實體設計:增加排序字段sort,表示元素當前的位置。例如,sort=1,則表示元素處於第一位
接口設計:

前端發送id數組,數組的索引表示數組當前的排序位置
例如:[3,2,4,1] 表示id為3的sortId為1,id為4的數組sortId為3

移動元素:移動元素后前端將id數組發送給后台
刪除元素:刪除元素直接刪除id對應的元素對排序沒什么影響,不過可能出現sortId出現跳過某個值的情況。也可以刪除前端發過來數組中不存在而服務器端存在的元素,然后根據刪除后的數組元素進行全部更新
新增元素:新增元素時如果想要放在最后一位,那么sortId為sortId的最大值加一,如果想要將新增的元素放在第一位,那么將前端把新加的數組放在第一位,發數組id給后端再進行全排序

二、取中值法

適用場景:數據量較多,移動次數不是很頻繁
原理:新加一個字段sortId,每個字段之間的間隔都很大,例如第一個65536,第一個為2*65536,當改變了某個元素的位置時,只要前端發送這個元素id和想要移動到的位置的id對應的sortId,后台根據拖拽的位置進行更新
具體實現:
1、移動元素:

  • 調整一個元素到兩個元素之間時,此元素的sortId為調整后位置前后兩個元素的sortId相加處於二,即sortId = (pre_sortId + after_sortId)/2
  • 調整一個元素到第一個元素,此元素的sortId為第一個元素的一半,即sortId = first_sortId / 2
  • 調整一個元素到最后一個元素時,此元素的sortId為最后一個元素加65536,即sortId = old_sortId + 65536
    2、刪除元素
    不影響排序
    3、新增元素
    創建第一個元素時默認為65536,第二個元素為265536,第N個元素為N65536
    注意點:
    理論上這種方式可以一直變更順序,但是考慮到由於精度的限制,所以sortId在某個情況下就可能變得變得很小導致排序失效,所以有兩個方法,一是設置一個安全值,當sortId低於這個安全值時就進行全表的重排,二是通過定時全表進行更新
三、單表單列

適用場景:快取取出某一位置的元素,查詢次數多修改頻率少的
每個元素,都有一個字段index,表示元素的排序信息
規定元素從0開始遞增。
具體實現:
1、新增元素
新增元素時,序號為當前元素數據總量-1
2、刪除元素
刪除元素時,將大於該序號的元素index都減一
3、修改元素
前端發送一個偏移量,有正有負,比如從第五移動到第三,那么偏移量就是-2,那么移動的元素的index加上偏移量,然后將移動元素的原位置的偏移量范圍內的元素進行加減
例如:
第六移動到第三,偏移量為-3,那么將第三到第五的位置index都加一,將當前元素的index加上偏移量,即5-3=2,在第三個位置上

參考文獻


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM