easyui实现树形菜单Tab功能layout布局

Posted huangting

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了easyui实现树形菜单Tab功能layout布局相关的知识,希望对你有一定的参考价值。

一:常见三种前端ui框架

在初学者入门的状态下,我们常见的前端框架有三种且都有自己的官方网站:

1.easyui:官方网站(http://www.jeasyui.net/)

基于jquery的用户页面插件集合,为一些交互的js提供相应的功能,开发者也不需要写特别复杂的javascript方法,可以用html的标签来解决,支持html5可以说算是能满足你的所有需求,节约时间还能扩展需求,虽然简单但是功能强大。

2.Bootstrap:官方网站(

Bootstrap 是依据 Twitter的一个开源用于前端开发的工具包。是一个CSS/HTML/JavaScript的前端框架。Bootstrap 是基于HTML5和CSS3并且属于响应式开发的,他的控件比较丰富好用,说白了也是一堆HTML代码,记住常用的css样式类会运用就行了,好用界面开发也美观但是人家要钱。

3.Layui:官方网站

 Layui属于开源的模块化前端 UI 框架,但是它更多的是偏向于后端开发者,所以在组织形式上毅然采用了几年前的以浏览器为宿主的类 AMD 模块管理方式,却又并非受限于 CommonJS 的那些条条框框,它拥有自己的模式,更加轻量和简单,layui 定义为"经典模块化",并非是刻意强调"模块"理念本身,而是有意避开当下 JS 社区的主流方案,试图以尽可能简单的方式去诠释高效,并且兼容性强。

二:实现树形菜单和Tab功能

今天主要分享的是easyui前端框架的树形菜单开发以及Tab功能(因为把两个技术点融合在一起了,就不一一展示单个功能的代码,可以去官网看详细方法怎么用,差别也只是javascript代码和新增jsp页面用来匹配对应的树形菜单):

所实现的页面如下图:

技术图片

 1.创建一个jsp页面引入js和css,并且在jsp中写出页面所需要的背景主题

注意:一定要去官网下载所需要的jar包,或者去官网APL文件中看流程,里面提供每项控件的详细用法、样式、方法和easyui框架的简介很值得学习,点点俱到(上面我所提供的是中文管网,不存在看不懂)

<link rel="stylesheet" type="text/css" href="$pageContext.request.contextPath/static/js/easyui5/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="$pageContext.request.contextPath/static/js/easyui5/themes/icon.css">
<script type="text/javascript" src="$pageContext.request.contextPath/static/js/easyui5/jquery.min.js"></script>
<script type="text/javascript" src="$pageContext.request.contextPath/static/js/easyui5/jquery.easyui.min.js"></script>
<script type="text/javascript" src="$pageContext.request.contextPath/static/js/index.js"></script>
<title>easyui树形组件tree演示</title>
</head>
<body class="easyui-layout">
    <div data-options="region:‘north‘,border:false"
        style="height: 60px; background: #B3DFDA; padding: 10px">north
        region</div>
    <div data-options="region:‘west‘,split:true,title:‘West‘"
        style="width: 150px; padding: 10px;">
        后台管理界面
        <ul id="tt"></ul>
    </div>
    <div data-options="region:‘east‘,split:true,collapsed:true,title:‘East‘" style="width: 100px; padding: 10px;">east region</div>
    <div data-options="region:‘south‘,border:false" style="height: 50px; background: #A9FACD; padding: 10px;">south region</div>
    <div data-options="region:‘center‘,title:‘Center‘"> 
    <div id="myshow" class="easyui-tabs" style=""> <div title="Tab1" style="padding: 20px; display: none;">tab1</div> </div> </div> </body>

3.定义实体类(设置set、get方法)

*我的树形菜单数据是根据数据库数据来显示的,所以呢我这里有涉及到了mysql数据库的运用和dao方法中转换josn数据格式的运用,所以先定义一个实体类用来设置、得到数据。

    private String id;
    private String text;
    private List<TreeNode> Children=new ArrayList<>();
    private Map<String, Object> attributes =new HashMap<>();    

4.重点来了,MenuDao类中数据装换和树形菜单的显示且在content页生成Tab功能

这里呢数据格式转换是最重要的也是难点,而显示树形菜单我用的javascript方法把数据上传至页面,并且用标签<iframe>把传过来的数据裹起来实现Tab的功能。这里我就直接上代码了,不过不是原生态代码,只是把MenuDao类中的方法分享出来了,主要功能就是转换集合数组格式,若是不转换菜单没法打印在界面。

MenuDao类

/**
     * 
     * @param map   req.getParameterMap
     * @param pageBean  分页
     * @return
     * @throws Exception 
     */
    public List<TreeNode> list(Map<String, String[]> map,PageBean pageBean) throws Exception
        List<Map<String, Object>> listMenu=this.listMenu(map, pageBean);
        List<TreeNode> treeNodeList=new ArrayList<>();
        menuList2TreeNodeList(listMenu, treeNodeList);
        return treeNodeList;
    
    /**
     * 查询Menu表的数据
     * @param map
     * @param pageBean
     * @return
     */
    public List<Map<String, Object>> listMenu(Map<String, String[]> map,PageBean pageBean)throws Exception
        String sql=" select * from t_easyui_menu where true";
        String id=JsonUtils.getParamVal(map, "id");
        if(StringUtils.isNotBlank(id)) 
            sql=sql +" and parentid ="+id;    
        
        else 
            sql=sql+" and parentid =-1";
        
        return super.executeQuery(sql, pageBean);
    
    /**
     * Menuid:1,....[]
     * ->id:1,....[]
     * menu表的数据不符合easyui树形展示的数据格式
     * 需要转换成easyui所能识别的数据格式
     * @param map
     * @param reTreeNode
     * @throws Exception 
     */
    private void menu2TreeNode(Map<String, Object> map, TreeNode treeNode) throws Exception 
        treeNode.setId(map.get("Menuid").toString());
        treeNode.setText(map.get("Menuname").toString());
        treeNode.setAttributes(map);
        Map<String, String[]> jspMap=new HashMap<>();
        jspMap.put("id", new String[] treeNode.getId());
        this.listMenu(jspMap, null);
        List<Map<String, Object>> listMenu=this.listMenu(jspMap, null);
        List<TreeNode> treeNodeList=new ArrayList<>();
        menuList2TreeNodeList(listMenu, treeNodeList);
        treeNode.setChildren(treeNodeList);
    
    /**
     * [Menuid:1,....[],Menuid:2,....[]]
     * ->[id:1,....[],id:2,....[]]
     * @param mapList
     * @param treeNodeList
     * @throws Exception
     */
    private void menuList2TreeNodeList(List<Map<String, Object>> mapList, List<TreeNode> treeNodeList)throws Exception 
        TreeNode treeNode =null;
        for (Map<String, Object> map : mapList) 
            treeNode =new TreeNode();
            menu2TreeNode(map, treeNode);
            treeNodeList.add(treeNode);
        
    

javascript方法:

为了代码安全就单独创建了一个js文件,专门用来写javascript实现代码,也挺方便(在这里提醒一下各位一定要看清楚自己在jsp中给div层定义的id,并且铭记几个重要的方法,可以去官网就去官网复制,毕竟javascript不如html代码一样有快捷键提醒,敲错一个字母也能报错,并且错极为细节,心态不好的就容易炸心态,一定要仔仔细细检查,吃饭的家伙基础还是要打好用正确心态对待)。

$(function()
    $(#tt).tree(    
        url:menuAction.action?methodName=treeMenu ,
        onClick:function(node)
            var content = <iframe scrolling="no" frameborder="0" src="+node.attributes.menuURL+" width="99%" height="99%"></iframe>;
            if($(#myshow).tabs(exists,node.text))
                $(#myshow).tabs(select,node.text);
            else
                $(#myshow).tabs(add,    
                    title:node.text,    
                    content:content,    
                    closable:true,    
                    tools:[    
                        iconCls:icon-mini-refresh,    
                        handler:function()    
                            alert(refresh);    
                            
                    ]    
                );  
            
        
    ); 
)

从上述代码中大家也看到了,我也用了mvc的模式,所以需要配置MVC.xml文件,很简单的几句代码,最好单独给xml文件创一个文件夹放置它并且与javasrc包同级,如下图:

技术图片

 树形菜单和tab页面功能就告一段落了,现在来看easyui中的Layout布局。

三:easyui框架中layout布局使用

还是那句话,配合官网和apl开发最好。

首先我个人认为layout布局是easyui中非常简单蛮容易上手的布局,layout布局也是有五个区域(北区 north、南区 south、东区 east、西区 west 和中区 center)的。中间的区域面板是必需要有的,边缘区域面板是可选的。每个边缘区域面板可通过拖拽边框调整尺寸,也可以通过点击折叠触发器来折叠面板。layout布局也可以嵌套,因此用户可建立复杂的布局。与java swing中的BorderLayout布局管理器蛮像的。

首先来看看要实现的效果图:

技术图片

1.创建layout布局

这是布局中的核心代码,给<div>标签添加”easyui-layout"的类ID

<div id="ht" class="easyui-layout" style="width:600px;height:400px;">
    <div data-options="region:‘north‘,title:‘North Title‘,split:true" style="height:100px;"></div>
    <div data-options="region:‘south‘,title:‘South Title‘,split:true" style="height:100px;"></div>
    <div data-options="region:‘east‘,title:‘East‘,split:true" style="width:100px;"></div>
    <div data-options="region:‘west‘,title:‘West‘,split:true" style="width:100px;"></div>
    <div data-options="region:‘center‘,title:‘center title‘" style="padding:5px;background:#eee;"></div>
</div>

2.自适应的两种方法

2.1:在body内创建一个<div >通过添加属性fit

<div class="easyui-layout" data-options="fit:true"></div>

如果为true,那么布局组件将自适应于父容器,也就是说在使用body创建layout布局时,它就会自动适应到整个页面最大。false反之,但是false是fit属性的默认值

2.2:在bady内添加 class样式

<body class="easyui-layout"></body>

3.嵌套布局的使用

嵌套是什么模式相信大家都是明白的,就是一层套一层嘛,其实这里也差不多的,就是布局套布局层层镶嵌;注意一点,内部布局的西区面板是折叠的,layout布局中也有折叠布局可以用,collapsible就像自适应的fit属性一样,去判断是否就行了

<body class="easyui-layout">
    <div data-options="region:‘north‘" style="height:100px"></div>
    <div data-options="region:‘center‘">
        <div class="easyui-layout" data-options="fit:true">
            <div data-options="region:‘west‘,collapsed:true" style="width:180px"></div>
            <div data-options="region:‘center‘"></div>
        </div>
    </div>
</body>

效果图就是这个样子

技术图片

layout布局中常用属性就是这些个egion、 title、split、iconCls、collapsible、collapsed(true的时候折叠起面板)collapsible:false 是否显示折叠按钮,如果想了解更多可以去官网看看

 

今天就分享到这里,菜鸟一个多多包涵,谢谢大家观看!

以上是关于easyui实现树形菜单Tab功能layout布局的主要内容,如果未能解决你的问题,请参考以下文章

EasyUI创建异步树形菜单和动态添加tab页面

使用easyui为tab页增加右键菜单

关于easyui的layout内页面跳转的问题...

easyUI用的树形菜单,父级菜单默认是打开的,但是父菜单和子菜单太多了我想让父菜单默认是合上的该怎么做

easyui Layout布局面板的一些功能

雷林鹏分享:jQuery EasyUI 窗口 - 窗口与布局