在数据库里建一个用户权限表(user_function)和用户表(user)关联 用户权限表(user_function)的字段,id(自动编号),userid(关联用户表使用),function(存放菜单关键字) 用户登陆时,取用户id(userid) 先设置所有菜单不可用 tmprs.open "select * from user_function where userid = '" & userid & "'",gcn,adopenkey if tmprs.RecordCount > 0 then select case tmprs.fields("function") case 功能名称 功能.visible = true case 功能名称 功能.visible = true case 功能名称 功能.visible = true .............................. end case end if
菜单(用数组) 单据处理(menu1,0) 数据分析(menu1,1) 生成送货单(menu2,0) 明细分析(menu3,0) 修改送货单(menu2,1) 汇总分析(menu3,1) Public Sub sccd() '根据权限生成菜单 On Error GoTo error1 Dim m As Integer, n As Integer dqqx = "" For m = 1 To 5 dqqx = Mid(qx, m, 1) If dqqx = "1" Then menu1(m - 1).Visible = True Else menu1(m - 1).Visible = False End If Next m n = Len(qx) For n = 6 To 8 dqqx = Mid(qx, n, 1) If dqqx = 1 Then menu2(n - 6).Visible = True Else menu2(n - 6).Visible = False End If Next n For n = 9 To 13 dqqx = Mid(qx, n, 1) If dqqx = 1 Then menu3(n - 9).Visible = True Else menu3(n - 9).Visible = False End If Next n
For n = 14 To 19 dqqx = Mid(qx, n, 1) If dqqx = 1 Then menu4(n - 14).Visible = True Else menu4(n - 14).Visible = False End If Next n
For n = 20 To 23 dqqx = Mid(qx, n, 1) If dqqx = 1 Then menu5(n - 20).Visible = True Else menu5(n - 20).Visible = False End If Next n
For n = 24 To 27 dqqx = Mid(qx, n, 1) If dqqx = 1 Then menu6(n - 24).Visible = True Else menu6(n - 24).Visible = False End If Next n qx为检索出的表中关于权限的记录(为0和1,例0111101110111) 第一个for循环为第一级菜单及单据处理这一极的,m的最大值为这一级菜单数据的下限,其它类推, 这种做法很简单,适合初学者,也很好判断,但是太死板,每次增加或是减少一个菜单都得改动源码和 for循环中的取值
做一个 用户-权限 对应表。超级用户可以定义其他用户的权限。保存在数据库里。
用户登陆时,将他的权限从数据库里读出保存在一个数组里。
用户点击菜单时,判断它是否有这个菜单的权限,没有的话弹出错误警告
权限定义界面:
http://zy954.3322.org/2.jpg
数据库中权限字段用一个varchar类型的,具体这个字段多大值根据你的软件权权限设定,管家婆中设定为varchar(500)
另外数据库中应添加一个权限组的表,先在程序中做权限组功能,再把登录用户添加到相应的权限组中。
每个权限可用0和1表示,当然也可以用空格,管家婆好像用的就是空格和1。
mod1:00011110010mod2:01001010......
先判断你在的大模块,在判断你所在的小模块
用户权限表(user_function)的字段,id(自动编号),userid(关联用户表使用),function(存放菜单关键字)
用户登陆时,取用户id(userid)
先设置所有菜单不可用
tmprs.open "select * from user_function where userid = '" & userid & "'",gcn,adopenkey
if tmprs.RecordCount > 0 then
select case tmprs.fields("function")
case 功能名称
功能.visible = true
case 功能名称
功能.visible = true
case 功能名称
功能.visible = true
..............................
end case
end if
登陆后 用SQL查询权限表
单据处理(menu1,0) 数据分析(menu1,1)
生成送货单(menu2,0) 明细分析(menu3,0)
修改送货单(menu2,1) 汇总分析(menu3,1)
Public Sub sccd() '根据权限生成菜单
On Error GoTo error1
Dim m As Integer, n As Integer
dqqx = ""
For m = 1 To 5
dqqx = Mid(qx, m, 1)
If dqqx = "1" Then
menu1(m - 1).Visible = True
Else
menu1(m - 1).Visible = False
End If
Next m
n = Len(qx)
For n = 6 To 8
dqqx = Mid(qx, n, 1)
If dqqx = 1 Then
menu2(n - 6).Visible = True
Else
menu2(n - 6).Visible = False
End If
Next n
For n = 9 To 13
dqqx = Mid(qx, n, 1)
If dqqx = 1 Then
menu3(n - 9).Visible = True
Else
menu3(n - 9).Visible = False
End If
Next n
For n = 14 To 19
dqqx = Mid(qx, n, 1)
If dqqx = 1 Then
menu4(n - 14).Visible = True
Else
menu4(n - 14).Visible = False
End If
Next n
For n = 20 To 23
dqqx = Mid(qx, n, 1)
If dqqx = 1 Then
menu5(n - 20).Visible = True
Else
menu5(n - 20).Visible = False
End If
Next n
For n = 24 To 27
dqqx = Mid(qx, n, 1)
If dqqx = 1 Then
menu6(n - 24).Visible = True
Else
menu6(n - 24).Visible = False
End If
Next n qx为检索出的表中关于权限的记录(为0和1,例0111101110111)
第一个for循环为第一级菜单及单据处理这一极的,m的最大值为这一级菜单数据的下限,其它类推,
这种做法很简单,适合初学者,也很好判断,但是太死板,每次增加或是减少一个菜单都得改动源码和
for循环中的取值