LayUI之动态树

本期精彩:

1、使用LayUI中提供的后台布局代码,结合MySQL数据库,制作出左侧导航菜单栏

2、使用LayUI提供的选项卡组件,运用到左侧菜单栏中(通过点击左侧菜单实现动态打开选项卡Tab)

目录

1、左侧导航菜单栏的制作

前台界面的搭建

数据库中对应的表结构

后台代码

2、动态选项卡的制作

参考实现步骤


1、左侧导航菜单栏的制作

前台界面的搭建

使用LayUI中提供的后台布局框架搭建出的界面👇

 对应代码👇

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
  <%@include file="/common/head.jsp" %>
  <script>
  layui.use(['layer','jquery','element'], function() {
	  let layer = layui.layer;
	  let $ = layui.jquery;
	  let element = layui.element;
	  $.ajax({
		  url: ctx+"/loginAction.action?methodName=index",
		  type: "get",
		  dataType: 'json',
		  success:function(resp) {
			  $.each(resp.data, function(index, val) {
				  let selected = index == 0 ? 'layui-nav-itemed' : '';
				  let li = $('<li class="layui-nav-item ' + selected + '"></li>');			  
				  li.append('<a class="" href="javascript:;"><i class="layui-icon '
				  		+ val.icon
				  		+ '" style="font-size:16px;margin-right:10px;"></i>' 
				  		+ val.name + '</a>');				  
				  let chidren=val.children;
				  let dl = $('<dl class="layui-nav-child"></dl>');
				  $.each(chidren, function(i, n) {
					  dl.append('<dd><a href="javascript:;">'+n.name+'</a></dd>');
				  });
				  li.append(dl);				  
				  $("#menu").append(li);
			  });
			  
			  //动态的生成菜单后,调用render方法进行重新渲染,可以使用init()方法进行初始化达到同样的效果
			  element.render('menu');
		  }
	  }); 
  });
  </script>
</head>
<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
  <div class="layui-header">
    <div class="layui-logo">layui 后台布局</div>
    <!-- 登录用户信息 -->
    <ul class="layui-nav layui-layout-right">
      <li class="layui-nav-item">
        <a href="javascript:;"><img src="http://t.cn/RCzsdCq" class="layui-nav-img">贤心</a>
        <dl class="layui-nav-child">
          <dd><a href="">基本资料</a></dd>
          <dd><a href="">安全设置</a></dd>
        </dl>
      </li>
      <li class="layui-nav-item"><a href="">退了</a></li>
    </ul>
  </div>
  <div class="layui-side layui-bg-black">
    <div class="layui-side-scroll">
      <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
      <ul class="layui-nav layui-nav-tree" id="menu" lay-filter="test">
      </ul>
    </div>
  </div>
  <div class="layui-body">
    <!-- 内容主体区域 -->
    <div style="padding: 0px;">
    	<div class="layui-tab" style="margin-top:0px;">
		  <ul class="layui-tab-title">
		    <li class="layui-this">网站设置</li>
		    <li>用户管理</li>
		    <li>权限分配</li>
		    <li>商品管理</li>
		    <li>订单管理</li>
		  </ul>
		  <div class="layui-tab-content">
		    <div class="layui-tab-item layui-show">内容1</div>
		    <div class="layui-tab-item">内容2</div>
		    <div class="layui-tab-item">内容3</div>
		    <div class="layui-tab-item">内容4</div>
		    <div class="layui-tab-item">内容5</div>
		  </div>
		</div>
    </div>
  </div> 
  <div class="layui-footer">
    <!-- 底部固定区域 -->
    © layui.com - 底部固定区域
  </div>
</div>
<script>
//JavaScript代码区域
layui.use('element', function(){
  var element = layui.element;  
});
</script>
</body>
</html>

<%@include file="/common/head.jsp" %>对应的代码👇

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
request.setAttribute("ctx", request.getContextPath());
%>
<meta name="viewport" content="width=device-width,initial-scale=1.33,minimum-scale=1.0,maximum-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="renderer" content="webkit">
<meta http-equiv="Content-Language" content="zh-CN">
<link rel="stylesheet"  href="${ctx}/css/iconfont.css" type="text/css" media="all">
<link rel="stylesheet"  href="${ctx}/css/login.css" type="text/css" media="all">
<link rel="stylesheet"  href="${ctx}/js/layui/css/layui.css" type="text/css" media="all">
<link rel="stylesheet"  href="${ctx}/js/layui/css/layui.css" type="text/css" media="all">
<script type="text/javascript" src="${ctx}/js/layui/layui.js"></script>
<script>
var ctx = "${ctx}";
</script>

