zhibo/archive/Zhibo/zhibo-1201/generate_menu_structure.py
2025-12-21 17:32:12 +08:00

125 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pymysql
# 数据库连接配置
db_config = {
'host': '1.15.149.240',
'user': 'zhibo',
'password': 'zCETFpGMwYN3CNeH',
'database': 'zhibo',
'charset': 'utf8mb4'
}
# 连接数据库
conn = pymysql.connect(**db_config)
cursor = conn.cursor(pymysql.cursors.DictCursor)
# 查询所有显示的菜单
sql = """
SELECT id, pid, name, component, menu_type, sort, is_show
FROM eb_system_menu
WHERE is_show = 1
ORDER BY pid, sort, id
"""
cursor.execute(sql)
all_menus = cursor.fetchall()
# 构建菜单树
menu_tree = {}
for menu in all_menus:
if menu['pid'] == 0:
if menu['id'] not in menu_tree:
menu_tree[menu['id']] = {'info': menu, 'children': []}
else:
menu_tree[menu['id']]['info'] = menu
# 添加子菜单
for menu in all_menus:
if menu['pid'] != 0:
parent_id = menu['pid']
if parent_id not in menu_tree:
menu_tree[parent_id] = {'info': None, 'children': []}
menu_tree[parent_id]['children'].append(menu)
# 生成Markdown文档
output = """# 系统完整菜单结构
> 生成时间2024-12-04
> 说明:本文档记录了系统中所有一级菜单及其子菜单的完整层级结构
---
## 📋 菜单统计
- **一级菜单总数**: {total_level1}
- **子菜单总数**: {total_children}
- **菜单总数**: {total_all}
---
## 🗂️ 完整菜单结构
"""
# 统计
total_level1 = len([m for m in all_menus if m['pid'] == 0])
total_children = len([m for m in all_menus if m['pid'] != 0])
total_all = len(all_menus)
output = output.format(
total_level1=total_level1,
total_children=total_children,
total_all=total_all
)
# 按sort排序一级菜单
sorted_level1 = sorted(
[(k, v) for k, v in menu_tree.items() if v['info'] is not None],
key=lambda x: (x[1]['info']['sort'], x[1]['info']['id'])
)
# 生成菜单列表
for idx, (menu_id, menu_data) in enumerate(sorted_level1, 1):
menu_info = menu_data['info']
children = menu_data['children']
# 一级菜单标题
output += f"\n### {idx}. {menu_info['name']}\n\n"
output += f"- **菜单ID**: {menu_info['id']}\n"
output += f"- **路由路径**: `{menu_info['component']}`\n"
output += f"- **菜单类型**: {menu_info['menu_type']}\n"
output += f"- **排序**: {menu_info['sort']}\n"
if children:
output += f"- **子菜单数量**: {len(children)}\n\n"
output += "#### 子菜单列表:\n\n"
# 按sort排序子菜单
sorted_children = sorted(children, key=lambda x: (x['sort'], x['id']))
for child_idx, child in enumerate(sorted_children, 1):
output += f"{child_idx}. **{child['name']}**\n"
output += f" - ID: {child['id']}\n"
output += f" - 路径: `{child['component']}`\n"
output += f" - 类型: {child['menu_type']}\n"
output += f" - 排序: {child['sort']}\n\n"
else:
output += f"- **子菜单数量**: 0无子菜单\n\n"
output += "---\n"
# 保存文件
output_file = r'小张\行动\完整菜单结构.md'
with open(output_file, 'w', encoding='utf-8') as f:
f.write(output)
print(f"✅ 菜单结构已生成到文件: {output_file}")
print(f"📊 统计信息:")
print(f" - 一级菜单: {total_level1}")
print(f" - 子菜单: {total_children}")
print(f" - 总计: {total_all}")
# 关闭连接
cursor.close()
conn.close()