注册 登录
编程论坛 VB6论坛

跟大家请教一个设置权限问题

梦泽雨羲 发布于 2015-07-29 14:10, 861 次点击
跟大家请教一个问题
我做了一个登陆界面,登陆后判断用户权限。现在有一个问题,就是我在module中写了一个查询权限的函数,比如
'添加用户
 If Mid(str, 4, 1) = 1 Then
    Form_ = True
 Else
    Form_ = False
 End If

我只是需要让这个按键根据权限可用或者不可用,
现在的问题是,每次登陆,这个按键所在的窗体就会弹出来
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录
19 回复
#2
风吹过b2015-07-29 14:44
好吧,看了半天,没测试,只是想了一下。

你显式修改按钮属性,当这个按钮所在的窗体没有加载时,会导致该窗体隐式被加载。

权限控制,我的理解应该是保存到内存里的,而不是保存到控件属性里的。因为控件可能被删掉。

按你的 权限控制,建议使用 结构体来保存。
public type 权限控制结构
    系统管理 as boolen
    ........
end type

每次需要使用到这个功能时,在初始化进程中,读取这个结构,根据这个结构来初始化各个控件的属性。
#3
梦泽雨羲2015-07-29 15:14
回复 2楼 风吹过b
首先非常感谢版主的耐心解答,这个问题困扰我两天了一直没明白控件所在的窗体为啥会加载。
我想实现的效果是,不同人登陆,进去的是同一个窗体,只是权限不同,相应的控件是灰的不可操作,比如一般用户只能修改密码,不能删除用户
,版主能不能帮我分析下这个思路到底存在什么问题?
万分感谢
#4
wp2319572015-07-29 15:21
这个思路是没有问题的  你的权限表 是以何种形式存在的
#5
梦泽雨羲2015-07-29 15:30
回复 4楼 wp231957
是放在access用户表里的一串字符
只有本站会员才能查看附件,请 登录
#6
wp2319572015-07-29 15:34
那首先进入用户眼中的是一个登陆界面  然后验证密码同时根据用户权限去设置相应的按钮的  是否可用

在另某个窗体作为顶层显示时  隐藏其他窗体 或者注销其他窗体
#7
梦泽雨羲2015-07-29 15:39
回复 6楼 wp231957
对的,就是这样。用户登陆,同时检测权限,然后设置相应的控件属性。你的意思是在设置这些控件属性时,所在的窗体自动被加载了,我需要在主界面卸载该窗体,是吗?
我先去试试
非常感谢
#8
梦泽雨羲2015-07-29 17:15
回复 6楼 wp231957
只有本站会员才能查看附件,请 登录

我在登陆窗体事件中加了unload,达到了效果,但是发现了一个新问题
只有本站会员才能查看附件,请 登录

登陆
只有本站会员才能查看附件,请 登录

正常进入主界面,放了一个textbox显示当前用户的权限值,正常
只有本站会员才能查看附件,请 登录

进去菜单,正常
只有本站会员才能查看附件,请 登录

这个时候卸载主界面,进入管理界面,增加按键应该是不可控才对,取消,重新加载主界面
只有本站会员才能查看附件,请 登录

发现主界面重新加载后数据丢失了
只有本站会员才能查看附件,请 登录

一开始以为是变量的事,改成全局变量,还是一样

我感觉有点问题,但是又说不清,你能帮我分析一下吗
#9
风吹过b2015-07-29 17:44
使用模块的里定义的全局变量来 保存 权限数据。
这样的 定义的全局变量才不会受 窗体卸载 而造成 数据丢失。

在VB里存在 四种文件可以有代码。

OCX ,自定义控件
BAS ,模块,这里定义的全局变量才是整个工程可见的全局变量。
FRM ,窗体,这里定义的全局变量,是整个窗体可见的全局变量,当窗体不存在时,变量会被清除。
CLS ,类

你前面说的定义了全局变量,我感觉你是定义在 FRM 窗体里面,才会出现你所说的 数据丢失情况。
#10
梦泽雨羲2015-07-30 12:13
回复 8楼 梦泽雨羲
嗯,就是在模块里定义的全局变量
只有本站会员才能查看附件,请 登录
#11
风吹过b2015-07-30 15:11
你还是把完整的源代码发出来吧。这个看着图片,光靠部分代码的静太分析,猜不出来。

