一、需求
需求:可以自定义排序
- 可以将一个记录移动到另一记录的上方或下方
- 可以置顶
原型,如下:
姓名 | 手机号 | 操作(排序) |
---|---|---|
滴滴 | +86-13444444444 | 移动 |
啦啦 | +86-13444444445 | 移动 置顶 |
哈哈 | +86-13444444446 | 移动 置顶 |
嘻嘻 | +86-13444444447 | 移动 置顶 |
二、设计实现
数据库中,增加 order
字段来标识排序,order_time
辅助排序。
数据库设计:
CREATE TABLE IF NOT EXISTS `app_basic` (
`user_id` VARCHAR(32) NOT NULL COMMENT '用户 Id',
`username` VARCHAR(64) NOT NULL COMMENT '用户名',
`phone_number` VARCHAR(64) NOT NULL COMMENT '手机号',
`order` INT NOT NULL DEFAULT 0 COMMENT '排序字段',
`order_time` DATETIME NOT NULL DEFAULT current_timestamp COMMENT '排序时间',
`create_time` DATETIME NOT NULL DEFAULT current_timestamp COMMENT '创建时间',
`modify_time` DATETIME NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp COMMENT '更新时间',
PRIMARY KEY (user_id)
) ENGINE=InnoDB DEFAULT CHARSET utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT '用户表';
举个栗子:
- 初始情况:
默认排序:order
(降序DESC
)、order_time
(升序 ASC
);order
均为 0,order_time
为插入时间
姓名 | 手机号 | order | order_time |
---|---|---|---|
滴滴 | +86-13444444444 | 0 | 2020-11-03 9:45:15 |
啦啦 | +86-13444444445 | 0 | 2020-11-04 10:05:09 |
哈哈 | +86-13444444446 | 0 | 2020-11-05 11:25:01 |
嘻嘻 | +86-13444444447 | 0 | 2020-11-06 12:13:40 |
- 情景1,“嘻嘻” 移动到 “哈哈” 之上
“嘻嘻”记录如何变化:order
字段(order
+ 1),order_time
更新为当前时间(2020-11-07 12:00:11)
姓名 | 手机号 | order | order_time |
---|---|---|---|
滴滴 | +86-13444444444 | 0 | 2020-11-03 9:45:15 |
啦啦 | +86-13444444445 | 0 | 2020-11-04 10:05:09 |
嘻嘻 | +86-13444444447 | 1 | 2020-11-07 12:00:11 |
哈哈 | +86-13444444446 | 0 | 2020-11-05 11:25:01 |
- 这时候按照
order
、order_time
排序有问题。
解决方法:将原先 “哈哈” 之上的记录 order + 1
,但不改变 order_time
展示如下:
姓名 | 手机号 | order | order_time |
---|---|---|---|
滴滴 | +86-13444444444 | 1 | 2020-11-03 9:45:15 |
啦啦 | +86-13444444445 | 1 | 2020-11-04 10:05:09 |
嘻嘻 | +86-13444444447 | 1 | 2020-11-07 12:00:11 |
哈哈 | +86-13444444446 | 0 | 2020-11-05 11:25:01 |
三、其他设计
还有一些其他方案:
-
全量排序,保证每个
order
均不同每次修改,前端需全量上传,每个记录的
order
如图:
姓名 手机号 order 滴滴 +86-13444444444 1 啦啦 +86-13444444445 2 嘻嘻 +86-13444444447 3 哈哈 +86-13444444446 4 缺点:限制数量。
需限定排序总数,比如 20 个以内能排序。
-
其他方案
保证每个
order
不同