多级菜单目录详细设计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] 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)