5.1.太极平台框架—菜单设置

1.概述

太极平台框架配置出来的后台系统,页面采用左右布局。左边放置导航菜单,右边是具体内容页面。点击左右导航菜单,右边加载相应菜单的数据。菜单设置功能,则是设置左边的导航菜单。如下图所示,为导航菜单的样例(奇点OA系统)。

目前框架菜单采用树状结构,最多支持两级结构,不支持两级以上菜单。经过多个项目演练,发现菜单达到三级时,既不方便操作(要多次展开菜单),也不够分级明显(界面UI上两级三级不太明显,如果三级缩进太多,又会导致左边页面占用太宽)。

2.使用设置

2.1.菜单管理

在框架管理后台,进入项目的菜单管理,可以看到当前项目的菜单结构。如下图所示。

2.1.1.菜单名称

菜单可以设置到两级,在列表上,通过缩进进行展示。菜单名称就是显示在系统左边的名称。

2.1.2.链接URL

链接URL指定点击菜单后,加载哪个页面地址。链接的URL地址,分3种情况:

1)组件的调用路径

在组件列表中,可以看到“调用路径”,如下图所示,这个就是当前组件的访问URL。在菜单中配置该URL路径,或者在其他地方调用(超链接加载等),就会加载该组件的数据。

2)模块的调用路径

在模块管理的列表页面,可以看到有“调用路径”。在菜单中,或者其他列表页面,加载该路径时,就会调用该模块的页面数据。

3)外部链接URL

不是框架自身创建的组件和模块,而是其他链接页面。那么链接的URL,根据页面的实际访问路径进行设置。比如在项目中单独写了页面,点击后,就会加载独立的页面。

注意:如果是内嵌到框架页面里面,单独的页面只需要中间部分,不需要头部head和尾部部分。因为框架是一个单页面应用,通过局部加载的方式,把页面加载的DIV中。

如下图所示,是外部链接URL的样例。如果是外部链接URL,注意权限字符串需要自己设置。

2.1.3.打开方式

链接打开方式分为4种:

1)无响应

如果一级菜单有子项,一般会将一级菜单设置为无响应。这样点击后,只会展开和合并子项菜单,不会进行其他行为操作。如果设定为其他类型,那么除了展开子项后,也会执行其他行为。

2)AJAX加载

90%以上的页面,都会设置为AJAX加载。就是点击左边菜单,在右边加载菜单链接。

其内部实现原理,是使用JS的ajax去加载远程链接。成功获取数据后,填充到中间内容(id为page-center的div区域)的div里面。如下图所示,是加载成功后的中间div源码图。

3)新页面

设定为新页面后,点击左边菜单,会打开一个新的web页面,在新页面去加载链接URL。一般用于要独立显示一个页面数据,而不是内嵌到当前框架页面中。

如下图所示,当设定为新页面打开后,菜单会直接采用HTML自带的超链接href属性,以及target属性为“_blank”来实现。

4)弹框

设定为弹框后,会在当前页面以弹框的形式展示内容。如下图所示,是一个弹框效果。

2.1.4.权限字符串

权限字符串,用于判断当前用户是否有权限使用某个菜单功能。权限字符串的使用,有很多细节点需要注意。

  1. 菜单的权限字符串,只负责菜单的显示和隐藏。在加载菜单项时,会根据角色进行权限验证。当角色有某个菜单的权限时,就会显示该菜单;没有权限,则不会显示该菜单。至于该菜单所链接的URL页面,是否有同样的权限,则是另外一回事。
  2. 菜单的权限字符串,要与设定的链接URL(组件、模块或自定义页面)的页面权限字符串,保持一致。否则就会出现上面第一条说的问题:要么菜单可见,点击后页面提示无权限;要么菜单不可见,但通过直接访问URL却有权限(这样有严重的安全隐患)。
  3. 框架自带的组件和模块,会根据id自动分配一个权限字符串。规则是“widget”或“module”加id值。直接使用即可,框架也会验证当前用户是否有组件或模块的权限。验证原理:从链接URL中,获取组件或模块的id值,组合为权限字符串,进行对比校验。
  4. 自定义的页面,权限字符串需要自己指定。同时,在自定义页面代码中,也要加上权限判断方法。否则就只是验证了菜单的显示隐藏,而并没有真正验证该页面是否有权限访问。
  5. 如果一个页面是由多个组件或模块组合而成,要注意当前页面的所有组件和模块的权限字符串,都要与当前菜单的权限字符串保持一致。因为点击左边链接,加载了右边所有组件数据,所以右边的所有数据页面,都要与左边链接权限一致。

