只需22行代码,加载菜单权限不要太简单

2021-08-16 15:07:08 浏览数 (1)

在VFP制作的菜单中,有一个属性叫跳过(skip),可以利用它来实现菜单的开闭。

我们来做一个最简单的菜单权限设计:

需设计数据表:用户表,菜单表,用户菜单权限表

一、用户表的设计

二、菜单表和菜单的设计如下图:

菜单description相当于菜单设计器的提示(菜单名),但可以多个菜单名对应一个description。

三、权限表的设计

我们用一个SQL语句来查看用户id=1 的菜单权限的设置情况

代码语言:javascript复制
select description,isnull(enabled,0) enabled,userid from rights left join  
(SELECT a1.userid,right_id, enabled FROM RoleRight
 inner join  
(
select  id userid from user_pass where USER_PASS.id=1
) a1
on RoleRight.userid=a1.userid
)  b1  on Rights.id=right_id

查询结果如下

用了左连接是因为菜单表以后随时会增加,这样查询就会将新增加的菜单项的设置项也全部展现出来,防止出现找不到权限的情况。

四、菜单权限的加载

表单的LOAD事件加载如下代码

代码语言:javascript复制
TEXT TO lcSQLCmd NOSHOW TEXTMERGE
select description,isnull(enabled,0) enabled,userid from rights left join  
(SELECT a1.userid,right_id, enabled FROM RoleRight
 inner join  
(
select  id userid from user_pass where USER_PASS.id=1
) a1
on RoleRight.userid=a1.userid
)  b1  on Rights.id=right_id
ENDTEXT
oDBSQLhelper=Newobject("MSSQLHelper","MSSQLHelper.prg")
If oDBSQLhelper.SQLQuery(lcSQLCmd,"main_menus")<0
    Messagebox(oDBSQLhelper.errrmsg)
    Return .F.
Endif
*--表变成对象(表的纵向记录变成了横向属性,*--方便菜单权限控制,简单高效)Select main_menus
oMenus=Createobject("empty")
Scan
    AddProperty(oMenus,Alltrim(description),enabled)
Endscan
AddProperty(_screen,"oMenus",oMenus)  &&将属性添到_screen

这里面用的技巧就是表的纵向记录变成对象的横向属性,从而很方便地设置跳过(skip)属性。

也就是用户权限表中 description.enabeld=.t. 即开启,=.f.即关闭

这样菜单权限就开发完成了,代码量极少,简单高效。

目前是针对一个一个用户来设置权限,当然我们也可以引用角色或组的概念,以后人员增加设置权限的工作量就会减少非常多。角色或组的引入,请期待下篇更新。

0 人点赞