感觉是逻辑问题。
CheckQx 每次都是读数据库的,按理来说,这个函数不应该去读数据库。而应该是使用 已存在的数据进行权限判断。
在每次进行权限进行判断时,都应该要校验一下数据是否有效。

读数据库里的权限数据,应该是 登陆校验过后读取用户信息的事。
#12
wmf20142015-07-30 16:10
这个通常是设计好权限数据结构,设计按钮控件时按统一规格对按钮、菜单命名,基本上一句for each a in object即可按要求初始化你所有的按钮(菜单)亮、灰的状态,不超过10行代码即可。
#13
梦泽雨羲2015-07-30 17:35
回复 11楼 风吹过b
大神你帮我看看,谢了。

只有本站会员才能查看附件,请 登录
#14
wmf20142015-07-30 20:17
虽然不是求助于我的,但既然夸下海口了,还是帮你解答下,按我的构思,管理权限按钮的代码共9行(包括过程名、过程退出),如下:
Public Sub setqx(sF As Form)
  Dim a As Control
  For Each a In sF.Controls
    If Left(a.name, 3) = "ctl" Then
      a.Enabled = False
      If Val(Mid(str, Val(Right(a.name, 3)), 1)) = 1 Then a.Enabled = True
    End If
  Next
End Sub

以下为简单演示效果工程:
只有本站会员才能查看附件,请 登录

#15
风吹过b2015-07-31 09:44
一、CheckQx 这个函数,我走的是另一个方向的,只负责读取权限
'权限检测
Public Function CheckQx(name As String)
 Dim rs1 As New ADODB.Recordset
 'Dim str As String
 Set rs1 = conn.Execute("Select quanxian From yonghu Where name='" & name & "'")
 str = rs1("quanxian")
 
 Const 权限长度 = 12                '权限字段所需要的最小长度,不足部分用 0 填充
 
 If Len(str) < 权限长度 Then
    str = str & String(权限长度 - Len(str), "0")
 End If
 
 '以下代码移动到 form_main 的 Form_load 中。
 
' Form_main.Text1.Text = str

' '系统管理√
' If Mid(str, 1, 1) = 1 Then
'    Form_main.toolbar_sys.Enabled = True
' Else
'    Form_main.toolbar_sys.Enabled = False
' End If
....

二、对于权限判断,
因为你的对控件的权限操作的,所以,设置控件的代码移到  form_main 的 Form_load 中。

'设置控件状态代码移至此处

Form_main.Text1.Text = str

 '系统管理√
 If Mid(str, 1, 1) = 1 Then
    Form_main.toolbar_sys.Enabled = True
 Else
    Form_main.toolbar_sys.Enabled = False
 End If
 
 '权限管理√
 If Mid(str, 2, 1) = 1 Then
    Form_main.toolbar_qx.Enabled = True
 Else
    Form_main.toolbar_qx.Enabled = False
 End If
 
 '用户管理√
 If Mid(str, 3, 1) = 1 Then
    Form_main.toolbar_user.Enabled = True
 Else
    Form_main.toolbar_user.Enabled = False
 End If
....


三、再说你原来的代码:
登陆部分:
   '检测权限
  CheckQx (Text_name.Text)        '如果按你原来的代码,这里设置 Form_main 的属性,就会导致 form_main 隐性加载
  Unload Me                       '把自己干掉后,因为后面还有需执行的代码,会导致自己又隐性加载
  Unload Form_guanliuser
  Load Form_main

    Form_ = True         '调试发现,你这句又导致 Form_guanliuser 被隐性加载,并且显示出来了。

总结:逻辑混乱,真的属于初学者。对于整个系统的实现,没有任何规划,而是想到那里做到哪里,和我新手时一样一样。
#16
风吹过b2015-07-31 10:03
总体规划:
你首先要实现在是 一个总体规划。
这个权限控制怎么读取,存储,判断。

读取,和存储: 现在改后的 代码就可以用了。你存为全局变量,这个也没问题。
判断:你判断里有问题。
问题在于你的判断应该是分散判断,而不是集中设置控件状态就可以了。
设置控件是在每个窗体载入时,判断一次。