数据库中对应的表结构

对应的SQL代码👇

CREATE TABLE t_module(
   id INT NOT NULL PRIMARY KEY COMMENT '模块ID',
   pid INT NOT NULL COMMENT '模块PID',
   NAME VARCHAR(20) NOT NULL COMMENT '模块名称',
   icon VARCHAR(20) NULL COMMENT '模块图标',
   url VARCHAR(50) NULL COMMENT 'URL地址',
   sort INT DEFAULT 0 COMMENT '模块顺序'
) COMMENT '模块信息表';

 测试数据(树表/自关联表/无限级分类表)👇

 

注:Pid为-1代表没有父节点,是根节点,icon代表对应的图标,url代表跳转的链接,sort代表菜单的先后顺序

后台代码

1、对应实体类

public class Module {
	private Integer id;
	private Integer pid;
	private String name;
	private String icon;
	private String url;
	private int sort;	
    //用于在Java中存放根目录的子目录
	private List<Module> children = new ArrayList<>();	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public Integer getPid() {
		return pid;
	}
	public void setPid(Integer pid) {
		this.pid = pid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getIcon() {
		return icon;
	}
	public void setIcon(String icon) {
		this.icon = icon;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public int getSort() {
		return sort;
	}
	public void setSort(int sort) {
		this.sort = sort;
	}	
	public List<Module> getChildren() {
		return children;
	}
	public void setChildren(List<Module> children) {
		this.children = children;
	}
	@Override
	public String toString() {
		return "Module [id=" + id + ", pid=" + pid + ", name=" + name + ", icon=" + icon + ", url=" + url + ", sort="
				+ sort + "]";
	}
}

2、对应dao层

IModuleDao

public interface IModuleDao {
	List<Module> getModules(int pid);
}

ModuleDao

public class ModuleDao implements IModuleDao {
	@Override
	public List<Module> getModules(int pid) {		
		String sql = "select * from t_module where pid=?";		
		return DbTemplate.query(sql, new Object[] {pid}, Module.class);
	}	
}

3、对应biz层

IModuleService

public interface IModuleService {
	List<Module> getModules(int pid);
}

ModuleService

public class ModuleService implements IModuleService {	
	private IModuleDao dao = new ModuleDao();
	@Override
	public List<Module> getModules(int pid) {
		List<Module> list = dao.getModules(pid);		
		for(Module m: list) {
			if(null == m.getUrl() || "".equals(m.getUrl())) {
                //递归
				m.setChildren(getModules(m.getId()));
			}
		}		
		return list;
	}
}

最终效果(左侧导航栏的显示文字都来自于上面建立好了的数据库表中了)👇 

2、动态选项卡的制作

 Tab广泛应用于Web页面,因此我们也对其进行了良好的支持(简约风格、卡片风格、响应式Tab以及带删除的Tab等等)。Layui内置多种Tab风格,支持删除选项卡、并提供响应式支持

参考实现步骤

先去官方文档中找到选项卡组件👇

再使用LayUI提供的选项卡组件的代码(根据提示找到你想要的选项卡的样式对应的代码)👇

结合使用JS、Ajax来实现对选项卡的动态控制👇

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <%@include file="/common/head.jsp" %>
  <style>
  #funcTab ul li:first-child i {
  	display:none;
  }
  </style>
  <script type="text/javascript">
  let element = null;
  let $ = null;
  layui.use(['layer','jquery','element'], function() {
	  let layer = layui.layer;
	  $ = layui.jquery;
	  element = layui.element;
	  $.ajax({
		  url: ctx + '/loginAction.action?methodName=index',
		  type: 'get',
		  dataType: 'json',
		  success: function(resp) {
	  $.each(resp.data, function(index, node){
				  let selected = index == 0 ? 'layui-nav-itemed' : '';
				  let li = $('<li class="layui-nav-item ' + selected + '"></li>');
				  
				  li.append('<a class="" href="javascript:;"><i class="layui-icon '
					  		+ node.icon
					  		+ '" style="font-size:16px;margin-right:10px;"></i>' 
					  		+ node.name + '</a>');				  
				  let chidren=node.children;
				  let dl = $('<dl class="layui-nav-child"></dl>');
				  $.each(chidren, function(i,n) {
					  dl.append('<dd><a href="javascript:openFuncTab(\''+n.name+'\',\''+n.id+'\',\''+n.url+'\');">'+n.name+'</a></dd>');
				  });
				  li.append(dl);			  
				  $("#menu").append(li);
			  });			  
			  element.render('menu');
		  }
	  })
  });
  function openFuncTab(name,id,url) {	  
	  let exit = $("li[lay-id='"+id+"']").length;
	  if(exit == 0) {
		  element.tabAdd('demo', {
	        title: name,
	        content: '<iframe frameborder="0" src="' + url+ '" scrolling="auto" style="width:100%;height:100%;"></iframe>',
	        id: id //实际使用一般是规定好的id,这里以时间戳模拟下
	      }); 
		  
	  }
	  element.tabChange('demo', id);	  
  }
  </script>
</head>
<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
  <div class="layui-header">
    <div class="layui-logo">layui 后台布局</div>   
    <ul class="layui-nav layui-layout-right">
      <li class="layui-nav-item">
        <a href="javascript:;">
          <img src="http://t.cn/RCzsdCq" class="layui-nav-img">
          	贤心
        </a>
        <dl class="layui-nav-child">
          <dd><a href="">基本资料</a></dd>
          <dd><a href="">安全设置</a></dd>
        </dl>
      </li>
      <li class="layui-nav-item"><a href="">退了</a></li>
    </ul>
  </div> 
  <div class="layui-side layui-bg-black">
    <div class="layui-side-scroll">
      <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
      <ul id="menu" class="layui-nav layui-nav-tree"  lay-filter="test">
     
