当前位置: 首页 > news >正文

如何进行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是否等于pidif (data[i].pid == pid) {//用dtat下标的子节点,继续调用函数data[i].children = tree_menu(data, data[i].id, []);//把获取到的放入到数组里面treearr.push(data[i]);}}//返回arrreturn 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++) {//判断它的子级长度大于0if (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`);// 改变面包屑的高亮$('.pages').css({'color': 'black','border-bottom': "none",'background-color': 'white'});}}// 如果信息框显示就让调用函数隐藏if (info == 1) {// 调用信息隐藏的函数information();}// 如果个人信息显示调用个人信息函数隐藏if (myes == 1) {// 调用个人信息函数my();}// 判断如果存储的名字等于树形菜单数据的下标0的名字下,或者面包屑数组的长度等于0,执行下面的代码if (name == treearr[0].title || breadcrumbarr.length == 0) {// 循环请求接口获取的数据for (let i = 0; i < res.length; i++) {// 如果标签的下标等于存储的名字执行下面的代码if ($('.icon').eq(i).text() == name) {// 移除所有菜单项的 icon-click 类 $('.icon').removeClass('icon-click');// 为当前点击的菜单项添加 icon-click 类$('.icon').eq(i).addClass('icon-click');// iframe框架的链接改成树形菜单点击的页面链接$('iframe').attr('src', `./${breadcrumbarr[i].path}.html`);}}// 在标题页面显示当前所在页面的名字 $('#font').html(name);// 改变面包屑的高亮$('.pages').css({'color': ' #5ca9ff', // 设置文本颜色'background-color': '#ecf5ff', // 设置背景颜色});}// 把字符串拼接的数据渲染到面包屑的div里document.getElementsByClassName('navigation')[0].innerHTML = str;
}

面包屑点击事件,点击面包屑让点击的面包屑显示高亮,显示对应的树形菜单显示高亮

//点击面包屑显示高亮
function usb(data) {// 存储点击面包屑的名字localStorage.setItem('name', data.title);// 循环获取一开始请求数据的参数for (let i = 0; i < res.length; i++) {//如果一开始存储数据的数组下标i的id==点击数据的id执行下面的操作if (res[i].id == data.id) {// 在标题页面显示当前所在页面的名字 $('#font').html(data.title);// 存储一下点击的整条数据,方便在刷新和锁屏解锁之后使用localStorage.setItem('paneldata', JSON.stringify(res[i]));// 存储一下点击的数据下标,方便在刷新和锁屏解锁之后使用localStorage.setItem('i', i);// iframe框架的链接改成面包屑点击的页面链接$('iframe').attr('src', `./${res[i].path}.html`);}}// 判断如果信息显示让他隐藏if (info == 1) {// 调用信息显示或者隐藏函数information();}// 如果个人信息显示让他隐藏if (myes == 1) {// 调用个人信息显示或者隐藏函数my();}// 循环获取一开始请求数据的参数for (let i = 0; i < res.length; i++) {// 如果icon的下标内容等于点击面包屑内容的名字执行下面的操作if ($('.icon').eq(i).text() == data.title) {// 移除所有菜单项的 icon-click 类 $('.icon').removeClass('icon-click');// 为当前点击的菜单项添加 icon-click 类$('.icon').eq(i).addClass('icon-click');}}// 循环面包屑的数组for (let i = 0; i < breadcrumbarr.length; i++) {// 判断面包屑数组的id==点击面包屑数据的id,执行下面的操作if (breadcrumbarr[i].id == data.id) {// 清除面包屑高亮样式$('.pages').css({'color': 'black','border-bottom': "none",'background-color': 'white'});// 清除行内样式$('.pagees').removeAttr('style');// 清除css的类名$('.pagees').removeClass('crumbs');// 给点击的面包屑数据绑上css的高亮域名$('.pagees').eq(i - 1).addClass('crumbs');}}// 存储面包屑的数组localStorage.setItem('breadcrumbarr', JSON.stringify(breadcrumbarr));
}

点击删除按钮删除面包屑事件,先要阻止事件的冒泡,在循环面包屑的数据,判断点击的是哪一条数据,使用splice方法删除点击的数据,显示面包屑最后一个高亮,显示树形菜单跟面包屑数组最后一条数据一样的显示高亮

