基於SqlSugar的開發框架循序漸進介紹(9)-- 結合Winform控制項實現欄位的許可權控制

来源:https://www.cnblogs.com/wuhuacong/archive/2022/06/23/16400608.html
-Advertisement-
Play Games

欄位的許可權控制,一般就是控制對應角色人員對某個業務對象的一些敏感欄位的可訪問性:包括可見、可編輯性等處理。本篇隨筆結合基於SqlSugar的開發框架進行的欄位控制管理介紹。 ...


欄位的許可權控制,一般就是控制對應角色人員對某個業務對象的一些敏感欄位的可訪問性:包括可見、可編輯性等處理。本篇隨筆結合基於SqlSugar的開發框架進行的欄位控制管理介紹。

在設計欄位許可權的時候,我們需要瞭解這些還是基於RBAC的概念,基於角色進行授權的,而且我們的欄位列表是屬於具體的業務對象列表的,這裡的業務對象是指一些我們具體的業務模塊,如客戶基礎信息、人員基礎信息、報價單等等,我們就是基於這些業務進行欄位的控制的。

1、欄位許可權表的設計和界面管理

基於SqlSugar的開發框架,對應處理的業務對象信息的,是相關的實體對象信息,我們在資料庫中設計兩個資料庫,一個用於存儲對應實體類名稱的信息,如ID,實體類全名,類路徑等主體信息;一個存儲對應角色配置的欄位列表信息,結合起來就可以實現對應角色的欄位許可權控制了,資料庫表設計信息如下所示。

兩個業務表的部分欄位信息如下所示。

 

 

 系統中對於欄位許可權的設置界面如下所示。

 

 通過列表對每個實體對象信息進行配置,如果沒有對應的實體,從程式集中選擇列出來即可加入進來。

加入對應的實體信息,我們可以根據名稱反射介面獲得對應欄位參考的中文信息,然後進行展示,用於加入控制列表。

這樣配置後,系統就記錄了相關的配置信息,我們接下來就可以利用這些配置信息,在Winform界面上進行控制項的顯示處理操作了。

 

2、在Winform界面上進行控制項的顯示處理操作

在界面上,我們為了綁定界面控制項和欄位的關係,需要設置一個Tag來標識,然後根據系統配置信息,自動進行欄位許可權的控制處理(隱藏、設置只讀,不限制等)

/// <summary>
/// 設置控制項欄位的許可權顯示或者隱藏(預設不使用欄位許可權)
/// </summary>
private async void SetPermit()
{
    #region 設置控制項和欄位的對應關係

    this.txtName.Tag = "Name";
    this.txtAge.Tag = "Age";

    #endregion

    //獲取列表許可權的列表
    var permitDict = await BLLFactory<IFieldPermitService>.Instance.GetColumnsPermit(typeof(CustomerInfo).FullName, LoginUserInfo.Id.ToInt32());
    this.SetControlPermit(permitDict, this.layoutControl1);

    await Task.CompletedTask;
}

設置控制項的欄位顯示方式 SetControlPermit ,代碼如下所示。

        /// <summary>
        /// 設置控制項的可見、讀寫許可權顯示
        /// </summary>
        /// <param name="panel">控制項對象</param>
        /// <param name="permitDict">欄位和許可權字典,字典值為許可權控制:0可讀寫,1只讀,2隱藏值,3不顯示</param>
        /// <param name="layoutControl">如果存在佈局,則使用佈局控制項,否則為空</param>
        public static void SetControlPermit(this Control panel, Dictionary<string, int> permitDict, LayoutControl layoutControl = null)
        {
            foreach (Control ctrl in panel.Controls)
            {
                var baseCtrl = ctrl as BaseEdit;
                if (baseCtrl != null)
                {
                    var tag = string.Concat(baseCtrl.Tag);
                    if (!string.IsNullOrEmpty(tag) && permitDict.ContainsKey(tag))
                    {
                        var permit = permitDict[tag];
                        var visible = (permit == 0 || permit == 1);//2、3不可見

                        if (layoutControl != null)
                        {
                            var layoutItem = layoutControl.GetItemByControl(baseCtrl);
                            if (layoutItem != null)
                            {
                                layoutItem.ToVisibility(visible);
                            }
                        }
                        baseCtrl.Visible = visible;
                        baseCtrl.ReadOnly = permit == 1;
                    }
                }
                ctrl.SetControlPermit(permitDict, layoutControl);
            }
        }

