基於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
  • 經常看到有群友調侃“為什麼搞Java的總在學習JVM調優?那是因為Java爛!我們.NET就不需要搞這些!”真的是這樣嗎?今天我就用一個案例來分析一下。 昨天,一位學生問了我一個問題:他建了一個預設的ASP.NET Core Web API的項目,也就是那個WeatherForecast的預設項目模 ...
  • 很多軟體工程師都認為MD5是一種加密演算法,然而這種觀點是不對的。作為一個 1992 年第一次被公開的演算法,到今天為止已經被髮現了一些致命的漏洞。本文討論MD5在密碼保存方面的一些問題。 ...
  • Maven可以使我們在構建項目時需要用到很多第三方類jar包,如下一些常用jar包 而maven的出現可以讓我們避免手動導入jar包出現的某些問題,它可以自動下載那須所需要的jar包 我們只需要在創建的maven項目自動生成的pom.xml中輸入如下代碼 <dependencies> <!--ser ...
  • 來源:https://developer.aliyun.com/article/694020 非同步調用幾乎是處理高併發Web應用性能問題的萬金油,那麼什麼是“非同步調用”? “非同步調用”對應的是“同步調用”,同步調用指程式按照定義順序依次執行,每一行程式都必須等待上一行程式執行完成之後才能執行;非同步調 ...
  • 1.面向對象 面向對象編程是在面向過程編程的基礎上發展來的,它比面向過程編程具有更強的靈活性和擴展性,所以可以先瞭解下什麼是面向過程編程: 面向過程編程的核心是過程,就是分析出實現需求所需要的步驟,通過函數一步一步實現這些步驟,接著依次調用即可,再簡單理解就是程式 從上到下一步步執行,從頭到尾的解決 ...
  • 10瓶毒藥其中只有一瓶有毒至少需要幾隻老鼠可以找到有毒的那瓶 身似浮雲,心如飛絮,氣若游絲。 用二分查找和二進位位運算的思想都可以把死亡的老鼠降到最低。 其中,二進位位運算就是每一隻老鼠代表一個二進位0或1,0就代表老鼠存活,1代表老鼠死亡;根據數學運算 23 = 8、24 = 16,那麼至少需要四 ...
  • 一、Kafka存在哪些方面的優勢 1. 多生產者 可以無縫地支持多個生產者,不管客戶端在使用單個主題還是多個主題。 2. 多消費者 支持多個消費者從一個單獨的消息流上讀取數據,而且消費者之間互不影響。 3. 基於磁碟的數據存儲 支持消費者非實時地讀取消息,由於消息被提交到磁碟,根據設置的規則進行保存 ...
  • 大家好,我是陶朱公Boy。 前言 上一篇文章《關於狀態機的技術選型,最後一個真心好》我跟大家聊了一下關於”狀態機“的話題。從眾多技術選型中我也推薦了一款阿裡開源的狀態機—“cola-statemachine”。 於是就有小伙伴私信我,自己項目也考慮引入這款狀態機,但網上資料實在太少,能不能系統的介紹 ...
  • 使用腳本自動跑實驗(Ubuntu),將實驗結果記錄在文件中,併在實驗結束之後將結果通過郵件發送到郵箱,最後在windows端自動解析成excel表格。 ...
  • 話說在前面,我不是小黑子~ 我是超級大黑子😏 表弟大周末的跑來我家,沒事幹天天騷擾我,搞得我都不能跟小姐姐好好聊天了,於是為了打發表弟,我決定用Python做一個小游戲來消耗一下他的精力,我思來想去,決定把他變成小黑子,於是做了一個坤坤打籃球的游戲,沒想到他還挺愛玩的~ 終於解放了,於是我把游戲寫 ...