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 ...
随机推荐
- 火山引擎DataLeap数据调度实例的 DAG 优化方案(三):技术实现
在原始数据中,是以一个数组的形式返回节点信息及依赖关系.所以,需要对数据进行处理形成图所需要的数据,同时,利用多个 map 对数据进行存储,方便后续对数据进行检索,减少时间复杂度. 实例节点的样式需要 ...
- PPT 年终总结PPT 应该怎么样改
- 抓包工具 Fiddler 抓取 exe 包
浏览器访问网页,可以使用 Fiddler 直接抓去,如果是 exe的客户端,可以借助 Proxifier 工具 设置完成后,添加代理规则,排除fiddler,也就是让fiddler进行网络直连.不然f ...
- MQTT 客户端 MQTT.fx 使用说明
下载 官网:https://softblade.de/en/download-2/ 说明:最后的免费版本是 MQTT.fx 1.7.1,官网已经没有免费的版本 下载 MQTT.fx 1.7.1 htt ...
- 谣言粉碎机?Python验证股市操盘口诀
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 经常炒股的朋友,应该都听说过这段操盘口诀: 早上大跌要买,早上大涨要卖 下午大涨不追,下午大跌次日买 早 ...
- Grafana--变量(label_values)
grafana官方文档:https://grafana.com/docs/grafana/latest/ 版本:6.5.2 模板与变量(摘抄自官方文档): 变量是值的占位符.您可以在度量查询和面板标题 ...
- 用 WebRTC 打造一个音乐教育 App,要解决哪些音质难题?
在去年疫情期间,在线教育行业获得了井喷式的发展,这背后的技术功臣非 RTC 莫属.本文将分享 RTC 技术在音乐教育场景下的实践经验. 作者| 逸城 审校| 泰一 音乐教育场景 - 在线陪练 2020 ...
- VA21 创建报价单
1.前台 报价是提供给客户交付货物或服务的一份文件,客户想要知道产品价格以及装运时间. 事务代码VA21 输入报价单类型和销售组织.分销渠道.产品组 输入售达方和行项目的物料信息,订购数量等信息 输入 ...
- C# 实用第三方库
C# 实用第三方库 Autofac 依赖注入IOC框架 NuGet安装:Autofac.Autofac.Extras.DynamicProxy AutoMapper 对象映射 Mapster 对象映射 ...
- Educational Codeforces Round 108 (Rated for Div. 2) (A思维,Bmath,C前缀和,D枚举)
1519A. Red and Blue Beans 问题简述 给定 \(r\) 个红豆,\(b\) 个蓝豆,差值 \(d\) ,要求我们进行为红蓝豆分组,使得红豆和蓝豆绝对值差值不大于 \(d\) , ...