拖拽排序–后端实现
实现思路:
要想实现排序后的状态能够对所有人可见,我们就需要对原来的表设定一个字段,来存储次序。例如下列的例子,我们增加了一个字段pre_sort
作为排序字段。
task_id | task_name | pre_sort |
---|---|---|
11ab | 实现数据可视化 | 1 |
21ae | 完成部署 | 3 |
34ee | 完成测试工作 | 7 |
我们可以约定,前端传入排序好的结果,例如:
{
"data": [
"21ae",
"34ee",
"11ab"
]
}
即表示,传入排序后的task_id
。
我们根据这些数据,可以在数据库中找到匹配的数据(原顺序):
[
{"task_id": "11ab", "pre_sort": 1, "task_name": "实现数据可视化"},
{"task_id": "21ae", "pre_sort": 3, "task_name": "完成部署"},
{"task_id": "34ee", "pre_sort": 7, "task_name": "完成测试工作"},
]
即取出三个数据原来的顺序为:
[1, 3, 7]
将其对应到我们排序后的数组:
{
"data": [
{"21ae": 1},
{"34ee": 3},
{"11ab": 7}
]
}
再更新回数据库中:
task_id | task_name | pre_sort |
---|---|---|
11ab | 实现数据可视化 | 7 |
21ae | 完成部署 | 1 |
34ee | 完成测试工作 | 3 |
以下是接口代码实现:
"""
任务重排序
"""
class ReorderTasksHandler(BaseHandler):
def initialize(self):
self.connect, self.db = database_decorator()
@with_transactional
def post(self, **kwargs):
# 解析请求体
data = json.loads(self.request.body.decode('utf-8'))
# 开启事务
session = kwargs['session']
# 获取排序后的task_id列表
task_id_list = list(data.get("task_id_list"))
# 按照原有的顺序查出
task_list = list(self.db.TaskDetail.find({"task_id": {"$in": task_id_list}}, {"_id": 0}, session=session).sort("pre_sort", -1))
# 替换成现有的顺序
pre_order_list = [item.get("pre_sort") for item in task_list]
for idx, task_id in enumerate(task_id_list):
self.db.TaskDetail.update_one({"task_id": task_id}, {"$set": {"pre_sort": pre_order_list[idx]}},
session=session)
task_list = list(
self.db.TaskDetail.find({"task_id": {"$in": task_id_list}}, {"_id": 0}, session=session).sort("pre_sort",
-1))
# 将排序成果后存入数据库的结果返回给前端
result = dict(code=200, state="success", message="排序成功", payload=task_list)
return self.write(json.dumps(result, ensure_scii=False))