点击上方蓝字"小黑在哪里"关注我吧

  • 扩展实体

  • 路由整理

前言

上一篇实现了前端vue部分的用户登录和菜单权限控制,但是有一些问题需要解决,比如用户头像、用户介绍字段目前还没有,下面就来完善一下。

开始

因为用户实体是ABP模板自动生成的,其中的属性都预先定义好了,但是ABP是允许我们扩展模块实体的,我们可以通过扩展用户实体来增加用户头像和用户介绍字段。

扩展实体

ABP支持多种扩展实体的方式:

  1. 将所有扩展属性以json格式存储在同一个数据库字段中

  2. 将每个扩展属性存储在独立的数据库字段中

  3. 创建一个新的实体类映射到原有实体的同一个数据库表中

  4. 创建一个新的实体类映射到独立的数据库表中

这里选择第2种方式就好,它们的具体区别请见官网:扩展实体[1]

src\Xhznl.HelloAbp.Domain\Users\AppUser.cs:

/// <summary>
/// 头像
/// </summary>
public string Avatar { get; set; }/// <summary>
/// 个人介绍
/// </summary>
public string Introduction { get; set; }

src\Xhznl.HelloAbp.EntityFrameworkCore\EntityFrameworkCore\HelloAbpDbContext.cs:

builder.Entity<AppUser>(b =>
{。。。。。。b.Property(x => x.Avatar).IsRequired(false).HasMaxLength(AppUserConsts.MaxAvatarLength).HasColumnName(nameof(AppUser.Avatar));b.Property(x => x.Introduction).IsRequired(false).HasMaxLength(AppUserConsts.MaxIntroductionLength).HasColumnName(nameof(AppUser.Introduction));
});

src\Xhznl.HelloAbp.EntityFrameworkCore\EntityFrameworkCore\HelloAbpEfCoreEntityExtensionMappings.cs:

OneTimeRunner.Run(() =>
{ObjectExtensionManager.Instance.MapEfCoreProperty<IdentityUser, string>(nameof(AppUser.Avatar),b => { b.HasMaxLength(AppUserConsts.MaxAvatarLength); }).MapEfCoreProperty<IdentityUser, string>(nameof(AppUser.Introduction),b => { b.HasMaxLength(AppUserConsts.MaxIntroductionLength); });
});

src\Xhznl.HelloAbp.Application.Contracts\HelloAbpDtoExtensions.cs:

OneTimeRunner.Run(() =>
{ObjectExtensionManager.Instance.AddOrUpdateProperty<string>(new[]{typeof(IdentityUserDto),typeof(IdentityUserCreateDto),typeof(IdentityUserUpdateDto),typeof(ProfileDto),typeof(UpdateProfileDto)},"Avatar").AddOrUpdateProperty<string>(new[]{typeof(IdentityUserDto),typeof(IdentityUserCreateDto),typeof(IdentityUserUpdateDto),typeof(ProfileDto),typeof(UpdateProfileDto)},"Introduction");
});

注意最后一步,Dto也需要添加扩展属性,不然就算你实体中已经有了新字段,但接口依然获取不到。

然后就是添加迁移更新数据库了:

Add-Migration Added_AppUser_Properties

Update-Database  也可以不用update,运行DbMigrator项目来更新

查看数据库,AppUsers表已经生成这2个字段了:

目前还没做设置界面,我先手动给2个初始值:

再次请求/api/identity/my-profile接口,已经返回了这2个扩展字段:

修改一下前端部分:

src\store\modules\user.js:

// get user info
getInfo({ commit }) {return new Promise((resolve, reject) => {getInfo().then(response => {const data = response;if (!data) {reject("Verification failed, please Login again.");}const { name, extraProperties } = data;commit("SET_NAME", name);commit("SET_AVATAR", extraProperties.Avatar);commit("SET_INTRODUCTION", extraProperties.Introduction);resolve(data);}).catch(error => {reject(error);});});
},

刷新界面,右上角的用户头像就回来了:

路由整理

删除掉vue-element-admin多余的路由,并添加ABP模板自带的身份认证管理和租户管理。

src\router\index.js:

/* Router Modules */
import identityRouter from "./modules/identity";
import tenantRouter from "./modules/tenant";export const asyncRoutes = [/** when your routing map is too long, you can split it into small modules **/identityRouter,tenantRouter,// 404 page must be placed at the end !!!{ path: "*", redirect: "/404", hidden: true }
];

src\router\modules\identity.js:

/** When your routing table is too long, you can split it into small modules **/import Layout from "@/layout";const identityRouter = {path: "/identity",component: Layout,redirect: "noRedirect",name: "Identity",meta: {title: "identity",icon: "user"},children: [{path: "roles",component: () => import("@/views/identity/roles"),name: "Roles",meta: { title: "roles", policy: "AbpIdentity.Roles" }},{path: "users",component: () => import("@/views/identity/users"),name: "Users",meta: { title: "users", policy: "AbpIdentity.Users" }}]
};
export default identityRouter;

src\router\modules\tenant.js:

/** When your routing table is too long, you can split it into small modules **/import Layout from "@/layout";const tenantRouter = {path: "/tenant",component: Layout,redirect: "/tenant/tenants",alwaysShow: true,name: "Tenant",meta: {title: "tenant",icon: "tree"},children: [{path: "tenants",component: () => import("@/views/tenant/tenants"),name: "Tenants",meta: { title: "tenants", policy: "AbpTenantManagement.Tenants" }}]
};
export default tenantRouter;

