如何进行js后台框架搭建(树形菜单,面包屑,全屏功能,刷新功能,监听页面刷新功能)

框架功能是后台高亮不可缺少的功能,基本上所有的后台都需要框架功能,下面是我制作好的一个效果图

下面是我的框架里面功能的具体讲解,还有完整的代码示例

1.声明的变量

// 声明一个用于判断个人信息显示变量
let myes = 0;
// 声明一个用于切换树形菜单状态的变量
let picture = 2;
// 声明一个用于判断信息显示变量
let info = 0;


// 声明一个树形菜单转换后的数据
let treearr = [];
// 声明一个面包屑的数据
let breadcrumbarr = [];
// 声明一个请求的数据
let res;

2.树形菜单功能

先通过接口请求获取数据,我这里用的是json,所以你们想写成接口请求的可以自己改一下

function requests() {
	$(document).ready(function() {
		//获取数据 
		$.ajax({
			//获取数据链接
			url: 'js/ifrom.json',
			//获取什么类型的数据
			dataType: 'json',
			//成功响应
			success: function(data) {
				//让data等于响应回来的数据
				// 先在面包屑数据push首页的数据
				breadcrumbarr.push(data[0]);
				// 使用变量获取数据方便在下面使用
				res = data;
				//让数组等于转换完的数据
				treearr = tree_menu(data, 0, []);
				//获取数组
				show_tree(treearr);
				// 创建一个新的p元素的jQuery对象
				var $newParagraph = $("<div class='block'></p>");
				// 获取目标div元素(假设它的id是myDiv)
				var $targetDiv = $('.treemenu');
				// 将新的p元素添加到div元素的末尾
				$targetDiv.append($newParagraph);
				// 如果存储的这个数据的值为1执行下面的操作
				if (localStorage.getItem('lock') == 1) {
					// 请求这个函数
					request();
				};
				// 如果存储的这个参数不是undefined执行下面的操作
				if (localStorage.getItem('i') != undefined) {
					// 声明存储获取最后显示页面的数据
					let paneldata = JSON.parse(localStorage.getItem('paneldata'));
					// 获取存储最后的显示页面的下标
					let i = localStorage.getItem('i');
					// 把之前存储的面包屑数据获取过了,重新赋值给面包屑的数组
					breadcrumbarr = JSON.parse(localStorage.getItem('breadcrumbarr'));
					// 请求渲染面包屑显示树形菜单高亮的函数
					panel(paneldata, i);
				};
			},


			error: function(xhr, status, error) {
				// 当请求失败时执行的回调函数
				console.error('请求失败:', status, error);
				// 可以在这里处理请求失败的情况,例如显示错误信息给用户
			}
		});
	});
}

这个函数是在请求接口这个函数里面调用的,通过这个函数把接口返回的数据转换成多维的数组结构,如果一开始接口返回的解锁多维的数据,就不需要使用这个函数

//转换数据
function tree_menu(data, pid, treearr) {
	//遍历数据
	for (let i = 0; i < data.length; i++) {

		//判断data下标的pid是否等于pid
		if (data[i].pid == pid) {
			//用dtat下标的子节点,继续调用函数
			data[i].children = tree_menu(data, data[i].id, []);
			//把获取到的放入到数组里面
			treearr.push(data[i]);
		}
	}
	//返回arr
	return treearr;
}

然后通过转换好的数据结构把数据渲染到树形菜单这个div里面,这个渲染函数也是在接口请求函数里面调用的,但是它在上面这个函数的下面,因为要先执行数据转换才能,转换好的数据才能让渲染使用,渲染出来的才是有子级的内容

//渲染
function show_tree(arrs) {
	//声明一个字符串先写一个大盒子包起来
	let str = `<div class="tree_wrap">`;
	// 获取存储的点击的页面名字
	let name = localStorage.getItem('name');
	//遍历数组
	for (let i = 0; i < arrs.length; i++) {
		//判断它的子级长度大于0
		if (arrs[i].children) {


			if (arrs[i].children.length > 0) {

				//拼接它本身,拼接子级,通过递归继续判断它的子级
				str += `<div class="icon icons"><div><img class="treemenuleft" src="${arrs[i].icon}" alt="" />${arrs[i].title}</div><img class="ico" src="./img/xia.png" alt="" /></div>
			                        <div style="display: none;" class="show tree_wrap">`;
				str += show_tree(arrs[i].children);
				str += `</div>`;
			} else {
				if (arrs[i].pid == 0) {
					//拼接它本身 
					str +=
						`<div class="icon" onclick="panel(${JSON.stringify(arrs[i]).replace(/\"/g,"'")},${i})" ><div><img class="treemenuleft" src="${arrs[i].icon}" alt="" />${arrs[i].title}</div></div>`;

				} else {
					str +=
						`<div class="icon" onclick="panel(${JSON.stringify(arrs[i]).replace(/\"/g,"'")},${i})" ><div class="child"><img class="treemenuleft" src="${arrs[i].icon}" alt="" />${arrs[i].title}</div></div>`;
				}
			}
		} else {
			//拼接它本身
			str +=
				`<div class="icon"><div><img class="treemenuleft" src="${arrs[i].icon}" alt="" />${arrs[i].title}</div></div>`;

		}
	}
	//拼接结束标签
	str += `</div>`;
	//渲染到页面上
	$('.treemenu').html(str);
	//显示首页的高亮
	$('.icon').eq(0).addClass('icon-click');
	//高亮点击事件
	$(document).ready(function() {
		$('.icon').on('click', function() {
			// 移除所有菜单项的 icon-click 类
			$('.icon').removeClass('icon-click');

			// 为当前点击的菜单项添加 icon-click 类
			$(this).addClass('icon-click');
		});
	});

	//返回字符串
	return str;
}