修改建议:
1、增加一个枚举数据和一个函数:
程序代码:
Public Enum 权限序号
    系统管理 = 1
    权限管理 = 2
    用户管理 = 3
    添加用户 = 4
    删除用户 = 5
    修改用户 = 6
    档案管理 = 7
    档案添加 = 8
    档案删除 = 9
    档案编辑 = 10
    档案保存 = 11
    档案打印 = 12
End Enum

 
Public Function CheckQx2(wz As 权限序号) As Boolean
If Mid(str, wz, 1) = 1 Then
    CheckQx2 = True
Else
    CheckQx2 = False
End If
End Function


2、调用方式可以大改变了。
程序代码:
Private Sub Form_Load()
Unload Form_guanliuser
Unload Form_adduser
'设置控件状态代码移至此处
Form_main.Text1.Text = str
'toolbar_sys.Enabled = CheckQx2(系统管理)           '这行不建议
toolbar_qx.Enabled = CheckQx2(权限管理)
toolbar_user.Enabled = CheckQx2(用户管理)
end sub

简洁吧

另一个窗体:
程序代码:
Private Sub Form_Load()
Dim rs1 As New ADODB.Recordset
rs1.CursorLocation = adUseClient
rs1.Open "select num,name from yonghu", conn  ''打开数据表
Set DataGrid1.DataSource = rs1
DataGrid1.Refresh
Command1.Enabled = CheckQx2(添加用户)
Command2.Enabled = CheckQx2(删除用户)
Command3.Enabled = CheckQx2(修改用户)
End Sub


二次判断:
如添加用户窗体载入时,就判断一下。
Private Sub Form_Load()
If Not CheckQx2(添加用户) Then
    MsgBox "你无权进行该操作", vbCritical
    Unload Me
End If
End Sub
#17
梦泽雨羲2015-07-31 10:32
回复 14楼 wmf2014
嗯啊,非常感谢,通过调试,发现效果跟我预期要实现的是一样的,同时让我认识到我这种权限设计的思路局限还是挺大,不过暂时满足我目前的需求了。再次感谢
#18
梦泽雨羲2015-07-31 10:44
回复 16楼 风吹过b
感谢版主帮我理清思路,确实是这样,新手加业余,哈哈。我是自动化搞电子的,之前写代码都是单片机C,面向过程的,想要什么功能写函数就完了,现在做管理 了,发现因为部门工作性质的原因,会产生超级多的记录、报告、证书啥的需要长期保存。闲暇之余就想自己做一个管理系统。一边学、一边锻炼、一边做,确实是想到哪就做到哪。
#19
风吹过b2015-07-31 10:57
说实在,我看VB,还是喜欢按 面向过程去看待。
所以我对函数功能要求比较专一,该做什么就做什么,其他事就再做过个函数。

程序的内核都是面向过程,只是在面向过程的情况下,系统帮你组织了一下,让它像是面向对象而以。
VB是面向对象的,但所以的对象之间的连接,还都是一个一个的函数连接起来的。

面向对象,仅仅是让人更好更快的阅读代码流程,而最终写代码还是对向过程。

在单片机中,没有操作系统,所以的系统调度都要自己考虑,在现在高级语言中,很多调度工作系统已做好了,就只要按照系统的调度去写就行了。
记住一点,对象不使用时,就不要去碰它,对象使用时,就先初始化。

-------------------------------------
关于 mdi 模式窗口程序,提个建议。

菜单,主窗口上是需要的。虽然做到子窗口里,可以做到换窗口,菜单就换了,
但当子窗口都关闭后,那光突突的主窗口怎么办,菜单没有,按钮没有,就有关闭一条路了??
#20
梦泽雨羲2015-07-31 11:14
回复 19楼 风吹过b
-------------------------------------
关于 mdi 模式窗口程序,提个建议。

菜单,主窗口上是需要的。虽然做到子窗口里,可以做到换窗口,菜单就换了,
但当子窗口都关闭后,那光突突的主窗口怎么办,菜单没有,按钮没有,就有关闭一条路了??

----------------------------------
对的对的,这两天意识到这个问题了,但是最近一直纠结权限这个事,还没有功夫去改它。
受教了
1