//点击删除面包屑按钮
function clears(data) {// 阻止事件冒泡event.stopPropagation();// 循环面包屑数组for (let i = 0; i < breadcrumbarr.length; i++) {// 如果面包屑的id等于删除事件的id,执行下面的操作if (breadcrumbarr[i].id == data.id) {// 使用splice方法删除数据breadcrumbarr.splice(i, 1);// 存储breadcrumbarr数组的最后一个数据的名字sessionStorage.setItem('title', breadcrumbarr[breadcrumbarr.length - 1].title);// 存储breadcrumbarr数组的最后一个数据的链接sessionStorage.setItem('redirect', breadcrumbarr[breadcrumbarr.length - 1].path);}}// 调用面包屑渲染函数,页面上也清除这个数据apple(breadcrumbarr);// 声明一个获取面包屑数组的最后一个数据的名字let titleToFind = breadcrumbarr[breadcrumbarr.length - 1].title;// 清除树形菜单所有的高亮类名$('.icon').removeClass('icon-click');// 遍历所有使用。icon类名的元素$('.icon').each(function() {// 判断内容是否==数组的最后一个数据的名字if ($(this).text() === titleToFind) {// 为当前的菜单项添加 icon-click 类$(this).addClass('icon-click');}});// 修改导航栏文字if (breadcrumbarr.length > 0) {$('#font').html(breadcrumbarr[breadcrumbarr.length - 1].title);} else {$('#font').html(breadcrumbarr[0].title);}
}

首页的点击事件

// 首页点击事件
function sy() {// 清除树形菜单首页的高量$('.icon').removeClass('icon-click');// 给首页的树形菜单显示高亮$('.icon').eq(0).addClass('icon-click');// 清除面包屑的高亮$('.pagees').removeAttr('style');$('.pagees').removeClass('crumbs');// 设置首页面包屑高亮$('.pages').css({'color': ' #5ca9ff', // 设置文本颜色'background-color': '#ecf5ff', // 设置背景颜色});// 渲染标题$('#font').html(treearr[0].title);// 把iframe的src路径改成首页路径$('iframe').attr('src', `./home.html`);
}

4.全屏功能

在当今数字化的网页浏览体验中,全屏功能已经成为许多网站和应用提升用户沉浸感与交互性的重要手段。今天,让我们深入探讨一个简单而实用的用于实现全屏切换的 JavaScript 函数 ——toggleFullScreen,剖析其背后的逻辑与应用场景。

下面是全屏的代码实例

