若依框架---树状层级部门数据库表
Posted 童小纯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了若依框架---树状层级部门数据库表相关的知识,希望对你有一定的参考价值。
👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者
📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人
问题起源
最近接手的某款办公软件,其中要添加一些额外的功能,涉及到树状层级的部门,人员查找。又最近在学习若依管理系统,其中也设计到层级的部门管理,查看了其中的部门表设计与一些SQL编写,发掘有一些小小的差异,即可带来检索与查找的极大遍历。容我们慢慢道来。
若依中的dept表设计
若依系统中的sys_dept表设计字段如下:
若依系统中添加部门的操作页面如下:
我们选几个重点字段说一下:
- parent_id字段:表明当前部门的上级部门节点id;
- order_num:表明当前部门在其上级部门下的排序次序;
- ancestors: 注释为“祖级列表”,我们来看一下表中的数据以及对应的真实的数据结构:
比如,若依中默认的部门级结构如下:
我们来看一下其中"若依科技->深圳总公司->研发部门"的数据库具体数据,尤其是ancestors
数据是什么样的:
如图所示,研发部门的ancestors
数据为“0,100,101”,0为所有部门父级,不表示具体部门,如果一个部门的父级只有0,表明其为最高级的部门;100表示dept_id=100的若依科技,101表示dept_id=101的深圳总公司。
乍一看这个字段设计的如此复杂,需要保存从最高级直到本级中的所有部门节点,给保存、更新带来了很大的复杂度,这样设计有什么好处呢?
另一种常用设计
说是另一种常用设计,更准确是说是我们当前系统的表设计,为了不违反公司相关规章,这里我就不贴真实的数据库表截图了,大概是这样的:
id | dept_name | parent_id |
1 | 总公司 | 0 |
2 | 一级部门 | 1 |
3 | 二级部门 | 2 |
即仅通过一个parent_id来表明层级关系,这样带来的一个显而易见的好处便是保存与更新带来的操作比较简单。
差异
差异就在于若依中的层级表设计有字段来保存部门祖级的所有节点。最近实现业务代码涉及到这块儿功能才发觉其有很好的实用性。
列举所有子部门
层级结构中最常见的一个业务是列出部门下的所有子部门,那么应该如下编写代码呢?
显然,如果没有ancestors
的帮助,我们需要在代码中通过parent_id逐层逐级的遍历列举以及合并列表,而有了ancestors
帮助,我们只需要一行SQL语句:
.....WHERE dept_id IN ( SELECT dept_id FROM sys_dept WHERE find_in_set('100', ancestors ) )
逐级查找所有父级部门
这种业务通常处于低级部门规则覆盖高级部门规则的场景下,即部门人员总是采用部门层级最接近自己的部门的规章,按照这一原则来实现代码的话,ancestors
直接列举出了从高到底各个层级部门,而仅有parent_id
则需要通过代码来循环查找父级部门。
专栏:若依框架
关注公众号,领取资料。
若依框架 使用数据权限功能
若依框架 使用数据权限功能
一、作用说明
若依设计了数据权限功能,分为:
- 全部数据权限
- 自定数据权限
- 部门数据权限
- 部门及以下数据权限
- 仅本人数据权限
若依数据权限的实现
主要在: DataScopeAspect 类里,通过AOP+注解的方式实现。
数据权限过滤注解
主要在@interface DataScope中实现。
二、操作步骤
1. 需要数据权限的表设计字段:
- dept_id :big int类型
- create_user_id :bigint类型
2. 在需要数据权限的方法上加注解
部门数据权限注解
@DataScope(deptAlias = "d")
public List<...> select(...)
return mapper.select(...);
部门及用户权限注解
@DataScope(deptAlias = "d", userAlias = "u")
public List<...> select(...)
return mapper.select(...);
3. 在mybatis的 xml 中加过滤标签
<select id="select" parameterType="..." resultMap="...Result">
<include refid="select...Vo"/>
<!-- 数据范围过滤 -->
$params.dataScope
</select>
注意SQL中关联 sys_dept
时别名要用 d
,关联sys_user
表时别名要用 u
。
4. 实体类注意事项
实体类必须从 BaseEntity
继承,组合的SQL会放在BaseEntity对象的params属性中,所以过滤标签可以通过$params.dataScope
来引用组合的SQL语句。
以上是关于若依框架---树状层级部门数据库表的主要内容,如果未能解决你的问题,请参考以下文章