DHDHSoftware/DH.RBAC/RBACWindow.cs
liyaobang 9f7c6206ca 提交rbac
提交设置右键错位的bug
2025-04-08 15:15:02 +08:00

205 lines
6.5 KiB
C#
Raw Permalink 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.

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<Menu> pageList = new List<Menu>();
public RBACWindow()
{
InitializeComponent();
userLogic = new SysUserLogic();
permissionLogic = new SysPermissionLogic();
Load += RBACWindow_Load;
menu1.SelectChanged += Menu1_SelectChanged;
}
/// <summary>
/// 窗体对象实例
/// </summary>
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<SysPermission> 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<SysPermission> 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<SysPermission> 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<PageCodeAttribute>();
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<AntdUI.TabPage>()
.FirstOrDefault(t => t.Tag?.ToString() == pageCode);
}
}
}