Layui选项卡Tab:完美实现网页内容分类与导航

news2024/11/24 9:32:05

目录

什么是Layui选项卡?

Layui选项卡的作用

实现步骤

1、编写公共jsp(header.jsp)

2、jsp界面(main.jsp)

3、JS代码(main.js)

4、PermissionDao类的修改

5、最终运行结果


什么是Layui选项卡?

Layui选项卡是一种基于Layui框架的前端组件,用于创建多个选项卡并在其之间进行切换。Layui是一个轻量级、易用、灵活的前端UI框架,旨在简化前端开发过程

使用Layui选项卡,你可以在页面中创建多个选项卡标签,每个标签对应一个内容区域。用户可以点击选项卡标签来切换显示相应的内容区域。这种方式常用于页面的分组显示或切换不同的功能模块。

Layui选项卡提供了丰富的配置选项,包括标签样式、选项卡切换的触发事件、内容区域的布局方式等。它还支持动态添加和删除选项卡,以及自定义选项卡的样式和功能。

总之,Layui选项卡是一种方便、灵活的前端组件,可用于创建多个选项卡,并在其之间切换显示不同的内容区域。

Layui选项卡的作用

  1. 分组显示内容:Layui选项卡可以将相关的内容分组显示在不同的选项卡中。例如,在一个表单页面中,可以使用选项卡将不同部分的表单内容进行分组,使用户能够更方便地切换查看和编辑不同的表单区域。
  2. 页面布局切换:Layui选项卡可以用于页面布局的切换。通过将不同的页面布局放置在不同的选项卡中,用户可以在不同的布局之间进行切换,实现页面结构的变化。这在一些需要展示不同类型或不同风格页面的应用中非常有用。
  3. 多标签页管理:Layui选项卡可以用于创建多标签页的界面,类似于浏览器的标签页功能。每个选项卡可以对应一个页面或功能模块,用户可以通过点击选项卡来快速切换不同的页面或功能,提高用户的操作效率。
  4. 动态控制选项卡:Layui选项卡支持动态添加和删除选项卡,可以根据业务需求来灵活控制选项卡的数量和内容。这对于需要根据用户操作动态生成选项卡的场景非常有用,可以实现动态的页面切换和内容展示。

Layui选项卡主要用于分组显示内容页面布局切换多标签页管理动态控制选项卡等场景,提供了方便的界面交互和操作方式。

实现步骤

我们最终要达到的一个效果

 

看过我前面的博客都知道,我是在前面博客的基础上继续写的一个案例


首先记住我们这次的博客包、类、jsp界面以及我们的资源放置位置

 

1、编写公共jsp(header.jsp)

在这个里面我和前面的进行了一个修改,并且添加了一个<base>标签

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 引入 layui.css -->
<link rel="stylesheet" href="${pageContext.request.contextPath }/static/js/layui/css/layui.css">
<!-- 引入 layui.js -->
<script src="${pageContext.request.contextPath }/static/js/layui/layui.js"></script>
<base href="${pageContext.request.contextPath }/" />

2、jsp界面(main.jsp)

我们在前面已有的界面上进行一个界面的修改,在主内容区域里面添加我们的Tab标签
 

            <!-- 内容主体区域 -->
			<div class="layui-tab" lay-filter="tab" lay-allowclose="true">
				<ul class="layui-tab-title">
				</ul>
				<div class="layui-tab-content">
				</div>
			</div>

整体的JSP界面代码
 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>后台首页</title>
<%@include file="/common/header.jsp"%>
<script src="static/js/main.js"></script>
</head>
<body>
	<div class="layui-layout layui-layout-admin">
		<div class="layui-header">
			<div class="layui-logo layui-hide-xs layui-bg-black">Layui</div>
			<!-- 头部区域(可配合layui 已有的水平导航) -->
			<ul class="layui-nav layui-layout-left">
				<!-- 移动端显示 -->
				<li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm"
					lay-header-event="menuLeft"><i
					class="layui-icon layui-icon-spread-left"></i></li>
				<!-- Top导航栏 -->
				<li class="layui-nav-item layui-hide-xs"><a href="">nav 1</a></li>
				<li class="layui-nav-item layui-hide-xs"><a href="">nav 2</a></li>
				<li class="layui-nav-item layui-hide-xs"><a href="">nav 3</a></li>
				<li class="layui-nav-item"><a href="javascript:;">nav
						groups</a>
					<dl class="layui-nav-child">
						<dd>
							<a href="">menu 11</a>
						</dd>
						<dd>
							<a href="">menu 22</a>
						</dd>
						<dd>
							<a href="">menu 33</a>
						</dd>
					</dl></li>
			</ul>
			<!-- 个人头像及账号操作 -->
			<ul class="layui-nav layui-layout-right">
				<li class="layui-nav-item layui-hide layui-show-md-inline-block">
					<a href="javascript:;"> <img
						src="//tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg"
						class="layui-nav-img"> tester
				</a>
					<dl class="layui-nav-child">
						<dd>
							<a href="">Your Profile</a>
						</dd>
						<dd>
							<a href="">Settings</a>
						</dd>
						<dd>
							<a href="login.jsp">Sign out</a>
						</dd>
					</dl>
				</li>
				<li class="layui-nav-item" lay-header-event="menuRight" lay-unselect>
					<a href="javascript:;"> <i class="layui-icon layui-icon-more-vertical"></i>
				</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="menu">

				</ul>
			</div>
		</div>

		<div class="layui-body">
			<!-- 内容主体区域 -->
			<div class="layui-tab" lay-filter="tab" lay-allowclose="true">
				<ul class="layui-tab-title">
				</ul>
				<div class="layui-tab-content">
				</div>
			</div>
		</div>

		<div class="layui-footer">
			<!-- 底部固定区域 -->
			底部固定区域
		</div>
	</div>

