后台排序改造:按板块标签页 + 拖拽排序 + 顺序完全固定
- 后台网站列表按板块分标签页,每个板块单独调顺序;用 URL hash (#sgroup-<gid>) 定位,上移/下移提交后回跳到原来的板块 - 支持鼠标拖拽排序(原生 HTML5 拖拽,零库依赖):拖动时实时重排预览, 松手后整组落库(Ajax 动作 site_reorder,带 CSRF 校验与板块归属校验, 防止跨板块搬条目) - 稀疏排序:新增链接的顺序号 = 同板块 MAX + SORT_STEP(1000),天然排最后; 拖拽落库、历史数据迁移时整组归一化为 index * SORT_STEP - 修复真根因:旧机制靠「交换两条 sort_order」上移/下移,一旦历史数据里 出现重复值,交换即无效、位置退化为按 id 排序 —— 这正是「排了顺序又被 打乱」的来源。新增一次性归一化迁移,用 settings.mig_sort_sparse 作哨兵, 避免每次请求重复覆盖用户设置 - 新增/修改链接不再用 MAX+1(MAX+1 会落进已有间隙、插到用户排好的中间) - 改变所属板块时,该条目自动排到新板块的最后 - 后台页面 + 拖拽手柄做了配套样式,触屏设备降级为上下移按钮
This commit is contained in:
+14
@@ -18,6 +18,20 @@ define('ICON_PATH', APP_PATH . '/uploads/icons'); // 抓取的网站图标(可
|
||||
define('ICON_URL', 'uploads/icons'); // 相对站点根
|
||||
define('ICON_STORE', 128); // 图标统一存成 128×128(高清屏下 45~64px 显示仍锐利)
|
||||
|
||||
/**
|
||||
* 排序步长(稀疏排序)。
|
||||
*
|
||||
* 为什么不用「连续整数 + 每次全表重排」:
|
||||
* · 拖拽排序只需要改**被拖动那一条**(在两邻居之间取中间值),不必重写整组;
|
||||
* · 新增条目一律 `同组 MAX + SORT_STEP`,天然排在最后,**永远不会插进用户已排好的
|
||||
* 顺序中间**(这是用户明确要求的行为);
|
||||
* · 只有「间隙用尽」或「用户拖完一次」时才做一次归一化(见 apply_sort_order())。
|
||||
*
|
||||
* 取值 1000:一个小组最多能容纳约 1000 次「往同两邻居之间插」而不归一化,
|
||||
* 个人导航站的规模下基本永远不会退化。
|
||||
*/
|
||||
define('SORT_STEP', 1000);
|
||||
|
||||
/**
|
||||
* 「站点整体图标」(浏览器标签页 favicon + 首页品牌图标)—— 用户上传后自动生成的一整套尺寸。
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user