#!/usr/bin/env python3 """ 重新初始化RBAC数据 - 修复菜单层级关系混乱问题 清晰的三级结构:父目录菜单 > 功能菜单 > 按钮权限 """ import pymysql from dotenv import load_dotenv import os import uuid from datetime import datetime load_dotenv() def get_db_connection(): """获取数据库连接""" try: config = { 'host': os.getenv('DB_HOST', 'localhost'), 'port': int(os.getenv('DB_PORT', 3306)), 'user': os.getenv('DB_USER', 'root'), 'password': os.getenv('DB_PASSWORD', 'admin'), 'database': os.getenv('DB_NAME', 'lq_db'), 'charset': 'utf8mb4', 'autocommit': True } return pymysql.connect(**config) except Exception as e: print(f"数据库连接失败: {e}") return None def clear_rbac_data(cursor): """清理现有RBAC数据""" print("🧹 清理现有RBAC数据...") # 清理关联表 cursor.execute("DELETE FROM role_permissions") cursor.execute("DELETE FROM role_menus") cursor.execute("DELETE FROM user_roles") # 清理主表 cursor.execute("DELETE FROM permissions") cursor.execute("DELETE FROM menus") cursor.execute("DELETE FROM roles") print(" ✅ 清理完成") def insert_menus(cursor): """插入菜单数据 - 清晰的三级结构""" print("📋 插入菜单数据(修复层级关系)...") menus_data = [ # ==================== 第一级:主菜单(父目录菜单) ==================== { 'id': 'dashboard-main', 'parent_id': None, 'name': 'dashboard', 'title': '仪表盘', 'path': '/dashboard', 'component': 'dashboard/Index', 'icon': 'House', 'sort_order': 1, 'menu_type': 'menu', 'is_hidden': False, 'description': '系统概览和统计信息' }, { 'id': 'profile-main', 'parent_id': None, 'name': 'profile', 'title': '个人资料', 'path': '/profile', 'component': 'user/Profile', 'icon': 'User', 'sort_order': 2, 'menu_type': 'menu', 'is_hidden': False, 'description': '个人信息管理' }, { 'id': 'admin-main', 'parent_id': None, 'name': 'admin', 'title': '系统管理', 'path': '/admin', 'component': None, 'icon': 'Setting', 'sort_order': 3, 'menu_type': 'menu', 'is_hidden': False, 'description': '系统管理功能目录' }, # ==================== 第二级:功能菜单 ==================== # 系统管理下的功能菜单 { 'id': 'admin-dashboard', 'parent_id': 'admin-main', 'name': 'admin-dashboard', 'title': '管理概览', 'path': '/admin/dashboard', 'component': 'admin/Dashboard', 'icon': 'Monitor', 'sort_order': 1, 'menu_type': 'menu', 'is_hidden': False, 'description': '管理员仪表盘' }, { 'id': 'user-management', 'parent_id': 'admin-main', 'name': 'user-management', 'title': '用户管理', 'path': '/admin/users', 'component': 'admin/Users', 'icon': 'UserFilled', 'sort_order': 2, 'menu_type': 'menu', 'is_hidden': False, 'description': '用户信息管理' }, { 'id': 'role-management', 'parent_id': 'admin-main', 'name': 'role-management', 'title': '角色管理', 'path': '/admin/roles', 'component': 'admin/Roles', 'icon': 'Avatar', 'sort_order': 3, 'menu_type': 'menu', 'is_hidden': False, 'description': '角色权限管理' }, { 'id': 'menu-management', 'parent_id': 'admin-main', 'name': 'menu-management', 'title': '菜单管理', 'path': '/admin/menus', 'component': 'admin/Menus', 'icon': 'Menu', 'sort_order': 4, 'menu_type': 'menu', 'is_hidden': False, 'description': '菜单结构管理' }, { 'id': 'permission-management', 'parent_id': 'admin-main', 'name': 'permission-management', 'title': '权限管理', 'path': '/admin/permissions', 'component': 'admin/Permissions', 'icon': 'Key', 'sort_order': 5, 'menu_type': 'menu', 'is_hidden': False, 'description': '权限配置管理' }, { 'id': 'app-management', 'parent_id': 'admin-main', 'name': 'app-management', 'title': '应用管理', 'path': '/admin/apps', 'component': 'admin/Apps', 'icon': 'Grid', 'sort_order': 6, 'menu_type': 'menu', 'is_hidden': False, 'description': 'OAuth2应用管理' }, { 'id': 'log-management', 'parent_id': 'admin-main', 'name': 'log-management', 'title': '系统日志', 'path': '/admin/logs', 'component': 'admin/Logs', 'icon': 'Document', 'sort_order': 7, 'menu_type': 'menu', 'is_hidden': False, 'description': '系统操作日志' }, { 'id': 'system-settings', 'parent_id': 'admin-main', 'name': 'system-settings', 'title': '系统设置', 'path': '/admin/settings', 'component': 'admin/Settings', 'icon': 'Tools', 'sort_order': 8, 'menu_type': 'menu', 'is_hidden': False, 'description': '系统配置设置' }, # ==================== 第三级:按钮权限 ==================== # 用户管理的按钮权限 { 'id': 'user-create-btn', 'parent_id': 'user-management', 'name': 'user-create', 'title': '创建用户', 'path': None, 'component': None, 'icon': 'Plus', 'sort_order': 1, 'menu_type': 'button', 'is_hidden': False, 'description': '创建新用户' }, { 'id': 'user-edit-btn', 'parent_id': 'user-management', 'name': 'user-edit', 'title': '编辑用户', 'path': None, 'component': None, 'icon': 'Edit', 'sort_order': 2, 'menu_type': 'button', 'is_hidden': False, 'description': '编辑用户信息' }, { 'id': 'user-delete-btn', 'parent_id': 'user-management', 'name': 'user-delete', 'title': '删除用户', 'path': None, 'component': None, 'icon': 'Delete', 'sort_order': 3, 'menu_type': 'button', 'is_hidden': False, 'description': '删除用户' }, { 'id': 'user-batch-delete-btn', 'parent_id': 'user-management', 'name': 'user-batch-delete', 'title': '批量删除用户', 'path': None, 'component': None, 'icon': 'DeleteFilled', 'sort_order': 4, 'menu_type': 'button', 'is_hidden': False, 'description': '批量删除用户' }, { 'id': 'user-assign-role-btn', 'parent_id': 'user-management', 'name': 'user-assign-role', 'title': '分配角色', 'path': None, 'component': None, 'icon': 'Avatar', 'sort_order': 5, 'menu_type': 'button', 'is_hidden': False, 'description': '为用户分配角色' }, { 'id': 'user-reset-password-btn', 'parent_id': 'user-management', 'name': 'user-reset-password', 'title': '重置密码', 'path': None, 'component': None, 'icon': 'Key', 'sort_order': 6, 'menu_type': 'button', 'is_hidden': False, 'description': '重置用户密码' }, # 角色管理的按钮权限 { 'id': 'role-create-btn', 'parent_id': 'role-management', 'name': 'role-create', 'title': '创建角色', 'path': None, 'component': None, 'icon': 'Plus', 'sort_order': 1, 'menu_type': 'button', 'is_hidden': False, 'description': '创建新角色' }, { 'id': 'role-edit-btn', 'parent_id': 'role-management', 'name': 'role-edit', 'title': '编辑角色', 'path': None, 'component': None, 'icon': 'Edit', 'sort_order': 2, 'menu_type': 'button', 'is_hidden': False, 'description': '编辑角色信息' }, { 'id': 'role-delete-btn', 'parent_id': 'role-management', 'name': 'role-delete', 'title': '删除角色', 'path': None, 'component': None, 'icon': 'Delete', 'sort_order': 3, 'menu_type': 'button', 'is_hidden': False, 'description': '删除角色' }, { 'id': 'role-assign-permission-btn', 'parent_id': 'role-management', 'name': 'role-assign-permission', 'title': '分配权限', 'path': None, 'component': None, 'icon': 'Key', 'sort_order': 4, 'menu_type': 'button', 'is_hidden': False, 'description': '为角色分配权限' }, { 'id': 'role-assign-menu-btn', 'parent_id': 'role-management', 'name': 'role-assign-menu', 'title': '分配菜单', 'path': None, 'component': None, 'icon': 'Menu', 'sort_order': 5, 'menu_type': 'button', 'is_hidden': False, 'description': '为角色分配菜单' }, # 菜单管理的按钮权限 { 'id': 'menu-create-btn', 'parent_id': 'menu-management', 'name': 'menu-create', 'title': '创建菜单', 'path': None, 'component': None, 'icon': 'Plus', 'sort_order': 1, 'menu_type': 'button', 'is_hidden': False, 'description': '创建新菜单' }, { 'id': 'menu-edit-btn', 'parent_id': 'menu-management', 'name': 'menu-edit', 'title': '编辑菜单', 'path': None, 'component': None, 'icon': 'Edit', 'sort_order': 2, 'menu_type': 'button', 'is_hidden': False, 'description': '编辑菜单信息' }, { 'id': 'menu-delete-btn', 'parent_id': 'menu-management', 'name': 'menu-delete', 'title': '删除菜单', 'path': None, 'component': None, 'icon': 'Delete', 'sort_order': 3, 'menu_type': 'button', 'is_hidden': False, 'description': '删除菜单' }, { 'id': 'menu-sort-btn', 'parent_id': 'menu-management', 'name': 'menu-sort', 'title': '排序菜单', 'path': None, 'component': None, 'icon': 'Sort', 'sort_order': 4, 'menu_type': 'button', 'is_hidden': False, 'description': '调整菜单排序' }, # 权限管理的按钮权限 { 'id': 'permission-create-btn', 'parent_id': 'permission-management', 'name': 'permission-create', 'title': '创建权限', 'path': None, 'component': None, 'icon': 'Plus', 'sort_order': 1, 'menu_type': 'button', 'is_hidden': False, 'description': '创建新权限' }, { 'id': 'permission-edit-btn', 'parent_id': 'permission-management', 'name': 'permission-edit', 'title': '编辑权限', 'path': None, 'component': None, 'icon': 'Edit', 'sort_order': 2, 'menu_type': 'button', 'is_hidden': False, 'description': '编辑权限信息' }, { 'id': 'permission-delete-btn', 'parent_id': 'permission-management', 'name': 'permission-delete', 'title': '删除权限', 'path': None, 'component': None, 'icon': 'Delete', 'sort_order': 3, 'menu_type': 'button', 'is_hidden': False, 'description': '删除权限' }, # 应用管理的按钮权限 { 'id': 'app-create-btn', 'parent_id': 'app-management', 'name': 'app-create', 'title': '创建应用', 'path': None, 'component': None, 'icon': 'Plus', 'sort_order': 1, 'menu_type': 'button', 'is_hidden': False, 'description': '创建OAuth2应用' }, { 'id': 'app-edit-btn', 'parent_id': 'app-management', 'name': 'app-edit', 'title': '编辑应用', 'path': None, 'component': None, 'icon': 'Edit', 'sort_order': 2, 'menu_type': 'button', 'is_hidden': False, 'description': '编辑应用信息' }, { 'id': 'app-delete-btn', 'parent_id': 'app-management', 'name': 'app-delete', 'title': '删除应用', 'path': None, 'component': None, 'icon': 'Delete', 'sort_order': 3, 'menu_type': 'button', 'is_hidden': False, 'description': '删除应用' }, { 'id': 'app-view-secret-btn', 'parent_id': 'app-management', 'name': 'app-view-secret', 'title': '查看密钥', 'path': None, 'component': None, 'icon': 'View', 'sort_order': 4, 'menu_type': 'button', 'is_hidden': False, 'description': '查看应用密钥' }, { 'id': 'app-reset-secret-btn', 'parent_id': 'app-management', 'name': 'app-reset-secret', 'title': '重置密钥', 'path': None, 'component': None, 'icon': 'RefreshRight', 'sort_order': 5, 'menu_type': 'button', 'is_hidden': False, 'description': '重置应用密钥' }, # 系统日志的按钮权限 { 'id': 'log-view-btn', 'parent_id': 'log-management', 'name': 'log-view', 'title': '查看日志', 'path': None, 'component': None, 'icon': 'View', 'sort_order': 1, 'menu_type': 'button', 'is_hidden': False, 'description': '查看系统日志' }, { 'id': 'log-export-btn', 'parent_id': 'log-management', 'name': 'log-export', 'title': '导出日志', 'path': None, 'component': None, 'icon': 'Download', 'sort_order': 2, 'menu_type': 'button', 'is_hidden': False, 'description': '导出系统日志' }, { 'id': 'log-clear-btn', 'parent_id': 'log-management', 'name': 'log-clear', 'title': '清理日志', 'path': None, 'component': None, 'icon': 'Delete', 'sort_order': 3, 'menu_type': 'button', 'is_hidden': False, 'description': '清理历史日志' }, # 系统设置的按钮权限 { 'id': 'settings-view-btn', 'parent_id': 'system-settings', 'name': 'settings-view', 'title': '查看设置', 'path': None, 'component': None, 'icon': 'View', 'sort_order': 1, 'menu_type': 'button', 'is_hidden': False, 'description': '查看系统设置' }, { 'id': 'settings-edit-btn', 'parent_id': 'system-settings', 'name': 'settings-edit', 'title': '修改设置', 'path': None, 'component': None, 'icon': 'Edit', 'sort_order': 2, 'menu_type': 'button', 'is_hidden': False, 'description': '修改系统设置' } ] for menu in menus_data: cursor.execute(""" INSERT INTO menus (id, parent_id, name, title, path, component, icon, sort_order, menu_type, is_hidden, is_active, description, created_at, updated_at) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW(), NOW()) """, ( menu['id'], menu['parent_id'], menu['name'], menu['title'], menu['path'], menu['component'], menu['icon'], menu['sort_order'], menu['menu_type'], menu['is_hidden'], True, menu['description'] )) print(f" ✅ 插入了 {len(menus_data)} 个菜单项") # 统计各级菜单数量 main_menus = len([m for m in menus_data if not m['parent_id']]) function_menus = len([m for m in menus_data if m['parent_id'] and m['menu_type'] == 'menu']) button_permissions = len([m for m in menus_data if m['menu_type'] == 'button']) print(f" 📊 菜单结构统计:") print(f" 📁 主菜单(父目录): {main_menus} 个") print(f" 📄 功能菜单: {function_menus} 个") print(f" 🔘 按钮权限: {button_permissions} 个") def insert_roles(cursor): """插入角色数据""" print("👥 插入角色数据...") roles_data = [ { 'id': str(uuid.uuid4()), 'name': 'super_admin', 'display_name': '超级管理员', 'description': '拥有系统所有权限的超级管理员', 'is_system': True }, { 'id': str(uuid.uuid4()), 'name': 'admin', 'display_name': '管理员', 'description': '系统管理员,拥有大部分管理权限', 'is_system': True }, { 'id': str(uuid.uuid4()), 'name': 'user_manager', 'display_name': '用户管理员', 'description': '负责用户和角色管理的管理员', 'is_system': True }, { 'id': str(uuid.uuid4()), 'name': 'app_manager', 'display_name': '应用管理员', 'description': '负责应用管理的管理员', 'is_system': True }, { 'id': str(uuid.uuid4()), 'name': 'user', 'display_name': '普通用户', 'description': '系统普通用户', 'is_system': True } ] role_ids = {} for role in roles_data: cursor.execute(""" INSERT INTO roles (id, name, display_name, description, is_active, is_system, created_at, updated_at) VALUES (%s, %s, %s, %s, %s, %s, NOW(), NOW()) """, (role['id'], role['name'], role['display_name'], role['description'], True, role['is_system'])) role_ids[role['name']] = role['id'] print(f" ✅ 插入了 {len(roles_data)} 个角色") return role_ids def insert_permissions(cursor): """插入权限数据""" print("🔐 插入权限数据...") permissions_data = [ # 用户管理权限 {'name': 'user.view', 'display_name': '查看用户', 'resource': 'user', 'action': 'view', 'description': '查看用户列表和详情'}, {'name': 'user.create', 'display_name': '创建用户', 'resource': 'user', 'action': 'create', 'description': '创建新用户'}, {'name': 'user.edit', 'display_name': '编辑用户', 'resource': 'user', 'action': 'edit', 'description': '编辑用户信息'}, {'name': 'user.delete', 'display_name': '删除用户', 'resource': 'user', 'action': 'delete', 'description': '删除用户'}, {'name': 'user.batch_delete', 'display_name': '批量删除用户', 'resource': 'user', 'action': 'batch_delete', 'description': '批量删除用户'}, {'name': 'user.assign_role', 'display_name': '分配用户角色', 'resource': 'user', 'action': 'assign_role', 'description': '为用户分配角色'}, {'name': 'user.reset_password', 'display_name': '重置用户密码', 'resource': 'user', 'action': 'reset_password', 'description': '重置用户密码'}, # 角色管理权限 {'name': 'role.view', 'display_name': '查看角色', 'resource': 'role', 'action': 'view', 'description': '查看角色列表和详情'}, {'name': 'role.create', 'display_name': '创建角色', 'resource': 'role', 'action': 'create', 'description': '创建新角色'}, {'name': 'role.edit', 'display_name': '编辑角色', 'resource': 'role', 'action': 'edit', 'description': '编辑角色信息'}, {'name': 'role.delete', 'display_name': '删除角色', 'resource': 'role', 'action': 'delete', 'description': '删除角色'}, {'name': 'role.assign_permission', 'display_name': '分配角色权限', 'resource': 'role', 'action': 'assign_permission', 'description': '为角色分配权限'}, {'name': 'role.assign_menu', 'display_name': '分配角色菜单', 'resource': 'role', 'action': 'assign_menu', 'description': '为角色分配菜单'}, # 菜单管理权限 {'name': 'menu.view', 'display_name': '查看菜单', 'resource': 'menu', 'action': 'view', 'description': '查看菜单列表和详情'}, {'name': 'menu.create', 'display_name': '创建菜单', 'resource': 'menu', 'action': 'create', 'description': '创建新菜单'}, {'name': 'menu.edit', 'display_name': '编辑菜单', 'resource': 'menu', 'action': 'edit', 'description': '编辑菜单信息'}, {'name': 'menu.delete', 'display_name': '删除菜单', 'resource': 'menu', 'action': 'delete', 'description': '删除菜单'}, {'name': 'menu.sort', 'display_name': '排序菜单', 'resource': 'menu', 'action': 'sort', 'description': '调整菜单排序'}, # 权限管理权限 {'name': 'permission.view', 'display_name': '查看权限', 'resource': 'permission', 'action': 'view', 'description': '查看权限列表和详情'}, {'name': 'permission.create', 'display_name': '创建权限', 'resource': 'permission', 'action': 'create', 'description': '创建新权限'}, {'name': 'permission.edit', 'display_name': '编辑权限', 'resource': 'permission', 'action': 'edit', 'description': '编辑权限信息'}, {'name': 'permission.delete', 'display_name': '删除权限', 'resource': 'permission', 'action': 'delete', 'description': '删除权限'}, # 应用管理权限 {'name': 'app.view', 'display_name': '查看应用', 'resource': 'app', 'action': 'view', 'description': '查看应用列表和详情'}, {'name': 'app.create', 'display_name': '创建应用', 'resource': 'app', 'action': 'create', 'description': '创建OAuth2应用'}, {'name': 'app.edit', 'display_name': '编辑应用', 'resource': 'app', 'action': 'edit', 'description': '编辑应用信息'}, {'name': 'app.delete', 'display_name': '删除应用', 'resource': 'app', 'action': 'delete', 'description': '删除应用'}, {'name': 'app.view_secret', 'display_name': '查看应用密钥', 'resource': 'app', 'action': 'view_secret', 'description': '查看应用密钥'}, {'name': 'app.reset_secret', 'display_name': '重置应用密钥', 'resource': 'app', 'action': 'reset_secret', 'description': '重置应用密钥'}, # 系统管理权限 {'name': 'system.dashboard', 'display_name': '管理概览', 'resource': 'system', 'action': 'dashboard', 'description': '查看管理概览'}, {'name': 'system.log_view', 'display_name': '查看系统日志', 'resource': 'system', 'action': 'log_view', 'description': '查看系统操作日志'}, {'name': 'system.log_export', 'display_name': '导出系统日志', 'resource': 'system', 'action': 'log_export', 'description': '导出系统日志'}, {'name': 'system.log_clear', 'display_name': '清理系统日志', 'resource': 'system', 'action': 'log_clear', 'description': '清理历史日志'}, {'name': 'system.settings_view', 'display_name': '查看系统设置', 'resource': 'system', 'action': 'settings_view', 'description': '查看系统配置'}, {'name': 'system.settings_edit', 'display_name': '修改系统设置', 'resource': 'system', 'action': 'settings_edit', 'description': '修改系统配置'}, ] permission_ids = {} for perm in permissions_data: perm_id = str(uuid.uuid4()) cursor.execute(""" INSERT INTO permissions (id, name, display_name, resource, action, description, is_active, created_at, updated_at) VALUES (%s, %s, %s, %s, %s, %s, %s, NOW(), NOW()) """, (perm_id, perm['name'], perm['display_name'], perm['resource'], perm['action'], perm['description'], True)) permission_ids[perm['name']] = perm_id print(f" ✅ 插入了 {len(permissions_data)} 个权限") return permission_ids def assign_role_permissions(cursor, role_ids, permission_ids): """分配角色权限""" print("🔗 分配角色权限...") # 超级管理员拥有所有权限 super_admin_id = role_ids['super_admin'] for perm_name, perm_id in permission_ids.items(): cursor.execute(""" INSERT INTO role_permissions (role_id, permission_id, created_at) VALUES (%s, %s, NOW()) """, (super_admin_id, perm_id)) # 管理员拥有大部分权限(除了系统设置修改) admin_id = role_ids['admin'] admin_permissions = [perm for perm in permission_ids.keys() if not perm.startswith('system.settings_edit')] for perm_name in admin_permissions: cursor.execute(""" INSERT INTO role_permissions (role_id, permission_id, created_at) VALUES (%s, %s, NOW()) """, (admin_id, permission_ids[perm_name])) # 用户管理员只有用户和角色相关权限 user_manager_id = role_ids['user_manager'] user_permissions = [perm for perm in permission_ids.keys() if perm.startswith(('user.', 'role.', 'system.dashboard'))] for perm_name in user_permissions: cursor.execute(""" INSERT INTO role_permissions (role_id, permission_id, created_at) VALUES (%s, %s, NOW()) """, (user_manager_id, permission_ids[perm_name])) # 应用管理员只有应用相关权限 app_manager_id = role_ids['app_manager'] app_permissions = [perm for perm in permission_ids.keys() if perm.startswith(('app.', 'system.dashboard'))] for perm_name in app_permissions: cursor.execute(""" INSERT INTO role_permissions (role_id, permission_id, created_at) VALUES (%s, %s, NOW()) """, (app_manager_id, permission_ids[perm_name])) print(" ✅ 角色权限分配完成") def assign_role_menus(cursor, role_ids): """分配角色菜单""" print("🔗 分配角色菜单...") # 获取所有菜单ID cursor.execute("SELECT id, parent_id, menu_type FROM menus") all_menus = cursor.fetchall() menu_ids = [menu[0] for menu in all_menus] # 超级管理员和管理员拥有所有菜单 for role_name in ['super_admin', 'admin']: role_id = role_ids[role_name] for menu_id in menu_ids: cursor.execute(""" INSERT INTO role_menus (role_id, menu_id, created_at) VALUES (%s, %s, NOW()) """, (role_id, menu_id)) # 用户管理员只有基础菜单和用户管理相关菜单 user_manager_id = role_ids['user_manager'] user_manager_menus = [ 'dashboard-main', 'profile-main', 'admin-main', 'admin-dashboard', 'user-management', 'role-management' ] # 添加用户管理和角色管理相关的按钮权限 cursor.execute("SELECT id FROM menus WHERE parent_id IN ('user-management', 'role-management')") user_buttons = cursor.fetchall() user_manager_menus.extend([btn[0] for btn in user_buttons]) for menu_id in user_manager_menus: cursor.execute(""" INSERT INTO role_menus (role_id, menu_id, created_at) VALUES (%s, %s, NOW()) """, (user_manager_id, menu_id)) # 应用管理员只有基础菜单和应用管理相关菜单 app_manager_id = role_ids['app_manager'] app_manager_menus = [ 'dashboard-main', 'profile-main', 'admin-main', 'admin-dashboard', 'app-management' ] # 添加应用管理相关的按钮权限 cursor.execute("SELECT id FROM menus WHERE parent_id = 'app-management'") app_buttons = cursor.fetchall() app_manager_menus.extend([btn[0] for btn in app_buttons]) for menu_id in app_manager_menus: cursor.execute(""" INSERT INTO role_menus (role_id, menu_id, created_at) VALUES (%s, %s, NOW()) """, (app_manager_id, menu_id)) # 普通用户只有基础菜单 user_id = role_ids['user'] user_menus = ['dashboard-main', 'profile-main'] for menu_id in user_menus: cursor.execute(""" INSERT INTO role_menus (role_id, menu_id, created_at) VALUES (%s, %s, NOW()) """, (user_id, menu_id)) print(" ✅ 角色菜单分配完成") def assign_user_roles(cursor, role_ids): """为现有用户分配角色""" print("👤 为用户分配角色...") # 获取admin用户 cursor.execute("SELECT id FROM users WHERE username = 'admin'") admin_user = cursor.fetchone() if admin_user: admin_user_id = admin_user[0] # 为admin用户分配超级管理员角色 cursor.execute(""" INSERT INTO user_roles (user_id, role_id, is_active, created_at) VALUES (%s, %s, %s, NOW()) """, (admin_user_id, role_ids['super_admin'], True)) print(f" ✅ 为admin用户分配了超级管理员角色") # 获取其他用户并分配普通用户角色 cursor.execute("SELECT id, username FROM users WHERE username != 'admin'") other_users = cursor.fetchall() for user in other_users: user_id, username = user cursor.execute(""" INSERT INTO user_roles (user_id, role_id, is_active, created_at) VALUES (%s, %s, %s, NOW()) """, (user_id, role_ids['user'], True)) print(f" ✅ 为用户 {username} 分配了普通用户角色") def print_menu_structure(cursor): """打印菜单结构验证""" print("\n🌳 菜单结构验证:") print("=" * 60) # 获取所有菜单 cursor.execute(""" SELECT id, parent_id, title, menu_type, sort_order FROM menus ORDER BY CASE WHEN parent_id IS NULL THEN 0 ELSE 1 END, sort_order, CASE WHEN menu_type = 'menu' THEN 0 ELSE 1 END """) all_menus = cursor.fetchall() # 构建菜单树 menu_dict = {} for menu in all_menus: menu_id, parent_id, title, menu_type, sort_order = menu menu_dict[menu_id] = { 'id': menu_id, 'parent_id': parent_id, 'title': title, 'menu_type': menu_type, 'sort_order': sort_order, 'children': [] } # 建立父子关系 root_menus = [] for menu_id, menu_data in menu_dict.items(): if menu_data['parent_id']: if menu_data['parent_id'] in menu_dict: menu_dict[menu_data['parent_id']]['children'].append(menu_data) else: root_menus.append(menu_data) # 打印树形结构 def print_menu_tree(menus, level=0): for menu in sorted(menus, key=lambda x: x['sort_order']): indent = " " * level if menu['menu_type'] == 'menu' and level == 0: icon = "📁" elif menu['menu_type'] == 'menu': icon = "📄" else: icon = "🔘" print(f"{indent}{icon} {menu['title']} ({menu['menu_type']})") if menu['children']: # 先显示菜单类型的子项,再显示按钮类型的子项 menu_children = [c for c in menu['children'] if c['menu_type'] == 'menu'] button_children = [c for c in menu['children'] if c['menu_type'] == 'button'] print_menu_tree(menu_children, level + 1) print_menu_tree(button_children, level + 1) print_menu_tree(root_menus) def reinit_rbac_data(): """重新初始化RBAC数据 - 修复层级关系""" print("🚀 开始重新初始化RBAC数据(修复层级关系)") print("=" * 60) conn = get_db_connection() if not conn: print("❌ 数据库连接失败") return False cursor = conn.cursor() try: # 1. 清理现有数据 clear_rbac_data(cursor) # 2. 插入菜单数据(修复层级关系) insert_menus(cursor) # 3. 插入角色数据 role_ids = insert_roles(cursor) # 4. 插入权限数据 permission_ids = insert_permissions(cursor) # 5. 分配角色权限 assign_role_permissions(cursor, role_ids, permission_ids) # 6. 分配角色菜单 assign_role_menus(cursor, role_ids) # 7. 为用户分配角色 assign_user_roles(cursor, role_ids) # 8. 打印菜单结构验证 print_menu_structure(cursor) conn.commit() print("\n" + "=" * 60) print("🎉 RBAC数据重新初始化完成!(层级关系已修复)") print("=" * 60) print("📊 数据统计:") # 统计数据 cursor.execute("SELECT COUNT(*) FROM menus") menu_count = cursor.fetchone()[0] cursor.execute("SELECT COUNT(*) FROM menus WHERE menu_type = 'menu' AND parent_id IS NULL") main_menu_count = cursor.fetchone()[0] cursor.execute("SELECT COUNT(*) FROM menus WHERE menu_type = 'menu' AND parent_id IS NOT NULL") function_menu_count = cursor.fetchone()[0] cursor.execute("SELECT COUNT(*) FROM menus WHERE menu_type = 'button'") button_count = cursor.fetchone()[0] cursor.execute("SELECT COUNT(*) FROM roles") role_count = cursor.fetchone()[0] cursor.execute("SELECT COUNT(*) FROM permissions") permission_count = cursor.fetchone()[0] print(f" 📁 主菜单(父目录): {main_menu_count} 个") print(f" 📄 功能菜单: {function_menu_count} 个") print(f" 🔘 按钮权限: {button_count} 个") print(f" 📋 菜单总数: {menu_count} 个") print(f" 👥 角色数量: {role_count} 个") print(f" 🔐 权限数量: {permission_count} 个") print("=" * 60) return True except Exception as e: print(f"❌ 初始化失败: {e}") conn.rollback() return False finally: cursor.close() conn.close() def main(): """主函数""" success = reinit_rbac_data() if success: print("\n🎯 重新初始化成功!菜单层级关系已修复。") print("💡 建议重启前端服务以刷新菜单缓存。") print("\n🌐 访问地址:") print(" 前端: http://localhost:3000") print(" 菜单管理: http://localhost:3000/admin/menus") print("\n🔑 登录信息:") print(" 用户名: admin") print(" 密码: Admin123456") else: print("\n❌ 重新初始化失败!") if __name__ == "__main__": main()