【自然框架】 之 資源角色——列表過濾方案(思路篇)
名詞解釋
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、 怎麼沒有程式碼了? 這篇主要寫思路,我感覺大家好像更喜歡思路,而不願意去看程式碼,所以這裡就集中說思路,下次再說程式碼吧。 可能我的程式碼很爛,但是我覺得我的這個思路還是可以的,也許您能夠借鑑一下。