多级菜单目录详细设计python+mysql数据库

Posted Dream_it_possible!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多级菜单目录详细设计python+mysql数据库相关的知识,希望对你有一定的参考价值。

一、数据库设计

       对于多级目录的设计,最简单直接的方式,可以直接把目录的名称和内容等相关信息放到一个表里,如何区分顶级目录和子目录是设计的关键。

      思想:

      可以把目录树看作是一个具有多个根节点的树状结构,子目录就是儿子,父目录就是父节点,每个子目录只能有一个父节点。 因此可以在设计时,设置顶级目录的parent_id为null, 在查询的时候可以直接根据null来查询出所有的顶级目录, 怎么去添加子节点,每个子目录的都有一个parent_id,parent_id的值对应其他记录的id, 这样就可以通过parent_id和id 来形成一个树。获取到根节点后,再遍历每个根节点的叶子节点,如果有叶子节点,那么就挂在它底下,类如id为5的对象的parent_id为1,那么就把data挂在id未1的记录下,id为20的记录的Parent_id为5,那么就把id为20的记录挂在id为5的记录下,json结构如下:

           
         
            "id": 1,
            "text": "顶级目录",
            "parent_menu_tree_item": null,
            "menu_type": 0,
            "data": [
                
                    "id": 5,
                    "text": "二级目录",
                    "parent_menu_tree_item": 1,
                    "menu_type": 0,
                    "data": 
                        "id": 20,
                        "text": "三级目录",
                        "parent_menu_tree_item": 5,
                        "menu_type": 0
                    
                
             ]
         

 数据库结构:

DROP TABLE IF EXISTS `schedule_directory_resource`;
CREATE TABLE `schedule_directory_resource`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `description` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `enabled` tinyint(1) NOT NULL,
  `create_datetime` datetime(6) NULL,
  `update_datetime` datetime(6) NULL,
  `delete_datetime` datetime(6) NULL DEFAULT NULL,
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `num_id` int(0) NULL DEFAULT NULL,
  `parent_id` int(0) NULL DEFAULT NULL,
  `resource_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `audition` tinyint(1) NOT NULL,
  `type` int(0) NULL DEFAULT NULL,
  `standard_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `high_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `super_path` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `media_uid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `media_size` bigint(0) NULL DEFAULT NULL,
  `media_time` bigint(0) NULL DEFAULT NULL,
  `category_id` int(0) NULL DEFAULT NULL,
  `default_page` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

 

二、程序设计

        思想:  递归。 先select出所有parent_id为null的记录,即根节点,然后遍历每一个父亲的子树,如果有子树,那么就继续递归遍历所有的子树,每遍历一次就挂在父节点的i["data"]上,遍历完了就下一个根节点。

        核心代码如下:

       1) 获取到所有的根节点items:

 items = HandsOnCaseMenuTreeItem.objects.using("admin").filter(parent_menu_tree_item=None,
                                                                          resource_id=resource_id) \\
                .values("id", "text", "parent_menu_tree_item", "menu_type")
            datas = []
            for i in items:
                find_child(i, resource_id)
                datas.append(i)
            r.data = datas

     2) 递归遍历所有根节点i, 然后寻找i下所有的子树,并拼接到i下面: 

def find_child(i, resource_id):
    p_id = i["id"]
    p = HandsOnCaseMenuTreeItem.objects.using("admin") \\
        .filter(parent_menu_tree_item=p_id, resource_id=resource_id) \\
        .values("id", "text", "parent_menu_tree_item", "menu_type")
    if len(p) > 0:
        i["data"] = list(p)
    for j in p:
        find_child(j, resource_id)

移动和拖拽菜单:  https://blog.csdn.net/qq_33036061/article/details/112221930

 

 

以上是关于多级菜单目录详细设计python+mysql数据库的主要内容,如果未能解决你的问题,请参考以下文章

动态生成多级菜单

[MySQL] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)

MVC5+EF6 入门完整教程13 -- 动态生成多级菜单

python作业-多级菜单

如何使用 Spring boot 和 MYSQL 为多级菜单列表创建嵌套 JSON?

带有 Php Mysql 的 Css 多级垂直菜单