</body>
</html>

我在JSP的界面添加了一个导入js的标签,在后面的代码里面做铺垫

<script src="static/js/main.js"></script>

3、JS代码(main.js)

可以在刚开始的资源放置位置图和JSP界面编写的代码可以看出,我们的js代码进行了一个分开的编写,并没有在JSP界面进行一个编写


var element,layer,util,$;
layui.use(['element', 'layer', 'util'], function(){
  element = layui.element
  ,layer = layui.layer
  ,util = layui.util
  ,$ = layui.$;
 
  $.ajax({
		url : 'tree.action?methodName=menus',
		method : 'post',
		dataType : 'json',
		success : function(data) {
			console.log(data);
			var htmlTree="";
			$.each(data,function(index,node){
				htmlTree+='<li class="layui-nav-item layui-nav-itemed">';
				
				htmlTree+='<a href="javascript:;">'+node.text+'</a>';
				
				if (node.hasChildren) {
					var children=node.children;
					htmlTree+='<dl class="layui-nav-child">';
					$.each(children,function(i,n){
						htmlTree+='<dd><a href="javascript:;" onclick="OpenTabAdd(\''+n.text+'\',\''+n.attributes.self.url+'\',\''+n.id+'\')">'+n.text+'</a></dd>';
					});
					htmlTree+='</dl>';
				}
				
				htmlTree+='</li>';
			});
			
			$("#menu").html(htmlTree);
			/* 进行渲染 */
			element.render('menu');
				} 
			});
  
});

	function OpenTabAdd(title,content,id){
		var $node = $('li[lay-id="' + id + '"]');
	// 如果点击的树形菜单在Tab里面有选项卡了就不添加,没有就添加
	if ($node.length == 0) {
			 // 新增一个Tab项
		      element.tabAdd('tab', {
		        title: title
		        ,content: "<iframe frameborder='0' src='"+content+"' scrolling='auto' style='width:100%;height:100%;'></iframe>"
		        ,id: id
		      });
		}
	element.tabChange('tab', id); // 切换
		
		     
	}
var $node = $('li[lay-id="' + id + '"]');

这一行代码用来获取你点击的树形菜单

element.tabChange('tab', id); // 切换

这一行代码用来获取点击的tab进行一个跳转
 

4、PermissionDao类的修改

我们在js的代码里面看到过这行代码
 

htmlTree+='<dd><a href="javascript:;" onclick="OpenTabAdd(\''+n.text+'\',\''+n.attributes.self.url+'\',\''+n.id+'\')">'+n.text+'</a></dd>';

我们在编写PermissionDao里面的方法的时候没有添加我们的url,所以我们获取不到url,

我们要更改PermissionDao里面的menus方法

/**
	 * 将数据库的平级数据,转换为父子关系数据
	 * 
	 * @param permission
	 * @param pageBean
	 * @return
	 * @throws Exception
	 */
	public List<TreeVo<Permission>> menus(Permission permission, PageBean pageBean) throws Exception {

		List<TreeVo<Permission>> listtp = new ArrayList<>();
		List<Permission> list = this.listPermission(permission, pageBean);
		for (Permission p : list) {// 把我们的平级对象转换为父级关系
			TreeVo<Permission> tv = new TreeVo<>();
			tv.setId(p.getId() + "");
			tv.setText(p.getName());
			tv.setParentId(p.getPid() + "");
			// 添加tab--url
			Map<String, Object> maps = new HashMap<>();
			maps.put("self", p);
			// 我们不可能在TreeVo里面建Permission所有的属性,可以用map集合保存起来并存储在TreeVo里面
			tv.setAttributes(maps);

			listtp.add(tv);
		}
		// 这是我们还没有构建父子关系
		// return listtp;
		// 我们要做一个外层循环和一个内层循环
		return BuildTree.buildList(listtp, "-1");
	}

