循序漸進介紹基於CommunityToolkit.Mvvm 和HandyControl的WPF應用端開發(9) -- 實現系統動態選單的設定和許可權分配

2023-10-17 12:01:23

在WPF應用端開發,它的介面類似於Winform端,因此我們也需要對系統的選單進行動態設定,這樣才能把系統的功能彈性發揮到極致,通過動態選單的設定方式,我們可以很容易的為系統新增所需的功能,通過許可權分配的方式,可以更有效的管理系統的選單分配到不同的角色使用者,本篇隨筆介紹在WPF應用端中實現系統動態選單的設定和許可權分配。

1、系統選單的管理

為了能夠動態的載入應用系統的選單,我們需要在資料庫中儲存對應的選單資訊,設定好後進行許可權分配即可。

選單的管理介面如下所示,左側是一個選單的樹形列表,用來指引選擇或者查詢特定的選單,右側列表列出選單的相關資訊,以及提供新增、編輯、匯入、匯出、刪除等操作入口。

由於選單的資訊,是會在系統中開啟指定的頁面的,因此需要設定一個供反射方式讀取的頁面物件,如下所示。

 這個WPF表單型別,也是類似Winform端,用於開啟WInform表單的物件全名,這個是WPF頁面的全名,用於我們能夠在反射處理中迅速定位到具體的型別,然後開啟頁面使用的。

系統具體的選單展示效果如下所示。

單擊開啟系統選單專案的時候,會根據相關的設定反射對應的WPF頁面類,如下程式碼所示。

    string filePath = Assembly.GetExecutingAssembly().GetName().Name;//預設為當前程式集
    string dllFullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filePath);

    var tempAssembly = Assembly.LoadFrom(dllFullPath);
    if (tempAssembly != null)
    {
        //wpfTypeName = 我們設定的反射類名稱
        Type objType = tempAssembly.GetType(wpfTypeName);
        return objType;
    }

另外圖示的選擇,也是根據系統的需要進行選擇的。

建立一個圖示選擇的頁面,如下所示,供系統圖示選擇使用。

 

2、分配角色許可權

 完成選單的資訊錄入後,我們需要對選單的存取許可權進行設定,根據角色分配許可權是最廣泛使用的方式,如下介面所示。

角色包含的選單,使用者登入系統後,根據使用者的角色身份獲取對應的選單即可,然後在系統中進行展示即可。

 如系統根據身份資訊,動態獲取伺服器端的選單如下所示。

/// <summary>
/// 獲取遠端的選單列表
/// </summary>
/// <returns></returns>
public async Task GetRemoteMenus()
{
    //設定使用動態選單
    if (this.UseRemoteMenus)
    {
        var menuList = await BLLFactory<IMenuService>.Instance.GetMenuNodesByUser(this.UserInfo.Id, this.SystemType);
        if (menuList.Count == 0) return;

        this.NavigationItems.Clear();

        var menuItems = AddMenuItem(menuList);
        foreach (var item in menuItems)
        {
            this.NavigationItems.Add(item);
        }
    }
}

由於程式主視窗裡面繫結的選單資訊,如下程式碼所示。

<ui:NavigationView
    x:Name="RootNavigation"
    Grid.Row="1"
    Padding="20,0,42,0"
    BreadcrumbBar="{Binding ElementName=BreadcrumbBar}"
    FooterMenuItemsSource="{Binding ViewModel.NavigationFooter, Mode=OneWay}"
    IsBackButtonVisible="Visible"
    IsPaneToggleVisible="True"
    MenuItemsSource="{Binding ViewModel.NavigationItems, Mode=OneWay}"
    Navigated="RootNavigation_Navigated"
    OpenPaneLength="210"
    PaneClosed="NavigationView_OnPaneClosed"
    PaneDisplayMode="Left"
    PaneOpened="NavigationView_OnPaneOpened"
    SelectionChanged="OnNavigationSelectionChanged">

因此係統選單就可以正常的更新為動態設定的選單資訊了。