using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using AntdUI; using DH.RBAC.Common; using DH.RBAC.Logic.Sys; using DH.RBAC.Model.Sys; using DH.RBAC.Models.Base; using DH.RBAC.Page; using Sunny.UI; namespace DH.RBAC { public partial class RBACWindow : Window { private SysUserLogic userLogic; private SysPermissionLogic permissionLogic; private List pageList = new List(); public RBACWindow() { InitializeComponent(); userLogic = new SysUserLogic(); permissionLogic = new SysPermissionLogic(); Load += RBACWindow_Load; menu1.SelectChanged += Menu1_SelectChanged; } /// /// 窗体对象实例 /// private static RBACWindow _instance; public static RBACWindow Instance { get { if (_instance == null || _instance.IsDisposed) _instance = new RBACWindow(); return _instance; } } private void RBACWindow_Load(object sender, EventArgs e) { lbName.Text = GlobalConfig.CurrentUser.Account; //设置关联 //Aside.TabControl = MainTabControl; //获得用户权限 List list; if (userLogic.ContainsUser("admin", GlobalConfig.CurrentUser.Id)) { list = permissionLogic.GetList(); } else { list = permissionLogic.GetList(GlobalConfig.CurrentUser.Id); } if (list.IsNullOrEmpty()) { AntdUI.Message.warn(this, "网络或服务器异常,请稍后重试!", autoClose: 3); return; } GlobalConfig.PermissionList = list; //取出一级菜单 List root = list.Where(it => it.ParentId == "0").ToList(); foreach (SysPermission permission in root) { MenuItem menuItem=new MenuItem(); menuItem.Text = permission.Name; menu1.Items.Add(menuItem); List childList = list.Where(it => it.ParentId == permission.Id).ToList(); foreach (SysPermission child in childList) { MenuItem childmenuItem = new MenuItem(); childmenuItem.Text = child.Name; childmenuItem.ID = child.EnCode; childmenuItem.Tag=child.Id.ToString(); menuItem.Sub.Add(childmenuItem); } } } private void Menu1_SelectChanged(object sender, MenuSelectEventArgs e) { var clickedItem = e.Value as MenuItem; if (clickedItem?.ID == null) return; string pageCode = clickedItem.ID; // 获取PageCode(如"sys-user") string menuText = clickedItem.Text; string permissionId= clickedItem.Tag.ToString(); // 查找是否已存在对应的TabPage var existingTab = FindTabByPageCode(pageCode); if (existingTab != null) { tabs1.SelectedTab = existingTab; return; } // 动态创建控件并添加TabPage MyPage control = CreateControlByPageCode(pageCode); try { control.ButtonPermissionList = GlobalConfig.PermissionList.Where(it => it.ParentId == permissionId).ToList(); } catch { } if (control == null) { AntdUI.Message.warn(this, "该菜单仅权限配置,无显示页面!", autoClose: 3); return; } AddNewTab(control, menuText, pageCode); } private MyPage CreateControlByPageCode(string pageCode) { Type controlType = FindControlTypeByPageCode(pageCode); if (controlType == null) return null; try { // 获取接受 Form 参数的构造函数 var constructor = controlType.GetConstructor(new[] { typeof(Window) }); if (constructor != null) { return constructor.Invoke(new object[] { this }) as MyPage; // 传递当前窗体实例 } else { // 如果未找到带 Form 参数的构造函数,尝试无参构造 return Activator.CreateInstance(controlType) as MyPage; } } catch (Exception ex) { MessageBox.Show($"创建页面失败: {ex.Message}"); return null; } } private Type FindControlTypeByPageCode(string pageCode) { // 反射查找所有带有PageCodeAttribute的UserControl类型 var controlTypes = Assembly.GetExecutingAssembly().GetTypes() .Where(t => t.IsSubclassOf(typeof(UserControl)) && !t.IsAbstract); foreach (var type in controlTypes) { var attr = type.GetCustomAttribute(); if (attr != null && attr.Encode == pageCode) { return type; } } return null; } private void AddNewTab(UserControl control, string menuText, string pageCode) { AntdUI.TabPage tabPage = new AntdUI.TabPage { Text = menuText, Tag = pageCode, // 可选:存储PageCode用于后续查找 ReadOnly = false }; control.Dock = DockStyle.Fill; AutoDpi(control); // DPI适配(如果有) tabPage.Controls.Add(control); tabs1.Pages.Add(tabPage); tabs1.SelectedTab = tabPage; } private AntdUI.TabPage FindTabByPageCode(string pageCode) { return tabs1.Pages.OfType() .FirstOrDefault(t => t.Tag?.ToString() == pageCode); } } }