      </ul>
    </div>
  </div>  
  <div class="layui-body">
    <!-- 内容主体区域 -->
    <div style="padding: 15px;">
    <!-- 功能选项卡B -->
    <div class="layui-tab" id="funcTab" lay-filter="demo" lay-allowclose="true">
	  <ul class="layui-tab-title">
	    <li class="layui-this" lay-id="11">首页</li>
	  </ul>
	  <div class="layui-tab-content">
	    <div class="layui-tab-item layui-show">首页内容区</div>
	  </div>
	</div>
    <!-- 功能选项卡E -->
    </div>
  </div>
    <div class="layui-footer">
    <!-- 底部固定区域 -->
    © layui.com - 底部固定区域
  </div>
</div>
<script src="../src/layui.js"></script>
<script>
//JavaScript代码区域
layui.use('element', function(){
  var element = layui.element; 
});
</script>
</body>
</html>

将选项卡运用到上期的左侧菜单栏中(最终效果)👇

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
根据引用\[1\]和引用\[2\]的代码,可以看出在测试类PermissionDaoTest中,使用了Junit进行测试。在testList方法中,通过调用permissionDao的list方法获取到了形菜单的数据,并将其打印出来。所以,可以使用类似的方法来动态获取形菜单。 具体实现步骤如下: 1. 创建一个测试类,使用Junit进行测试。 2. 在测试方法中,调用获取形菜单的方法,将返回的数据打印出来。 3. 可以使用ObjectMapper将返回的数据转换成JSON格式,方便前端使用。 示例代码如下: ```java import static org.junit.Assert.*; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.fasterxml.jackson.databind.ObjectMapper; import com.zking.dao.PermissionDao; import com.zking.entity.Permission; import com.zking.util.TreeVo; public class TreeMenuTest { private PermissionDao permissionDao = new PermissionDao(); @Before public void setUp() throws Exception { // 初始化操作 } @After public void tearDown() throws Exception { // 清理操作 } @Test public void testGetTreeMenu() { try { List<TreeVo<Permission>> list = permissionDao.getTreeMenu(); for (TreeVo<Permission> t : list) { System.out.println(t); } ObjectMapper om = new ObjectMapper(); System.out.println(om.writeValueAsString(list)); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上述代码中,testGetTreeMenu方法调用了permissionDao的getTreeMenu方法获取形菜单数据,并将其打印出来。同时,使用ObjectMapper将返回的数据转换成JSON格式,并打印出来。 请注意,上述代码仅为示例,具体的实现可能需要根据你的项目结构和需求进行调整。 #### 引用[.reference_title] - *1* *2* [LayUI--动态形菜单](https://blog.csdn.net/weixin_67450855/article/details/125617088)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值