EasyUI之生成动态异步菜单栏

举报
波波烤鸭 发表于 2022/03/31 00:55:53 2022/03/31
【摘要】   在项目开发中,对于整体的页面布局中对于菜单导航栏我们一般设计为根据不同的用户权限展示不同的菜单选项,同时菜单显示也会做异步加载处理。本文就来介绍下基于EasyUI的tree插件来实现导航栏的异步加载实...

  在项目开发中,对于整体的页面布局中对于菜单导航栏我们一般设计为根据不同的用户权限展示不同的菜单选项,同时菜单显示也会做异步加载处理。本文就来介绍下基于EasyUI的tree插件来实现导航栏的异步加载实现。

EasyUI中tree的异步加载

1.实现效果

  首先我们来看下最终的实现效果,具体如下。

在这里插入图片描述

2.表结构设计

  因为在tree插件显示数据的时候对应查询的json数据的字段有要求,具体参考官网:http://www.jeasyui.net/plugins/185.html ,所以为了避免查询的数据和需要显示的数据不一致而造成的数据的转换,所以在设计表结构的时候可以注意下。菜单的结构如下:

在这里插入图片描述

测试数据

在这里插入图片描述

3.服务端处理

  通过mybatis的逆向工程生成相关的接口,映射文件和pojo文件等。然后在controller中定义处理请求的方法,接收查询菜单的id。返回JSON数据,如下:

/**
 *  异步查询菜单【node】信息
 * @param  id
 * @return
 */
@RequestMapping("/getNode")
@ResponseBody
public List<Menu> getNode(Integer id){
    Menu menu = new Menu();
    if(id !=null && id > 0){
        menu.setParentId(id);
    }else{
        menu.setParentId(0);
    }
    return menuService.query(menu);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

然后在控制器中具体处理请求

public List<Menu> query(Menu menu) {
    MenuExample example = new MenuExample();
    MenuExample.Criteria criteria = example.createCriteria();
    if(menu!=null){
        if(menu.getParentId()!=null ){
            // 根据父菜单编号查询
            criteria.andParentIdEqualTo(menu.getParentId());
        }else{
            criteria.andParentIdEqualTo(0);
        }
    }
    return menuMapper.selectByExample(example);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

4.页面js代码实现

  home界面的主要代码如下:

<body class="easyui-layout">
		<!-- 顶部  Logo -->
		<div data-options="region:'north',border:true,split:true"
			style="height: 100px;background: url(img/logo.png) no-repeat 0% 50%;  ">
			
			<div class="topNav" style="border: 0px red solid; width: 230px; height: 80px; line-height:80px; float: right;">
				<a href="https://www.itbaizhan.com/" target="_blank" style="color:red">百战程序员</a>  | 
				 <a href="#"><shiro:principal property="username"></shiro:principal></a> |
				<a href="logout.do"> 安全退出 </a>
			</div>
			
		</div>
		<!-- 右侧  菜单栏 -->
		<div data-options="region:'west',title:'导航栏',split:true"
			style="width: 180px;">
			    <ul id="tt" class="easyui-tree">
				    	<!-- 动态加载数据 -->
			    </ul>
		</div>
		<!-- 中间  内容主体 -->
		<div data-options="region:'center',border:false"
			style="padding: 0px; background: #eee;">
			    <div id="tabs" class="easyui-tabs" data-options="fit:true" style="width:500px;height:250px;">
			        <div title="首页" style="padding:20px;display:none;">
			    		欢迎光临
			        </div>
			    </div>
		</div>
		
		<script type="text/javascript">
			function goTabs(path,title){
				// 动态添加一个标签页
				var isSelect = $("#tabs").tabs('exists', title);
			    // 添加一个新的标签页面板(tab panel)
				if(isSelect){
					$("#tabs").tabs('select', title);
					return;
				}else{
					$('#tabs').tabs('add',{
						title:title,
						content:'<iframe src="'+path+'" width="100%" height="100%" style="border: 0px;"></iframe>',
						closable:true,
						//刷新按钮
						tools: [{
							iconCls: 'icon-mini-refresh',
							handler: function(){
								var currentTab = $('#tabs').tabs('getSelected');
								RefreshTab(currentTab);
							}
						}]
					});
				}

			}

			//刷新当前标签Tabs
			function RefreshTab(currentTab) {
				var url = $(currentTab.panel('options')).attr('href');
				$('#tabs').tabs('update', {
					tab: currentTab,
					options: {
						href: url
					}
				});
				currentTab.panel('refresh');
			}

			$(function(){
				// 动态添加菜单
				$("#tt").tree({
					url: "/sys/menu/getNode",
					onClick: function(node){
						if(node.url != null && node.url != '' ){
							// 打开一个新的窗口
							goTabs(node.url+"/go",node.text);
						}
					}
				});
			});
			
		</script>
		
		
</body>
</html>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

  加载导航菜单的核心代码:

// 加载菜单数据 state:closed是关键
$(function(){
	// 动态添加菜单
	$("#tt").tree({
		url: "/sys/menu/getNode",
		onClick: function(node){
			if(node.url != null && node.url != '' ){
				// 打开一个新的窗口
				goTabs(node.url+"/go",node.text);
			}
		}
	});
});

// 点击子菜单开的一个新窗口的代码
function goTabs(path,title){
	// 动态添加一个标签页
	var isSelect = $("#tabs").tabs('exists', title);
    // 添加一个新的标签页面板(tab panel)
	if(isSelect){
		$("#tabs").tabs('select', title);
		return;
	}else{
		$('#tabs').tabs('add',{
			title:title,
			content:'<iframe src="'+path+'" width="100%" height="100%" style="border: 0px;"></iframe>',
			closable:true,
			//刷新按钮
			tools: [{
				iconCls: 'icon-mini-refresh',
				handler: function(){
					var currentTab = $('#tabs').tabs('getSelected');
					RefreshTab(currentTab);
				}
			}]
		});
	}
}
//刷新当前标签Tabs
function RefreshTab(currentTab) {
	var url = $(currentTab.panel('options')).attr('href');
	$('#tabs').tabs('update', {
		tab: currentTab,
		options: {
			href: url
		}
	});
	currentTab.panel('refresh');
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

  因为我们的表结构设计的tree默认的字段是一致的所以省略掉了转换的过程,如果不一致还需要将查询的数据转换为满足tree展示的数据要求。至于根据账号的权限来查询不同的菜单仅仅只需要在业务逻辑层加上账号的条件即可了。

文章来源: dpb-bobokaoya-sm.blog.csdn.net,作者:波波烤鸭,版权归原作者所有,如需转载,请联系作者。

原文链接:dpb-bobokaoya-sm.blog.csdn.net/article/details/89857540

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。