需求:abp框架原有的abpusers表字段无法满足业务需求,需要新增字段来解决。

实现步骤如下

一.向abpusres表添加字段

1、在domain程序集下新建AppUser表

该类用来定义新增的字段,不需要继承任何父类,如下所示:

   public class AppUser{/// <summary>/// 会员Code/// </summary>[MaxLength(50)]public string MemberCode { get; set; }}

2.在EntityFrameworkCore程序集添加MyAppEfCoreEntityExtensionMappings类,

类名可以随意,但是按照惯例,一般以“项目名”+EfCoreEntityExtensionMappings命名。该类主要用来配置为IdentityUser新增字段,代码如下:

    public class DemoEfCoreEntityExtensionMappings{private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();public static void Configure(){OneTimeRunner.Run(() =>{ObjectExtensionManager.Instance.MapEfCoreProperty<IdentityUser, string>(nameof(AppUser.MemberCode), b => { b.HasMaxLength(50); });});}}

3.在DemoEntityFrameworkCore程序集下的DemoEntityFrameworkCoreModule模块中配置PreConfigureServices

    public override void PreConfigureServices(ServiceConfigurationContext context){DemoEfCoreEntityExtensionMappings.Configure();base.PreConfigureServices(context);}

4.在Admin.HttpApi.Host程序集配置AdminHttpApiHostMigrationsDbContextFactory类中的CreateDbContext

同上一步,在DbContextFactory中进行同样配置,一些情况下我们需要通过DbContextFactory来获取DbContext,如不配置此项,将会导致获取的DbContext中内容不一致。

   public DemoDbContext CreateDbContext(string[] args){var configuration = BuildConfiguration();var builder = new DbContextOptionsBuilder<DemoDbContext>().UseMySql(configuration.GetConnectionString("Default"), MySqlServerVersion.LatestSupportedServerVersion,option => { option.MigrationsAssembly("Demo.Admin.HttpApi.Host"); });//添加扩展配置DemoEfCoreEntityExtensionMappings.Configure();return new DemoDbContext(builder.Options);}

5.在Application.Contracts层配置用户表相关Dto的扩展字段

public static class DemoDtoExtensions
{private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();public static void Configure(){OneTimeRunner.Run(() =>{ObjectExtensionManager.Instance.AddOrUpdateProperty<string>(new[]{typeof(IdentityUserDto),typeof(IdentityUserCreateDto),typeof(IdentityUserUpdateDto),typeof(ProfileDto),typeof(UpdateProfileDto)},"MemberCode");});}
}

6、在模块类ApplicationContractsModule中进行配置

为了是上一步配置生效,还需要在MyAppApplicationContractsModule中进行如下配置:

   public override void PreConfigureServices(ServiceConfigurationContext context){DemoDtoExtensions.Configure();base.PreConfigureServices(context);}

7、通过EF Core将MemberCode字段添加到abpUsers表中

1)生成迁移脚本

add-migration   add_abpUusers_MemberCode

2)  将迁移脚本sql更新到数据库

update-database

二.向CurrentUser会话中Claim赋值

1.在Admin.HttpApi程序集下LoginController类中给toekn中Claim添加自定义字段

/// <summary>/// 在CurrentUser对象的Claims中添加扩展字段/// </summary>private List<Claim> SetUserClaims(IdentityUser userInfo){List<Claim> claims = new List<Claim>();if (userInfo.ExtraProperties.ContainsKey("MemberCode")){//添加会员Codeclaims.Add(new Claim(MemberCode,userInfo.ExtraProperties["MemberCode"].ToString()));}return claims;}//在abp框架生成的方法中添加private async Task<string> GetToken(IdentityUser user, string[] roles){var claims = await CreateJwtClaims(user, roles);//添加自定义claimList<Claim> customClaims = SetUserClaims(userInfo);if (!customClaims.IsNullOrEmpty()){claims.AddRange(customClaims);}//...}

2.在程序集中使用

 //获取abpuser表中扩展字段MemberCode值var storeCode = CurrentUser.FindClaimValue("MemberCode");

三、前端账号管理添加扩展字段

1.账号管理列表

