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

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

Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章。

前言

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

开始

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

扩展实体

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

  1. 将所有扩展属性以json格式存储在同一个数据库字段中
  2. 将每个扩展属性存储在独立的数据库字段中
  3. 创建一个新的实体类映射到原有实体的同一个数据库表中
  4. 创建一个新的实体类映射到独立的数据库表中

这里选择第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项目来更新

<span>初识ABP vNext(5):ABP扩展实体</span>

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

<span>初识ABP vNext(5):ABP扩展实体</span>

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

<span>初识ABP vNext(5):ABP扩展实体</span>

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

<span>初识ABP vNext(5):ABP扩展实体</span>

修改一下前端部分:

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);
      });
  });
},

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

<span>初识ABP vNext(5):ABP扩展实体</span>

路由整理

删除掉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;

运行效果:

<span>初识ABP vNext(5):ABP扩展实体</span>

对应ABP模板界面:

<span>初识ABP vNext(5):ABP扩展实体</span>

最后

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2642.html原文链接:https://javaforall.net

(0)
上一篇 2020年11月20日 上午9:34
下一篇 2020年11月20日 上午9:38


相关推荐

  • DotNetty使用之Echo

    DotNetty使用之Echo一 DotNetty 介绍 DotNetty 是微软的 Azure 团队 使用 C 实现的 Netty 的版本发布 不但使用了 C 和 Net 平台的技术特点 并且保留了 Netty 原来绝大部分的编程接口 让我们在使用时 完全可以依照 Netty 官方的教程来学习和使用 DotNetty 应用程序 那 Netty 又是什么尼 Netty 是一个提供 asynchronous driven 异步事件驱动 的

    2026年3月19日
    1
  • WD移动硬盘读不出来(不能读取移动硬盘盘符)

    这样就说明他的移动硬盘没有物理硬件上的故障问题,说明硬盘本身是好的,只是软件问题。首先,更换一条数据线,结果仍然一样无效,说明不是数据线的问题。经过询问,三副在别人电脑里面拷大片时候,电脑卡,没有点击右下角的安全移除移动硬盘,直接在硬盘运行的时候暴力拔掉USB连接数据线导致硬盘无法读取的问题。所以还是提示大家,最好把移动硬盘里面所以程序停止后,再安全移除后再拔掉移动硬盘。你对它好一点,它也不至于罢…

    2022年4月11日
    274
  • monit mysql_monit 配置详解(monitrc)

    monit mysql_monit 配置详解(monitrc)monitrc 是 Monit 的主配置文件 控制文件 monitrc 的内容主要分为全局 golbal 和服务 services 两个部分 默认情况下 monitrc 文件在 etc monit 目录下 配置内容书写规范

    2026年3月17日
    2
  • 河北省理科2001——2010年一分一档表[通俗易懂]

    河北省理科2001——2010年一分一档表[通俗易懂]VirtualBox.bat:C:cd”\ProgramFiles\Oracle\VirtualBox”VBoxManagestartvm”CentOS-6.5″–typeheadless

    2022年7月13日
    44
  • daphile的dsd设置_小块头有大能量 篇二:JaguarBoard之Daphile HiFi 畅享

    daphile的dsd设置_小块头有大能量 篇二:JaguarBoard之Daphile HiFi 畅享小块头有大能量篇二 JaguarBoard 之 DaphileHiFi 畅享 2016 02 2012 00 4258 点赞 457 收藏 75 评论小编注 此篇文章来自即可瓜分 10 万金币 周边好礼达标就有 邀新任务奖励无上限 点击查看活动详情题外话半月前分享了一下在 JaguarBoard 下文简称 JB 上安装 RemixOS 的简单体验 其中一句 性能比 ARM 的不知强了多少倍 引来了一些值友的强烈吐槽 在此

    2026年3月26日
    3
  • u盘拒绝访问怎么解决win11_u盘无权限访问

    u盘拒绝访问怎么解决win11_u盘无权限访问使用U盘启动盘安装系统时需要用到U盘,但是当我们将U盘插上电脑,结果出现拒绝访问的情形,别说是使用U盘启动盘重装系统了,连U盘基础的文件存储功能都无法使用。当U盘出现拒绝访问怎么解决呢?就此问题,下面小编分享u盘拒绝访问没有权限的原因和解决方法。U盘出现拒绝访问怎么解决1、U盘问题1)鼠标右键单击U盘盘符,在右键菜单中点击属性。2)在弹出的属性窗口中点击“工具”选项卡,再点击“开始检查”按钮,如下图所示:3)接着勾选“自动修复文件系统错误”和“扫描并尝试恢复坏扇区”并点击“开始”按钮(1)4)

    2026年4月20日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号