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

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

  • 扩展实体

  • 路由整理

前言

上一篇实现了前端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

如果本文对您有用,

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机管理-磁盘管理中进行扩展卷操作,管理磁盘diskpart命令

很多时候&#xff0c;我们需要对磁盘进行诸如创建分区、转换分区表格式、格式化、扩展卷等操作&#xff0c;尤其你在一台安装了全新的硬盘的电脑上安装windows的时候&#xff0c;磁盘管理操作显得更加必要。通常&#xff0c;人们会使用第三方Windows PE启动盘当中附带的可视化磁…

7-8 最优服务次序问题 (10 分)

一 &#xff1a;题目 设有n 个顾客同时等待一项服务。顾客i需要的服务时间为 t i ​ (1<i<n) 。应如何安排n个顾客的服务次序才能使平均等待时间达到最小&#xff1f;平均等待时间是n 个顾客等待服务时间的总和除以n。 输入格式: 第一行是正整数n(1<n<1000)&…

.NET Core + K8S + Apollo 玩转配置中心

1.引言Apollo&#xff08;阿波罗&#xff09;是携程框架部门研发的分布式配置中心&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端&#xff0c;并且具备规范的权限、流程治理等特性&#xff0c;适用于微服务配置管理场景。…

计算机格式化后数据恢复的基础,电脑硬盘格式化后还能恢复吗

电脑硬盘是电脑运行的基础固件&#xff0c;我们使用电脑需要依赖它储存文件、运行软件等。那么在使用电脑的过程中你有没有遇到这样的问题&#xff1a;当打开一个电脑磁盘分区时&#xff0c;该分区无法使用并提示格式化&#xff0c;这时候一般的小伙伴是不是都手欠格式化硬盘了…

并查集的相关知识详解 Come baby!!!

一&#xff1a;并查集的相关知识 这道题用到了并查集&#xff0c;所以我就学了一下并查集&#xff0c;所以把自己的见解也分享给大家&#xff08;建议 先看视频 再浏览 博客 再自己敲一遍 学习效率高而已&#xff0c;我总是乱着来 以为看几篇博客就会了&#xff0c;其实最后还…

路线错误的教训对如今的模范企业也有借鉴意义

此前&#xff0c;倪光南院士对L公司如今的困境做了深刻的剖析&#xff0c;那就是“路线不对”、“知识产权0股份”。“路线不对”指的是L公司放弃了技术路线&#xff0c;选择了“造不如买”&#xff0c;玩组装和贸易。几十年如一日依附于Wintel体系&#xff0c;“跟在洋人身后吃…

7-3 最小生成树-kruskal (10 分)(思路+详解+并查集详解+段错误超时解决)宝 Come

一&#xff1a;前言 本题需要用到并查集的知识&#xff0c;建议先学完并查集后再看看本题 二&#xff1a;题目 题目给出一个无向连通图&#xff0c;要求求出其最小生成树的权值。 温馨提示&#xff1a;本题请使用kruskal最小生成树算法。 输入格式: 第一行包含两个整数 N(1&…

计算机等级delphi取消,计算机二级DELPHI控件:DELPHI过滤记录的实现方法

所谓过滤就是从表中选取满足特定条件的部分记录。过滤记录首先要通过Filter。属性设置过滤条件&#xff0c;然后将Filtered属性设置为True&#xff0c;即可从数据集组件连接的表中过滤出满足条件的记录。1&#xff0e;Filter属性Filter属性用于设置过滤条件&#xff0c;它是一个…

Azure认知服务之使用墨迹识别功能识别手写汉字

前面我们使用Azure Face实现了人脸识别、使用Azure表格识别器提取了表格里的数据。这次我们试试使用Azure墨迹识别API来对笔迹进行识别。墨迹识别墨迹识别器认知服务提供基于云的 REST API 用于分析和识别数字墨迹内容。与使用光学字符识别 (OCR) 的服务不同&#xff0c;该 API…

7-9 删数问题 (10 分)(思路加详解)

