| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 861 人关注过本帖
标题:跟大家请教一个设置权限问题
只看楼主 加入收藏
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:0 
你还是把完整的源代码发出来吧。这个看着图片,光靠部分代码的静太分析,猜不出来。

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

读数据库里的权限数据,应该是 登陆校验过后读取用户信息的事。

授人于鱼,不如授人于渔
早已停用QQ了
2015-07-30 15:11
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
这个通常是设计好权限数据结构,设计按钮控件时按统一规格对按钮、菜单命名,基本上一句for each a in object即可按要求初始化你所有的按钮(菜单)亮、灰的状态,不超过10行代码即可。

能编个毛线衣吗?
2015-07-30 16:10
梦泽雨羲
Rank: 2
等 级:论坛游民
帖 子:14
专家分:20
注 册:2015-7-29
收藏
得分:0 
回复 11楼 风吹过b
大神你帮我看看,谢了。

复件 hh.zip (289.1 KB)
2015-07-30 17:35
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:7 
虽然不是求助于我的,但既然夸下海口了,还是帮你解答下,按我的构思,管理权限按钮的代码共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

以下为简单演示效果工程:
复件 hh.rar (266.48 KB)


能编个毛线衣吗?
2015-07-30 20:17
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:1 
一、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 被隐性加载,并且显示出来了。

总结:逻辑混乱,真的属于初学者。对于整个系统的实现,没有任何规划,而是想到那里做到哪里,和我新手时一样一样。

授人于鱼,不如授人于渔
早已停用QQ了
2015-07-31 09:44
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:9 
总体规划:
你首先要实现在是 一个总体规划。
这个权限控制怎么读取,存储,判断。

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

修改建议:
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

授人于鱼,不如授人于渔
早已停用QQ了
2015-07-31 10:03
梦泽雨羲
Rank: 2
等 级:论坛游民
帖 子:14
专家分:20
注 册:2015-7-29
收藏
得分:0 
回复 14楼 wmf2014
嗯啊,非常感谢,通过调试,发现效果跟我预期要实现的是一样的,同时让我认识到我这种权限设计的思路局限还是挺大,不过暂时满足我目前的需求了。再次感谢
2015-07-31 10:32
梦泽雨羲
Rank: 2
等 级:论坛游民
帖 子:14
专家分:20
注 册:2015-7-29
收藏
得分:0 
回复 16楼 风吹过b
感谢版主帮我理清思路,确实是这样,新手加业余,哈哈。我是自动化搞电子的,之前写代码都是单片机C,面向过程的,想要什么功能写函数就完了,现在做管理 了,发现因为部门工作性质的原因,会产生超级多的记录、报告、证书啥的需要长期保存。闲暇之余就想自己做一个管理系统。一边学、一边锻炼、一边做,确实是想到哪就做到哪。
2015-07-31 10:44
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:0 
说实在,我看VB,还是喜欢按 面向过程去看待。
所以我对函数功能要求比较专一,该做什么就做什么,其他事就再做过个函数。

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

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

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

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

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

授人于鱼,不如授人于渔
早已停用QQ了
2015-07-31 10:57
梦泽雨羲
Rank: 2
等 级:论坛游民
帖 子:14
专家分:20
注 册:2015-7-29
收藏
得分:0 
回复 19楼 风吹过b
-------------------------------------
关于 mdi 模式窗口程序,提个建议。

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

----------------------------------
对的对的,这两天意识到这个问题了,但是最近一直纠结权限这个事,还没有功夫去改它。
受教了
2015-07-31 11:14
快速回复:跟大家请教一个设置权限问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017521 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved