【Blog.Core开源】框架集成部门权限

fb98fa95258d9596e602f2368cedc805.png

(Blog.Core框架功能点概述)

Blog.Core开源四年啦,一行行代码凝结了大家的热情和心血,基本功能骨架已完成,欢迎更多的公司和企业使用哟。真实公司留言盖楼可获得一对一技术指导:

https://github.com/anjoy8/Blog.Core/issues/75

书接上文,上回咱们说到了《【Blog.Core开源】将Program升级为.NET6.0版本》,终于将项目完全的升级到了6.0,而且6.0是一个三年的LTS版本,所以可以暂时稳定一段时间了。正好最近也把框架中最后一个版图——数据部门权限,给集成进来了。当然每个公司的具体情况不一样,我只是提供一个抽象的功能点,还需要各自在具体的情况中,做相应的修改。

PS:所有代码已经全部更新到master分支,欢迎批评指正。

今天简单说一下,部门权限设计的概要设计吧,如果不是很清晰,下次直播的时候,我再详细的讲讲这一块,配合着鉴权认证一起。

071c6be875379d9c3a42ecfff9dc3698.png

1、部门表结构概要设计

我们都知道,部门表结构其实挺简单的,无非就是id、name、pid之类的常规设计,然后就是写业务逻辑,做CURD接口了,其中稍微需要动脑筋考虑的事情就是如何做到级别的划分和快速定位。

我这里先设计了一版,主要还多了一个关系码的字段,用来表示当前部门的上游节点信息,每次更新的时候要同步更新,要注意:

273529bfd081952b7e6572a7a11f3cf1.png

这么设计的好处是方便我们快速的查找整个部门树的关系,比如:

1、可以查询0,1的所有同级部门,用equal即可满足;

2、可以查询0,1的所有子集部门,用contain即可,同时也可以进一步细分是所有子集还是下一级(用长度即可快速找到);

3、可以快速查询当前部门的部门链(下文就会用到);

这样部门权限就很清晰明了,因为快速定位部门树关系对我们来说很重要。

剩下的就是CURD了,比较简单,大家看Blog.Core源码就行了,最终展示到页面上的效果是这样的:

(代码下载后,生成种子数据,用超级管理员查看效果)

27149557980ba80b9e8d7d7a0a03ebce.png

(部门树型列表展示)

068788264960740083d7aebd30e5b616.png

(添加部门,勾选父级部门)

8f8304cfc718f0acd02f8c5ad53902a5.png

2、给用户绑定部门信息

有了部门信息,那我们就需要绑定到用户上了,一般来说一个用户肯定就是一个部门了,如果一定要实现多个部门,就需要继续抽象一个逻辑模型了,下文会说到。

这块逻辑比较简单,就是在用户表添加一个部门id就行,不用存放整个父级上游关系链,让部门子领域处理就行,用户不需要考虑这块。最终的效果就是这样的:

2294a741d6db78c013e268c7e6f8c105.png

(用户列表)

06e51c1ab740b5cb69e6bfe2e92ae1bc.png

(用户添加/编辑部门信息)

我们在把部门id存到数据库里,然后通过部门表的CodeRelationship字段给带出完全的部门名称和部门id数组,是不是很方便,核心代码是这样的:

