跃然纸上

#😎路漫漫其修远兮,吾将上下而求索!

RBAC(基于角色的访问控制)模型的权限管理系统,使用.NET 10.0 + Blazor + FreeSql架构

整体流程图如下:

1

  

RoleMenuEntity中间表的作用

预期作用:

  1. 建立多对多关系:在角色(RoleEntity)和菜单(MenuEntity)之间建立多对多关联

  2. 权限控制:记录哪些角色可以访问哪些菜单

  3. 数据解耦:将角色和菜单的关联关系独立存储

RoleMenuEntity数据表现说明

📊 数据结构示例

假设我们有:

  • 角色表 (RoleEntity):角色1(ID=1,RoleName="管理员")

  • 菜单表 (MenuEntity):菜单ID从1到9

  • 关系表 (RoleMenuEntity):记录角色1对应的9个菜单权限

var roleMenus = db.RoleMenuEntity
    .Where(rm => rm.RoleId == 1)
    .Include(rm => rm.Menu)
    .ToList();

// 结果:返回9条记录,每条记录包含Menu导航属性

📋 RoleMenuEntity表中会创建9条记录:

RoleIdMenuId说明
1 1 角色1有菜单1的权限
1 2 角色1有菜单2的权限
1 3 角色1有菜单3的权限
1 4 角色1有菜单4的权限
1 5 角色1有菜单5的权限
1 6 角色1有菜单6的权限
1 7 角色1有菜单7的权限
1 8 角色1有菜单8的权限
1 9 角色1有菜单9的权限

 

 

 

[Description("菜单表")]
// 菜单-角色:多对多关系(通过RoleMenuEntity中间表)
public class MenuEntity: BaseEntity<MenuEntity,int>
{
    [Description("菜单名")]
    public string? MenuName { get; set; }
    [Description("URL")]
    public string? Url { get; set; }
    [Description("图标")]
    public string? Icon { get; set; }
    public int ParentId { get; set; }

    // 自引用关系:父子菜单
    [Navigate(nameof(ParentId))]
    public MenuEntity? Parent { get; set; } // 父菜单
    
    [Navigate(nameof(ParentId))]
    public List<MenuEntity>? Children { get; set; } // 子菜单列表
    
    // 多对多关系:角色-菜单
    [Navigate(ManyToMany = typeof(RoleMenuEntity))]
    public List<RoleEntity>? Roles { get; set; } // 拥有该菜单的角色
}

 

[Description("角色表")]
// 角色-用户:一对多关系(一个角色有多个用户)
public class RoleEntity: BaseEntity<RoleEntity,int>
{
    [Description("角色名称")]
    public string? RoleName { get; set; }

    [Navigate(nameof(UserEntity.RoleId))]
    public List<UserEntity>? Users { get; set; }// 导航属性到用户列表

    [Navigate(ManyToMany =typeof(RoleMenuEntity))]
    public List<MenuEntity>? Menus { get; set; }
}

 

[Description("角色菜单关系表")]
//FreeSql复合主键配置:复合主键,唯一索引,不允许重复值
[Index("uk_role_menu", "RoleId,MenuId", true)]
public class RoleMenuEntity
{
    [Description("角色ID")]
    public int RoleId { get; set; }

    [Description("菜单ID")]
    public int MenuId { get; set; }

    [Navigate(nameof(RoleId))]
    public RoleEntity? Role { get; set; }

    [Navigate(nameof(MenuId))]
    public MenuEntity? Menu { get; set; }
}

 

[Description("用户实体")]    
// 用户-角色:一对多关系(一个用户属于一个角色)
public class UserEntity:BaseEntity<UserEntity,int>
{
    [Description("用户名称")]
    public string UserName { get; set; }
    [Description("密码")]
    public string Password { get; set; }
    [Description("昵称")]
    public  string NickName { get; set; }
    
    [Description("角色ID")]
    public int RoleId { get; set; }
    
    [Navigate(nameof(RoleId))]
    public RoleEntity? Role { get; set; }// 导航属性到角色
    
}

 

posted @ 2025-12-28 00:37  CCFWZ  阅读(32)  评论(0)    收藏  举报