update_menu_structure.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #!/usr/bin/env python3
  2. """
  3. 更新菜单结构 - 移除"我的应用"菜单,将应用管理功能迁移到管理员菜单下
  4. """
  5. import pymysql
  6. from dotenv import load_dotenv
  7. import os
  8. load_dotenv()
  9. def get_db_connection():
  10. """获取数据库连接"""
  11. try:
  12. config = {
  13. 'host': os.getenv('DB_HOST', 'localhost'),
  14. 'port': int(os.getenv('DB_PORT', 3306)),
  15. 'user': os.getenv('DB_USER', 'root'),
  16. 'password': os.getenv('DB_PASSWORD', 'admin'),
  17. 'database': os.getenv('DB_NAME', 'lq_db'),
  18. 'charset': 'utf8mb4',
  19. 'autocommit': True
  20. }
  21. return pymysql.connect(**config)
  22. except Exception as e:
  23. print(f"数据库连接失败: {e}")
  24. return None
  25. def update_menu_structure():
  26. """更新菜单结构"""
  27. print("🔄 更新菜单结构...")
  28. print("=" * 50)
  29. conn = get_db_connection()
  30. if not conn:
  31. print("❌ 数据库连接失败")
  32. return False
  33. cursor = conn.cursor()
  34. try:
  35. # 1. 删除"我的应用"相关菜单和按钮
  36. print("🗑️ 删除旧的'我的应用'菜单...")
  37. # 删除应用管理按钮权限
  38. cursor.execute("DELETE FROM menus WHERE parent_id = 'apps-menu'")
  39. print(f" 删除了应用管理按钮权限")
  40. # 删除"我的应用"主菜单
  41. cursor.execute("DELETE FROM menus WHERE id = 'apps-menu'")
  42. print(f" 删除了'我的应用'主菜单")
  43. # 2. 更新菜单排序
  44. print("📝 更新菜单排序...")
  45. cursor.execute("UPDATE menus SET sort_order = 3 WHERE id = 'admin-menu'")
  46. print(" 更新了系统管理菜单排序")
  47. # 3. 确保应用管理按钮权限在管理员应用管理菜单下
  48. print("➕ 添加应用管理按钮权限...")
  49. apps_buttons = [
  50. ('apps-create-btn', 'admin-apps-menu', 'apps-create', '创建应用', None, None, 'Plus', 1, 'button', False),
  51. ('apps-edit-btn', 'admin-apps-menu', 'apps-edit', '编辑应用', None, None, 'Edit', 2, 'button', False),
  52. ('apps-delete-btn', 'admin-apps-menu', 'apps-delete', '删除应用', None, None, 'Delete', 3, 'button', False),
  53. ('apps-secret-btn', 'admin-apps-menu', 'apps-secret', '查看密钥', None, None, 'Key', 4, 'button', False),
  54. ]
  55. for button_data in apps_buttons:
  56. # 检查是否已存在
  57. cursor.execute("SELECT COUNT(*) FROM menus WHERE id = %s", (button_data[0],))
  58. if cursor.fetchone()[0] == 0:
  59. cursor.execute("""
  60. INSERT INTO menus (id, parent_id, name, title, path, component, icon, sort_order, menu_type, is_hidden)
  61. VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
  62. """, button_data)
  63. print(f" 添加了按钮权限: {button_data[3]}")
  64. else:
  65. print(f" 按钮权限已存在: {button_data[3]}")
  66. # 4. 清理角色菜单关联中的"我的应用"菜单
  67. print("🧹 清理角色菜单关联...")
  68. cursor.execute("DELETE FROM role_menus WHERE menu_id = 'apps-menu'")
  69. cursor.execute("DELETE FROM role_menus WHERE menu_id LIKE 'apps-%' AND menu_id != 'admin-apps-menu'")
  70. print(" 清理了旧的角色菜单关联")
  71. # 5. 为管理员角色添加应用管理权限
  72. print("🔐 为管理员角色添加应用管理权限...")
  73. # 获取管理员相关角色
  74. admin_roles = ['super_admin', 'admin', 'app_manager']
  75. for role_name in admin_roles:
  76. # 获取角色ID
  77. cursor.execute("SELECT id FROM roles WHERE name = %s", (role_name,))
  78. role_result = cursor.fetchone()
  79. if role_result:
  80. role_id = role_result[0]
  81. # 添加应用管理菜单权限
  82. cursor.execute("""
  83. INSERT IGNORE INTO role_menus (role_id, menu_id, created_at)
  84. VALUES (%s, 'admin-apps-menu', NOW())
  85. """, (role_id,))
  86. # 添加应用管理按钮权限
  87. for button_data in apps_buttons:
  88. cursor.execute("""
  89. INSERT IGNORE INTO role_menus (role_id, menu_id, created_at)
  90. VALUES (%s, %s, NOW())
  91. """, (role_id, button_data[0]))
  92. print(f" 为角色 {role_name} 添加了应用管理权限")
  93. conn.commit()
  94. print("\n" + "=" * 50)
  95. print("✅ 菜单结构更新完成!")
  96. print("📋 更新内容:")
  97. print(" - 删除了'我的应用'菜单")
  98. print(" - 应用管理功能迁移到系统管理下")
  99. print(" - 更新了菜单排序")
  100. print(" - 更新了角色权限")
  101. print("=" * 50)
  102. return True
  103. except Exception as e:
  104. print(f"❌ 更新失败: {e}")
  105. conn.rollback()
  106. return False
  107. finally:
  108. cursor.close()
  109. conn.close()
  110. def main():
  111. """主函数"""
  112. success = update_menu_structure()
  113. if success:
  114. print("\n🎉 菜单结构更新成功!请重启前端服务以查看更改。")
  115. else:
  116. print("\n❌ 菜单结构更新失败!")
  117. if __name__ == "__main__":
  118. main()