ABP-VNext 用戶權限管理系統實戰02---用戶權限表的創建與遷移

一、表實體建立

1、菜單表

 [Comment("菜單表")]
 [Table("t_identity_menu")]
 public class Menu : AuditedAggregateRoot<Guid>, ISoftDelete, IMultiTenant
 {
     [MaxLength(200)]
     [Comment("菜單名")]
     public string Name { get; set; }
 
     [MaxLength(50)]
     [Comment("菜單編碼")]
     public int Code { get; set; }
    
     [MaxLength(36)]
     [Comment("父級菜單標識")]
     public Guid ParentId { get; set; }

     [Comment("層級")]
     public int Level { get; set; }

     [MaxLength(200)]
     [Comment("圖標路徑")]
     public string IconUrl { get; set; }

     [MaxLength(200)]
     [Comment("跳轉路徑")]
     public string RedirectUrl { get; set; }

     [Comment("菜單類型 0 APP 1 web")]
     public int MenuType { get; set; }


     [Comment("地址類型")]
     public int MenuInOut { get; set; }

  
     [Comment("排序")]
     public int Sort { get; set; }
   
     [Comment("是否啓用")]
     public bool IsActive { get; set; }

     [Comment("是否刪除")]
     public bool IsDeleted { get; set; }
  
     [Comment("租戶Id")]
     public Guid? TenantId { set; get; }

    
     [Comment("用戶歸屬系統Id")]
     [MaxLength(20)]
     public string SystemId { get; set; }
 
     [Comment("備註")]
     [MaxLength(500)]
     public string Remark { get; set; }
 }

2、角色權限中間表

  [Comment("角色權限中間表")]
  [Table("t_identity_role_authority")]
  public class RoleAuthority : AuditedAggregateRoot<Guid>, ISoftDelete, IMultiTenant
  {/// <summary>
   /// 角色id
   /// </summary>
      [MaxLength(36)]
      [Comment("角色標識")]
      public Guid RoleId { get; set; }

      /// <summary>
      /// 權限id
      /// </summary>
      [MaxLength(36)]
      [Comment("權限標識")]
      public Guid AuthId { get; set; }
     
      [Comment("是否刪除")]
      public bool IsDeleted { get; set; }
      /// <summary>
      /// 租戶Id
      /// </summary>
      public Guid? TenantId { get; set; }

      /// <summary>
      /// 構造函數
      /// </summary>
      /// <param name="id"></param>
      /// <param name="tenantId"></param>
      /// <param name="roleId"></param>
      /// <param name="authId"></param>
      public RoleAuthority(Guid id, Guid? tenantId, Guid roleId, Guid authId)
      {
          TenantId = tenantId;
          Id = id;
          RoleId = roleId;
          AuthId = authId;
      }
  }

3、角色擴展表

[Comment("角色擴展表")]
[Table("t_identity_role_expand")]
public class RoleExpand : AuditedAggregateRoot<Guid>
{

    public RoleExpand(Guid Id, int RoleType, Guid RoleId, int RoleStatus)
    {
        this.Id = Id;
        this.RoleId = RoleId;
        this.RoleType = RoleType;
        this.RoleStatus = RoleStatus;
    }

    [MaxLength(36)]
    [Comment("角色標識")]
    public Guid RoleId { get; set; }
   
    [Comment("角色類型")]
    public int RoleType { get; set; }
 
    [MaxLength(36)]
    [Comment("用戶狀態:0啓用、1禁用")]
    public int RoleStatus { get; set; }
  
    [MaxLength(20)]
    [Comment("歸屬系統Id")]
    public string SystemId { get; set; }
}

4、角色菜單中間表

[Comment("角色菜單中間表")]
[Table("t_identity_role_menu")]
public class RoleMenu : AuditedAggregateRoot<Guid>, ISoftDelete
{
   
    [MaxLength(36)]
    [Comment("角色標識")]
    public Guid RoleId { get; set; }

   
    [MaxLength(36)]
    [Comment("菜單標識")]
    public Guid MenuId { get; set; }
    

    [Comment("是否刪除")]
    public bool IsDeleted { get; set; }
}

