初识ABP vNext(5):ABP扩展实体
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章。
前言
上一篇实现了前端vue部分的用户登录和菜单权限控制,但是有一些问题需要解决,比如用户头像、用户介绍字段目前还没有,下面就来完善一下。
开始
因为用户实体是ABP模板自动生成的,其中的属性都预先定义好了,但是ABP是允许我们扩展模块实体的,我们可以通过扩展用户实体来增加用户头像和用户介绍字段。
扩展实体
ABP支持多种扩展实体的方式:
- 将所有扩展属性以json格式存储在同一个数据库字段中
- 将每个扩展属性存储在独立的数据库字段中
- 创建一个新的实体类映射到原有实体的同一个数据库表中
- 创建一个新的实体类映射到独立的数据库表中
这里选择第2种方式就好,它们的具体区别请见官网:扩展实体
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本地化,让系统文字支持多国语言。
初识ABP vNext(5):ABP扩展实体的更多相关文章
- 初识ABP vNext(2):ABP启动模板
目录 前言 开始 AbpHelper 模块安装 最后 前言 上一篇介绍了ABP的一些基础知识,本篇继续介绍ABP的启动模板.使用ABP CLI命令就可以得到这个启动模板,其中包含了一些基础功能模块,你 ...
- ABP VNext框架基础知识介绍(1)--框架基础类继承关系
在我较早的时候,就开始研究和介绍ABP框架,ABP框架相对一些其他的框架,它整合了很多.net core的新技术和相关应用场景,虽然最早开始ABP框架是基于.net framework,后来也全部转向 ...
- [Abp vNext 源码分析] - 1. 框架启动流程分析
一.简要说明 本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程,让大家了解整个 Abp vNext 框架是如何运作的.总的来说 ,Abp vNext 比起 ABP 框架 ...
- [Abp vNext 源码分析] - 9. 接口参数的验证
一.简要说明 ABP vNext 当中的审计模块早在 依赖注入与拦截器一文中有所提及,但没有详细的对其进行分析. 审计模块是 ABP vNext 框架的一个基本组件,它能够提供一些实用日志记录.不过这 ...
- ABP vNext
一.简要介绍# ABP vNext 是 ABP 框架作者所发起的新项目,截止目前 (2019 年 8 月 20 日) 已经拥有 1400 多个 Star,最新版本号为 v 0.19.0,可以尝试用于生 ...
- ABP VNext框架基础知识介绍(2)--微服务的网关
ABP VNext框架如果不考虑在微服务上的应用,也就是开发单体应用解决方案,虽然也是模块化开发,但其集成使用的难度会降低一个层级,不过ABP VNext和ABP框架一样,基础内容都会设计很多内容,如 ...
- [Abp vNext 源码分析] - 文章目录
一.简要介绍 ABP vNext 是 ABP 框架作者所发起的新项目,截止目前 (2019 年 2 月 18 日) 已经拥有 1400 多个 Star,最新版本号为 v 0.16.0 ,但还属于预览版 ...
- Abp vNext 切换MySql数据库
Abp vNext是Abp的下一代版本,目前还在经一步完善,代码已经全部重写了,好的东西保留了下来,去除了很多笨重的东西,从官宣来看,Abp vNext主要是为了以后微服务架构而诞生的. 从源码来看, ...
- [Abp vNext微服务实践] - vue-element-admin登录二
简介: Vue Element Admin是基于vue.element ui开发的后台管理ui,abp vNext是abp新一代微服务框架.本篇将会介绍如何改造Vue Element Admin权限验 ...
- [Abp vNext微服务实践] - 前后端分类
一.前景 abp vNext是ABP 开源 Web应用程序框架,是abp的新一代开源web框架.框架完美的集成.net core.identity server4等开源框架,适用于构建web应用程序和 ...
随机推荐
- three.js 数学方法之Matrix4
今天郭先生说一说three.js中的Matrix4,相较于Matrix3来说,Matrix4和three.js联系的更紧密,因为在4x4矩阵最常用的用法是作为一个变换矩阵.这使得表示三维空间中的一个点 ...
- phpcms视频模块实现列表页打开内容页直接播放视频
摘自phpcms论坛 原链接地址:http://bbs.phpcms.cn/thread-557691-1-1.html 之前下载研究过“化蝶自在飞”开发的视频模型,发现功能不错,但唯一的缺憾是,我想 ...
- 《python开发技术详解》|百度网盘免费下载|Python开发入门篇
<python开发技术详解>|百度网盘免费下载|Python开发入门篇 提取码:2sby 内容简介 Python是目前最流行的动态脚本语言之一.本书共27章,由浅入深.全面系统地介绍了利 ...
- 初识 Nacos 以及安装
Nacos简介 前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service. 是什么: 一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台.Nacos: ...
- MacOS安装npm
原文链接:https://www.cnblogs.com/zmdComeOn/p/11543441.html 第一步:检查brew -v是否安装了homebrew这个MacOS 缺失的软件包的管理器. ...
- redis实操-sentinel
本文主要记录一些操作步骤,作为自己学习的一个记录,也供虚拟机上学习redis的人参考. 实操篇,可以参考 http://redis.cn/ 主从复制实操 在test目录下新建配置进行练习 1.mkdi ...
- 使用Esxi虚拟化部署OpenWrt/HomeLede+扩容硬盘 保姆级教程
本文介绍使用VMware虚拟化平台部署OpenWrt/HomeLede,并扩容固件硬盘的方法. 推荐使用虚拟化方式部署软路由,理由如下: 部署.升级.回退.扩容等操作非常方便,特别适合折腾 可以方便的 ...
- Python raw_input() 函数
python raw_input() 用来获取控制台的输入.高佣联盟 www.cgewang.com raw_input() 将所有输入作为字符串看待,返回字符串类型. 注意:input() 和 ra ...
- C/C++编程笔记:C语言开发经典游戏项目《五子棋》,内含源码
上一节给大家分享了扫雷游戏的源代码,本篇文章当然也不会让大家失望,专门针对C语言入门或者学习了部分知识之后的小伙伴来练手的游戏项目——<五子棋大战>,本期并不是使用的easyX,因为考虑到 ...
- electron-react-umi模板
electron-react-umi-tpl github English Version 更新日志: 2020-06-08 添加全量更新功能 2020-06-29 添加远程增量更新功能,无需下载包来 ...