1. 程式人生 > 其它 >【自然框架】 之 資源角色——列表過濾方案(思路篇)

【自然框架】 之 資源角色——列表過濾方案(思路篇)

名詞解釋

1、資源角色,我的理解就是資源過濾方案 + 角色。就是把資源過濾方案和角色結合在一起的東東。 2、資源:這裡的資源指的是關係資料庫裡的記錄。 3、資源過濾:就是按照一定的條件提取資料庫裡的記錄。比如只提取自己新增的記錄,只提取Kind=2的記錄。 4、資源過濾方案:就是把這種查詢條件以“方案”的形式儲存起來,以便於和角色結合。

資料列表的過濾方案  

      資源過濾又分為兩種:資料列表的過濾繫結控制元件(比如下拉列表框等)的過濾。       其實不管哪一種,儲存的都是查詢條件,我把它們分為了兩種,完全是為了便於操作,就是便於用程式碼的方式實現其功能。            資料列表的過濾方案。這個是給列表頁面使用的。比如業務員只能看自己新增的客戶,業務部經理可以看到業務部的客戶,總經理可以看到全部的客戶。這裡主要說的就是這個方案是如何實現的,另外一個方案下次再說。

      這裡根據我以前做過的一個專案來說明吧。

      前幾年給一個集團公司做了一個管理軟體,這個集團有四個銷售子公司,一個售後服務子公司,一個維修廠。他們是銷售挖掘機、壓路機這一類的工程機械,賣出去之後還要做機械的保養和維修等售後服務。       軟體的主要功能就是記錄業務員跑了哪些客戶,哪些客戶來買挖掘機,賣的是哪個型號(每一臺都有自己的唯一編號,便於以後的保養)的,每一臺機器的保養以及維修情況的記錄。

      第一個問題就是業務員和客戶資訊的問題。四個銷售子公司是獨立運營獨立核算的,每個子公司都有自己的業務員,跑自己的客戶,不過好在對於軟體的要求都是一樣的,做一個就可以了,不用做四套不同的程式。但是同時也遇到了一個問題。

1、 業務員只能看到自己新增的客戶,不能看到其他業務員的客戶。 2、 銷售子公司經理只能看到自己所在公司的客戶,不能看到其他子公司的客戶。 3、 總經理可以看到全部的客戶。

      程式是一個,但是不同的人(或者說是崗位),看到的記錄卻是不一樣的,那麼這時候就可以使用“列表過濾方案”。

      這裡主要目的就是為了說明“列表過濾方案”的思路,所以其他的就一切從簡,比如表設計。表結構就只寫出幾個主要的表和主要的欄位,其他的欄位就暫時忽略,以免大家看著麻煩,呵呵。

客戶表

欄位名

說明

欄位型別

欄位大小

CustomerID

客戶

int

4

客戶名稱

客戶名稱

nvarchar

30

客戶地址

客戶地址

ntext

16

AddedDate

新增日期

smalldatetime

4

AddedPersonID

業務員

int

4

UpdatedDate

最後修改日期

smalldatetime

4

UpdatedPersonID

最後修改業務員

int

4

部門表

欄位名

說明

欄位型別

欄位大小

DepartmentID

組織機構

int

4

機構名稱

機構名稱

nvarchar

50

機構簡稱

機構簡稱

nvarchar

50

人員表

欄位名

說明

欄位型別

欄位大小

PersonID

主鍵

int

4

姓名

姓名

nvarchar

50

性別

性別

nchar

1

出生日期

出生日期

smalldatetime

4

身份證號碼

身份證號碼

varchar

19

部門人員表。(關聯表)

欄位名

說明

欄位型別

欄位大小

DeptPersonID

序號

int

4

DepartmentID

組織機構

int

4

PersonID

人員ID

int

4

      這幾個表比較簡單,我就不畫關係圖了。(打算下載一個PD,好好學習一下)。

      依據這幾個表,讓您回答上面的三個問題,這個沒什麼難度吧。

