本帖最后由 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
|