添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

项目上有组织结构的管理,所有需要将其输出成一颗目录树。

  • 数据库数据组织方式,采用自关联的方式,示例如下:

    id father_id name
    1 null 01
    2 1 0101
    3 1 0102
    4 1 0103
  • 目录树,示例如下:

    json:
    {"name":"01","id":1,"child":[
        {"name":"0101","id":2,"child":[...]},
        {"name":"0102","id":3,"child":[...]},
        {"name":"0103","id":4,"child":[...]},
       |__0101
       |    |__...
       |__0102
       |     |__...
       |__0103
       |     |__...
       |__...
    
    1. 实现思路:

      • 寻找到根节点,放入到列表A中。
      • 寻找共同的父节点,并放入到字典B。
      • 循环遍历根节点A列表,在共同父节点字典B中取出对应的子节点列表C。
      • 依次递归遍历子节点列表C,直到没有子节点列表为止。
    2. 实现代码:

      • 寻找根节点find_root_node
        def find_root_node(data: list) -> list:
            查找根节点
            :param data:原始数据
            :return:根节点
            # root_node = filter(lambda x: x["father_id"] is None, data)
            root_node = list()
            for node in data:
                # 假定father_id是None就是根节点
                # 例如有些数据库设计会直接把根节点标识出来。
                if node["father_id"] is None:
                    root_node.append(node)
            return root_node
        
      • 寻找共同的父节点find_common_node
        def find_common_node(data: list) -> dict:
            寻找共同的父节点
            :param data: 原始数据
            :return: 共同的父节点字典
            common_node = dict()
            for node in data:
                father_id = node.get("father_id")
                # 排除根节点情况
                if father_id is not None:
                    # 如果父节点ID不在字典中则添加到字典中
                    if father_id not in common_node:
                        common_node[father_id] = list()
                    common_node[father_id].append(node)
            return common_node
        
      • 生成目录树jsonbuild_treefind_child
        def build_tree(root_node: list, common_node: dict) -> list:
            生成目录树
            :param root_node: 根节点列表
            :param common_node: 共同父节点字典
            :return:
            tree = list()
            for root in root_node:
                # 生成字典
                base = dict(name=root["name"], id=root["id"], child=list())
                # 遍历查询子节点
                find_child(base["id"], base["child"], common_node)
                # 添加到列表
                tree.append(base)
            return tree
        def find_child(father_id: int, child_node: list, common_node: dict):
            查找子节点
            :param father_id:父级ID
            :param child_node: 父级孩子节点
            :param common_node: 共同父节点字典
            :return:
            # 获取共同父节点字典的子节点数据
            child_list = common_node.get(father_id, [])
            for item in child_list:
                # 生成字典
                base = dict(name=item["name"], id=item["id"], child=list())
                # 遍历查询子节点
                find_child(item["id"], base["child"], common_node)
                # 添加到列表
                child_node.append(base)
        
      • 测试
          data = [
          {"id": 1, "father_id": None, "name": "01"},
          {"id": 2, "father_id": 1, "name": "0101"},
          {"id": 3, "father_id": 1, "name": "0102"},
          {"id": 4, "father_id": 1, "name": "0103"},
          {"id": 5, "father_id": 2, "name": "010101"},
          {"id": 6, "father_id": 2, "name": "010102"},
          {"id": 7, "father_id": 2, "name": "010103"},
          {"id": 8, "father_id": 3, "name": "010201"},
          {"id": 9, "father_id": 4, "name": "010301"},
          {"id": 10, "father_id": 9, "name": "01030101"},
          {"id": 11, "father_id": 9, "name": "01030102"},
          root_node = find_root_node(data)
          common_node = find_common_node(data)
          tree = build_tree(root_node, common_node)
          print(tree)
          # [{'name': '01', 'id': 1, 'child': [{'name': '0101', 'id': 2, 'child': [{'name': '010101', 'id': 5, 'child': []}, {'name': '010102', 'id': 6, 'child': []}, {'name': '010103', 'id': 7, 'child': []}]}, {'name': '0102', 'id': 3, 'child': [{'name': '010201', 'id': 8, 'child': []}]}, {'name': '0103', 'id': 4, 'child': [{'name': '010301', 'id': 9, 'child': [{'name': '01030101', 'id': 10, 'child': []}, {'name': '01030102', 'id': 11, 'child': []}]}]}]}]
        
        • 代码
          class Tree(object):
              def __init__(self, data):
                  self.data = data
                  self.root_node = list()
                  self.common_node = dict()
                  self.tree = list()
              def find_root_node(self) -> list:
                  查找根节点
                  :return:根节点列表
                  # self.root_node = list(filter(lambda x: x["father_id"] is None, data))
                  for node in self.data:
                      # 假定father_id是None就是根节点
                      #例如有些数据库设计会直接把根节点标识出来
                      if node["father_id"] is None:
                          self.root_node.append(node)
                  return self.root_node
              def find_common_node(self) -> dict:
                  寻找共同的父节点
                  :return: 共同的父节点字典
                  for node in self.data:
                      father_id = node.get("father_id")
                      # 排除根节点情况
                      if father_id is not None:
                          # 如果父节点ID不在字典中则添加到字典中
                          if father_id not in self.common_node:
                              self.common_node[father_id] = list()
                          self.common_node[father_id].append(node)
                  return self.common_node
              def build_tree(self, ) -> list:
                  生成目录树
                  :return:
                  self.find_root_node()
                  self.find_common_node()
                  for root in self.root_node:
                      # 生成字典
                      base = dict(name=root["name"], id=root["id"], child=list())
                      # 遍历查询子节点
                      self.find_child(base["id"], base["child"])
                      # 添加到列表
                      self.tree.append(base)
                  return self.tree
              def find_child(self, father_id: int, child_node: list):
                  查找子节点
                  :param father_id:父级ID
                  :param child_node: 父级孩子节点
                  :return:
                  # 获取共同父节点字典的子节点数据
                  child_list = self.common_node.get(father_id, [])
                  for item in child_list:
                      # 生成字典
                      base = dict(name=item["name"], id=item["id"], child=list())
                      # 遍历查询子节点
                      self.find_child(item["id"], base["child"])
                      # 添加到列表
                      child_node.append(base)
          
        • 测试
            data = [
                {"id": 1, "father_id": None, "name": "01"},
                {"id": 2, "father_id": 1, "name": "0101"},
                {"id": 3, "father_id": 1, "name": "0102"},
                {"id": 4, "father_id": 1, "name": "0103"},
                {"id": 5, "father_id": 2, "name": "010101"},
                {"id": 6, "father_id": 2, "name": "010102"},
                {"id": 7, "father_id": 2, "name": "010103"},
                {"id": 8, "father_id": 3, "name": "010201"},
                {"id": 9, "father_id": 4, "name": "010301"},
                {"id": 10, "father_id": 9, "name": "01030101"},
                {"id": 11, "father_id": 9, "name": "01030102"},
            new_tree = Tree(data=data)
            print(new_tree.build_tree())
            # [{'name': '01', 'id': 1, 'child': [{'name': '0101', 'id': 2, 'child': [{'name': '010101', 'id': 5, 'child': []}, {'name': '010102', 'id': 6, 'child': []}, {'name': '010103', 'id': 7, 'child': []}]}, {'name': '0102', 'id': 3, 'child': [{'name': '010201', 'id': 8, 'child': []}]}, {'name': '0103', 'id': 4, 'child': [{'name': '010301', 'id': 9, 'child': [{'name': '01030101', 'id': 10, 'child': []}, {'name': '01030102', 'id': 11, 'child': []}]}]}]}]
          
          • 本文提供一种解决无限层级输出目录树的方法,还有其他更优的方案,仅供参考。
          • 下一篇将介绍Flask实现微信Web端及APP端登录注册
          Flask后端实践 连载十五 实现自关联无限层级生成目录树。本文主要解决自关联无限层级生成目录树。本文基于python3编写。项目上有组织结构的管理,所有需要将其输出成一颗目录树。
          flask-admin 状表格示例 git clone git@github.com:AngelLiang/flask-admin-tree-table-demo.git cd flask-admin-tree-table-demo pipenv install pipenv shell python app.py 启动后访问: jquery-treegrid.js: 用于显示状表格 sqlalchemy-mptt: 配置数据模型为“左右值”数据结构 本示例前端树形表格依赖 jquery-treegrid.js 插件;后端状数据模型需要设计成“左右值”数据结构,因此 Tree 模型引用了 sqlalchemy_mptt 扩展。 一、设计数据结构 首先状数据模型需要设计成左右值数据结构,本示例直接使用 sqlalchemy_mptt 扩
          npm install-在react-frontend上。 npm运行构建-在react-frontend上。 python main.py-在flask-backend上(有时它是python3 main.py)。 您的react应用程序现在在localhost:5000上运行。
          烧瓶的例子 flask基本的开发接口示例,利用Flask开发的API接口。包含基本的项目配置,统一响应,MySQL和Redis数据库操作,定时任务,图片生成,项目部署,用户权限认证,报表输出,无限层级生成目录,阿里云手机验证码验证,微信授权,Celery,单元测试,Drone等模块。 一,系列文章 1.拉取代码 切换到/projects目录(没有就先新建目录sudo mkdir /projects ),执行命令cd /projects 执行命令sudo git clone https://github.com/qzq1111/flask-restful-example.git拉取代
          数据库系统课程设计已经过去好几天了,两周的课程设计强度除了强制到场其实强度并不大。起初的任务书原版本是以python语言为基础在flask框架下完成,不过因为涉及到频繁的表单操作,而这恰恰也是我还并不太熟练的部分,于是果断改用了C#。 虽然之前并未尝试过C#编程,但由于之前有一些语言基础,加之C#窗体编程的傻瓜式操作,方便的界面设计,so用了两天时间熟悉了一下C#窗体控...
          Flask学习「一 」(按钮,角色,菜单,用户,权限) 很荣幸有时间能静下心来写在这篇文章,前段时间写了一些没有营养的文章对那些关注我的同学来说非常抱歉,接下来的一段日子里会围绕近期所做的Flask项目写一系列的博客,以记录自己的不足。 鉴于可能有些小白可能会看到这篇文章,于是我尽量写的通俗易懂。 接下来进入正题,我这篇文章要写的是一个系统的权限部分。权限的控制对于一个优秀的系统来说至关重要,但是...
          如果使用 EasyUI tree 加载10000+项菜单项,全部加载出来耗时10s+,改为异步后,瞬间加载完成,极大提升用户体验。下图小圆圈是正在加载的菜单项效果。 Easyui tree 异步 EasyUI官方文档 EasyUI 创建异步树形菜单 - 官方教程示例 支持内置的异步加载模式,因此用户可以创建一个空的,然后指定一个动态返回 JSON 数据的服务器端,用于根据需求异步...
          可以使用以下代码实现:首先,在MySQL中创建一个自增的id列,然后在Flask中使用ORM框架SQLAlchemy与MySQL进行交互。在Flask中,创建一个路由,用来接收Angular前端传来的数据,并使用SQLAlchemy将数据添加到MySQL数据库中。在添加数据时,我们可以使用order_by来按照id升序排列,如下所示: ```python # 导入必要的库和模块 from flask import Flask, request from flask_sqlalchemy import SQLAlchemy # 创建Flask app和SQLAlchemy对象 app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name' db = SQLAlchemy(app) # 定义数据模型 class Data(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) data = db.Column(db.String(255)) # 定义添加数据的路由 @app.route('/addData', methods=['POST']) def add_data(): data = request.form['data'] new_data = Data(data=data) db.session.add(new_data) db.session.commit() return 'Data added successfully!' if __name__ == '__main__': app.run() # 在查询时按照id升序排列 Data.query.order_by(Data.id.asc()) 这样,当我们向Flask后端提交数据时,数据将按照id升序排列,并自动添加到MySQL数据库中。
          温柔陷阱: self.project_id_1 = struct.unpack('l', f.read(4))[0] struct.error: unpack requires a buffer of 8 bytes 按照isssu还是被报错