菜單權限控制,該怎麼解決

菜單權限控制
最近用pb做了個簡單需求 我在abc程序主菜單 m_main 上加了個sub_menu 然後把程序傳到系統管理程序systemmger中  
systemmger的菜單權限管理中就自動出現了我新增加的sub_menu 我跟蹤了下 發現systemmger的菜單控制是調用的數據庫表來實現  


我很奇怪 這個sub_menu的信息事怎麼傳到數據庫的呢? 我沒有手動去insert這些權限相關的表啊 搞不懂

據說pfc有這個功能,我也是聽說 反正好神奇, 我很想學習這個菜單權限管理的方式,很重要啊

在此請教各位pb的前輩

------解決方案--------------------------------------------------------
基於 PFC 構造一個靈活通用的程序框架作 MIS 開發時,更多的精力要放在分析、理解及實現業務上,而且一般的 MIS 結構和要求也是 大同小異,如果構造了一個靈活通用的程序框架,就能很快進入核心業務的開發,極大地提高了你的 “生產效率” 。 以下就結合我的實際開發經驗:

一、總體考慮 程序框架既要靈活又要通用, 這就要求程序總控要儘量不涉及到具體的控制, 模塊儘量獨 立化。一般 MIS 需要考慮的主要是安全管理和操作命令項,而基於多用戶的系統,要滿足這 個要求,只能是通過數據庫存儲這些信息來實現。

二、安全管理

1、PFC 中提供了一套安全管理的模式,但不太實用,所以我另外設計了四個表: Security_Modules (ModuleId,ModuleName) PK: ModuleId //模塊 Security_Roles(RoleId,RoleName) PK: RoleId //角色 Security_RoleRights(RoleId,ModuleId,Rights) PK: RoleId,ModuleId //角色對應權限 Security_Users(UserId,UserDes,Password,RoleId) PK: UserId //用戶

2、定義一個非視化類:n_cst_securitymanager 用於安全管理,該類的定義如下: //Instance Variables: private: n_ds ids_Rights //存放指定 RoleId 對應每個模塊的權限 string is_UserId //當前用戶 Id Integer ii_RoleId //當前角色 Id //Member Functions: of_SetUserID(string as_UserId) Return (None) //設置當前用戶名 of_GetUserId() Return String //取當前用戶名 of_GetUserDes() Return string //取當前用戶描述名 of_LoadRights() Return Boolean //檢索當前用戶對應各模塊的權限 of_GetRoleName() Return String //取當前用戶角色名 of_GetRights(string as_ModuleName) Return Integer //返回當前用戶對應給定模塊的權限 of_GetRights(Integer ai_ModuleId) Return Integer //返回當前用戶對應給定模塊 Id 的權限 of_CanOpen(string as_ModuleName) Return Boolean //判斷當前用戶是否可以進入給定模塊 of_CanOpen(Integer ai_ModuleId) Return Boolean //判斷當前用戶是否可以進入給定模塊 of_CanWrite(string as_ModuleName) Return Boolean //判斷當前用戶在給定模塊是否有更改 的權限 of_CanWrite(Integer ai_ModuleId) Return Boolean //判斷當前用戶在給定模塊是否有更改的 權限

3、定義 n_cst_securitymanager 的全局變量 gnv_security,並在應用對象的 Open 事件中創建, 在 Close 事件中銷燬。

4、在登錄成功後調用 of_SetUserId 和 of_LoadRights。

5、實際上授權和用戶管理可以做成通用的模塊,如:

三、操作命令

1、我們的程序模塊通常由工作表(Sheet Window)、主窗體(Main Window)、對話盒(Reponse Window)構成,打開每個模塊,一般通過菜單命令實現,但 PB 的菜單不便於動態管理,而且 PB 的 MDI 結構分 PowerBar(對應主菜單)和 Toolbar(對應每個 sheet),所以要實現操作命令的 維護,tb無須再修改程序,可考慮其他形式。

2、定義一個表存放操作命令的相關信息,例如(你的可能不同,按需要而定) : AppCfg_OptrItems(ItemId,ItemName,ModuleId,GroupId,GroupName,WindowName,WindowTy pe,IconFileName) //WindowType 可爲 Sheet、Main 或 Response

3、表現形式: 菜單一般是具有層次的,但作爲操作命令,最好不要超過兩層,否則用戶可能嫌麻煩,要 通過修改數據庫中的數據的辦法以達到修改程序操作命令集的目的,通常可用 ListView、 TreeView 或 OutLook Bar(網上流行的 OutLook 風格的控件,稍作改造即可)等形式。下面 是後兩種形式的圖例:

4、窗口管理: 由於最好不要打開多個窗口實例, 並且用戶希望能夠通過單擊操作命令項切換到已經打開 的窗口上,所以要在你的 MDI Frame 窗口中定義一個tb結構體和幾個函數以管理窗口: //Structure: os_Sheet (你的可能不同) Window WindowVar String WindowName String ItemName //Window Functions: of_FindSheet of_RegisterSheet //在 Sheet Window 或 Main Window 的 Open 事件中註冊該窗口 of_RemoveSheet //在 Sheet Window 或 Main Window 的 Close 事件中註銷該窗口

5、打開窗口 定義一個非可視類 n_cst_windowopenarguments 以傳遞窗口參數。 把 ListView、TreeView 或 OutLook Bar 中用戶對操作命令選中的信息傳到 MDI Frame 窗 口的 Pfc_Open 事件中,在此事件中統一處理: (例子代碼: ) n_cst_windowopenarguments lnv_Arguments window integer lw_window li_Location lnv_Arguments=Message.PowerObjectParm If Isnull(lnv_Arguments.is_WindowName) Or Trim(lnv_Arguments.is_WindowName)="" Or & Isnull(lnv_Arguments.is_WindowType) Or Trim(lnv_Arguments.is_WindowType)="" Or & Isnull(lnv_Arguments.is_ItemName) Or Trim(lnv_Arguments.is_ItemName)="" Then Return End IF CHOOSE CASE lower(lnv_Arguments.is_WindowType) CASE "sheet" li_location=of_FindSheet(lnv_Arguments.is_WindowName,lnv_Arguments.is_ItemName) If li_location>0 Then iws_sheetlist[li_location].windowvar.SetFocus() Else Opensheetwithparm(lw_Window,lnv_Arguments.is_ItemName,lnv_Arguments.is_WindowName,this,0,Original!) End If Case "main" li_location=of_FindSheet(lnv_Arguments.is_WindowName,lnv_Arguments.is_ItemName) If li_location>0 Then if iws_sheetlist[li_location].windowvar.WindowState=Minimized! Then iws_sheetlist[li_location].windowvar.WindowState=Normal! End If iws_sheetlist[li_location].windowvar.SetFocus() Else Openwithparm(lw_Window,lnv_Arguments.is_ItemName,lnv_Arguments.is_WindowName,this) End If Case "response" Openwithparm(lw_Window,lnv_Arguments.is_ItemName,lnv_Arguments.is_WindowName) CASE ELSE //Do Nothing END CHOOSE 通過這種方式構造出來的程序框架結合你的風格和對 PFC 的擴展,相信你會成爲一隻“高產奶 牛”的! 以上僅作爲各位參考,如有錯誤,請指正,如有更好的方法,請賜教。 Seasouce 2000-12-06

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章