為了實作資料權限的控制,我們需要在通用的權限系統裡面儲存好對應角色具有哪些組織機構的資料權限,然後在應用系統中調用API進行過濾資料處理即可。
為了實作以上的功能需求,我們需要在權限系統裡面,角色控制哪裡增加一個資料權限的資料存儲。
實際的應用系統,當使用者登陸成功後,我們擷取并記錄好其可以管理的公司或者部門,如果是主管的角色,可能有多個公司的資料可以管理,那麼可以在程式的頂部,讓使用者選擇管理那個公司的資料即可,如果切換公司,那麼重新整理現有的界面資料顯示就可以了。

在使用者成功登陸後,我們可以記錄使用者的相關權限控制資訊,如他所能控制資料的公司或者部門,把它記錄下來。
然後存儲使用者預設的公司ID,并根據使用者是否為管理者(超級管理者、公司管理者),然後構造一個通用的過濾條件,放到全局緩存裡面,友善各個子產品使用,如下代碼所示。
在主界面的時候,我們可以根據使用者所能管理的公司資料,在頂部初始化公司清單,友善切換選擇,以下是初始化的代碼。
如果多于一個公司,那麼正常的需求是可以切換公司來檢視其它公司的資料的,要實作這個功能,那麼就需要修改登陸的那個全局的過濾條件:Cache.Instance["DataFilterCondition"]了。
我們來看看代碼的實作,其主要的邏輯就是擷取使用者選擇的公司ID,然後根據公司、部門資訊,重新建構一個全局的過濾條件,并重新緩存到對應的鍵值裡面去,供後面的窗體實作資料的過濾更新。
如果需要對已有的窗體實作資料更新,那麼周遊窗體,并統一實作資料重新整理即可。
從上面的步驟代碼,我們可以看到如何建構一個全局的過濾條件,但是我們擷取資料的時候,如何才能實作資料權限的控制,讓使用者所能看到的資料在可控的範圍内呢?
我們知道,一般窗體資料清單的綁定操作類似如下代碼所示
是以主要的資料控制,就在函數GetConditionSql()裡面了,那麼這個裡面,我們如何整合前面的過濾條件呢?
下面是一個案例代碼。
我們主要關注下上面紅色部分即可,因為我們已經加上了标準的過濾條件了,這樣我們就可以看到自己管理的資料了。
為了實作統一的資料控制,我們要求整個業務表的設計,需要引入下面幾個标準的字段,這樣就能很好使用過濾條件進行資料的過濾了。
前面也介紹到了,窗體可以統一重新整理,其奧秘就是它們遵循統一的一個資料加載接口,我們初始化窗體資料的函數代碼如下所示。
是以它們就能夠統一調用FormOnLoad來統一重新整理資料,就是這個道理。