我们用Map集合添加了Permission里面的所有属性

我们可以用jsp界面打印一下


这下我们就有了url,我们就可以拿到url了。
就可以用n.attributes.self.url传到我们的方法里面去

 

完整的PermissionDao类方法

package com.zking.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.zking.entity.Permission;
import com.zking.util.BaseDao;
import com.zking.util.BuildTree;
import com.zking.util.PageBean;
import com.zking.util.TreeVo;

/**
 * dao方法
 * 
 * @author tgq
 *
 */
public class PermissionDao extends BaseDao<Permission> {

	/**
	 * 查询导所有的
	 * 
	 * @param permission
	 * @param pageBean
	 * @return
	 * @throws Exception
	 */
	public List<Permission> listPermission(Permission permission, PageBean pageBean) throws Exception {
		String sql = "select * from t_oa_Permission";
		return super.executeQuery(sql, Permission.class, pageBean);
	}

	/**
	 * 将数据库的平级数据,转换为父子关系数据
	 * 
	 * @param permission
	 * @param pageBean
	 * @return
	 * @throws Exception
	 */
	public List<TreeVo<Permission>> menus(Permission permission, PageBean pageBean) throws Exception {

		List<TreeVo<Permission>> listtp = new ArrayList<>();
		List<Permission> list = this.listPermission(permission, pageBean);
		for (Permission p : list) {// 把我们的平级对象转换为父级关系
			TreeVo<Permission> tv = new TreeVo<>();
			tv.setId(p.getId() + "");
			tv.setText(p.getName());
			tv.setParentId(p.getPid() + "");
			// 添加tab--url
			Map<String, Object> maps = new HashMap<>();
			maps.put("self", p);
			// 我们不可能在TreeVo里面建Permission所有的属性,可以用map集合保存起来并存储在TreeVo里面
			tv.setAttributes(maps);

			listtp.add(tv);
		}
		// 这是我们还没有构建父子关系
		// return listtp;
		// 我们要做一个外层循环和一个内层循环
		return BuildTree.buildList(listtp, "-1");
	}

}

5、最终运行结果

 

希望对你们有帮助!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据备份与还原,(mysqldump,source)索引(index),创建视图(view)

