#!/usr/bin/env python3 """添加缺失的菜单项""" import asyncio from sqlalchemy.ext.asyncio import create_async_engine from sqlalchemy import text DB_CONFIG = { 'host': '123.57.81.127', 'port': 3306, 'user': 'cpy_admin', 'password': 'Tgzz2025+', 'database': 'ruoyi-fastapi' } DATABASE_URL = ( f"mysql+asyncmy://{DB_CONFIG['user']}:{DB_CONFIG['password']}@" f"{DB_CONFIG['host']}:{DB_CONFIG['port']}/{DB_CONFIG['database']}" ) async def fix_menus(): engine = create_async_engine(DATABASE_URL, echo=False) async with engine.connect() as conn: print("=" * 80) print("Adding Missing Menus") print("=" * 80) # 1. 添加工单领取菜单 print("\n[1] Adding Work Order Claim Menu...") # 检查是否已存在 result = await conn.execute(text(""" SELECT COUNT(*) FROM sys_menu WHERE path = 'workorder/claim' """)) count = result.scalar() if count == 0: # 添加工单管理目录 await conn.execute(text(""" INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time) VALUES ('工单管理', 0, 7, 'workorder', NULL, 0, 0, 'M', '0', '0', NULL, 'form', 'admin', NOW()) """)) await conn.commit() # 获取刚插入的目录ID result = await conn.execute(text(""" SELECT menu_id FROM sys_menu WHERE path = 'workorder' AND menu_type = 'M' """)) parent_id = result.scalar() # 添加工单领取菜单 await conn.execute(text(f""" INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time) VALUES ('工单领取', {parent_id}, 1, 'workorder/claim', 'workorder/claim/index', 0, 0, 'C', '0', '0', 'workorder:claim:list', 'el-icon-s-claim', 'admin', NOW()) """)) await conn.commit() # 添加工单领取按钮权限 result = await conn.execute(text(""" SELECT menu_id FROM sys_menu WHERE path = 'workorder/claim' """)) claim_menu_id = result.scalar() buttons = [ ('工单领取查询', 'workorder:claim:query'), ('工单领取', 'workorder:claim:claim'), ('批量领取', 'workorder:claim:batch'), ] for btn_name, btn_perm in buttons: await conn.execute(text(f""" INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time) VALUES ('{btn_name}', {claim_menu_id}, 1, '#', NULL, 0, 0, 'F', '0', '0', '{btn_perm}', NULL, 'admin', NOW()) """)) await conn.commit() print(f" [OK] Work Order Claim Menu added (Parent ID: {parent_id}, Menu ID: {claim_menu_id})") else: print(" [INFO] Work Order Claim Menu already exists") # 2. 检查测试类别配置菜单 print("\n[2] Checking Test Category Menu...") result = await conn.execute(text(""" SELECT menu_id, menu_name, parent_id, path, component FROM sys_menu WHERE path = 'test_category' """)) row = result.fetchone() if row: print(f" [INFO] Test Category Menu exists: ID={row[0]}, Name={row[1]}, Parent={row[2]}") print(f" Path={row[3]}, Component={row[4]}") else: print(" [WARN] Test Category Menu not found!") # 3. 检查测试配置管理目录 print("\n[3] Checking Test Config Directory...") result = await conn.execute(text(""" SELECT menu_id, menu_name FROM sys_menu WHERE path = 'testconfig' AND menu_type = 'M' """)) row = result.fetchone() if row: print(f" [INFO] Test Config Directory exists: ID={row[0]}, Name={row[1]}") else: print(" [WARN] Test Config Directory not found!") print("\n" + "=" * 80) print("Menu Fix Complete") print("=" * 80) print("\n请刷新页面查看新菜单") await engine.dispose() if __name__ == '__main__': asyncio.run(fix_menus())