博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初识ABP vNext(5):ABP扩展实体
阅读量:4034 次
发布时间:2019-05-24

本文共 4855 字,大约阅读时间需要 16 分钟。

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

  • 扩展实体

  • 路由整理

前言

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

开始

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

扩展实体

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

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

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

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

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

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

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

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

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

builder.Entity
(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
(            nameof(AppUser.Avatar),            b => { b.HasMaxLength(AppUserConsts.MaxAvatarLength); }        )        .MapEfCoreProperty
(            nameof(AppUser.Introduction),            b => { b.HasMaxLength(AppUserConsts.MaxIntroductionLength); }        );});

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

OneTimeRunner.Run(() =>{    ObjectExtensionManager.Instance        .AddOrUpdateProperty
(            new[]            {                typeof(IdentityUserDto),                typeof(IdentityUserCreateDto),                typeof(IdentityUserUpdateDto),                typeof(ProfileDto),                typeof(UpdateProfileDto)            },            "Avatar"        )        .AddOrUpdateProperty
(            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 infogetInfo({ 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://qqzdi.baihongyu.com/

你可能感兴趣的文章
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>
Oracle 物化视图
查看>>
PHP那点小事--三元运算符
查看>>
解决国内NPM安装依赖速度慢问题
查看>>