1、 業務員訪問列表頁面,新增AddedPersonID={PersonID} 作為查詢條件。 2、 銷售子公司經理訪問列表頁面,新增DepartmentID={DepartmentID}作為查詢條件。 3、 總經理訪問列表頁面,不加查詢條件作為查詢條件。

      {PersonID}、{DepartmentID}是什麼意思?{PersonID}就是當前登入人的人員ID,這個ID是動態的,有人登入了之後才能確定,所以這裡就用一個標籤來佔位了,執行的時候再做替換。{DepartmentID}就是當前登入人所在的部門ID。

      我們在定義一個表來存放這些查詢語句,這個表就是“資料列表的過濾方案”。

欄位名

說明

欄位型別

欄位大小

ListCaseID

編號

int

4

FunctionID

關聯節點

int

4

ResourceName

資源角色名稱

nvarchar

50

ResourceDescribe

資源角色描述

nvarchar

50

SQL

過濾條件

nvarchar

200

      過濾方案有了下一步就是和角色結合了。也可以叫做關聯。我們建立一個關聯表。一個角色可以訪問多個功能節點,所以 角色ID+節點ID 是聯合主鍵,對於這種組合只能選擇一個過濾方案

欄位名

說明

欄位型別

欄位大小

RoleID

角色

int

4

FunctionID

節點

int

4

ListCaseID

列表過濾方案

int

4

      我們可以建立三個角色:業務員角色、銷售公司經理角色、總經理角色,然後再把這三個角色和過濾方案關聯起來就可以了。當然了,這些是由程式來實現的,不需要直接到資料庫裡面修改資料的。

      那麼如何來提取這個過濾方案(也就是查詢條件)呢?以前我寫了一個BaseUserInfo類,這個類的目的是儲存登入使用者的一些資訊的,我們可以增加一個函式來實現提取查詢條件的目的。

【函式程式碼】

/// <summary>
        /// 傳入節點ID,返回當前登入人訪問該節點需要設定的查詢條件
        /// </summary>
        /// <param name="functionID"></param>
        /// <returns></returns>
        public string GetResourceListCastSQL(string functionID)
        {
            string sql = "select [SQL] from V_Nature_User_GetListCase where UserID = " + this.UserID + " and FunctionID= " + functionID ;
            string listCase = DAL.ExecuteString(sql);
            if (listCase == null)
            {
                //沒有設定列表過濾方案
                return "";
            }
            else
            {
                if (listCase.Length > 0)
                { 
                    listCase = listCase.ToLower();
                    listCase = listCase.Replace("{personid}", this.PersonID );
                    listCase = listCase.Replace("{departmentid}", this.DepartmentID[0]);
                }
                return listCase;
            }
        }

呼叫這個函式之後就可以返回相應的查詢語句,比如“AddedPersonID=3”。如果沒有過濾方案者返回空字串。       如果您使用的是QuickPager分頁控制元件的話,那麼只需要把這個查詢語句賦值給“TableQueryAlways”屬性就可以了,這個屬性在查詢的時候,查詢條件變更了也會有效的屬性。相當於每次回發都會把查詢條件賦值給分頁控制元件。       如果您使用的是其他的分頁方式的話,那麼這個查詢條件也是有用處的吧。   附幾個截圖。(詳細程式碼下次給出) 【給程式設計師用的管理過濾方案的頁面】

【角色管理裡面,通過“高階”選項,選擇需要的過濾方案】可以給程式設計師用,也可以給客戶的管理員用。

【V_Nature_User_GetListCase檢視】

FAQ: 1、 過濾方案只能和角色結合嗎?       過濾方案也可以和部門結合,也可以和其他的結合,也可以不結合直接使用,其實他就是給SQL語句找了一個存放地點,集中起來便於管理,使用起來也比較靈活。我把他和角色結合起來主要是為了方便嘛。 2、 怎麼沒有程式碼了?       這篇主要寫思路,我感覺大家好像更喜歡思路,而不願意去看程式碼,所以這裡就集中說思路,下次再說程式碼吧。 可能我的程式碼很爛,但是我覺得我的這個思路還是可以的,也許您能夠借鑑一下。