基於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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...