日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Blog.Core开源】框架集成部门权限 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

Blog.Core開源四年啦,一行行代碼凝結(jié)了大家的熱情和心血,基本功能骨架已完成,歡迎更多的公司和企業(yè)使用喲。真實公司留言蓋樓可獲得一對一技術(shù)指導(dǎo):

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

書接上文,上回咱們說到了《【Blog.Core開源】將Program升級為.NET6.0版本》,終于將項目完全的升級到了6.0,而且6.0是一個三年的LTS版本,所以可以暫時穩(wěn)定一段時間了。正好最近也把框架中最后一個版圖——數(shù)據(jù)部門權(quán)限,給集成進來了。當(dāng)然每個公司的具體情況不一樣,我只是提供一個抽象的功能點,還需要各自在具體的情況中,做相應(yīng)的修改。

PS:所有代碼已經(jīng)全部更新到master分支,歡迎批評指正。

今天簡單說一下,部門權(quán)限設(shè)計的概要設(shè)計吧,如果不是很清晰,下次直播的時候,我再詳細的講講這一塊,配合著鑒權(quán)認證一起。

1、部門表結(jié)構(gòu)概要設(shè)計

我們都知道,部門表結(jié)構(gòu)其實挺簡單的,無非就是id、name、pid之類的常規(guī)設(shè)計,然后就是寫業(yè)務(wù)邏輯,做CURD接口了,其中稍微需要動腦筋考慮的事情就是如何做到級別的劃分和快速定位。

我這里先設(shè)計了一版,主要還多了一個關(guān)系碼的字段,用來表示當(dāng)前部門的上游節(jié)點信息,每次更新的時候要同步更新,要注意:

這么設(shè)計的好處是方便我們快速的查找整個部門樹的關(guān)系,比如:

1、可以查詢0,1的所有同級部門,用equal即可滿足;

2、可以查詢0,1的所有子集部門,用contain即可,同時也可以進一步細分是所有子集還是下一級(用長度即可快速找到);

3、可以快速查詢當(dāng)前部門的部門鏈(下文就會用到);

這樣部門權(quán)限就很清晰明了,因為快速定位部門樹關(guān)系對我們來說很重要。

剩下的就是CURD了,比較簡單,大家看Blog.Core源碼就行了,最終展示到頁面上的效果是這樣的:

(代碼下載后,生成種子數(shù)據(jù),用超級管理員查看效果)

(部門樹型列表展示)

(添加部門,勾選父級部門)

2、給用戶綁定部門信息

有了部門信息,那我們就需要綁定到用戶上了,一般來說一個用戶肯定就是一個部門了,如果一定要實現(xiàn)多個部門,就需要繼續(xù)抽象一個邏輯模型了,下文會說到。

這塊邏輯比較簡單,就是在用戶表添加一個部門id就行,不用存放整個父級上游關(guān)系鏈,讓部門子領(lǐng)域處理就行,用戶不需要考慮這塊。最終的效果就是這樣的:

(用戶列表)

(用戶添加/編輯部門信息)

我們在把部門id存到數(shù)據(jù)庫里,然后通過部門表的CodeRelationship字段給帶出完全的部門名稱和部門id數(shù)組,是不是很方便,核心代碼是這樣的:

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>());}// 獲取整個鏈路節(jié)點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);}

其實到了這里,用戶部門權(quán)限已經(jīng)基本定型了,我們先考慮下以后怎么做劃分——我們編輯某條目標(biāo)數(shù)據(jù),比如是績效信息,每條目標(biāo)數(shù)據(jù)都會有個UserId,那當(dāng)前人登錄的時候,就根據(jù)UserId,查出來部門DepartmentId,就可以獲取整個部門的數(shù)據(jù)了。這是最簡單的最基礎(chǔ)的一套部門權(quán)限數(shù)據(jù),但是我們肯定不會滿足于這種情況的。因為我們經(jīng)常會有這個需求:

1、查詢我同級別的所有部門數(shù)據(jù);

2、查詢我下屬的數(shù)據(jù);

3、甚至是跨部門查詢數(shù)據(jù);

那這個時候就需要我們再往上抽離一層,將用戶和部門關(guān)系進行融合,但是我把這塊邏輯給放到Role上了,整體流程是:

根據(jù)User查詢Role,根據(jù)Role查詢具體的控制Department的邏輯,從而實現(xiàn)目的。

3、角色和部門邏輯的綁定

這塊邏輯是可以放到User表的,但是這樣每個人都需要一一的標(biāo)記,無法做到統(tǒng)一的處理,所以我還是放到了Role上,先看效果吧:

(Role增加一個權(quán)限范圍的抽象概念)

(權(quán)限范圍有六種級別)

可以看到這幾種級別就是上文咱們說到的那幾種關(guān)系:

我想查本部門的(普通人),僅僅自己的,全部的(公司老板),本部門及以下的(你的直屬leader),可以看到除了其他五種,還有一個自定義數(shù)據(jù)權(quán)限,支持跨部門查詢數(shù)據(jù),這場景肯定有吧,比如風(fēng)控部門,你懂的:

(權(quán)限范圍支持自定義權(quán)限分配)

4、總結(jié)

今天的分享暫時就先到這里了,代碼均已提交到GitHub的Master分支,最后再總結(jié)下整體結(jié)構(gòu)設(shè)計:

一個人打開目標(biāo)數(shù)據(jù)頁面,根據(jù)自己的角色信息,然后根據(jù)權(quán)限范圍機制,查找對應(yīng)的部門,再根據(jù)部門來過濾到目標(biāo)數(shù)據(jù),所以需要同時也把部門id給冗余到目標(biāo)數(shù)據(jù)表中,這樣方便查詢,當(dāng)然,用sql語句兩表inner join也是可以的。

那最后再思考下,能不能做個統(tǒng)一過濾器或者AOP來處理呢,答案是肯定的,部門權(quán)限分享下期再給大家揭曉吧。

總結(jié)

以上是生活随笔為你收集整理的【Blog.Core开源】框架集成部门权限的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。