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、生成迁移文件

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;

ABP-VNext 用户权限管理系统实战02---用户权限表的创建与迁移的更多相关文章
- SpringSecurity权限管理系统实战—八、AOP 记录用户、异常日志
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- SpringSecurity权限管理系统实战—一、项目简介和开发环境准备
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- SpringSecurity权限管理系统实战—二、日志、接口文档等实现
系列目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战 ...
- SpringSecurity权限管理系统实战—四、整合SpringSecurity(上)
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- SpringSecurity权限管理系统实战—六、SpringSecurity整合jwt
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- SpringSecurity权限管理系统实战—七、处理一些问题
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- SpringSecurity权限管理系统实战—九、数据权限的配置
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- ABP vNext微服务架构详细教程——分布式权限框架
1.简介 ABP vNext框架本身提供了一套权限框架,其功能非常丰富,具体可参考官方文档:https://docs.abp.io/en/abp/latest/Authorization 但是我们使用 ...
- 初识ABP vNext(4):vue用户登录&菜单权限
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 登录 菜单权限 运行测试 最后 前言 上一篇已经创建好了前后端项目,本篇开始编码部分. 开始 几乎所有的系统都绕不开登 ...
- SpringSecurity权限管理系统实战—五、整合SpringSecurity(下)
系列目录 前言 上篇文章SpringSecurity整合了一半,这次把另一半整完,所以本篇的序号接着上一篇. 七.自定义用户信息 前面我们登录都是用的指定的用户名和密码或者是springsecurit ...
随机推荐
- Solon2 的 Bean 生命周期
Solon 框架的 Bean 是被容器托管的,所以它的生命周期只限定在容器内部: 时机点 说明 补充 AopContext::new() 是在应用初始化时执行 ::new() AopContext:: ...
- 用 ChatGPT 写一篇《ChatGPT 会取代我们的工作吗》
自从 ChatGPT 火爆以后,最常谈到的话题就是 ChatGPT 会取代我们的工作吗?在写这篇内容时我有个大胆的想法,那就是让 ChatGPT 来取代我的工作. 首先,我决定直接让 ChatGPT ...
- 1、springboot工程新建(单模块)
系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...
- 深度学习(三)——Transforms的使用
一.Transforms的结构及用法 导入transforms from torchvision import transforms 作用:图片输入transforms后,可以得到一些预期的变换 1. ...
- Missing return type on function. eslint(@typescript-eslint/explicit-module-boundary-types))
setup报错: 解决办法:
- Can‘t resolve ‘core-js/modules/es.symbol‘ in
https://blog.csdn.net/guoqing2016/article/details/108639300?utm_medium=distribute.pc_relevant.none-t ...
- zzuli 1079
以EOF结束输入的处理 使用cin.hasNext(),现在还不懂就先记这了 import java.util.Scanner; public class Main{ public static vo ...
- C语言基础之理论概述
C语言介绍 C语言是一种高级程序设计语言,由贝尔实验室的Dennis Ritchie在1972年开发.C语言是结构化编程语言,支持变量.数据类型.运算符.表达式.流程控制语句和函数等基本程序设计元素. ...
- IDEA插件Material Theme UI 激活
介绍 "Material Theme UI" 是一款为 IntelliJ IDEA 提供现代化材料设计主题的插件,通过重新设计IDE的外观,为开发人员带来更加美观.富有活力的用户体 ...
- 05_二叉树的层次遍历II
二叉树的层序遍历 II 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 . (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 示例 1: 输入:root = [3,9,20 ...