import copy
def filter_menu_data(menu_list):
"""菜单数据结构"""
# 构造字典结构
menu_dict = {}
for menu in menu_list:
menu_dict[menu['id']] = menu
def get_children_recursion(item):
"""获取子节点"""
item_children = item.setdefault('children', [])
# 该节点的所有子节点
children = [i for i in menu_list if item['id'] == i['parent_id']]
for child in children:
# 添加子节点
item_children.append(child)
# 递归子节点
get_children_recursion(child)
def clear_field(item):
"""清理多余字段"""
# item.pop('id')
item.pop('parent_id')
# item.pop('order_num')
# item.pop('menu_type')
for child in item.get('children', []):
clear_field(child)
if not item.get('children', []):
item.pop('children')
return item
# 最终结果值
result = []
for menu in menu_list:
# 从导航栏开始递归
if menu['parent_id'] == 0:
# 浅拷贝
get_children_recursion(menu)
# 深拷贝
items = clear_field(copy.deepcopy(menu))
result.append(items)
for i in result:
print(i, end='\n\n')
if __name__ == '__main__':
conf = {
'host': 'localhost',
'port': 3306,
'user': '****',
'password': '****',
'db': '****'
}
db = MysqlLink(conf)
# 查询全部
result = db.query('''
SELECT id, menu_name, parent_id, order_num, menu_type
FROM tb_user_menu
WHERE is_deleted = 0''')
print(result)
print()
filter_menu_data(result)
结果集
# 查询数据
{'id': 1, 'menu_name': '任务总览', 'parent_id': 0, 'order_num': 0, 'menu_type': 1}
{'id': 2, 'menu_name': '调度总览', 'parent_id': 0, 'order_num': 1, 'menu_type': 1}
{'id': 3, 'menu_name': '基础配置', 'parent_id': 0, 'order_num': 2, 'menu_type': 1}
{'id': 4, 'menu_name': '接口配置', 'parent_id': 1, 'order_num': 0, 'menu_type': 2}
{'id': 5, 'menu_name': '任务配置', 'parent_id': 1, 'order_num': 1, 'menu_type': 2}
{'id': 6, 'menu_name': '接口列表', 'parent_id': 4, 'order_num': 0, 'menu_type': 3}
{'id': 8, 'menu_name': '任务列表', 'parent_id': 5, 'order_num': 0, 'menu_type': 3}
{'id': 10, 'menu_name': '调度配置', 'parent_id': 2, 'order_num': 0, 'menu_type': 2}
{'id': 11, 'menu_name': '运行日志', 'parent_id': 2, 'order_num': 1, 'menu_type': 2}
{'id': 12, 'menu_name': '调度列表', 'parent_id': 10, 'order_num': 0, 'menu_type': 3}
{'id': 14, 'menu_name': '执行列表', 'parent_id': 11, 'order_num': 0, 'menu_type': 3}
{'id': 15, 'menu_name': '执行服务器配置', 'parent_id': 3, 'order_num': 0, 'menu_type': 2}
{'id': 16, 'menu_name': '预警配置', 'parent_id': 3, 'order_num': 1, 'menu_type': 2}
{'id': 17, 'menu_name': '执行服务器列表', 'parent_id': 15, 'order_num': 0, 'menu_type': 3}
{'id': 19, 'menu_name': '预警配置列表', 'parent_id': 16, 'order_num': 0, 'menu_type': 3}
{'id': 21, 'menu_name': '执行服务器状态', 'parent_id': 15, 'order_num': 1, 'menu_type': 3}
{'id': 22, 'menu_name': '参数配置', 'parent_id': 5, 'order_num': 3, 'menu_type': 3}
{'id': 23, 'menu_name': '数据源配置', 'parent_id': 5, 'order_num': 2, 'menu_type': 3}
# 递归结果
{'id': 1, 'menu_name': '任务总览', 'order_num': 0, 'menu_type': 1, 'children': [{'id': 4, 'menu_name': '接口配置', 'order_num': 0, 'menu_type': 2, 'children': [{'id': 6, 'menu_name': '接口列表', 'order_num': 0, 'menu_type': 3}]}, {'id': 5, 'menu_name': '任务配置', 'order_num': 1, 'menu_type': 2, 'children': [{'id': 8, 'menu_name': '任务列表', 'order_num': 0, 'menu_type': 3}, {'id': 22, 'menu_name': '参数配置', 'order_num': 3, 'menu_type': 3}, {'id': 23, 'menu_name': '数据源配置', 'order_num': 2, 'menu_type': 3}]}]}
{'id': 2, 'menu_name': '调度总览', 'order_num': 1, 'menu_type': 1, 'children': [{'id': 10, 'menu_name': '调度配置', 'order_num': 0, 'menu_type': 2, 'children': [{'id': 12, 'menu_name': '调度列表', 'order_num': 0, 'menu_type': 3}]}, {'id': 11, 'menu_name': '运行日志', 'order_num': 1, 'menu_type': 2, 'children': [{'id': 14, 'menu_name': '执行列表', 'order_num': 0, 'menu_type': 3}]}]}
{'id': 3, 'menu_name': '基础配置', 'order_num': 2, 'menu_type': 1, 'children': [{'id': 15, 'menu_name': '执行服务器配置', 'order_num': 0, 'menu_type': 2, 'children': [{'id': 17, 'menu_name': '执行服务器列表', 'order_num': 0, 'menu_type': 3}, {'id': 21, 'menu_name': '执行服务器状态', 'order_num': 1, 'menu_type': 3}]}, {'id': 16, 'menu_name': '预警配置', 'order_num': 1, 'menu_type': 2, 'children': [{'id': 19, 'menu_name': '预警配置列表', 'order_num': 0, 'menu_type': 3}]}]}