拖拽排序–后端实现
实现思路:
要想实现排序后的状态能够对所有人可见,我们就需要对原来的表设定一个字段,来存储次序。例如下列的例子,我们增加了一个字段pre_sort作为排序字段。

task_idtask_namepre_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_idtask_namepre_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))
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