一&#xff1a;题目 有一个长度为n&#xff08;n < 240&#xff09;的正整数&#xff0c;从中取出k&#xff08;k < n&#xff09;个数&#xff0c;使剩余的数保持原来的次序不变&#xff0c;求这个正整数经过删数之后最小是多少。 输入格式: n和k 输出格式: 一个数字…

如何做一个懂产品的程序员?

这篇是之前发过的《懂程序员的产品经理是什么样子&#xff1f;》的镜像篇&#xff0c;这次是程序员视角。两个相爱相杀的岗位&#xff0c;想要更好的达成共识、更好的合作&#xff0c;自然不仅仅是一方的事情。这次Z哥先会带你看看产品经理眼中的程序员是什么样子。然后给出一些…

2019吉首大学计算机调剂,吉首大学2019年硕士研究生调剂考生复试情况分学院公示...

002商学院2019年第二批拟录取硕士研究生情况汇总表 (调剂考生公示版).pdf.pdf 72.8 KB 2019-04-26 15:18 -a--003法管学院2019年硕士研究生拟录取情况汇总表(调剂考生递补公示版).pdf.pdf 69.0 KB 2019-04-26 15:18 -a--003法管学院2019年硕士研究生拟录取情…

2021-10-28

想敲代码 想敲代码

突破冯诺依曼原理的计算机,冯诺依曼计算机的基本原理

冯诺伊曼结构(英语&#xff1a;Von Neumann architecture)&#xff0c;也称冯诺伊曼模型(Von Neumann model)或普林斯顿结构(Princeton architecture)&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的电脑设计概念结构。本词描述的是一种实现通用图灵机的计算设备&…

【LeetCode】1. 盛最多水的容器:C#三种解法

题目&#xff1a;https://leetcode-cn.com/problems/container-with-most-water/盛最多水的容器难度:中等给你 n 个非负整数 a1&#xff0c;a2&#xff0c;...&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个…

7-1 银行家算法--安全性检查 (20 分)(思路+详解+知识分析)宝 你今天 AC了吗

一&#xff1a;前言 停更一周了&#xff0c;在这一周里&#xff0c;我每时每刻都在 想这我这 29个粉丝&#xff0c;庆幸教师资格证终于结束了&#xff0c;贴心杰又可以天天更新博客了 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈&#xff0c;I am come back; 二&#xff1a;题目&a…

平均成绩计算机控件,计算机技术基础(第十二章 文件 )

功能&#xff1a;包括文件的创建(打开)、复制、移动、删除及获取与文件有关的信息。可以使用FileSystemObject对象和File对象完成文件管理工作。管理文件的部分属性和方法&#xff1a;P229-230表12-5&#xff1b;表12-61&#xff0e;文件的创建与打开FSO对象模型提供了三种创建…

.Net Core中的诊断日志DiagnosticSource讲解

前言近期由于需要进行分布式链路跟踪系统的技术选型&#xff0c;所以一直在研究链路跟踪相关的框架。作为能在.Net Core中使用的APM&#xff0c;SkyWalking自然成为了首选。SkyAPM-dotnet是SkyWalking在.Net Core端的探针实现&#xff0c;其主要的收集日志的手段就是基于Diagno…

7-2 银行家算法--申请资源 (30 分)

7-2 银行家算法–申请资源 (30 分)&#xff08;思路详解&#xff09;Come 乖宝宝们 一&#xff1a;前言 这道题需要用到前面的一道题 安全性检查 算法知识&#xff0c;所以强烈建议先看前面那道题 7-1 银行家算法–安全性检查 (20 分) 二&#xff1a;题目 输入N个进程(N<…

计算机一级文档题,计算机一级模拟题

计算机2008第二次一级笔试试题A卷一、单选题1.计算机的发展大体可(按其组成的器件)分为()阶段。A.六 B.五 C.四 D.三2.计算机中的运算器能进行()。A.加法和减法运算 B.算术运算和逻辑运算C.加、减、乘、除运算 D.字符处理运算3.计算机软件是指所使用的()。A.各种程序的集合B.有…