ABP是一个成熟的.NET框架,功能完善。目前由于项目需要正在自学中。

ABP对于组织节点管理这一基本上每个项目都要反复重复开发的内容,进行了自己的实现。

主要包括这些常用功能:

  • 多租户
  • 树结构管理的实体
  • 与用户系统集成的查询

下面我们根据官方文档以及DEMO去学习这个功能。

不过需要注意的是,ABP默认没有提供展示层的实现,这一块就需要自己实现了。

官方文档理解

OrganizationUnit 实体定义

  • TenantId: 租户ID,如果为null则是host的组织节点。(具体概念参阅多租户)
  • ParentId: 父节点Id,如果为null则是根节点。
  • Code: 一个拼接的虚拟路径字符串代码,在租户内唯一。
  • DisplayName: 显示名称

Organization Tree

模型定义中的ParentId使得这个数据结构定义了一个典型的父子树。

  • 这个树允许有多个根节点
  • 树的最大深度是OrganizationUnit.MaxDepth,值为16
  • 每一级子节点的数目也有限制,主要是由于后面要提到的OU Code定义决定的。

OU Code

OU Code由OrganizationUnit Manager自动维护,它是类似于"00001.00042.00005"的字符串。它可以用于递归查询。

这种字段在树结构中是很必须的,如果没有它,树查询会变成效率的杀手。有了这类虚拟路径,可以通过分隔符分解后批量查询。

Abp对OU Code有以下规则:

  • 在一个租户中唯一
  • 子节点的Code需要以父节点的Code开头
  • Code的长度,由层级深度决定
  • OU Code可以被改变,例如移动节点
  • 我们需要使用Id作为OU引用的字段,而不是Code

OrganizationUnit Manager

  • OrganizationUnitManager 通过依赖注入引入,一般用于:
  • 增、删、改OU
  • 移动OU
  • 读取OU信息,以及OU的items

Multi-Tenancy

OrganizationUnitManager 一次只能操作一个租户,默认租户为当前租户。

样例代码分析

首先创建一个实体,派生自IMustHaveTenant , IMustHaveOrganizationUnit

public class Product : Entity, IMustHaveTenant, IMustHaveOrganizationUnit
{public virtual int TenantId { get; set; }public virtual long OrganizationUnitId { get; set; }public virtual string Name { get; set; }public virtual float Price { get; set; }
}

  

实现Service:

public class ProductManager : IDomainService
{//实体仓储,实体继承自IMustHaveOrganizationUnitprivate readonly IRepository<Product> _productRepository;//OU仓储,通过此仓储读取OUprivate readonly IRepository<OrganizationUnit, long> _organizationUnitRepository;//用户数据Managerprivate readonly UserManager _userManager;//构造函数,DI注入public ProductManager(IRepository<Product> productRepository, IRepository<OrganizationUnit, long> organizationUnitRepository, UserManager userManager){_productRepository = productRepository;_organizationUnitRepository = organizationUnitRepository;_userManager = userManager;}//根据组织节点,获取关联的Productpublic List<Product> GetProductsInOu(long organizationUnitId){return _productRepository.GetAllList(p => p.OrganizationUnitId == organizationUnitId);}//根据组织节点Id查询所有的Products,包含子Product[UnitOfWork]//UnitOfWork支持事务public virtual List<Product> GetProductsInOuIncludingChildren(long organizationUnitId){//根据组织节点id,获取codevar code = _organizationUnitRepository.Get(organizationUnitId).Code;//查询组织节点开头的所有节点,这样避免了递归查询,提升了效率,也是Code定义的目的所在var query =from product in _productRepository.GetAll()join organizationUnit in _organizationUnitRepository.GetAll() on product.OrganizationUnitId equals organizationUnit.Idwhere organizationUnit.Code.StartsWith(code)select product;return query.ToList();}//根据用户查询Product//查询用户关联的组织节点,再根据组织节点,查询关联的Productpublic async Task<List<Product>> GetProductsForUserAsync(long userId){var user = await _userManager.GetUserByIdAsync(userId);var organizationUnits = await _userManager.GetOrganizationUnitsAsync(user);var organizationUnitIds = organizationUnits.Select(ou => ou.Id);return await _productRepository.GetAllListAsync(p => organizationUnitIds.Contains(p.OrganizationUnitId));}//同上个函数类似,查询中加入了子节点[UnitOfWork]public virtual async Task<List<Product>> GetProductsForUserIncludingChildOusAsync(long userId){var user = await _userManager.GetUserByIdAsync(userId);var organizationUnits = await _userManager.GetOrganizationUnitsAsync(user);var organizationUnitCodes = organizationUnits.Select(ou => ou.Code);var query =from product in _productRepository.GetAll()join organizationUnit in _organizationUnitRepository.GetAll() on product.OrganizationUnitId equals organizationUnit.Idwhere organizationUnitCodes.Any(code => organizationUnit.Code.StartsWith(code))select product;return query.ToList();}
}

  

  

通过这段源码我们发现,其实在Abp模板中Zero模块已经默认添加了用户与组织节点的关联,如下图:

