diff --git a/backend/app/utils/build_tree.py b/backend/app/utils/build_tree.py index 271f1771..c10231f2 100644 --- a/backend/app/utils/build_tree.py +++ b/backend/app/utils/build_tree.py @@ -24,20 +24,21 @@ def traversal_to_tree(nodes: list[dict[str, Any]]) -> list[dict[str, Any]]: :param nodes: :return: """ - node_map = {} - root_nodes = [] + tree = [] + node_dict = {node['id']: node for node in nodes} for node in nodes: parent_id = node['parent_id'] if parent_id is None: - root_nodes.append(node) + tree.append(node) else: - parent_node = node_map.get(parent_id, {}) - parent_node.setdefault('children', []).append(node) - node_map[parent_id] = parent_node - node_map[node['id']] = node + parent_node = node_dict.get(parent_id) + if parent_node is not None: + if 'children' not in parent_node: + parent_node['children'] = [] + parent_node['children'].append(node) - return root_nodes + return tree async def recursive_to_tree(nodes: list[dict[str, Any]], *, parent_id: int | None = None) -> list[dict[str, Any]]: @@ -51,12 +52,10 @@ async def recursive_to_tree(nodes: list[dict[str, Any]], *, parent_id: int | Non tree = [] for node in nodes: if node['parent_id'] == parent_id: - child_node = { - 'id': node['id'], - 'parent_id': node['parent_id'], - 'children': await recursive_to_tree(nodes, parent_id=node['id']), - } - tree.append(child_node) + child_node = await recursive_to_tree(nodes, parent_id=node['id']) + if child_node: + node['children'] = child_node + tree.append(node) return tree diff --git a/backend/sql/init_test_data.sql b/backend/sql/init_test_data.sql index 2b2e0152..8dcb8247 100644 --- a/backend/sql/init_test_data.sql +++ b/backend/sql/init_test_data.sql @@ -1,7 +1,7 @@ INSERT INTO fba.sys_dept (id, name, level, sort, leader, phone, email, status, del_flag, parent_id, created_time, updated_time) VALUES (1, 'test', 0, 0, null, null, null, 1, 0, null, '2023-06-26 17:13:45', null); -insert into fba.sys_menu (id, name, level, sort, icon, path, menu_type, component, perms, status, remark, parent_id, created_time, updated_time, 'show', cache) +insert into fba.sys_menu (id, name, level, sort, icon, path, menu_type, component, perms, status, remark, parent_id, created_time, updated_time, `show`, cache) values (1, 'test', 0, 0, null, null, 0, null, null, 1, null, null, '2023-06-26 17:13:45', null, 0, 1), (2, 'dashboard', 0, 0, 'icon-dashboard', '/dashboard', 0, '/dashboard/workplace/index.vue', null, 1, null, null, '2023-06-30 10:10:34', null, 1, 1), (3, 'Workplace', 0, 0, null, '/workplace', 0, null, null, 1, null, 2, '2023-06-30 10:11:40', null, 1, 1),