上面代碼主要就是變數面板中的控制項,並判斷tag標簽,然後進行只讀、不可見、正常等的判斷。

 在列表界面中,我們可以通過設置隱藏字元讓內容隱藏,如下界面效果所示。

如果不可見,就在界面上不顯示這個列了,而非隱藏。

同樣類似編輯控制項界面,我們在列表界面也提供了對應的方法,用於隱藏列表欄位的某些信息,如下代碼所示。

//獲取欄位顯示許可權,並設置(預設不使用欄位許可權)        
this.winGridViewPager1.gridView1.SetColumnsPermit(permitDict); 

它的實現規則也是類似,根據配置的欄位許可權控制點信息進行處理,決定是否顯示,是否隱藏,是否正常處理。

它的permitDic也是根據配置信息讀取出來進行判斷即可。

//根據業務對象獲取對應的顯示欄位,如果沒有設置,那麼根據FieldPermit表的配置獲取欄位許可權列表
var permitDict = await BLLFactory<IFieldPermitService>.Instance.GetColumnsPermit(typeof(BlackIPInfo).FullName, Portal.gc.UserInfo.Id);
var displayColumns = await BLLFactory<IBlackIPService>.Instance.GetDisplayColumns();
if (permitDict != null && permitDict.Keys.Count > 0)
{
    //0可讀寫,1只讀,2隱藏值,3不顯示
    displayColumns = string.Join(",", permitDict.Keys.Where(s => permitDict[s] < 2));
}
this.winGridViewPager1.DisplayColumns = displayColumns;

下麵是具體邏輯的通用控制方法,把它作為控制項的擴展函數,我們就只需要一行代碼調用就是寫控制了

/// <summary>
/// 根據參數許可權字典的值:0可讀寫,1只讀,2隱藏值,3不顯示,設置列的許可權。
/// </summary>
/// <param name="gridView">GridView對象</param>
/// <param name="fieNamePermitDict">欄位和許可權字典,字典值為許可權控制:0可讀寫,1只讀,2隱藏值,3不顯示</param>
public static void SetColumnsPermit(this GridView gridView, Dictionary<string,int> fieNamePermitDict)
{
    char passwordChar = '*';
    foreach (GridColumn col in gridView.Columns)
    {
        var include = fieNamePermitDict.ContainsKey(col.FieldName);
        if (include)
        {
            int permit = fieNamePermitDict[col.FieldName];
            switch (permit)
            {
                case 0://正常可見、可讀寫
                    col.OptionsColumn.AllowEdit = true;
                    col.OptionsColumn.ReadOnly = false;
                    col.AppearanceHeader.ForeColor = Color.Black;

                    col.Visible = true;
                    break;

                case 1:
                    //只讀
                    col.OptionsColumn.AllowEdit = false;
                    col.OptionsColumn.ReadOnly = true;
                    col.AppearanceHeader.ForeColor = Color.Gray;

                    col.Visible = true;
                    break;

                case 2:
                    //隱藏值
                    var edit = col.CreateTextEdit();                            
                    col.Tag = string.Concat(passwordChar);//用來在界面端進行判斷,避免設置DisplayText
                    edit.PasswordChar = passwordChar;
                    col.Visible = true;
                    break;

                case 3:
                    //不可見
                    col.Visible = false;
                    break;
            }
        }
    }            
}

通過上面的代碼處理,我們就能實現對Winform界面中的列表,編輯窗體的控制項,進行相關的欄位許可權控制顯示了。如下是實現的界面效果。

 這樣在系統後臺,就可以根據需要設置一些敏感欄位的信息隱藏或者只讀處理了。

  

系列文章:

基於SqlSugar的開發框架的循序漸進介紹(1)--框架基礎類的設計和使用

基於SqlSugar的開發框架循序漸進介紹(2)-- 基於中間表的查詢處理