//修改vben-admin\src\views\identity\user\datas\TableData.ts列表参数配置
{title: '会员Code',dataIndex: 'extraProperties.MemberCode',align: 'left',width: 270,sorter: true,slots: { customRender: 'MemberCode' },  //通过自定义插槽在列表中显示},
//(修改vben-admin\src\views\identity\user\components\UserTable.vue列表参数配置)
<BasicTable @register="registerTable"><template #MemberCode="{ record }">{{ record.extraProperties.MemberCode}}</template></BasicTable>

2.修改列表添加扩展字段

//修改vben-admin\src\views\identity\user\datas\ModalData.ts配置{tab: t('AbpIdentity.UserInformations'),field: 'memberCode',component: 'Input',label: '会员Code',colProps: { span: 24 },},
//在弹框打开事件里,通过useForm回调函数setFieldsValue设置会员code值const [registerModal, { closeModal }] = useModalInner(async (val) => {const formEl = unref(formElRef);formEl?.setFieldsValue({memberCode: val.extraProperties.MemberCode,});});//保存时需要将会员Code值按后台api接口存在handleSubmit() {const formEl = unref(this.formElRef);const param = formEl?.getFieldsValue();if (param) {param.extraProperties = { MemberCode: param.MemberCode};}formEl?.validate().then(() => {this.handleSaveUser(param).then(() => {this.$emit('change');this.closeModal();});});},

注:表单组件对JSON数据格式读取只能读取一层,像val.extraProperties.MemberCode是读取不到的,需要转换一下。

保存的时候格式又要转回去,必须和接口数据保持一致才行

abp vnext 通过Claim扩展用户表字段相关推荐

  1. Django解决扩展用户表时,后台Admin显示密码为明文的问题

    小生博客:http://xsboke.blog.51cto.com -------谢谢您的参考,如有疑问,欢迎交流 Django解决当扩展用户表时,用户继承AbstractUser后,后台Admin会 ...

  2. ABP vNext 的实体与服务扩展技巧分享

    使用 ABP vNext 有一个月左右啦,这中间最大的一个收获是:ABP vNext 的开发效率真的是非常好,只要你愿意取遵循它模块化.DDD 的设计思想.因为官方默认实现了身份.审计.权限.定时任务 ...

  3. QPW 系统管理后台用户表(tm_user_info)

    文章目录 系统管理后台用户表 字段说明 系统管理后台用户表 CREATE TABLE `tm_user_info` (`user_id` int(11) NOT NULL AUTO_INCREMENT ...

  4. Abp VNext 集成sharding-core 分表分库

    ShardingCore 易用.简单.高性能.普适性,是一款扩展针对efcore生态下的分表分库的扩展解决方案,支持efcore2+的所有版本,支持efcore2+的所有数据库.支持自定义路由.动态路 ...

  5. 初识ABP vNext(5):ABP扩展实体

    点击上方蓝字"小黑在哪里"关注我吧 扩展实体 路由整理 前言 上一篇实现了前端vue部分的用户登录和菜单权限控制,但是有一些问题需要解决,比如用户头像.用户介绍字段目前还没有,下面 ...

  6. abp Vnext OpenIddect 扩展微信小程序授权登录

    abp vnext6.0之后官方替换了原来的ids4,采用了openIddict的oauth认证框架.使用之前的方法已经不行,以下是OpenIddect 使用ITokenExtensionGrant接 ...

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

    点击上方蓝字"小黑在哪里"关注我吧 登录 菜单权限 运行测试 前言 上一篇已经创建好了前后端项目,本篇开始编码部分. 开始 几乎所有的系统都绕不开登录功能,那么就从登录开始,完成用 ...

  8. mybatis 动态字段与表中不一样_mybatis创建一个或多个新用户 insert 字段和表名不确定时动态添加问题...

    创建用户: /** * 创建一个或多个新用户 insert 字段和表名不确定时动态添加 */ @Test public void createAccount() { String lineColumn ...

  9. mysql字段作用_mysql用户表host字段作用

    mysql用户表中host字段介绍,如果host设置不正确,可能导致无法连接mysql数据库. user_name@host_name,其中host_name是主机IP地址或主机名. 1)为了能够在本 ...

最新文章

  1. ajax技术如何实现,ajax技术的基本原来以及实现过程
  2. Python基本语法_基本数据类型_序列类型详解
  3. LNMP环境搭建(centos6.9+mysql5.7+php7.1+nginx1.10)
  4. spring中的ReflectionUtil
  5. java8 lambda 接口_Java8新特性之一:Lambda表达式
  6. sql注入问题-视图-事物-以及存储过程(可视化工具)
  7. 如何处理SAP OData错误消息: Invalid parametertype used at function XXXX
  8. vcenter 6.7 (vcsa)部署指南
  9. 编程语言对比 基本数据类型
  10. win11的drivers文件可以删除吗 windows11drivers文件是否可以删除的详细介绍
  11. 使用python命令行参数sys.argv 做bat脚本
  12. TabBars代码解读之——Visual Studio的自动化接口
  13. 视差图Disparity与深度图Depth Map的一点知识
  14. php 制作通讯录,PHP 制作通讯录(五)
  15. 数电——全减器分析(用74HC138设计提示)
  16. 氪金玩家逸仙电商的高端困境
  17. 有些歌,放在这慢慢听
  18. Swift All-In-One安装指南
  19. NP完全问题的归约-碰撞集(HITTING SET)
  20. CAD .NET 14.1.X DWG/ DXF, PLT 自由转换- CNC

热门文章

  1. 上汽荣威E50 颇有想法的纯电动产品
  2. RK 7.1 导航栏添加隐藏虚拟按键的开关 并向上滑动显示虚拟按键
  3. 识别IOS和android方法
  4. ,英式发音和美式发音有什么区别
  5. h5策划书_DIYH5|3.12世界睡眠日H5策划方案
  6. 计算机读不到u盘如何修复u盘,u盘读不出来怎么办?各种U盘无法显示无法读取修复方案...
  7. 这几个宝藏网站,一旦知道,你就离不开了!!!
  8. 梦幻模拟战 服务器维护,《梦幻模拟战》问题修复公告暨致歉信
  9. Qt编写自定义控件:带阴影、圆角、可拉伸的弹窗
  10. 动态html函数的写法,如何将html div id的动态传递给js函数