从零开始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
,并且增加Icon
、ParentId
用于菜单使用。
修改后的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:https://github.com/j4587698/BlazorLearn,分支lesson8。