运行效果:

对应ABP模板界面:

最后

本篇介绍了ABP扩展实体的基本使用,并且整理了前端部分的系统菜单,但是菜单的文字显示不对。下一篇将介绍ABP本地化,让系统文字支持多国语言。

参考资料

[1]

扩展实体: https://docs.abp.io/zh-Hans/abp/latest/Customizing-Application-Modules-Extending-Entities

如果本文对您有用,

不妨点个“”或者转发朋友圈支持一下

初识ABP vNext(5):ABP扩展实体相关推荐

  1. abp vnext 通过Claim扩展用户表字段

    需求:abp框架原有的abpusers表字段无法满足业务需求,需要新增字段来解决. 实现步骤如下 一.向abpusres表添加字段 1.在domain程序集下新建AppUser表 该类用来定义新增的字 ...

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

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

  3. 初识ABP vNext(2):ABP启动模板

    点击上方蓝字"小黑在哪里"关注我吧 AbpHelper 模块安装 前言 上一篇介绍了ABP的一些基础知识,本篇继续介绍ABP的启动模板.使用ABP CLI命令就可以得到这个启动模板 ...

  4. [Abp vNext 源码分析] - 1. 框架启动流程分析

    一.简要说明 本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程,让大家了解整个 Abp vNext 框架是如何运作的.总的来说 ,Abp vNext 比起 ABP 框架 ...

  5. ABP VNext系列(二)-详解ABP的依赖注入

    ABP VNext系列(二)-详解ABP的依赖注入 上一篇 : ABP VNext系列(一)-第一个ABP VNext 目录 ABP VNext系列(二)-详解ABP的依赖注入 一.什么是依赖注入 1 ...

  6. ABP VNext系列(一)-第一个ABP VNext

    ABP VNext系列(一)-第一个ABP VNext 下一篇 : ABP VNext系列(二)-详解ABP的依赖注入 目录 ABP VNext系列(一)-第一个ABP VNext 一. ABP VN ...

  7. 我和ABP vNext 的故事

    Abp VNext是Abp的.NET Core 版本,但它不仅仅只是代码重写了.Abp团队在过去多年社区和商业版本的反馈上做了很多的改进.包括性能.底层的框架设计,它融合了更多优雅的设计实践.不管你是 ...

  8. Abp vNext 切换MySql数据库

    Abp vNext是Abp的下一代版本,目前还在经一步完善,代码已经全部重写了,好的东西保留了下来,去除了很多笨重的东西,从官宣来看,Abp vNext主要是为了以后微服务架构而诞生的. 从源码来看, ...

  9. 2.1.1 Abp vNext 地磅无人值守 接口服务创建

    地磅无人值守项目 系列文章目录 文章目录 前言 一.Abp vNext手脚架 二.创建Abp vNext项目 1.创建项目 2.初始化数据库 3.试运行 3.1 查看数据库连接 3.2 浏览器查看 3 ...

  10. Abp vNext 模块化

    Abp vNext 在Abp vNext框架当中呢,模块化管理可以说是最基本的要求,他把程序按照模块进行切分,模块之间也存在相互依赖的关系,当然模块切分可以按照业务,也可以按照功能,最后一个一个组装拼 ...

最新文章

  1. 【c语言】蓝桥杯算法提高 淘淘的名单
  2. 弹性理论法研究桩基受力计算公式_收藏!桩基检测的7种方法
  3. 编译Android 4.0 ICS注意事项
  4. DataSource--DBCP--C3P0--DBUtils
  5. 数据交换平台_从零开始理解大数据架构之数据交换平台
  6. Spark RDD使用详解3--Value型Transformation算子
  7. 当退出python时是否释放全部内存_python如何释放内存
  8. [渝粤教育] 西南科技大学 服务管理 在线考试复习资料
  9. 别扯了,这才是应对高并发的正确处理思路。
  10. 常用计算机检索技术的例子,专业检索常用方法及应用实例
  11. ios 重复引用 静态库_Swift 制作静态库
  12. 如何构建可视化的营销数据大屏? 1
  13. IEEE754标准:二进位浮点数算术标准
  14. docker容器别人访问很卡_docker容器下远程访问jupyter的方式
  15. 计算机专业html5的毕业论文范文,计算机专业毕业设计论文范文.doc
  16. 怎么制作真人qq秀_NBA赛事最震撼的开场秀
  17. Qt开发之路——SogouInput\Components\ Error - RtlWerpReportException failed with status code :-107374182
  18. CSDN 个人博客域名设置
  19. js 手机号、邮箱、身份证校验
  20. 企业信息化将推动企业组织结构和管理模式的变革

热门文章

  1. FPGA浮点数定点化
  2. C#构造函数、操作符重载以及自定义类型转换
  3. JavaScript自动设置IFrame高度(兼容各主流浏览器)
  4. 如何在Raspberry Pi上设置两因素身份验证
  5. 如何在Windows上解决蓝牙问题
  6. staem被盗_如何检查照片是否被盗
  7. dvd刻录软件_如何在Windows 7中刻录照片和视频DVD(无需额外的软件)
  8. dropbox文件_Dropbox即将发布的扩展程序更新将添加更多文件编辑支持,包括Pixlr照片...
  9. Lombok@Builder和@NoArgsConstructor冲突
  10. MySQL复制--slave设置读取binlog的位置