private (string, List<int>) GetFullDepartmentName(List<Department> departments, int departmentId){var departmentModel = departments.FirstOrDefault(d => d.Id == departmentId);if (departmentModel == null){return ("", new List<int>());}// 获取整个链路节点var pids = departmentModel.CodeRelationship?.TrimEnd(',').Split(',').Select(d => d.ObjToInt()).ToList();pids.Add(departmentModel.Id);var pnams = departments.Where(d => pids.Contains(d.Id)).ToList().Select(d => d.Name).ToArray();var fullName = string.Join("/", pnams);return (fullName, pids);}

其实到了这里,用户部门权限已经基本定型了,我们先考虑下以后怎么做划分——我们编辑某条目标数据,比如是绩效信息,每条目标数据都会有个UserId,那当前人登录的时候,就根据UserId,查出来部门DepartmentId,就可以获取整个部门的数据了。这是最简单的最基础的一套部门权限数据,但是我们肯定不会满足于这种情况的。因为我们经常会有这个需求:

1、查询我同级别的所有部门数据;

2、查询我下属的数据;

3、甚至是跨部门查询数据;

那这个时候就需要我们再往上抽离一层,将用户和部门关系进行融合,但是我把这块逻辑给放到Role上了,整体流程是:

根据User查询Role,根据Role查询具体的控制Department的逻辑,从而实现目的。

72615a1b3ae12902a9024ddcac4bc210.png

3、角色和部门逻辑的绑定

这块逻辑是可以放到User表的,但是这样每个人都需要一一的标记,无法做到统一的处理,所以我还是放到了Role上,先看效果吧:

99e6c19ccb042d4bd8f1dd8be6822696.png

(Role增加一个权限范围的抽象概念)

46ec79b1f702510077f6f47ccd315f57.png

(权限范围有六种级别)

可以看到这几种级别就是上文咱们说到的那几种关系:

我想查本部门的(普通人),仅仅自己的,全部的(公司老板),本部门及以下的(你的直属leader),可以看到除了其他五种,还有一个自定义数据权限,支持跨部门查询数据,这场景肯定有吧,比如风控部门,你懂的:

c96cfc619ced8519977f1e6f0f4603e2.png

(权限范围支持自定义权限分配)

47b3c0ce9993df43d8c482d51f78c6f5.png

4、总结

今天的分享暂时就先到这里了,代码均已提交到GitHub的Master分支,最后再总结下整体结构设计:

一个人打开目标数据页面,根据自己的角色信息,然后根据权限范围机制,查找对应的部门,再根据部门来过滤到目标数据,所以需要同时也把部门id给冗余到目标数据表中,这样方便查询,当然,用sql语句两表inner join也是可以的。

那最后再思考下,能不能做个统一过滤器或者AOP来处理呢,答案是肯定的,部门权限分享下期再给大家揭晓吧。

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

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

相关文章

[一个经典的多线程同步问题]解决方案一:关键段CS

前面提出了一个经典的多线程同步互斥问题&#xff0c;本篇将用关键段CRITICAL_SECTION来尝试解决这个问题。 本文先介绍如何使用关键段&#xff0c;然后再深层次的分析下关键段的实现机制和原理。 关键段CRITICAL_SECTION一共就四个函数&#xff0c;下面说一下这四个函数的原型…

服务器线程数一直增加,.NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长...

一个 asp.net core 站点&#xff0c;之前运行在Linux 服务器上&#xff0c;运行一段时间后有时站点会挂掉&#xff0c;在日志中记录很多“EMFILE too many open files”的错误&#xff1a;Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -24 EMF…

python种颜色循环_Python 实现一个颜色色值转换的小工具

需求说明 公司的 UI 设计小哥&#xff0c;已经转用 Zeplin 很久了。Zeplin 的设计稿展示页面的颜色色值使用十进制的 RGB 表示的&#xff0c;在 Android 中的颜色表示大多情况下都需要十六进制的 RGB 表示。我的数学没有好到直接看到十进制就可以心算得到十六进制的结果&#x…

bugly中批量隐藏版本

App项目使用Bugly的内测分发功能进行整包的测试&#xff0c;但日积月累之后&#xff0c;版本就会特别多。而线上同时跑的版本可能不过三个左右&#xff0c;那么多版本会干扰到查看崩溃、选择版本&#xff0c;如何隐藏呢&#xff1f; 右上角&#xff0c;更多 –> 产品设置 –…

检查点(Checkpoint)过程如何处理未提交的事务

每次我讲解SQL Server之前&#xff0c;我都会先简单谈下当我们执行查询时&#xff0c;在SQL Server内部发生了什么。执行一个SELECT语句非常简单&#xff0c;但是执行DML语句更加复杂&#xff0c;因为SQL Server要修改内存中的相关页&#xff0c;并在事务日志里记录整个事务。 …

机器学习工作坊 - 计算机视觉

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;2分钟&#xff09;活动介绍四月的 MS Learn 学堂&#xff0c;我们将进入机器学习专题。 本月三期 MS Learn 学堂&#xff0c;我们会以工作坊的形式&#xff0c;结合具体应用实例&#xff0c;带领大家实践计算机视觉、…

arcgis server 无法手动删除切片

背景 问题 场景如下&#xff1a; 切片放置在专门的文件服务器上&#xff0c;通过unc共享路径对外共享。文件服务器的OS为windows server2008R2想手动更新切片服务的切片。发现同一切片服务&#xff0c;有的比例级别文件夹可以删除或者重命名。有的比例级别不可以。不能删除的比…

Hadoop 2.0 中的资源管理框架 - YARN(Yet Another Resource Negotiator)

1. Hadoop 2.0 中的资源管理 http://dongxicheng.org/mapreduce-nextgen/hadoop-1-and-2-resource-manage/Hadoop 2.0指的是版本为Apache Hadoop 0.23.x、2.x或者CDH4系列的Hadoop&#xff0c;内核主要由HDFS、MapReduce和YARN三个系统组成&#xff0c;其中&#xff0c;YARN是一…

React Native实现js调用安卓原生代码

1 问题 实现js调用安卓原始代码,直接上代码,简单粗暴 2 代码实现 1) 实现一个继承ReactContextBaseJavaModule的类,MyToastModule.java文件如下 public class MyToastModule extends ReactContextBaseJavaModule {public MyToastModule(ReactApplicationContext reactContext)…

发布nuget包的正确姿势---cicd自动打包发布

最轻便的发布nuget包方式&#xff0c;方便cicd自动打包发布nuget包首先新建项目项目名随便取&#xff0c;这里就叫它GuiH.ClassLibrary默认即可&#xff0c;需要改目标版本时&#xff0c;等创建好再改项目创建好了随便写个接口方法namespace GuiH.ClassLibrary {public class C…

我的世界服务器物品属性,属性 - Minecraft Wiki,最详细的官方我的世界百科

属性(Attributes)是生物和玩家身上的增益/减益特性系统。属性也存在修饰符(Modifiers)中&#xff0c;用于调整属性的强度。属性应用[]当应用到一个物品&#xff0c;一个物品的修饰符将增加或减少以修正相应的属性下面的命令将给最近的玩家一把增加20( 10)点额外伤害的钻石剑&a…

分布式和微服务区别_深度解析spring cloud分布式微服务的实现

分布式系统微服务就是原来臃肿的项目拆分为多个模块互不关联。如&#xff1a;按照子服务拆分、数据库、接口&#xff0c;依次往下就更加细粒度&#xff0c;当然运维也就越来越难受了。分布式则是偏向与机器将诺大的系统划分为多个模块部署在不同服务器上。微服务和分布式就是作…

通过Shell开发企业级专业服务启动脚本案例(MySQL)

老男孩教育Linux高端运维班Shell课后必会考试题:企业Shell面试题10&#xff1a;开发企业级MySQL启动脚本说明:MySQL启动命令为&#xff1a;/bin/sh mysqld_safe --pid-file$mysqld_pid_file_path 2>&1 >/dev/null &停止命令逻辑脚本为&#xff1a;mysqld_pidcat …

React Native之js调用Android原生使用Callback传递结果给js

如果不清楚js如何调用Android原生,可以先参考我的这篇博客React Native实现js调用安卓原生代码 1 问题 上面的文章只是调用安卓原生显示Toast,但是我们一般会需要调用安卓的代码然后去拿回结果给js,但是我们知道在android层js调用的这个函数返回值必须的void,所以我们需要用到…

ENVI帮助研究人员发现金矿

本文转自&#xff1a;http://www.esrichina-bj.cn/2012/0319/1663.html 遥感影像能让我们实时的获取地理区域的准确信息&#xff0c;这些为很多石油、天然气和矿产的开采提供关键的信息&#xff0c;节约实地测量的成本&#xff0c;提高工作效率。 美国圣路易斯大学的研究人员希…

C# 使用TCP创建HTTP客户程序

首先&#xff0c;创建一个控制台应用程序(包)&#xff0c;向 Web 服务器发送一个 HTTP 请求。以前用 HttpClient 类实现了这个功能&#xff0c;但使用 TcpClient 类需要深入 HTTP 协议。HttpClientUsingTcp 示例代码使用了以下名称空间:System System.IO System.Net.Sockets …

迅捷路由器 服务器无响应,如果路由器重启还是上不了网 几招搞定

如果网速很慢重启了路由器之后结果还是慢&#xff0c;而且甚至上不了网了那该怎么办。如果有这种情况原因其实有很多很多的可能&#xff0c;需要逐个排查&#xff0c;首先需要进入192.168.1.1路由器的管理设置界面&#xff0c;查看路由器的运行状态。路由器设置、路由器没有成功…

Azure DevOps 中 Dapr项目自动部署流程实践

注&#xff1a;本文中主要讨论 .NET6.0项目在 k8s 中运行的 Dapr 的持续集成流程, 但实际上不是Dapr的项目部署到K8s也是相同流程&#xff0c;只是k8s的yaml配置文件有所不同流程选择基于 Dapr 的项目持续集成包含以下流程编译并打包项目构建 Dockerfile,并推送镜像push image至…

React Native之js同步调用安卓原生方法@ReactMethod(isBlockingSynchronousMethod = true)

1 问题 之前的代码js调用安卓原生都是用的异步方法,比如callback, promiss,异步的话,我们一般是在安卓原生有耗时操作,才用异步,如果我要离开返回,就需要js调用安卓同步方法 利用callback实现js调用原生可以参考我的这篇博客 React Native实现js调用安卓原生代码 React Nat…

用POP动画引擎实现弹簧动画(POPSpringAnimation)

效果图: #import "ViewController.h" #import <POP.h>interface ViewController ()property (nonatomic, weak) UIView *testView;endimplementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor [UIColor blackColor…