ERP系統開發隨筆系列三(定義Page的OperationMode)
好了,今天要講的是ERP系統Web層核心功能:Erp.Utils.OperationMode權限控制及控件狀態的模式控制。
首先我們采用Web Application來開發整個系統,95%的頁面都要繼承基類GenericPage,這個基類主要定議了Page要使用的最常用部分,但是不希望什么都加入到這里來,這里我簡單的定義了以下幾個接口,當然里面是可以實現一些具體的功能,至於更詳細的要根據系統實際需求而定.
public class GenericPage<R> : System.Web.UI.Page, IWebPage<R>
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
InitOperationMode();//初始化控件的狀態
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
}
public virtual void init()
{
;
}
public virtual void Authorize()
{
;
}
//95%的頁面都要重寫虛方法,這個方法就類似於一個指揮官,
//這里定義了每一個控件在不同操作方法下的狀態。
public virtual void InitOperationMode()
{
;
}
public R UserSession
{
set { Session["USER_SESSION"] = value; }
get { return (R)Session["USER_SESSION"]; }
}
}
//****************************************************
Erp.Utils.OperationMode主要實現功能就是權限控制和特別權限控制每一個控制在不同操作模式下的狀態,我想大家都知道ERP系統的安全性和數據保密性是要求很嚴格的,同一個頁面或不同頁面有些數據不允許多一個人知道就不能給多一個人看,因此我們都會定義兩個功能組,基中同一頁面的新增,修改,刪除,查詢......就叫做功能權限控制,而同一頁面不同的隊伍進入或一些特別操作則用特別權限控制。這兩個是一個單獨模塊,將會在下一系列發表ER圖(呵呵,這里我不會發表圖片,只能用文字說明)。
下面說明Erp.Utils.OperationMode這個模塊(我喜歡工廠模式,策略模式):
public class ControlUnit//(這個是控制單元)包含了所有操作模式,主要屬性有如下:
public int[] NewMode(EditMode,DeleteMode,CancelMode,SaveMode,NormalMode,SpecialMode,ExtraMode,PageControl......)
{
get
{
return m_iNewMode;(......)
}
}
public interface IOperationMode//主要為了未知擴展控件,供OperationModeFactory創建對象
{ void TakeAction(ControlUnit pi_ControlUnit, EnumActionMode pi_enumActionMode,
Button pi_cmdSearch, Button pi_cmdNew, Button pi_cmdEdit, Button pi_cmdDelete, Button pi_cmdSave, Button pi_cmdCancel......);
//EnumActionMode這個枚舉定義了各種操作模式
}
public class OperationModeBase: IOperationMode//基類,所有未知擴展控件都繼承這個類
{
public virtual void TakeAction(ControlUnit pi_ControlUnit, EnumActionMode pi_enumActionMode,
Button pi_cmdSearch, Button pi_cmdNew, Button pi_cmdEdit, Button pi_cmdDelete, Button pi_cmdSave, Button pi_cmdCancel......)
{
//實現各個繼承類要做的事務
}
//只讀且保持原值
protected virtual void ReadOnlyKeepContainer(System.Web.UI.Control pi_Control)
{
//每個擴展類,按實際處理,Override這個方法
}
//可修改且清空原值
protected virtual void EditClearContainer(System.Web.UI.Control pi_Control)
{
}
//Disable控制不可用
protected virtual void Disable(System.Web.UI.Control pi_Control)
{
}
......
......
......
}
//TextBox對象各種操作的處理方法
public class OperationModeTextBox:OperationModeBase
{
public override void TakeAction(ControlUnit pi_ControlUnit, EnumActionMode pi_enumActionMode,
Button pi_cmdSearch, Button pi_cmdNew, Button pi_cmdEdit, Button pi_cmdDelete, Button pi_cmdSave, Button pi_cmdCancel......)
{
base.TakeAction(pi_ControlUnit, pi_enumActionMode,
pi_cmdSearch,pi_cmdNew,pi_cmdEdit,pi_cmdDelete,pi_cmdSave,pi_cmdCancel......);
}
protected override void ReadOnlyKeepContainer(System.Web.UI.Control pi_Control)
{
((TextBox)pi_Control).ReadOnly = true;
((TextBox)pi_Control).CssClass = WebConstants.CSSCLASS_TEXTBOX_READONLY_BYTEXT;//CSS要定義TextBox只讀樣式
}
//......
//......
//......
}
public class OperationMode......:OperationModeBase
{
}
public class OperationModeFactory
{
//工廠創建對象
public static IOperationMode GetOperationMode(string pi_strControlTypeName)
{
//......
Type l_Type = System.Type.GetType(l_strTypeOperationMode);
IOperationMode l_OperationMode = (IOperationMode)Activator.CreateInstance(l_Type);
return l_OperationMode;
}
}
//*****************另一個關鍵類WebPage使用調用的OperationModeController類****
public class OperationModeController
{
protected ControlUnit m_ControlUnit;//聲明控件個體
protected ArrayList OperationModeControlList = new ArrayList();//Page需要OperationMode控制的控件集合
private IOperationMode m_OperationMode;
private Button m_cmdSearch;
private Button m_cmdNew;
private Button m_cmdEdit;
private Button m_cmdDelete;
private Button m_cmdSave;
private Button m_cmdCancel;
public OperationModeController(Button pi_cmdSearch, Button pi_cmdNew, Button pi_cmdEdit, Button pi_cmdDelete, Button pi_cmdSave, Button pi_cmdCancel)
{
m_cmdSearch = pi_cmdSearch;
m_cmdNew = pi_cmdNew;
m_cmdEdit = pi_cmdEdit;
m_cmdDelete = pi_cmdDelete;
m_cmdSave = pi_cmdSave;
m_cmdCancel = pi_cmdCancel;
}
public OperationModeController()
{
}
/// <summary>
/// 函數功能描述:
/// 觸發事件
/// 錯誤處理:
/// __________________________________________________________________
/// 修改日期 修改人 修改描述
/// __________________________________________________________________
/// 函數參數清單:
/// </summary>
/// <param name="pi_enumActionMode">觸發模式</param>
public void TakeAction(EnumActionMode pi_enumActionMode)
{
foreach (ControlUnit l_Control in OperationModeControlList)
{
m_OperationMode = OperationModeFactory.GetOperationMode(l_Control.PageControl.GetType().ToString());//創建執行實例化對象
m_OperationMode.TakeAction(l_Control, pi_enumActionMode, m_cmdSearch, m_cmdNew, m_cmdEdit, m_cmdDelete, m_cmdSave, m_cmdCancel);
}
}
/// <summary>
/// 函數功能描述:
/// 初始化各控件的狀態
/// 錯誤處理:
/// __________________________________________________________________
/// 修改日期 修改人 修改描述
/// __________________________________________________________________
/// 函數參數清單:
/// </summary>
/// <param name="pi_Control">頁面控件</param>
/// <param name="pi_enumNewMode">新增狀態</param>
/// <param name="pi_enumEditMode">編輯狀態</param>
/// <param name="pi_enumDeleteMode">刪除狀態</param>
/// <param name="pi_enumSaveMode">保存狀態</param>
/// <param name="pi_enumCancelMode">取消狀態</param>
/// <param name="pi_enumNormalMode">普通狀態</param>
public void AddControlsRef(Control pi_Control, EnumOperationMode pi_enumNewMode, EnumOperationMode pi_enumEditMode, EnumOperationMode pi_enumDeleteMode, EnumOperationMode pi_enumSaveMode, EnumOperationMode pi_enumCancelMode,
EnumOperationMode pi_enumNormalMode)
{
m_ControlUnit = new ControlUnit(pi_Control, pi_enumNewMode, pi_enumEditMode, pi_enumDeleteMode, pi_enumSaveMode, pi_enumCancelMode, pi_enumNormalMode);
OperationModeControlList.Add(m_ControlUnit);
}
/// <summary>
/// 函數功能描述:
/// 初始化各控件的狀態(帶擴展模式)
/// 錯誤處理:
/// __________________________________________________________________
/// 修改日期 修改人 修改描述
/// __________________________________________________________________
/// 函數參數清單:
/// </summary>
/// <param name="pi_Control">頁面控件</param>
/// <param name="pi_enumNewMode">新增狀態</param>
/// <param name="pi_enumEditMode">編輯狀態</param>
/// <param name="pi_enumDeleteMode">刪除狀態</param>
/// <param name="pi_enumSaveMode">保存狀態</param>
/// <param name="pi_enumCancelMode">取消狀態</param>
/// <param name="pi_enumNormalMode">普通狀態</param>
/// <param name="pi_enumExtraMode">擴展狀態</param>
public void AddControlsRef(Control pi_Control, EnumOperationMode pi_enumNewMode, EnumOperationMode pi_enumEditMode, EnumOperationMode pi_enumDeleteMode, EnumOperationMode pi_enumSaveMode, EnumOperationMode pi_enumCancelMode,
EnumOperationMode pi_enumNormalMode, EnumExtraMode pi_enumExtraMode)
{
m_ControlUnit = new ControlUnit(pi_Control, pi_enumNewMode, pi_enumEditMode, pi_enumDeleteMode, pi_enumSaveMode, pi_enumCancelMode, pi_enumNormalMode, pi_enumExtraMode);
OperationModeControlList.Add(m_ControlUnit);
}
}
public enum EnumActionMode
{
NewMode = 1,
EditMode = 2,
DeleteMode = 4,
SaveMode = 8,
CancelMode = 16,
NormalMode = 32,
}
public enum EnumExtraMode
{
TextBoxByNumber=1,
TextBoxByPriceNumber = 2,
TextBoxBySizeNumber = 4,
TextBoxByWeightNumber=8,
TextBoxByExchangeRateNumber = 16,
TextBoxByOtherNumber=32,
}
//以上就把所有Erp.Utils.OperationMode介紹完成了,接下來是Page的使用了
1.初始化對象:m_omController = new OperationModeController(cmd_Normal,cmd_New ,cmd_Edit,cmd_Delete ,cmd_Save ,cmd_Cancel );
2.定義控件的操作模式的狀態:m_omController.AddControlsRef(TextBox1, EnumOperationMode.EditClearContainer,
EnumOperationMode.EditClearContainer, EnumOperationMode.EditKeepContainer,EnumOperationMode.ReadOnlyKeepContainer,
EnumOperationMode.ReadOnlyKeepContainer, EnumOperationMode.ReadOnlyKeepContainer, EnumExtraMode.TextBoxByPriceNumber);
//EnumExtraMode.TextBoxByPriceNumber這個是TextBox的擴展模式,因為它是貨幣的樣式,如:[ 123,123.00]右對齊千分位兩位小數點
3.m_omController.TakeAction(EnumActionMode.NewMode);//觸發新增模式,那麼對應的就是EnumOperationMode.EditClearContainer--編輯且清空值。[ ]
好啦,Page的核心控制就完了。當然上面只是一個簡單的框架,還要將下一系列的功能權限表和特別控制項權限都要封裝進去。
下一系列是功能權限控制及特別控制項權限和樹型菜單管理,多謝關注,有什么想法都可以提出來。