在VFP制作的菜单中,有一个属性叫跳过(skip),可以利用它来实现菜单的开闭。
我们来做一个最简单的菜单权限设计:
需设计数据表:用户表,菜单表,用户菜单权限表
一、用户表(user_pass表)的设计
二、菜单表和菜单(rights表)的设计如下图:
菜单description相当于菜单设计器的提示(菜单名),但可以多个菜单名对应一个description。
三、权限表(RoleRight表)的设计
我们用一个SQL语句来查看用户id=1 的菜单权限的设置情况
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事件加载如下代码
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.即关闭
这样菜单权限就开发完成了,代码量极少,简单高效。
目前是针对一个一个用户来设置权限,当然我们也可以引用角色或组的概念,以后人员增加设置权限的工作量就会减少非常多。
VFP 目前可以开发 CS BS APP 微信公众号 微信小程序 中间层。具有支付组件,短信组件,OSS组件。
用VFP混合一切,MIX ALL。
想了解更多,请关注加菲猫的VFP。