一、表实体建立

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
完成后查看数据库表:

 

ABP-VNext 用户权限管理系统实战02---用户权限表的创建与迁移的更多相关文章

  1. SpringSecurity权限管理系统实战—八、AOP 记录用户、异常日志

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  2. SpringSecurity权限管理系统实战—一、项目简介和开发环境准备

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  3. SpringSecurity权限管理系统实战—二、日志、接口文档等实现

    系列目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战 ...

  4. SpringSecurity权限管理系统实战—四、整合SpringSecurity(上)

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  5. SpringSecurity权限管理系统实战—六、SpringSecurity整合jwt

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  6. SpringSecurity权限管理系统实战—七、处理一些问题

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  7. SpringSecurity权限管理系统实战—九、数据权限的配置

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  8. ABP vNext微服务架构详细教程——分布式权限框架

    1.简介 ABP vNext框架本身提供了一套权限框架,其功能非常丰富,具体可参考官方文档:https://docs.abp.io/en/abp/latest/Authorization 但是我们使用 ...

  9. 初识ABP vNext(4):vue用户登录&菜单权限

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 登录 菜单权限 运行测试 最后 前言 上一篇已经创建好了前后端项目,本篇开始编码部分. 开始 几乎所有的系统都绕不开登 ...

  10. SpringSecurity权限管理系统实战—五、整合SpringSecurity(下)

    系列目录 前言 上篇文章SpringSecurity整合了一半,这次把另一半整完,所以本篇的序号接着上一篇. 七.自定义用户信息 前面我们登录都是用的指定的用户名和密码或者是springsecurit ...

随机推荐

  1. Solon2 的 Bean 生命周期

    Solon 框架的 Bean 是被容器托管的,所以它的生命周期只限定在容器内部: 时机点 说明 补充 AopContext::new() 是在应用初始化时执行 ::new() AopContext:: ...

  2. 用 ChatGPT 写一篇《ChatGPT 会取代我们的工作吗》

    自从 ChatGPT 火爆以后,最常谈到的话题就是 ChatGPT 会取代我们的工作吗?在写这篇内容时我有个大胆的想法,那就是让 ChatGPT 来取代我的工作. 首先,我决定直接让 ChatGPT ...

  3. 1、springboot工程新建(单模块)

    系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...

  4. 深度学习(三)——Transforms的使用

    一.Transforms的结构及用法 导入transforms from torchvision import transforms 作用:图片输入transforms后,可以得到一些预期的变换 1. ...

  5. Missing return type on function. eslint(@typescript-eslint/explicit-module-boundary-types))

    setup报错: 解决办法:

  6. Can‘t resolve ‘core-js/modules/es.symbol‘ in

    https://blog.csdn.net/guoqing2016/article/details/108639300?utm_medium=distribute.pc_relevant.none-t ...

  7. zzuli 1079

    以EOF结束输入的处理 使用cin.hasNext(),现在还不懂就先记这了 import java.util.Scanner; public class Main{ public static vo ...

  8. C语言基础之理论概述

    C语言介绍 C语言是一种高级程序设计语言,由贝尔实验室的Dennis Ritchie在1972年开发.C语言是结构化编程语言,支持变量.数据类型.运算符.表达式.流程控制语句和函数等基本程序设计元素. ...

  9. IDEA插件Material Theme UI 激活

    介绍 "Material Theme UI" 是一款为 IntelliJ IDEA 提供现代化材料设计主题的插件,通过重新设计IDE的外观,为开发人员带来更加美观.富有活力的用户体 ...

  10. 05_二叉树的层次遍历II

    二叉树的层序遍历 II 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 . (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 示例 1: 输入:root = [3,9,20 ...