//放大功能
function toggleFullScreen() {if (!document.fullscreenElement) {// 进入全屏document.documentElement.requestFullscreen();} else {// 退出全屏if (document.exitFullscreen) {document.exitFullscreen();}}
}// 绑定一个按钮点击事件来触发全屏功能
document.getElementById('blowup').addEventListener('click', toggleFullScreen);

这个函数是用来实现网页在全屏与非全屏状态之间的转换。首先通过document.fullscreenElement判断当前页面是否处于全屏的状态。如果属性为null,代表页面为处于全屏的状态,那就调用进入全屏的方法,请求将整个页面切换到全屏的模式,通过html文档的根元素<html>,通过它来发起全屏请求可以使整个页面进入全屏展示。

而当document.fullscreenElement不为null时,说明页面已经处于全屏的状态,判断document.exitFullscreen();这个方法是否存在,如果存在,就调用该方法来实现退出全屏的操作,使页面恢复到正常的非全屏显示状态

5.框架刷新功能

在网页开发与用户交互体验的领域中,页面刷新功能是一项常见但又颇具深度的技术点。今天,我们将聚焦于一个特定的用于刷新页面且不使用缓存的 JavaScript 函数 ——refreshPage,剖析其工作原理、应用场景以及在优化网页体验方面的意义。

让我们先来研究一下刷新功能代码

//刷新页面
// 不使用缓存刷新页面
function refreshPage() {// 刷新iframe的链接$('iframe').attr('src', $('iframe').attr('src'));// 不刷新整个页面event.preventDefault();event.stopPropagation();
}

 这个函数首先,针对页面的iframe元素进行了处理。通过jqurey选择器选中了所有的iframe元素,然后利用jqurey里面的attr方法改变它的路径。这一操作看似简单,实则巧妙地实现了对 iframe 内容的刷新。由于重新设置了相同的源链接,浏览器会重新向服务器请求该 iframe 页面的资源,而不是直接使用缓存中的内容,从而达到了刷新 iframe 且不依赖缓存的目的。

其次,函数中使用了 event.preventDefault();  和 event.stopPropagation(); 这两个方法。这两个方法通常用于处理事件流,在这里它们的作用是阻止默认的页面刷新行为以及阻止事件的冒泡传播。这一步骤非常关键,因为如果没有这两个操作,函数的执行可能会导致整个页面的常规刷新,而不是仅仅刷新 iframe 内容,这就违背了函数设计的初衷,即实现无缓存的局部页面(iframe)刷新。

6.监听页面刷新功能

在现代网页开发的复杂世界中,有效地处理页面刷新事件对于提供流畅且数据一致的用户体验至关重要。今天,我们将深入探讨一段用于监听页面刷新事件并根据情况执行特定操作的 JavaScript 代码,揭示其背后的原理、应用场景以及对网页性能和用户体验的影响。

以下是我们要深入研究的刷新代码片段:

// 监听页面刷新事件
window.addEventListener('load', function(event) {// 如果点击刷新按钮执行下面if (performance.navigation.type === performance.navigation.TYPE_RELOAD) {// 调用树形菜单接口请求的数据requests()} else {}
});

首先,window.addEventListener('load',callback) 这行代码用于在页面加载完成后添加一个事件监听器。load事件在整个页面(包括所有依赖资源,如样式表、脚本、图像等)都已加载完成时触发。这确保了我们在处理页面刷新相关逻辑时,页面已经处于一个相对稳定且完整的状态,避免了因资源未加载完全而导致的错误或不一致性。

在事件监听器的回调函数内部,通过performance.navigation.type 属性来判断页面导航的类型。performance.navigation 对象提供了有关页面导航的信息,其中 type 属性可以取不同的值来表示页面是如何被导航到当前状态的。当 performance.navigation.type === performance.navigation.TYPE_RELOAD时,这意味着页面是通过点击浏览器的刷新按钮(或者在 JavaScript 中使用 location.reload()方法)进行重新加载的。在这种情况下,代码会执行 requests()函数,这个函数可能是用于向服务器请求树形菜单接口的数据,以确保在页面刷新后,树形菜单能够显示最新的数据内容,与服务器端的数据保持同步。

7.下面是完整的代码示例

// 框架js// 获取提示弹出窗
let tooltip = $(".Tooltip")[0]; // 获取提示信息的 DOM 元素
// 获取本地存储登录的数据
let tokens = localStorage.getItem("data");// 判断数据如果为null返回登录页
function disconnected() {tokens = localStorage.getItem("data");if (tokens == null) {// 弹出窗提示tooltip.innerHTML = `您已掉线,两秒将返回登录页面`; // 设置提示信息// 显示弹出窗tooltip.style = "display:block";// 定时器跳转到登录页setTimeout(function() {console.log(1);// 清除临时存储的数据sessionStorage.clear();// 清除本地存储的数据localStorage.clear();// 跳转到登录页window.location.replace("login.html");}, 2000);}
}// 每五秒执行定时器
setInterval(function() {//判断数据是否丢失,如果丢失,弹出窗提示跳转到登录页disconnected();// 请求首页接口判断,token是否失效showdata();
}, 1000);
// 数据转换
let personal = JSON.parse(tokens);
// 获取存储登录页数据里面的id
let uid = personal.data.id;
// 获取登录页数据的token
let token = personal.data.token;
// 获取本地存储的接口
let dns = localStorage.getItem('dns');
// 请求首页接口
function showdata() {$.ajax({type: "post",url: dns + "/spigall/Statis",data: {},headers: {token: token,id: uid},success: function(data) {// 判断token是否过期if (data.code == 0) {// 弹出窗显示tooltip.style = "display:block";// 弹出窗渲染tooltip.innerHTML = `您已掉线,两秒将返回登录页面`; // 设置提示信息、// 定时器跳转到登录页setTimeout(function() {// 清除临时存储的数据sessionStorage.clear();// 清除本地存储的数据localStorage.clear();// 跳转到登录页window.location.replace("login.html");}, 2000);}},error: function(e) { // 请求失败的回调函数console.error("请求失败", e);}})
}
// 如果获取的存储为1跳转到锁屏页面
if (localStorage.getItem('locks') == 1) {window.location.replace('lock.html');
}
// 声明一个用于判断个人信息显示变量
let myes = 0;
// 声明一个用于切换树形菜单状态的变量
let picture = 2;
// 声明一个用于判断信息显示变量
let info = 0;// 声明一个树形菜单转换后的数据
let treearr = [];
// 声明一个面包屑的数据
let breadcrumbarr = [];
// 声明一个请求的数据
let res;
// 调用树形菜单接口请求的数据
requests();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 request() {// 如果存储的面包屑数据不是undefined执行下面的操作if (localStorage.getItem('breadcrumbarr') != undefined) {// 设置个人信息的显示方式为0 myes = 0;// 设置信息的显示方式为0 info = 0;// 声明存储获取最后显示页面的数据 let paneldata = JSON.parse(localStorage.getItem('paneldata'));// 获取存储最后的显示页面的下标let i = localStorage.getItem('i');// 把之前存储的面包屑数据获取过来,重新赋值给面包屑的数组breadcrumbarr = JSON.parse(localStorage.getItem('breadcrumbarr'));// 请求渲染面包屑显示树形菜单高亮的函数panel(paneldata, i);// 删除存储的这个值localStorage.removeItem('lock');}
}
//转换数据
function tree_menu(data, pid, treearr) {//遍历数据for (let i = 0; i < data.length; i++) {//判断data下标的pid是否等于pidif (data[i].pid == pid) {//用dtat下标的子节点,继续调用函数data[i].children = tree_menu(data, data[i].id, []);//把获取到的放入到数组里面treearr.push(data[i]);}}//返回arrreturn treearr;
}
//渲染
function show_tree(arrs) {//声明一个字符串先写一个大盒子包起来let str = `<div class="tree_wrap">`;// 获取存储的点击的页面名字let name = localStorage.getItem('name');//遍历数组for (let i = 0; i < arrs.length; i++) {//判断它的子级长度大于0if (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)');}
});//点击渲染面包屑
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`);// 改变面包屑的高亮$('.pages').css({'color': 'black','border-bottom': "none",'background-color': 'white'});}}// 如果信息框显示就让调用函数隐藏if (info == 1) {// 调用信息隐藏的函数information();}// 如果个人信息显示调用个人信息函数隐藏if (myes == 1) {// 调用个人信息函数my();}// 判断如果存储的名字等于树形菜单数据的下标0的名字下,或者面包屑数组的长度等于0,执行下面的代码if (name == treearr[0].title || breadcrumbarr.length == 0) {// 循环请求接口获取的数据for (let i = 0; i < res.length; i++) {// 如果标签的下标等于存储的名字执行下面的代码if ($('.icon').eq(i).text() == name) {// 移除所有菜单项的 icon-click 类 $('.icon').removeClass('icon-click');// 为当前点击的菜单项添加 icon-click 类$('.icon').eq(i).addClass('icon-click');// iframe框架的链接改成树形菜单点击的页面链接$('iframe').attr('src', `./${breadcrumbarr[i].path}.html`);}}// 在标题页面显示当前所在页面的名字 $('#font').html(name);// 改变面包屑的高亮$('.pages').css({'color': ' #5ca9ff', // 设置文本颜色'background-color': '#ecf5ff', // 设置背景颜色});}// 把字符串拼接的数据渲染到面包屑的div里document.getElementsByClassName('navigation')[0].innerHTML = str;
}//点击面包屑显示高亮
function usb(data) {// 存储点击面包屑的名字localStorage.setItem('name', data.title);// 循环获取一开始请求数据的参数for (let i = 0; i < res.length; i++) {//如果一开始存储数据的数组下标i的id==点击数据的id执行下面的操作if (res[i].id == data.id) {// 在标题页面显示当前所在页面的名字 $('#font').html(data.title);// 存储一下点击的整条数据,方便在刷新和锁屏解锁之后使用localStorage.setItem('paneldata', JSON.stringify(res[i]));// 存储一下点击的数据下标,方便在刷新和锁屏解锁之后使用localStorage.setItem('i', i);// iframe框架的链接改成面包屑点击的页面链接$('iframe').attr('src', `./${res[i].path}.html`);}}// 判断如果信息显示让他隐藏if (info == 1) {// 调用信息显示或者隐藏函数information();}// 如果个人信息显示让他隐藏if (myes == 1) {// 调用个人信息显示或者隐藏函数my();}// 循环获取一开始请求数据的参数for (let i = 0; i < res.length; i++) {// 如果icon的下标内容等于点击面包屑内容的名字执行下面的操作if ($('.icon').eq(i).text() == data.title) {// 移除所有菜单项的 icon-click 类 $('.icon').removeClass('icon-click');// 为当前点击的菜单项添加 icon-click 类$('.icon').eq(i).addClass('icon-click');}}// 循环面包屑的数组for (let i = 0; i < breadcrumbarr.length; i++) {// 判断面包屑数组的id==点击面包屑数据的id,执行下面的操作if (breadcrumbarr[i].id == data.id) {// 清除面包屑高亮样式$('.pages').css({'color': 'black','border-bottom': "none",'background-color': 'white'});// 清除行内样式$('.pagees').removeAttr('style');// 清除css的类名$('.pagees').removeClass('crumbs');// 给点击的面包屑数据绑上css的高亮域名$('.pagees').eq(i - 1).addClass('crumbs');}}// 存储面包屑的数组localStorage.setItem('breadcrumbarr', JSON.stringify(breadcrumbarr));
}//点击删除面包屑按钮
function clears(data) {// 阻止事件冒泡event.stopPropagation();// 循环面包屑数组for (let i = 0; i < breadcrumbarr.length; i++) {// 如果面包屑的id等于删除事件的id,执行下面的操作if (breadcrumbarr[i].id == data.id) {// 使用splice方法删除数据breadcrumbarr.splice(i, 1);// 存储breadcrumbarr数组的最后一个数据的名字sessionStorage.setItem('title', breadcrumbarr[breadcrumbarr.length - 1].title);// 存储breadcrumbarr数组的最后一个数据的链接sessionStorage.setItem('redirect', breadcrumbarr[breadcrumbarr.length - 1].path);}}// 调用面包屑渲染函数,页面上也清除这个数据apple(breadcrumbarr);// 声明一个获取面包屑数组的最后一个数据的名字let titleToFind = breadcrumbarr[breadcrumbarr.length - 1].title;// 清除树形菜单所有的高亮类名$('.icon').removeClass('icon-click');// 遍历所有使用。icon类名的元素$('.icon').each(function() {// 判断内容是否==数组的最后一个数据的名字if ($(this).text() === titleToFind) {// 为当前的菜单项添加 icon-click 类$(this).addClass('icon-click');}});// 修改导航栏文字if (breadcrumbarr.length > 0) {$('#font').html(breadcrumbarr[breadcrumbarr.length - 1].title);} else {$('#font').html(breadcrumbarr[0].title);}
}
// 首页点击事件
function sy() {// 清除树形菜单首页的高量$('.icon').removeClass('icon-click');// 给首页的树形菜单显示高亮$('.icon').eq(0).addClass('icon-click');// 清除面包屑的高亮$('.pagees').removeAttr('style');$('.pagees').removeClass('crumbs');// 设置首页面包屑高亮$('.pages').css({'color': ' #5ca9ff', // 设置文本颜色'background-color': '#ecf5ff', // 设置背景颜色});// 渲染标题$('#font').html(treearr[0].title);// 把iframe的src路径改成首页路径$('iframe').attr('src', `./home.html`);
}//放大功能
function toggleFullScreen() {if (!document.fullscreenElement) {// 进入全屏document.documentElement.requestFullscreen();} else {// 退出全屏if (document.exitFullscreen) {document.exitFullscreen();}}
}// 绑定一个按钮点击事件来触发全屏功能
document.getElementById('blowup').addEventListener('click', toggleFullScreen);//刷新页面
// 不使用缓存刷新页面
function refreshPage() {// 刷新iframe的链接$('iframe').attr('src', $('iframe').attr('src'));// 不刷新整个页面event.preventDefault();event.stopPropagation();
}// 退出登录函数
function quit() {// 清除所有的本地存储localStorage.clear();// 清除所有的临时存储sessionStorage.clear();// 返回登录页window.location.replace("login.html");
}
// 获取存储的个人信息
let data = JSON.parse(localStorage.getItem('data'));
//树形菜单只显示图表的函数 
function tree_hover(arrs) {//声明一个字符串先写一个大盒子包起来let str = `<div class="tree_wrap">`;// 使用变量获取存储的数据名字let name = localStorage.getItem('name');//遍历数组for (let i = 0; i < arrs.length; i++) {//判断它的子级长度大于0if (arrs[i].children) {// 如果数据有子级执行下面的操作if (arrs[i].children.length > 0) {//拼接它本身,拼接子级,通过递归继续判断它的子级str += `<div class="icon icons">${arrs[i].title}<img class="ico" src="./img/jiantou.png" alt="" /></div><div style="display: none;" class="show">`;str += tree_hover(arrs[i].children);str += `</div>`;} else {if (arrs[i].pid == 0) {//拼接它本身 str +=`<div class="icon" onclick="panel(${JSON.stringify(arrs[i]).replace(/\"/g,"'")})" ><img class="treemenulefts" src="${arrs[i].icon}" alt="" />${arrs[i].title}</div>`;} else {str +=`<div class="icon" onclick="panel(${JSON.stringify(arrs[i]).replace(/\"/g,"'")})" >${arrs[i].title}</div>`;}}} else {//拼接它本身str +=`<div class="icon"><img class="treemenulefts" src="${arrs[i].icon}" alt="" />${arrs[i].title}</div>`;}}//拼接结束标签str += `</div>`;//渲染到页面上$('.treeicon').html(str);//返回字符串return str;
}function tree() {// 点击管理图片切换只显示图片状态if (picture === 1) {// 显示第一个框架$('.background').css('display', 'block');// 隐藏第二个框架$('.backgrounds').css('display', 'none');// 调整左边的或者宽度$('.framework').css('width', '87.5%');show_tree(treearr);// 改变它的状态picture = 2;} else {//隐藏第一个框架$('.background').css('display', 'none');// 显示第二个框架$('.backgrounds').css('display', 'block');// 调整左边的或者宽度$('.framework').css('width', '96%');// 声明一个数组let arrs = [];// 让数组调用树形菜单的数组arrs = treearr;// 字符串拼接let str = `<div class="tree_wraps">`;let name = localStorage.getItem('name');// 循环拼接数据for (let i = 0; i < arrs.length; i++) {if (arrs[i].children && arrs[i].children.length > 0) {str += `<div class="icones icos icons"><div ><img class="treemenulefts" title="${arrs[i].title}" src="${arrs[i].icon}" alt="" /></div><div class=" icon-text" >`;str += show_treeto(arrs[i].children);str += `</div></div>`;} else {str += `<div class="icones " onclick="panel(${JSON.stringify(arrs[i]).replace(/\"/g,"'")})"><img class="treemenulefts"  title="${arrs[i].title}" src="${arrs[i].icon}" alt="" /><div class="icon-text">${arrs[i].title}</div></div>`;}}str += `</div>`;// 渲染到这个div里面$('.treemenus').html(str);// 改变它的状态picture = 1;}
};//渲染
function show_treeto(arrs) {//声明一个字符串先写一个大盒子包起来let str = `<div class="tree_wraps">`;let name = localStorage.getItem('name');//遍历数组for (let i = 0; i < arrs.length; i++) {//判断它的子级长度大于0if (arrs[i].children) {if (arrs[i].children.length > 0) {//拼接它本身,拼接子级,通过递归继续判断它的子级str += `<div class=" icons"><img class="treemenulefts" src="./img/${arrs[i].icon}.png" alt="" />${arrs[i].title}<img class="ico" src="./img/jiantou.png" alt="" /></div><div style="display: none;" class="show">`;str += show_treeto(arrs[i].children);str += `</div>`;} else {if (arrs[i].pid == 0) {//拼接它本身 str +=`<div onclick="panel(${JSON.stringify(arrs[i]).replace(/\"/g,"'")})" ><img  src="./img/${arrs[i].icon}.png" alt="" />${arrs[i].title}</div>`;} else {str +=`<div class="icos" onclick="panel(${JSON.stringify(arrs[i]).replace(/\"/g,"'")})" >${arrs[i].title}</div>`;}}}}//拼接结束标签str += `</div>`;//渲染到页面上$('.treemenu').html(str);//返回字符串return str;
}// 点击锁屏函数
function lock() {// 存储一个数据为1localStorage.setItem('locks', 1);// 创建一个新的状态对象newState,它包含了两个属性// pageTitle属性用于表示页面标题,这里设置为"lock.html"// pageContent属性用于描述页面的内容,这里设置了相关的描述字符串var newState = {pageTitle: "lock.html",pageContent: "这是新的页面内容相关描述"};// 使用history.replaceState方法来更新浏览器历史记录中的当前状态// 第一个参数newState就是上面定义的新状态对象,它包含了页面相关的一些状态信息// 第二个参数"新页面标题"是一个可选的标题参数,用于在某些浏览器的历史记录中展示相关标题(不过实际支持情况因浏览器而异)// 第三个参数"lock.html"指定了与该历史记录状态关联的URL路径,当用户点击浏览器的前进/后退按钮时可能会用到这个路径信息history.replaceState(newState, "新页面标题", "lock.html");// 使用location.reload方法来重新加载当前页面,这会导致页面重新从服务器获取资源(如果是无缓存情况)// 或者从缓存中重新加载页面内容(如果有可用缓存),常用于需要更新页面显示状态的场景location.reload();
}// 	请求个人接口
individual();
function individual() {$.ajax({url: dns + 'spigall/amend',method: 'POST',dataType: 'json',headers: {token: personal.data.token,id: personal.data.id},data: {id: personal.data.id},success: function(data) {// 渲染个人信息$("#myico").attr("src", `${dns}${data.data.img}`);$("#myicos").attr("src", `${dns}${data.data.img}`);$("#myicoss").attr("src", `${dns}${data.data.img}`);$("#myicoes").attr("src", `${dns}${data.data.img}`);$("#myname").html(data.data.name);$("#mynames").html(data.data.name);$("#my").html(data.data.name);$("#sex").html(data.data.sex == 1 ? "男" : "女");$("#sexs").html(data.data.sex == 1 ? "男" : "女");$("#tel").html(data.data.tel);$("#tels").html(data.data.tel);$("#account").html(data.data.tel);$("#accounts").html(data.data.tel);$("#pass").html(data.data.password);$("#passes").html(data.data.password);},error: function(xhr, status, error) {// 当请求失败时执行的回调函数console.error('请求失败:', status, error);// 可以在这里处理请求失败的情况,例如显示错误信息给用户}});
}
// 消息
function information() {// 如果参数为0显示信息,隐藏个人信息if (info == 0) {$(".information-box").show();$('.my-information-box').hide();$('#info').css({"color": "white","background-color": "rgb(97, 161, 201)"});$('#infos').css({"color": "","background-color": ""});info = 1;myes = 0;// 如果参数为1隐藏信息} else if (info == 1) {$(".information-box").hide();$('#info').css({"color": "","background-color": ""});info = 0;}
}// 我的信息function my() {// 如果参数为0显示个人信息,隐藏信息if (myes == 0) {$(".information-box").hide();$('.my-information-box').show();$('#infos').css({"color": "white","background-color": "rgb(97, 161, 201)"});$('#info').css({"color": "","background-color": ""});myes = 1;info = 0;// 如果参数为1隐藏个人信息} else if (myes == 1) {$('#infos').css({"color": "","background-color": ""});$('#infos').css({"color": "","background-color": ""});$('.my-information-box').hide();myes = 0;}
}// 个人页面的点击事件
function mys() {// iframe框架的链接改成我的的页面链接$('#iframe').attr('src', `./my.html`);
}
// 用点击其他地方关闭信息和个人信息弹出窗
function hides() {$('.my-information-box').hide();$(".information-box").hide();$('#infos').css({"color": "","background-color": ""});$('#info').css({"color": "","background-color": ""});myes = 0;info = 0;
}// 监听页面刷新事件
window.addEventListener('load', function(event) {// 如果点击刷新按钮执行下面if (performance.navigation.type === performance.navigation.TYPE_RELOAD) {// 调用树形菜单接口请求的数据requests()} else {}
});

相关文章:

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

框架功能是后台高亮不可缺少的功能&#xff0c;基本上所有的后台都需要框架功能&#xff0c;下面是我制作好的一个效果图 下面是我的框架里面功能的具体讲解&#xff0c;还有完整的代码示例 1.声明的变量 // 声明一个用于判断个人信息显示变量 let myes 0; // 声明一个用于切…...

多目标优化常用方法:pareto最优解

生产实际中的许多优化问题大都是多目标问题&#xff0c;举个例子&#xff1a;我们想换一份工资高、压力小、离家近的新工作&#xff0c;这里工资高、压力小、离家近就是我们的目标&#xff0c;显然这是一个多目标问题&#xff0c;那我们肯定想找到这三个目标同时最优的工作&…...

Vue.js实例开发-如何通过Props传递数据

props 是父组件用来传递数据给子组件的一种机制。通过 props&#xff0c;你可以将数据从父组件“传递”到子组件&#xff0c;并在子组件的模板和逻辑中使用这些数据。 1. 定义子组件并接收 props 首先&#xff0c;定义一个子组件&#xff0c;并在该组件中声明它期望接收的 pr…...

由popover框一起的操作demo问题

场景&#xff1a; 当popover框弹出的时候&#xff0c;又有MessageBox 提示&#xff0c;此时关闭MessageBox 提示&#xff0c;popover就关闭了。将popover改为手动激活&#xff0c;可以解决这个问题&#xff0c;但是会引起另外一个问题&#xff0c;之前&#xff08;click触发的时…...

人工智能ACA(四)--机器学习基础

零、参考资料 一篇文章完全搞懂正则化&#xff08;Regularization&#xff09;-CSDN博客 一、 机器学习概述 0. 机器学习的层次结构 学习范式&#xff08;最高层&#xff09; 怎么学 监督学习 无监督学习 半监督学习 强化学习 学习任务&#xff08;中间层&#xff0…...

uniapp图片数据流���� JFIF ��C 转化base64

1&#xff0c;后端返回的是图片数据流&#xff0c;格式如下 &#xfffd;&#xfffd;&#xfffd;&#xfffd; JFIF &#xfffd;&#xfffd;C 如何把这样的文件流转化为base64&#xff0c; btoa 是浏览器提供的函数&#xff0c;但在 小程序 环境中&#xff08;如微信小程序…...

django中cookie与session的使用

一、cookie cookie由服务器生成 &#xff0c;存储在浏览器中的键值对数据,具有不安全性&#xff0c;对应敏感数据应该加密储存在服务端每个域名的cookie相互独立浏览器访问域名为A的url地址&#xff0c;会把A域名下的cookie一起传递到服务器cookie可以设置过期时间 django中设…...

<项目代码>YOLO Visdrone航拍目标识别<目标检测>

项目代码下载链接 &#xff1c;项目代码&#xff1e;YOLO Visdrone航拍目标识别&#xff1c;目标检测&#xff1e;https://download.csdn.net/download/qq_53332949/90163918YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一…...

GhostRace: Exploiting and Mitigating Speculative Race Conditions-记录

文章目录 论文背景Spectre-PHT&#xff08;Transient Execution &#xff09;Concurrency BugsSRC/SCUAF和实验条件 流程Creating an Unbounded UAF WindowCrafting Speculative Race ConditionsExploiting Speculative Race Conditions poc修复flush and reload 论文 https:/…...

OPPO 数据分析面试题及参考答案

如何设计共享单车数据库的各个字段? 对于共享单车的数据库设计,首先考虑用户相关的字段。用户表可以包含用户 ID,这是一个唯一标识符,用于区分不同用户;姓名,记录用户的真实姓名;联系方式,比如手机号码,方便在出现问题时联系用户;注册时间,记录用户何时开始使用共享…...

腾讯云云开发 Copilot 深度探索与实战分享

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 一、引言 二、产品介绍 三、产品体验过程 四、整体总结 五、给开发者的复用建议 六、对 AI 辅助开发的前景展望 一、引言 在当今数字化转型加速的时代&#xff0c;…...

Mac M1使用pip3安装报错

1. Mac系统使用pip3安装组件的时候报”外部管理环境”错误&#xff1a; error: externally-managed-environment 2.解决办法 去掉这个提示 1、先查看当前python版本&#xff1a; python3 --version 2、查找EXTERNALLY-MANAGED 文件的位置&#xff08;根据自己当前使用的pytho…...

flask-admin的modelview 实现list列表视图中扩展修改状态按钮

背景&#xff1a; 在flask-admin的模型视图&#xff08;modelview 及其子类&#xff09;中如果不想重构UI视图&#xff0c;那么就不可避免的出现默认视图无法很好满足需求的情况&#xff0c;如默认视图中只有“新增”&#xff0c;“编辑”&#xff0c;“选中的”三个按钮。 材…...

算法训练第二十三天|93. 复原 IP 地址 78. 子集 90. 子集 II

93. 复原 IP 地址--分割 题目 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&…...

imu相机EKF

ethzasl_sensor_fusion/Tutorials/Introductory Tutorial for Multi-Sensor Fusion Framework - ROS Wiki https://github.com/ethz-asl/ethzasl_msf/wiki...

【杂谈】虚拟机与EasyConnect运行巧设:Reqable助力指定应用流量专属化

场景 公司用的是EasyConnect&#xff0c;这个软件非常好用&#xff0c;也非常稳定&#xff0c;但是有个缺点&#xff0c;就是会无条件拦截本机所有流量&#xff0c;而且会加入所有运行的exe程序&#xff0c;实现流量全部走代理。 准备材料 一个windows/Linux 桌面版虚拟机Ea…...

【AI系列】Paddle Speech安装指南

文章目录 环境依赖1. 安装Python1.1 下载Python安装包1.2 安装gcc1.3 安装依赖库1.4 编译和安装Python1.5 配置环境变量 2. 安装PaddlePaddle3. 安装PaddleSpeech4. 运行PaddleSpeech5. 解决常见问题5.1 错误&#xff1a;libssl.so.1.1解决方法&#xff1a; 5.2 错误&#xff1…...

【AI学习】OpenAI推出o3,向AGI迈出关键一步

2024年12月21日&#xff0c;OpenAI在其为期12天发布会活动的最后一天&#xff0c;正式发布了备受期待的o3系列模型&#xff0c;包括o3和o3-mini。 o3 是一个非常强大的模型&#xff0c;在编码、数学以及 ARC-AGI 基准测试等多个基准上超过了 OpenAI 此前的 o1 模型&#xff08…...

深度学习0-前置知识

一、背景 AI最大&#xff0c;它的目的是通过让机器模仿人类进而超越人类&#xff1b; ML次之&#xff0c;它是AI的一个分支&#xff0c;是让机器模仿人类的一种方法。开发人员用大量数据和算法“训练”机器&#xff0c;让机器自行学会如何执行任务&#xff0c;它的成功取决于…...

Elasticsearch-分词器详解

什么是分词器 1、分词器介绍 对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 常用的中文分词器有ik按照切词的粒度粗细又分为:ik_max_word和ik_smart&…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...

简约商务通用宣传年终总结12套PPT模版分享

IOS风格企业宣传PPT模版&#xff0c;年终工作总结PPT模版&#xff0c;简约精致扁平化商务通用动画PPT模版&#xff0c;素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df...

解决MybatisPlus使用Druid1.2.11连接池查询PG数据库报Merge sql error的一种办法

目录 前言 一、问题重现 1、环境说明 2、重现步骤 3、错误信息 二、关于LATERAL 1、Lateral作用场景 2、在四至场景中使用 三、问题解决之道 1、源码追踪 2、关闭sql合并 3、改写处理SQL 四、总结 前言 在博客&#xff1a;【写在创作纪念日】基于SpringBoot和PostG…...

可视化预警系统:如何实现生产风险的实时监控?

在生产环境中&#xff0c;风险无处不在&#xff0c;而传统的监控方式往往只能事后补救&#xff0c;难以做到提前预警。但如今&#xff0c;可视化预警系统正在改变这一切&#xff01;它能够实时收集和分析生产数据&#xff0c;通过直观的图表和警报&#xff0c;让管理者第一时间…...