用VB動態(tài)生成不同使用權(quán)限的菜單
發(fā)表時間:2023-08-22 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]馬廣焜,陳世東,黃有群 在筆者開發(fā)的一個多用戶協(xié)同工作的軟件中,多個用戶需共用一窗體及其上的菜單,但不同級別的用戶對菜單的使用權(quán)限是不同的,而用戶的組成與身份都是動態(tài)的,為此,筆者開發(fā)了一個程序,...
馬廣焜,陳世東,黃有群
在筆者開發(fā)的一個多用戶協(xié)同工作的軟件中,多個用戶需共用一窗體及其上的菜單,但不同級別的用戶對菜單的使用權(quán)限是不同的,而用戶的組成與身份都是動態(tài)的,為此,筆者開發(fā)了一個程序,讓管理員以可視化的方式在用戶初次登錄時分配該用戶可用的菜單項,來控制用戶的使用權(quán)限,所以用戶可以根據(jù)登錄時分配的權(quán)限使用菜單不同的選項。本文以產(chǎn)品結(jié)構(gòu)管理系統(tǒng)為例,介紹一下具體的工作。
一.?dāng)?shù)據(jù)庫的設(shè)計及介紹
該程序需要三個數(shù)據(jù)庫表的支持。用戶的注冊信息在t_register表中存放,表t_privilege用來存儲用戶的別名和它可用菜單項的名稱和代號,而把窗口上的所有菜單項放在一個叫t_menu的表中。三個表的結(jié)構(gòu)和說明如下:
name字段表示用戶的真實名字,password字段表示用戶的密碼,nickname字段表示用戶的別名,別名的使用是為了防止用戶的重名,別名應(yīng)該是唯一的。
nickname字段表示用戶的別名,usemenuname表示菜單項的名稱 ,usemenu表示菜單項的標(biāo)題,id字段表示此菜單項在表t_menu中的id號。
id字段表示菜單項的記錄號,mcaption字段表示菜單項的標(biāo)題 ,mname字段表示菜單項的名稱。舉例來說,在筆者開發(fā)的軟件中,應(yīng)用界面的菜單有5項,標(biāo)題分別為文件、編輯、系統(tǒng)維護(hù)、窗口、幫助,名稱為mnumain,索引值為0,1,2,3,4。數(shù)組n(0),n(1),n(2),n(3),n(4)分別代表這5項應(yīng)用界面菜單各包含的子菜單數(shù)。它們的子菜單名稱分別為mnufile,mnuedit,mnuwh,mnuwindow,mnuhelp,不同的子菜單各設(shè)置不相干擾的的索引值。例如:在“文件”菜單項下的”打開”子菜單項,名稱為mnufile,索引值為0,”退出”子菜單項,名稱為mnufile,索引值為2,在“編輯”菜單項下的”產(chǎn)品結(jié)構(gòu)展開”子菜單項名稱為mnuedit,索引值為0。
二.工作流程
用戶第一次注冊后,管理員設(shè)置用戶可用的菜單項,設(shè)置的界面如圖1。左邊組合框1列出t_register表中已注冊的所有用戶別名,列表框2列出表t_menu中name字段的內(nèi)容,即應(yīng)用界面菜單中所有的菜單項。管理員可以在組合框1中選擇用戶,然后在列表框2中選擇該用戶可用的菜單項,選中的菜單項被移到列表框3中。如果選擇了不需要的菜單項,則雙擊列表框3中的已選項使其還原到列表框2中。按完成按鈕后,用戶別名和該用戶可用的菜單項的名稱、標(biāo)題和其在t_menu表中的id號分別被存入表t_privilege中的nickname、usemenu、usemenuname和id字段。
用戶設(shè)置完成之后,已注冊的用戶可以登錄了。用戶輸入別名和密碼后,用表t_register進(jìn)行驗證,通過后,從表t_privilege中找出與此用戶別名相同的所有記錄中usemenuname字段中的值記錄的值,即找到可用的菜單項。再把這些可用項在應(yīng)用界面的菜單中的的Enable屬性設(shè)置為True(缺省為False)。
對已分配菜單使用權(quán)限的用戶,登錄后,系統(tǒng)處理給該用戶的菜單功能的分配。這里,定義了一個記錄集myrs,myrs為t_privilege表中nickname字段的值等于輸入用戶別名的所有記錄。筆者先在模塊中定義一個Init函數(shù),它根據(jù)菜單各菜單項的數(shù)量設(shè)置的數(shù)組個數(shù),而數(shù)組的值是每一個菜單項的子菜單項個數(shù),這樣子菜單中的項可以任意的添加,只需改動數(shù)組的值。在本文的例子里,設(shè)置如下:
Public Function init()
……
c=5 ‘c為應(yīng)用界面菜單中的菜單項個數(shù)
n(0) = 3
n(1) = 4
n(2) = 3
n(3) = 4
n(4) = 2
m(0) = n(0) ‘?dāng)?shù)組m(i)是第i子菜單項與第0,1,i-1子菜單項的個數(shù)和
For i = 1 To c – 1
m(i) = m(i - 1) + n(i)
Next
End Function
然后,處理菜單的具體程序如下:
……
Set myrs = New ADODB.Recordset
……
‘菜單處理
myrs.Open "select * from t_privilege where nickname='" & nickname & "'", cnn2, adOpenDynamic, adLockBatchOptimistic ‘用只讀方式打開t_privilege表中的 nickname字段中等于輸入別名的所有記錄
‘用只讀方式打開t_menu表
k = myrs.RecordCount ‘k為打開的記錄數(shù)目
Init ‘Init 為初始化數(shù)組的函數(shù)
For i = 1 To k
t = myrs ("id") ‘t為匹配記錄的記錄號
‘下面為t所在記錄的菜單項索引值,找到所它所連接的菜單項后,把其enable屬性設(shè)為True,即此菜單項為可用
If t > m(4) Then
MsgBox "出現(xiàn)錯誤 !"
ElseIf t > m(3) Then
j = t - m(3)
Form1.mnuhelp.Item(j - 1).Enabled = True
ElseIf t > m(2) Then
j = t - m(2)
Form1.mnuwindow.Item(j - 1).Enabled = True
ElseIf t > m(1) Then
j = t - m(1)
Form1.mnuwh.Item(j - 1).Enabled = True
ElseIf t > m(0) Then
j = t - m(0)
Form1.mnuedit.Item(j - 1).Enabled = True
Else: j = t
Form1.mnufile.Item(j - 1).Enabled = True
End If
myrs.MoveNext
Next
……
三.效果圖
在應(yīng)用界面的菜單中,選定的菜單項為可見,其余沒有選定的菜單項為不可見。用戶“湘湖”登錄以后,其中“打開”、“重新登錄”、“退出”、“XML文檔結(jié)構(gòu)展開”、“XML文檔編輯”子菜單項在圖1中已經(jīng)選定,在“系統(tǒng)維護(hù)”菜單下,“XML文檔結(jié)構(gòu)展開”、“XML文檔編輯”子菜單項為可用,而“產(chǎn)品結(jié)構(gòu)展開”、“產(chǎn)品結(jié)構(gòu)錄入”子菜單項為不可用.
本文所提的方案在WINDOWS 98環(huán)境下,通過VB 6.0 和ACCESS 97 調(diào)試成功。