一、备份与还原 /***************************样例表***************************/ CREATE DATABASE booksDB; use booksDB;CREATE TABLE books (bk_id INT NOT NULL PRIMARY KEY,bk_title VARCHAR(50) NOT NULL,copyright YEAR NOT NULL ); INSERT INTO books VALUES (11078…

【i阿极送书——第五期】《Python机器学习:基于PyTorch和Scikit-Learn》

系列文章目录 作者&#xff1a;i阿极 作者简介&#xff1a;数据分析领域优质创作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&#x1f4d2;…

【CANN训练营】Atlas 200I DK A2开发板运行ChatYuan-large对话机器人应用

环境介绍 PC 操作系统&#xff1a;Ubuntu 22 内存&#xff1a;32GB Python&#xff1a;3.8 开发板 华为Atlas 200I DK A2 内存&#xff1a;4G NPU&#xff1a;昇腾310B 环境准备 只需要一台Linux 系统的PC机即可 Python版本需要3.7、3.8、3.9 准备CANN ToolKit 下载CANN T…

Centos6.5 用户权限例题

例题一&#xff1a;为网站管理员创建一个FTP帐户webmaster&#xff0c;将其加入到ftp组中&#xff0c;其登录的主目录为WEB站点的主目录/var/www/jnds.net&#xff0c;设置其为系统帐户&#xff0c;但却没有登录系统的权限&#xff0c;备注该用户为“FTP User” 解&#xff1a…

【RocketMQ】005-Docker 部署 RocketMQ

【RocketMQ】005-Docker 部署 RocketMQ 文章目录 【RocketMQ】005-Docker 部署 RocketMQ一、部署1、拉取镜像MQ 镜像可视化平台镜像 2、创建挂载目录创建 nameserver 挂载目录创建 broker 目录创建 broker 配置文件目录 3、编辑配置文件4、启动服务启动 nameserver启动 broker启…

pytorch保存、加载和解析模型权重

1、模型保存和加载 主要有两种情况&#xff1a;一是仅保存参数&#xff0c;二是保存参数及模型结构。 保存参数&#xff1a; torch.save(net.state_dict()) 加载参数&#xff08;加载参数前需要先实例化模型&#xff09;&#xff1a; param torch.load(param.pth) net.load_…

AWS 中文入门开发教学 47- S3 - 基本的使用

知识点 S3 - 基本的使用方法实战演习 创建存储桶 阻止所有公网访问: 打开版本控制、添加标签: KMS是收费的: 创建成功: 上传文件 选择存储类:

这是中国人工智能AI激情澎湃的一周

融资 贝联珠贯完成 5000 万元天使轮融资&#xff0c;业务涵盖 AI 型算力市场据投中网报道&#xff0c;近日&#xff0c;云资源管理服务提供商浙江贝联珠贯宣布完成 5000 万元天使轮融资&#xff0c;由元璟资本、红杉中国种子基金和舟轩股权投资。 盛大网络 CEO 陈天桥再投 1…

springboot就业信息管理系统

本次设计任务是要设计一个就业信息管理系统&#xff0c;通过这个系统能够满足就业信息管理功能。系统的主要功能包括&#xff1a;首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;导师管理&#xff0c;企业管理&#xff0c;招聘信息管理&#xff0c;应聘信息管理&…

DMA是一个超级简化版的cpu吗?

来自群友的讨论 我的理解是DMA某种程度相当于一个CPU是因为DMA拥有访问其他地址空间的权利。 从系统角度考虑&#xff0c;对整个系统的观测者一般CPU DSP GPU DMA是一个级别&#xff0c;其他都是slave。cache一致性POC是要保证所有观测者&#xff0c;包括DMA观测到相同数据。 …

【学习bubbliiiing代码-2】从txt中获取类别名称以及类别数量

本系列主要用于自我学习&#xff0c;参考的为bubbliiiing的代码 写一个优雅的&#xff1a;从txt文件中获得类别名与类别数的函数&#xff0c;如下&#xff1a; #---------------------------------------------------# # 获得类别名与类别数 #-----------------------------…

Python爬虫:利用JS逆向抓取携程网景点评论区图片的下载链接

Python爬虫:利用JS逆向抓取携程网景点评论区图片的下载链接 1. 前言2. 实现过程3. 运行结果 1. 前言 文章内容可能存在版权问题&#xff0c;为此&#xff0c;小编不提供相关实现代码&#xff0c;只是从js逆向说一说到底怎样实现这个的过程&#xff0c;希望能够帮助到那些正在做…

主动配电网故障恢复的重构与孤岛划分统一模型(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SIP协议学习(2)

文章目录 注册&#xff08;REGISTER&#xff09;1、AOR和Contact区别2、注册概述3、注册与定位服务4、注册超时处理5、注册消息6、多Contact地址处理7、下期预告 注册&#xff08;REGISTER&#xff09; 1、AOR和Contact区别 在学习注册之前&#xff0c;首先区分一下AOR和Cont…

Threads上线5天用户增至1亿,Threads软件常见问题百问百答

7月10日&#xff0c;脸书&#xff08;Facebook&#xff09;母公司Meta旗下新应用程序Threads上线的第5天&#xff0c;其用户数量已经超过1亿。这一增长速度打破聊天机器人ChatGPT的纪录——推出两个月内活跃用户量才破亿。 Threads或成为史上用户数增长速度最快的消费者应用。 …

Mysql数据库基础和增删改查操作

目录 一、数据库基本概念 二、数据库类型和常用数据库 1.关系型数据库 2.非关系型数据库 三、数据库的数据类型 四、SQL语句 1.简介 2.分类 五、SQL语句的使用 1.数据库操作 &#xff08;1&#xff09;创建数据库 ​编辑 &#xff08;2&#xff09;查看数据库 &am…

mac MySQL修改密码

简介&#xff1a; MySQL是一种常用的关系型数据库管理系统。在某些情况下&#xff0c;您可能需要关闭MySQL服务或修改root密码。本文将向您展示如何执行这些操作的步骤。 步骤1&#xff1a;关闭MySQL服务 打开MySQL软件并关闭它。 或者使用以下命令关闭MySQL服务&#xff1a…

conda的使用

一、conda 1、为什么使用conda 在安装Python包的过程中&#xff0c;可能遇到依赖包的问题。例如&#xff0c;要安装numpy&#xff0c;需要先安装BLAS和LAPACK等库。在使用pip等包管理工具时&#xff0c;这些依赖包需要手动安装&#xff0c;操作起来可能比较繁琐。而conda是一个…

pdf怎么添加水印图片?分享3个超实用解决方法

在使用PDF文件时&#xff0c;我们经常会看到一些设置的水印&#xff0c;这提醒观看者文件的所有权。给PDF文件添加水印是一种常见且实用的功能。为了解决如何给PDF添加水印的问题&#xff0c;我将介绍几种常用的方法。 方法一&#xff1a;使用WPS添加水印 WPS是我们常用的办公…

【分布式应用】zookeeper集群

目录 一、zookeeper概述1.1zookeeper工作机制1.2Zookeeper 数据结构1.3Zookeeper 应用场景1.4Zookeeper 选举机制第一次启动选举机制**非第一次启动选举机制 二、部署 Zookeeper 集群2.1环境配置2.2安装 Zookeeper 一、zookeeper概述 Zookeeper是一个开源的分布式的&#xff0c…