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 接口开发: 熟悉 Gateway
Gateway 是 Solon 框架的特殊控制器(也是Handler 的一个实现类).它通过注册收集之后,在局部范围内提供:二级路由.拦截.过滤.融断.异常处理等功能,并统一到网关处理. 另一个作用: ...
- Solon2 开发之IoC,九、自定义注解开发汇总
1.定义构建能力注解,比如@Controller 注解类: @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Docum ...
- Kubernetes(K8S) 介绍
Master Api Server 统一入口,以 Restful 方式,交给 etcd 存储 Scheduler 节点调试,选择 Node 节点,做应用部署 Controller Manager 处理 ...
- JDk 与 ADB 环境变量配置
### Java环境变量配置 首先,JDK是整个Java的核心,包括了Java运行环境,一推Java工具和Java基础的类库. 网址:https://www.oracle.com/technetwor ...
- 解读IDC《中国视频云市场跟踪》最新报告,视频云将趋向何方?
国际权威咨询公司IDC发布<中国视频云市场跟踪(2021 H2)>报告,阿里云连续四年稳居中国视频云整体市场份额第一,整体市场份额占比达26.9%. 时至2021,中国视频云的数字背后 近 ...
- 聊聊与前端工程师天然互补的 Serverless
作者:灵轮_(阿里云前端技术专家)_ 作为前端工程师,我们的使命是为用户提供良好的前端用户体验.随着云原生时代的到来,显而易见的,我们能做的更多了.Serverless 产品的特点是免运维.按量付费和 ...
- uni-app实现扫码签到
1 uni.scanCode({ 2 success: res => { 3 this.$http({ 4 url: '/checkin/scanSign', 5 data: { 6 codeI ...
- P1725-DP【绿】
这道题最开始我用记搜写的,然后WA了一些点,后来看了半天才发现是数组开小了,原来他给了两个数据范围,一个是60%数据的数据范围,另一个是100%数据的数据范围.我没仔细看,没看见后面那行,把60%数据 ...
- python之HtmlTestRunner(一)生成测试报告
一.下载安装 windows10,cmd环境通过如下命令
- go 接口学习笔记
这里是对接口在汇编层面上转换和实现的小结,详细了解可参考 Go 语言接口的原理 1. 类型转换:结构体到接口 1.1 结构体方法实现接口 package main type Duck interfac ...