基於SqlSugar的開發框架循序漸進介紹(3)-- 實現代碼生成工具Database2Sharp的整合開發

基於SqlSugar的開發框架循序漸進介紹(4)-- 在數據訪問基類中對GUID主鍵進行自動賦值處理 

基於SqlSugar的開發框架循序漸進介紹(5)-- 在服務層使用介面註入方式實現IOC控制反轉

基於SqlSugar的開發框架循序漸進介紹(6)-- 在基類介面中註入用戶身份信息介面 

基於SqlSugar的開發框架循序漸進介紹(7)-- 在文件上傳模塊中採用選項模式【Options】處理常規上傳和FTP文件上傳

 《基於SqlSugar的開發框架循序漸進介紹(8)-- 在基類函數封裝實現用戶操作日誌記錄

基於SqlSugar的開發框架循序漸進介紹(9)-- 結合Winform控制項實現欄位的許可權控制

專註於代碼生成工具、.Net/.NetCore 框架架構及軟體開發,以及各種Vue.js的前端技術應用。著有Winform開發框架/混合式開發框架、微信開發框架、Bootstrap開發框架、ABP開發框架、SqlSugar開發框架等框架產品。
  轉載請註明出處:撰寫人:伍華聰  http://www.iqidi.com 
    

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Hi,大家好,我是Mic 一個工作3年的粉絲,早上6點給我微信發語音,把我直接嚇醒。 我以為什麼天大的事情,結果一問才知道。 面試官問了他一個問題沒答上來,問題是“Spring裡面,如果兩個id相同的bean會報錯嗎?如果會,在哪個階段報錯?” 下麵看看普通人和高手的回答! 普通人: 兩個id相同的 ...
  • 作為SpringData JPA系列內容的第二篇,此處以SpringBoot項目為基準,講一下集成SpringData JPA的相關要點,帶你快速的上手SpringData JPA,並用實例演示常見的DB操作場景,讓你分分鐘輕鬆玩轉JPA。 ...
  • 前言 不知道大家在工作無聊時,有沒有一種衝動:總想掏出手機,看看微博熱搜在討論什麼有趣的話題,但又不方便直接打開微博瀏 覽,今天就和大家分享一個有趣的小爬蟲,定時採集微博熱搜榜&熱評,下麵讓我們來看看具體的實現方法。 頁面分析 熱搜頁 熱榜首頁:https://s.weibo.com/top/sum ...
  • Zookeeper3.7源碼剖析 能力目標 能基於Maven導入最新版Zookeeper源碼 能說出Zookeeper單機啟動流程 理解Zookeeper預設通信中4個線程的作用 掌握Zookeeper業務處理源碼處理流程 能夠在Zookeeper源碼中Debug測試通信過程 1 Zookeeper ...
  • 系列文章彙總 前言: 最近看到ABP官網的一本電子書,感覺寫的很好,翻譯出來,一起學習下 Implementing Domain Driven Design 實現領域驅動設計 - 使用ABP框架 - 什麼是領域驅動設計? 實現領域驅動設計 - 使用ABP框架 - 解決方案概覽 實現領域驅動設計 - ...
  • 應用程式服務 應用程式服務是一種無狀態的服務,它實現應用程式的用例。應用程式服務通常獲取和返回dto。它由表示層使用。它使用並協調領域對象(實體、存儲庫等)來實現用例 應用程式服務的常見原則如下: 實現特定於當前用例的應用程式邏輯。不要在應用程式服務內部實現核心領域邏輯。我們將回到應用程式領域邏輯之 ...
  • 提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文檔 @(MstnVBA學習--Vol1.代碼畫點線--20220623) 前言 2022年6月23日,小白筆記,複習之前的MstnVBA代碼,因為目前還做不到完全自己背誦或編寫出來,雖然簡單,溫故知新~ Mstn中沒有單獨的圓的概念,圓實 ...
  • DevExpress提供了一個比較強大的圖形繪製工具,可以用於繪製各種圖形,如流程圖、組織機構圖等等,本篇隨筆介紹XtraDiagram.DiagramControl的使用,以及利用代碼對其屬性進行控制,以及利用圖形模具的自定義操作,實現一些簡單流程圖形的繪製和處理。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...