请选择 进入手机版 | 继续访问电脑版
查看: 1235|回复: 0

[分享] 如何实现Web系统菜单

[复制链接]

46

主题

47

帖子

226

积分

超级版主

Rank: 8Rank: 8

积分
226
发表于 2019-8-16 13:31:52 | 显示全部楼层 |阅读模式
本帖最后由 Alisa 于 2019-9-17 13:56 编辑

在介绍如何实现菜单之前,先说明我们在系统中有很多的菜单控件,常用的为DvelopMenu 。 在系统中我们在WorkWithPlusMasterPage页面中获取菜单数据,然后进行加载。
DvelopMenu 使用了如下图所示的SDT,所以本质上,我们是基于这个SDT结构往其中添加数据。




在Web系统菜单实现有两种方式


方法1.菜单从数据库动态获取,根据登录用户从数据库取不同的菜单集合
a. 建立一个transaction 存储菜单信息,其中使用到了Subtype ,因为我们的菜单是有上下级的。


b. 建立transaction 存储角色数据,角色菜单数据,角色用户数据。实质上我们是寻找登录用户的菜单数据,但是如果每个用户我们都去存储对应的用户菜单数据,会造成此表数据
非常多,因此使用角色数据,角色菜单数据,角色用户数据去进行存储。 先理解:每个用户都拥有角色,角色都有对应的菜单,因此只要找到这个角色信息,就可以通过角色拥有的
菜单数据找到用户的菜单数据。




c. 建立procedure :“Proc_GetDVelop_Menu” 去获取菜单数据,其中Rule 中:parm(in:&pSubMenuInfoID,in:&vLoginUser,out:&oDVelop_Menu);
其中传入参数“&pSubMenuInfoID” 表示最上级菜单编号,“&vLoginUser” 表示从登录中获取的用户信息, 传出参数:&oDVelop_Menu 的datatype 为DVelop_Menu 也就是第一张图片上的sdt。
对应代码如下:





红线标注说明:循环调用获取菜单的方法,直到无法找到最后一个层级的菜单。
另外代码中还调用了另一个 Procedure:“Proc_CheckMenuByUser” 去判断当前菜单是否属于这个用户。
Rule:parm(in:&pMenuInfoID,in:&vLoginUser,out:&oResult);  
&pSubMenuInfoID
” 表示最上级菜单编号,“
&vLoginUser
” 表示从登录中获取的用户信息,传出参数
“&oResult” 为boolean 类型,表示返回true or false
代码如下



通过c 步骤就可以获取到当前登录用户的菜单数据



d .在workwithplusmasterpage 中调用procdure 去加载数据,如红线标注,第一句表示的是从websession 中获取用户的信息如主键等。



关于Proc_GetGoodTekLoginInfo:这是获取登录信息的方法;
登陆时,先验证登录信息是否正确,如果正确,就将所有信息存入session
其中Proc_CheckGoodTekLogin如下:

然后在MasterPage中需要通过获取登录信息来验证当前用户是否登录或是否登录超时,如果未获取到登录信息,则代表用户未登录或登录超时,
需要重新登陆,也就是我们图中的这个方法Proc_GetGoodTekLoginInfo:



方法2.菜单是通过DataProvider写死的时候,可以多写几个不同的菜单,根据角色的不同,显示不同的DataProvider






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|GeneXus中国

GMT+8, 2019-10-14 12:50 , Processed in 0.096480 second(s), 19 queries .

 

© 2019 GeneXus中国

快速回复 返回顶部 返回列表