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

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

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

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

一、用户表(user_pass表)的设计

微信截图_20210225103935.png

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

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

微信截图_20210225103058.png

微信截图_20210225103211.png

三、权限表(RoleRight表)的设计

微信截图_20210225104125.png

我们用一个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

查询结果如下

微信截图_20210225104913.png

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

四、菜单权限的加载

表单的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)属性。

微信截图_20210225105341.png

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

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

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

22.jpg

VFP 目前可以开发 CS BS APP 微信公众号 微信小程序 中间层。具有支付组件,短信组件,OSS组件。

用VFP混合一切,MIX ALL。

想了解更多,请关注加菲猫的VFP。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加菲猫的VFP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值