下面是点击父级显示子级的函数


//点击父级显示子级
$(document).on('click', '.icons', function() {
	//获取子级框架
	let children = $(this).next();
	//获取图片,过渡1s
	$(this).find('.ico').css('transition', 'all 0.5s');
	//判断是否显示
	if (children.css('display') == 'block') {
		//滑出
		children.hide(500);
		//图片初始化
		$(this).find('.ico').css('transform', 'rotate(0deg)');
	} else {
		//滑入
		children.show(500);
		//图片旋转180
		$(this).find('.ico').css('transform', 'rotate(180deg)');
	}
});

3.面包屑渲染

面包屑渲染是先通过树形菜单的点击事件获取的

下面是树形菜单的点击事件

//点击渲染面包屑
function panel(paneldata, i) {
	// 移除所有菜单项的 icon-click 类
	$('.icon').removeClass('icon-click');
	//高亮点击事件
	if (paneldata.id == 4) {
		// 为当前点击的菜单项添加 icon-click 类
		$('.icon').eq(3).addClass('icon-click');
	} else if (paneldata.id == 6) {
		// 为当前点击的菜单项添加 icon-click 类
		$('.icon').eq(5).addClass('icon-click');
	} else {
		// 为当前点击的菜单项添加 icon-click 类
		$('.icon').eq(i).addClass('icon-click');
	}
	// 存储一下菜单的名字方便下面使用
	sessionStorage.setItem('title', paneldata.title)
	// 如果面包屑数组了吗不存在这个id执行里面的操作
	if (JSON.stringify(breadcrumbarr).indexOf(JSON.stringify(paneldata.id)) == -1) {
		// 存储过来的数据放入到面包屑的数组里面
		breadcrumbarr.push(paneldata);
	}
	// 获取存储的页面链接
	sessionStorage.setItem('redirect', paneldata.path);
	// 在标题页面显示当前所在页面的名字
	$('#font').html(paneldata.title);
	// iframe框架的链接改成树形菜单点击的页面链接
	$('#iframe').attr('src', `./${paneldata.path}.html`);
	// 存储一下点击的整条数据,方便在刷新和锁屏解锁之后使用
	localStorage.setItem('paneldata', JSON.stringify(paneldata));
	// 存储一下点击的数据下标,方便在刷新和锁屏解锁之后使用
	localStorage.setItem('i', i);
	// 存储一下面包屑的所有数据,方便在刷新和锁屏解锁之后使用
	localStorage.setItem('breadcrumbarr', JSON.stringify(breadcrumbarr));
	// 调用渲染面包屑函数
	apple(breadcrumbarr);
}

通过点击树形菜单把点击的树形菜单的这一条数据获取过来,先判断面包屑数组里面是否有这条数据,如果没有这条数据,把这条数据添加到面包屑的数组里面,通过调用面包屑渲染函数,把面包屑渲染出来

//面包屑渲染
function apple(data) {
	// 获取存储的数据的名字
	let name = sessionStorage.getItem('title');
	//获取存储的链接
	let redirect = sessionStorage.getItem('redirect');
	// 声明一个字符串
	let str = ``;
	// 循环面包屑的数据
	for (let i = 0; i < data.length; i++) {
		// 如果data的id不等于1执行下面的操作
		if (data[i].id != 1) {
			// 字符串拼接面包屑的数据
			str +=
				`<div class="pagees" onclick="usb(${JSON.stringify(data[i]).replace(/\"/g,"'")})" style="background-color:${data[i].title==name?'#ecf5ff':''}; color:${data[i].title==name?'#5ca9ff':''}; "><div >${breadcrumbarr[i].title}</div>
				<img onclick="clears(${JSON.stringify(data[i]).replace(/\"/g,"'")})" src="./img/ba60394b-1e8c-449d-a439-33b2b9038aff.png" alt="" />		</div>`
			// iframe框架的链接改成树形菜单点击的页面链接
			$('iframe').attr('src', `./${redirect}.html`);
			// 改变面包屑的高亮
			$(
在Vue 2框架中结合Element UI搭建后台管理系统,通常会采用模块化的开发思路,将界面分为组件化的设计,包括布局、面包屑导航和导航菜单等部分。 1. **布局**:Element UI提供了一套响应式的栅格系统`el-row`和`el-col`,用于构建页面的基本布局。你可以通过调整列数和自适应设置,轻松创建适应不同屏幕尺寸的响应式设计。 2. **面包屑导航**:Element的`el-breadcrumb`组件可以用来实现面包屑功能,只需要将需要显示的历史路径添加到组件的`items`属性里。例如: ```html <el-breadcrumb separator="/" class="breadcrumb"> <el-breadcrumb-item v-for="item in breadcrumbItems" :key="item.path">{{ item.name }}</el-breadcrumb-item> </el-breadcrumb> ``` 这里`breadcrumbItems`是一个数组,包含各个层级的名称和路径信息。 3. **导航菜单**:Element的`el-menu`组件非常适合做后台系统的导航。你可以使用`el-submenu`作为子菜单,`isActive`属性可以帮助判断当前选中的菜单项。示例: ```html <el-menu default-active="$route.path" router> <el-menu-item v-for="item in menuItems" :key="item.id"> <template #title>{{ item.name }} <i :class="{ active: isActive(item.path) }"></i></template> <el-submenu :index="item.path" v-if="item.children"> <template #title>{{ item.text }}</template> <el-menu-item v-for="subItem in item.children" :key="subItem.id">{{ subItem.name }}</el-menu-item> </el-submenu> </el-menu-item> </el-menu> ``` 这里的`menuItems`是一个包含菜单层级结构的对象数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值