OrganizationUnits表是一个父子树结构,表达了我们系统中所有需要以父子树表达的逻辑结构。

实体表User,Product通过一张关联表与组织节点关联,关联关系如E-R图所示。

在数据库中,abp并没有创建外键联系,这应该是为了高复用OU表。

其他设置

你可以通过 AbpZeroSettingNames.OrganizationUnits.MaxUserMembershipCount 来设置一个用户的最大OU关联数。

转载于:https://www.cnblogs.com/wswind/p/10176201.html

AspnetBoilerplate (ABP) Organization Units 组织结构管理相关推荐

  1. SSM+mysql实现的汽车销售管理系统(角色权限分离,功能:采购申请、仓储入库、车辆出库、车辆入库、登录、客户管理、汽车销售柱状统计、销售统计、组织结构管理)

    博客目录 SSM汽车销售管理系统 实现功能截图 系统功能 使用技术 代码 写在最后 SSM汽车销售管理系统 本系统是解决了汽车销售领域品类针对性管理的问题,通过组织角色权限分离,采购入库出库等业务设计 ...

  2. when I enter ZSOCIAL role FM RH_STRUC_GET to get organization units that a given user belongs to

    Created by Wang, Jerry, last modified on Dec 12, 2014

  3. JAVA类似ABP框架_Orchard 与 ABP架构比较 (aspnetboilerplate)

    前言:  ABP框架经常在一些.NET群中听群友提起,以前也浏览过官网,大致了解它是一个框架,直到今天本人才正式下载源码入门 ... 经过两个小时的ABP中文文档入门(感谢各位辛勤的翻译者) ,大致了 ...

  4. 吐槽一下Abp的用户和租户管理模块

    1. 背景 ASP.NET Core 基于声明的访问控制到底是什么鬼? 聊到基于声明的身份认证将 身份和签发机构分离,应用程序信任签发机构,故认可签发的身份信息. -- --- --- --- Cla ...

  5. ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理

    在前面两篇随笔<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>和<ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程>开始 ...

  6. ABP zero 4.2 发布

    需要源码,请加QQ:3833-255-96 说明:ABP Zero项目已经包含了Module-Zero模块 Demo URL: http://abpzerodemo.demo.aspnetzero.c ...

  7. 基于DDD的现代ASP.NET开发框架--ABP系列之1、ABP总体介绍

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之1.ABP总体介绍 ABP是"ASP.NET Boilerplate Project (ASP.NET样 ...

  8. Windows域的管理

    目录 域的管理 默认容器 组织单位的管理 添加额外域控制器 卸载域控服务器 组策略应用 域的管理 域用户账户的管理 创建域用户账户 配置域用户账户属性 验证用户的身份 授权或拒绝对域资源的访问 组的管 ...

  9. ABP(现代ASP.NET样板开发框架)系列之2、ABP入门教程

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是"ASP.NET Boilerplate Project (ASP.NET样 ...

最新文章

  1. 【Spark Summit EU 2016】在在线学习中使用Structured Streaming流数据处理引擎
  2. eos操作系统_如何基于EOS区块链发一个自己的币,挣它一个亿?
  3. mongodb shell基础命令
  4. ASP.NET Core 3.x - 为什么采用新的 Endpoint Routing 路由系统
  5. java如何实现tcp传输图像_如何在java中实现TCP服务器和TCP客户端传输文件
  6. 一:ActiveMQ知识整理
  7. 腾讯封杀linux/mac QQ
  8. django-admin的源码流程
  9. 【ACL2021】BERT也能做生成?利用多个BERT模型分离对话生成和对话理解
  10. 矩阵迹的几何意义是什么?
  11. 安卓TV应用 Hello Word - 怎样新建一个Android TV 项目
  12. [UE4]计算小地图比例尺
  13. Educoder---Java继承与接口、文件
  14. ESP8266-Arduino编程实例-MQ3酒精传感器驱动
  15. Docker安装PHP-FPM5.6 (自带redis扩展,Mysql扩展,GD库扩展(支持JEPG))
  16. 多个PDF合并成一个PDF
  17. A*算法与8数字谜题(参见《算法》P226习题2.5.32)
  18. 数据压缩作业1之:使用音频分析软件(Audacity)分析浊音、清音爆破音的时域及频域特性。
  19. 初学编程者必知的五个网站
  20. 自定义ViewGroup之仿奥运五环的实现

热门文章

  1. zip学习笔记 —— 用C编写的简单压缩库
  2. 菜鸟破解email账号的技巧
  3. 思科路由器ios系统学习
  4. ELK-elasticsearch故障排查篇
  5. MTK DTS 文件配置
  6. openGL绘制带纹理太阳、地球、月亮,并且地球自转并且围绕太阳旋转。月亮自转也会围绕地球旋转
  7. Python基础 实例
  8. 常见的五种神经网络(3)-循环神经网络(上)篇
  9. Python基础——计算机组成原理、操作系统概述、编程语言的由来、编程语言分类、python介绍、 安装Cpython解释器、 第一个python程序
  10. 数学建模--数学规划模型Python实现