补充:

在自定义的页面中,进行权限验证,使用TaiJiService.validateUserAuthority方法,传递2个参数:权限字符串和session引用。

使用代码如下。当前页面的权限字符串,定义为“home”。

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	//验证是否有当前页面的使用权限。当前页面设定的权限字符串是:home
	if (!TaiJiService.validateUserAuthority("home", request.getSession())) {
		ExceptionUtil.printlnFailure(response, "没有权限使用该功能");
		return;
	}

	//有权限,进行下面的工作

}

TaiJiService中权限校验方法,validateUserAuthority源码如下。

//检测当前用户是否有权限,根据session里的权限字符串
public static boolean validateUserAuthority(String authorityTag, HttpSession httpSession) {
	if (httpSession == null) {
		return false;
	}

	//没有权限字符串,那么无权限
	if (StringUtil.isEmpty(authorityTag)) {
		return false;
	}

	//超级管理员,有所有权限
	if (StringUtil.convertToBoolean(httpSession.getAttribute(TaiJiUser.SESSION_ISSUPERADMIN))) {
		return true;
	}

	//普通管理员,获取权限字符串
	String roleAuthority = StringUtil.convertObjToString(httpSession.getAttribute(TaiJiUser.SESSION_AUTHORITY));
	roleAuthority = "," + roleAuthority + ",";


	return roleAuthority.contains("," + authorityTag + ",");
}

2.1.5.启用状态

如果菜单要暂时隐藏屏蔽,可以先停用。停用后的菜单,在权限设置页面,也不会显示。所以在用户界面,也不会显示。

2.1.6.上移下移

对菜单的上下位置进行排序。菜单的上移下移,都会限定在当前级别内。比如二级菜单的排序,只能在当前一级菜单的下面。而一级菜单的排序,也只会在一级菜单之间,不会影响到自己的子项菜单顺序。

2.2.添加修改菜单

目前菜单级别限制为两级,在一级菜单的更多操作里面,除了上移下移外,还有添加子菜单功能;在二级菜单里面,则不能再添加子菜单。

添加一级菜单与添加子菜单,基本类似。区别在于添加子菜单时,页面会显示上级菜单。如下图所示。

2.2.权限字符串校正

菜单名称与链接URL会经常调整变动,一旦链接URL变化后,由于其指向的页面地址变了,所以新页面的权限字符串跟原来的权限字符串,肯定就不一样。那么在调整链接URL的同时,也应该要同步调整权限字符串(有时候就会经常忘记同步调整修改)。

由于组件和模块的权限字符串具有一定规律,都是“widget+id值”或“module+id值”的形式。因此可以直接从链接URL中提取出权限字符串。

为了方便修改链接的权限字符串,框架提供“权限字符串校正”功能,其功能有以下几个作用。

  • 自动根据链接URL提取权限字符串。对于内部组件和模块,自动提取出“widget+id”或“module+id”形式的权限字符串。
  • 对于一级菜单,自动提取出“root+id值”的权限字符串。
  • 对于自定义页面,则无法自动提取权限字符串,需要手动设定。
  • 该功能会自动批量更新所有菜单的权限字符串,所以可以经常性的执行。
  • 可以先批量修改菜单链接URL,最后一次性校验所有链接的权限字符串。

发布了89 篇原创文章 · 获赞 71 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/weixin_42127613/article/details/103101578
今日推荐