EasyUI之生成动态异步菜单栏

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


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

EasyUI中tree的异步加载

1.实现效果

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

image.png

2.表结构设计

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

image.png

测试数据

image.png

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);
}

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

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);
}

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>

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

// 加载菜单数据 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');
}

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


相关文章
easyUI datagarid 编辑状态下的combobox动态赋值
easyUI datagarid 编辑状态下的combobox动态赋值
easyUI 动态参数名称和动态参数值
easyUI 动态参数名称和动态参数值
easyui dialog 按钮动态命名
1.方法一: /** * grid新增 * 弹框并且获取支付类型 */ function gridAdd() { var dlg = $('#mydialog').dialog({ title : "缴纳保证金", buttons : [ { ...
970 0
easyui datagrid 表格动态隐藏部分列的展示
1.一套代码中,可能不同的项目情况都在用,但是可能不同的项目要求展示的datagrid列的内容并不一致,所以能够动态的显示部分datagrid列的内容。    即datagrid的中的某一列,这个项目要求显示那个项目要求不显示。
1721 0
|
JSON JavaScript 前端开发
EasyUI----动态拼接EasyUI控件
<div class="markdown_views"> <p>最近在做的项目中,根据查询到的数据,然后动态的拼接easyUI的控件显示到界面上。在数据库中,有一个命令的表,还有一个参数的表,先到命令的表中去查询这一个设备有哪些命令,比如说,摄像头有一个<strong>转动</strong>的命令,那么就要把<strong>转动</strong>这个命令动态的拼接成EasyUI
2061 0
|
前端开发 JavaScript .NET
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(10)-系统菜单栏[附源码]
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(10)-系统菜单栏[附源码] 似乎我们需要更多的模块了,我们有一个样例程序,可以帮助我们以后的系统开发做很多对照,我们稍后还有系统日志和系统异常的记录,这时浏览发生了困难,我们这一节来完成一个大家比较喜欢的东西吧,系统菜单栏,我们系统左边预留了一个位置,那里存放菜单,菜单在这里主要可以分为两种,  1.
1134 0
下一篇
无影云桌面