多级菜单目录详细设计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

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部