5、用戶擴展表

 [Comment("用戶擴展表")]
 [Table("t_identity_user_expand")]
 public  class UserExpand : AuditedAggregateRoot<Guid>
 {
     public UserExpand(Guid Id, int UserType, Guid UserId, UserStatusEnum userStatus = UserStatusEnum.Enable, int isConfirm = 0)
     {
         this.Id = Id;
         this.UserId = UserId;
         this.UserType = UserType;
         this.UserStatus = userStatus;
         this.IsConfirm = isConfirm;
     }
  
     [MaxLength(36)]
     [Comment("用戶標識")]
     public Guid UserId { get; set; }
    

     [Comment("用戶類型")]
     public int UserType { get; set; }


     [Comment("用戶狀態")]
     public UserStatusEnum UserStatus { get; set; }

  

     [Comment("是否已確認結果,0未確認,1已確認")]
     public int IsConfirm { get; set; }

  
     [MaxLength(200)]
     [Comment("用戶圖像")]
     public string HeadFileUrl { get; set; }

  
     [MaxLength(20)]
     [Comment("歸屬系統Id")]
     public string SystemId { get; set; }
     [Comment("鎖定狀態")]
     public bool? IsLock { get; set; }
 
     [Comment("登錄失敗次數")]
     public int? LoginFailedCount { get; set; }

     [Comment("鎖定時間")]
     public DateTime? LockTime { get; set; }


     [Comment("鎖定人")]
     public Guid? LockUserId { get; set; }

    
     [Comment("解鎖時間")]
     public DateTime? UnLockTime { get; set; }

  
     [Comment("解鎖人")]
     public Guid? UnLockUserId { get; set; }
 }

 

二、配置實體到EFCORE

1、IdentityManagementDbContext中增加實體集

 2、IdentityManagementDbContextModelCreatingExtensions中增加實體和表的映射

 

三、建立公共的數據遷移項目

1、新建一個web項目

項目中引用對應的程序集:Volo.Abp.EntityFrameworkCore.MySQL、Microsoft.EntityFrameworkCore,引入對應要遷移的項目:Bridge.IdentityManagement.EntityFrameworkCore

注意版本號要統一。

2、新增EFCoreDbContextFactory類和EFCoreMigrationDbContext類

EFCoreDbContextFactory類,在類中配置了數據庫類型,要用的配置文件

 public class EFCoreDbContextFactory : IDesignTimeDbContextFactory<EFCoreMigrationDbContext>
 {

     public EFCoreMigrationDbContext CreateDbContext(string[] args)
     {

         var configuration = BuildConfiguration();

         var builder = new DbContextOptionsBuilder<EFCoreMigrationDbContext>()
             .UseMySql(configuration.GetConnectionString("Default"),
             ServerVersion.AutoDetect(configuration.GetConnectionString("Default")), o => o.SchemaBehavior(MySqlSchemaBehavior.Ignore));

         return new EFCoreMigrationDbContext(builder.Options);
     }

     private static IConfigurationRoot BuildConfiguration()
     {
         var builder = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
             .AddJsonFile("appsettings.json", optional: false);

         return builder.Build();
     }
 }

EFCoreMigrationDbContext類中加和了要遷移的實體,要實體和表的映射擴展方法

public class EFCoreMigrationDbContext : AbpDbContext<EFCoreMigrationDbContext>
{
    public EFCoreMigrationDbContext(
        DbContextOptions<EFCoreMigrationDbContext> options
        ) : base(options)
    {

    }
    #region 用戶權限管理模塊
    public DbSet<Menu> Menus { get; set; }
    public DbSet<RoleAuthority> RoleAuthoritys { get; set; }
    public DbSet<Authority> Authoritys { get; set; }
    public DbSet<RoleMenu> RoleMenus { get; set; }
    public DbSet<UserExpand> UserExpands { get; set; }
    #endregion


    protected override void OnModelCreating(ModelBuilder builder)
    {


        builder.ConfigureIdentityManagement();
        base.OnModelCreating(builder);

    }
}

3、修改配置文件,增加數據庫連接

"ConnectionStrings": {
  "Default": "Server=123.249.14.34;Port=3306; Database=bridge; User=root; Password=xxxx;"
},

 

四、遷移數據表

1、生成遷移文件

Add-Migration -Context EFCoreMigrationDbContext -Name bridge_identity_20231022 -OutputDir Migrations/EFCoreMigrationDb

 

 
2、遷移數據庫
方法一:生成sql腳本
如果你不想直接遷移到數據庫,只生成sql腳本請用如下的命令
Script-Migration -Context EFCoreMigrationDbContext
 
