從零開始Blazor Server(8)–增加菜單以及調整位置

這篇幹啥

這篇文章主要是把前面的一些東西稍微調整一下,使其更適合後面的內容。

主要是兩個事,一個是把原來的PermissionEntity直接變成MenuEntity,直接讓最後一級是菜單,這樣後面就簡單很多。

另外增加一些默認的菜單為後面的文章做準備。

另外就是調整一下Pages裡面的目錄結構,讓我們不用每個頁面都去加@attribute [Authorize]

處理目錄結構

之前的內容里,我們最後還是用了Furion自帶的方法來處理成策略授權了,所以我們正常的話需要每個頁面都加上@attribute [Authorize]

但是這樣太麻煩了,幸好微軟給我們提供了一個_Imports.razor的東西,這個文件是目錄級的,我們可以在某層目錄下添加,然後此目錄和它的子目錄都會受影響。

所以我們就需要把Login和其他的頁面分開,因為我們的Login頁面是不需要登錄的,而且分開以後更清晰。

這裡在Pages下面新建兩個目錄,一個叫Account,一個叫Admin。這裡把Login.razor放到Account目錄下,把其他的razor文件都放到Admin下面。

這裡注意不要移動那兩個cshtml文件,因為那兩個文件的位置如果改變還需要改變很多其他的東西。

然後在Admin目錄下新建一個_Imports.razor,內容為:

@attribute [Authorize]

這樣,所有的Admin目錄下的頁面都會受到影響,需要許可權驗證。

修改MenuEntity

在之前,我們是做了個PermissionEntity,裡面只記錄了許可權資訊,但是這樣就還需要一套菜單系統,然後還要根據Url來進行匹配,就太麻煩了一點,所以這裡我們直接把菜單系統和許可權系統合起來,把PermissionEntity改為MenuEntity,並且增加IconParentId用於菜單使用。

修改後的MenuEntity如下:

[Description("菜單表")]
public class MenuEntity: BaseEntity<MenuEntity, int>
{
    [Description("菜單名")]
    public string? Name { get; set; }

    [Description("菜單圖標")]
    public string? Icon { get; set; }

    [Description("對應頁面Url")]
    public string? Url { get; set; }

    [Description("父菜單ID")]
    public int ParentId { get; set; }

    [Navigate(nameof(ParentId))]
    public MenuEntity? Parent { get; set; }

    [Navigate(nameof(ParentId))]
    public List<MenuEntity>? Children { get; set; }
    
    [Description("角色")]
    [Navigate(ManyToMany = typeof(RoleMenuEntity))]
    public virtual ICollection<RoleEntity>? Roles { get; set; }
}

同時我們增加一部分菜單項到DbExtension,這塊程式碼就不貼了,直接去github看把。

源碼在github://github.com/j4587698/BlazorLearn,分支lesson8。