看看这个方法是否可以
--------------------------
1、 权限管理表单设计
SYSTEM_PRIVILEGES:记录系统中所有需要进行权限设置的菜单或按钮的信息。
表单结构如下:
ITEM_CHILD,NAME_CHILD,W_CHILD,PRIVILEGE,NAME_PARENT,W_PARENT
说明如下:
ITEM_CHILD:
整个权限表在程序中将以TREEVIEW形式显示,该字段存储菜单或按钮的显示名称,如:成品入库单(菜单),新增(按钮)等.
NAME_CHILD:
记录菜单或按钮的NAME属性.如:M_CPRK(菜单),B_ADD(按钮)
W_CHILD:
记录菜单或按钮所在的WINDOW的NAME属性.
W_CHILD字段和NAME_CHILD字段唯一决定了一个菜单或按钮.(因为不同的窗口上的按钮或菜单的NAME属性可能相同,而WINDOW的NAME属性在整个程序中是唯一的)
PRIVILEGE
读取用户权限时使用,见后述
NAME_PARENT
对菜单或按钮的含义有所不同,分别叙述如下:
菜单:
菜单的NAME属性,NAME属性为NAME_CHILD的菜单由它直接展开.
按钮:
按钮的NAME属性,NAME属性为NAME_CHILD的按钮所在的WINDOW由它直接打开.
W_PARENT
NAME属性为NAME_PARENT的按钮或菜单所在的WINDOW
整张表由NAME_PARENT,W_PARENT相关联,构成一个TREEVIEW数据结构,这样菜单的级数和窗口的嵌套层数没有任何限制可以进行任意的权限设置
示例数据如下:
ITEM_CHILD ,NAME_CHILD, W_CHILD, NAME_PARENT, W_PARENT, STYLE
业务部 BUSS_DEPT W_MAIN M
工程部 ENG_DEPT W_MAIN M
业务信息 BUSS_INFO W_MAIN BUSS_DEPT W_MAIN M
材料入库 MAT_IN W_MAIN ENG_DEPT W_MAIN M
新增 ADD W_INFO BUSS_INFO W_MAIN M
删除 DELETE W_INFO BUSS_INFO W_MAIN B
修改 MODIFY W_INFO BUSS_INFO W_MAIN B
查询 QUERY W_INFO BUSS_INFO W_MAIN B
新增 ADD W_IN MAT_IN W_MAIN B
删除 DELETE W_IN MAT_IN W_MAIN B
修改 MODIFY W_IN MAT_IN W_MAIN B
查询 QUERY W_IN MAT_IN W_MAIN B
帐目查询 ACCOUNT_QUERY W_ACCNT QUERY W_INFO B
其它查询 OTHERS_QUERY W_ACCNT QUERY W_INFO B
因[业务部]和[工程部]是系统主窗口W_MAIN的顶级菜单,故其无NAME_PARENT及W_PARENT
则该表数据在TREEVIEW中显示如下
财务部
业务信息
新增
删除
修改
查询
帐目查询
其它查询
工程部
材料入库
新增
删除
修改
查询
注:
上面图中项目前都有一个CHECKBOX
USER_PRIVILEGES
该表记录系统用户所具有的权限,结构如下
USER_ID, NAME_CHILD ,W_CHILD
USER_ID:系统用户的识别码
NAME_CHILD:系统用户所具有的权限项目的NAME属性,与SYSTEM_PRIVILEGES中的NAME_CHILD相对应
W_CHILD:系统用户所具有的权限项目所在WINDOW的NAME属性,与SYSTEM_PRIVILEGES中的W_CHILD相对应.
2、权限管理
系统权限管理的画面为WINDOW左右两边各是一个TREEVIEW控件,左边是系统用户的组织结构图,右边是系统权限表
点击左边TREEVIEW中的任何一个用户,则右边TREEVIEW中将显示该用户所具有的权限,若该用户具有某个权限,则该项目左边的CHECKBOX将被选中,否则相反.
权限读取过程如下:
首先系统获取选中用户的USER_ID(UID),其次从USER_PRIVILEGES表中读取USER_ID为UID的权限,每读取一项,就把SYSTEM_PRIVILEGES中NAME_CHILD,W_CHILD与USER_PRIVILEGES中的NAME_CHILD,W_CHILD相同的记录的PRIVILEGE设置为1,全部设定完毕之后,右边的TREEVIEW从SYSTEM_PRIVILEGES中读取所有记录,若该记录的PRIVILEGE的值为1,则该项目左边的CHECKBOX将处于被选中状态,也就意味着该用户具有该项权限.
权限设置(修改)如下:
若想让该用户具有某项权限,则将TREEVIEW中该项目左边的CHECKBOX选中,否则不选中.设置完毕之后,点击确认,则系统首先在USER_PRIVILEGES表中把USER_ID与当前需设置(修改)权限的USER_ID相同的权限全部删除,然后遍历权限TREEVIEW,若项目被选中,则在USER_PRIVILEGES中插入该项目.
2、 权限设置
用户登录系统后,则该用户的USER_ID将被记录在一个全局变量中(假定为UID).该用户打开任何一个WINDOW(通过菜单项或按钮),则系统将进行如下操作,
1、 判断该WINDOW是否具有菜单,若有,则遍历该菜单,每遍历一个菜单项,则记录该菜单项的NAME(M_NAME)属性,随同该菜单项所在WINDOW的NAME(W_NAME)属性,到SYSTEM_PRIVILEGES中查找NAME_CHILD为M_NAME,W_CHILD为W_NAME的项目,若未找到,则说明该项目无需通过权限控制,略过该项目,继续遍历.否则,到USER_PRIVILEGES中查找NAME_CHILD为M_NAME,W_CHILD为W_NAME的记录.若找到,则说明该用户具有该权限,则设置该菜单项为可见.否则,设置该采单项为不可见.
2、 遍历该WINDOW中的所有BUTTON,设置过程同上.
注:若用户不具有某菜单项或按钮的权限,则必须标志该菜单或按钮的某个属性(假设为
)为FALSE,因为有些菜单项或按钮的VISIBLE属性会在程序中改变.例如,通常在进入一个WINDOW中时,该WINDOW的ADD若可用的话,则DELETE,MODIFY通常为不可用。若该用户不具备DELETE,MODIFY权限,则DELETE,MODIFY应始终不可见,但当用户新增记录并存盘成功时,通常会程序中改变DELETE,MODIFY的状态,这时这几个按钮将不仅可见而且可用,致使权限设置失效。所以若设置用户不具备权限的菜单或按钮的P属性为FALSE,则在设置菜单或按钮的状态时,应先判断该菜单或按钮的P属性,若为FALSE则不改变该菜单或按钮的状态,使权限设置可以始终有效地工作。
该模块对菜单的级数或窗口的嵌套深度无任何限制.只要在SYSTEM_PRIVILEGES中设置好数据权限权限设置就能有效地工作.若系统中新增或删除任何功能,只需修改SYSTEM_PRIVILEGES中相应的数据即可,而无须对本权限设置模块进行任何修改,方便了系统的维护.