如果想遷移指定文件的內容請用如下的命令,增加了from 和 to參數
Script-Migration -From 20231023025116_bridge_identity_20231022 -To 20231023025116_bridge_identity_20231022 -Context EFCoreMigrationDbContext
生成的sql腳本如下,可直接在數據庫中執行:
CREATE TABLE IF NOT EXISTS `__EFMigrationsHistory` (
    `MigrationId` varchar(150) CHARACTER SET utf8mb4 NOT NULL,
    `ProductVersion` varchar(32) CHARACTER SET utf8mb4 NOT NULL,
    CONSTRAINT `PK___EFMigrationsHistory` PRIMARY KEY (`MigrationId`)
) CHARACTER SET=utf8mb4;

START TRANSACTION;

ALTER DATABASE CHARACTER SET utf8mb4;

CREATE TABLE `Authoritys` (
    `Id` char(36) COLLATE ascii_general_ci NOT NULL,
    `PageCode` varchar(64) CHARACTER SET utf8mb4 NULL,
    `PageName` varchar(64) CHARACTER SET utf8mb4 NULL,
    `MenuId` char(36) COLLATE ascii_general_ci NULL,
    `Operate` varchar(64) CHARACTER SET utf8mb4 NULL,
    `OperateName` varchar(64) CHARACTER SET utf8mb4 NULL,
    `IsDeleted` tinyint(1) NOT NULL DEFAULT FALSE,
    `TenantId` char(36) COLLATE ascii_general_ci NULL,
    `ExtraProperties` longtext CHARACTER SET utf8mb4 NULL,
    `ConcurrencyStamp` varchar(40) CHARACTER SET utf8mb4 NULL,
    `CreationTime` datetime(6) NOT NULL,
    `CreatorId` char(36) COLLATE ascii_general_ci NULL,
    `LastModificationTime` datetime(6) NULL,
    `LastModifierId` char(36) COLLATE ascii_general_ci NULL,
    CONSTRAINT `PK_Authoritys` PRIMARY KEY (`Id`)
) CHARACTER SET=utf8mb4;

CREATE TABLE `t_identity_menu` (
    `Id` char(36) COLLATE ascii_general_ci NOT NULL,
    `Name` varchar(200) CHARACTER SET utf8mb4 NULL COMMENT '菜單名',
    `Code` int NOT NULL COMMENT '菜單編碼',
    `ParentId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '父級菜單標識',
    `Level` int NOT NULL COMMENT '層級',
    `IconUrl` varchar(200) CHARACTER SET utf8mb4 NULL COMMENT '圖標路徑',
    `RedirectUrl` varchar(200) CHARACTER SET utf8mb4 NULL COMMENT '跳轉路徑',
    `MenuType` int NOT NULL COMMENT '菜單類型 0 APP 1 web',
    `MenuInOut` int NOT NULL COMMENT '地址類型',
    `Sort` int NOT NULL COMMENT '排序',
    `IsActive` tinyint(1) NOT NULL COMMENT '是否啓用',
    `IsDeleted` tinyint(1) NOT NULL DEFAULT FALSE COMMENT '是否刪除',
    `TenantId` char(36) COLLATE ascii_general_ci NULL COMMENT '租戶Id',
    `SystemId` varchar(20) CHARACTER SET utf8mb4 NULL COMMENT '用戶歸屬系統Id',
    `Remark` varchar(500) CHARACTER SET utf8mb4 NULL COMMENT '備註',
    `ExtraProperties` longtext CHARACTER SET utf8mb4 NULL,
    `ConcurrencyStamp` varchar(40) CHARACTER SET utf8mb4 NULL,
    `CreationTime` datetime(6) NOT NULL,
    `CreatorId` char(36) COLLATE ascii_general_ci NULL,
    `LastModificationTime` datetime(6) NULL,
    `LastModifierId` char(36) COLLATE ascii_general_ci NULL,
    CONSTRAINT `PK_t_identity_menu` PRIMARY KEY (`Id`)
) CHARACTER SET=utf8mb4 COMMENT='菜單表';

CREATE TABLE `t_identity_role_authority` (
    `Id` char(36) COLLATE ascii_general_ci NOT NULL,
    `RoleId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '角色標識',
    `AuthId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '權限標識',
    `IsDeleted` tinyint(1) NOT NULL DEFAULT FALSE COMMENT '是否刪除',
    `TenantId` char(36) COLLATE ascii_general_ci NULL,
    `ExtraProperties` longtext CHARACTER SET utf8mb4 NULL,
    `ConcurrencyStamp` varchar(40) CHARACTER SET utf8mb4 NULL,
    `CreationTime` datetime(6) NOT NULL,
    `CreatorId` char(36) COLLATE ascii_general_ci NULL,
    `LastModificationTime` datetime(6) NULL,
    `LastModifierId` char(36) COLLATE ascii_general_ci NULL,
    CONSTRAINT `PK_t_identity_role_authority` PRIMARY KEY (`Id`)
) CHARACTER SET=utf8mb4 COMMENT='角色權限中間表';

CREATE TABLE `t_identity_role_expand` (
    `Id` char(36) COLLATE ascii_general_ci NOT NULL,
    `RoleId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '角色標識',
    `RoleType` int NOT NULL COMMENT '角色類型',
    `RoleStatus` int NOT NULL COMMENT '用戶狀態:0啓用、1禁用',
    `SystemId` varchar(20) CHARACTER SET utf8mb4 NULL COMMENT '歸屬系統Id',
    `ExtraProperties` longtext CHARACTER SET utf8mb4 NULL,
    `ConcurrencyStamp` varchar(40) CHARACTER SET utf8mb4 NULL,
    `CreationTime` datetime(6) NOT NULL,
    `CreatorId` char(36) COLLATE ascii_general_ci NULL,
    `LastModificationTime` datetime(6) NULL,
    `LastModifierId` char(36) COLLATE ascii_general_ci NULL,
    CONSTRAINT `PK_t_identity_role_expand` PRIMARY KEY (`Id`)
) CHARACTER SET=utf8mb4 COMMENT='角色擴展表';

CREATE TABLE `t_identity_role_menu` (
    `Id` char(36) COLLATE ascii_general_ci NOT NULL,
    `RoleId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '角色標識',
    `MenuId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '菜單標識',
    `IsDeleted` tinyint(1) NOT NULL DEFAULT FALSE COMMENT '是否刪除',
    `ExtraProperties` longtext CHARACTER SET utf8mb4 NULL,
    `ConcurrencyStamp` varchar(40) CHARACTER SET utf8mb4 NULL,
    `CreationTime` datetime(6) NOT NULL,
    `CreatorId` char(36) COLLATE ascii_general_ci NULL,
    `LastModificationTime` datetime(6) NULL,
    `LastModifierId` char(36) COLLATE ascii_general_ci NULL,
    CONSTRAINT `PK_t_identity_role_menu` PRIMARY KEY (`Id`)
) CHARACTER SET=utf8mb4 COMMENT='角色菜單中間表';

CREATE TABLE `t_identity_user_expand` (
    `Id` char(36) COLLATE ascii_general_ci NOT NULL,
    `UserId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '用戶標識',
    `UserType` int NOT NULL COMMENT '用戶類型',
    `UserStatus` int NOT NULL COMMENT '用戶狀態',
    `IsConfirm` int NOT NULL COMMENT '是否已確認結果,0未確認,1已確認',
    `HeadFileUrl` varchar(200) CHARACTER SET utf8mb4 NULL COMMENT '用戶圖像',
    `SystemId` varchar(20) CHARACTER SET utf8mb4 NULL COMMENT '歸屬系統Id',
    `IsLock` tinyint(1) NULL COMMENT '鎖定狀態',
    `LoginFailedCount` int NULL COMMENT '登錄失敗次數',
    `LockTime` datetime(6) NULL COMMENT '鎖定時間',
    `LockUserId` char(36) COLLATE ascii_general_ci NULL COMMENT '鎖定人',
    `UnLockTime` datetime(6) NULL COMMENT '解鎖時間',
    `UnLockUserId` char(36) COLLATE ascii_general_ci NULL COMMENT '解鎖人',
    `ExtraProperties` longtext CHARACTER SET utf8mb4 NULL,
    `ConcurrencyStamp` varchar(40) CHARACTER SET utf8mb4 NULL,
    `CreationTime` datetime(6) NOT NULL,
    `CreatorId` char(36) COLLATE ascii_general_ci NULL,
    `LastModificationTime` datetime(6) NULL,
    `LastModifierId` char(36) COLLATE ascii_general_ci NULL,
    CONSTRAINT `PK_t_identity_user_expand` PRIMARY KEY (`Id`)
) CHARACTER SET=utf8mb4 COMMENT='用戶擴展表';

INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`)
VALUES ('20231023025116_bridge_identity_20231022', '7.0.1');

COMMIT;

 

方法二:直接遷移
Update-DataBase 20231023025116_bridge_identity_20231022
完成後查看數據庫表:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章