网站 友情链接怎么做/seo专业培训学费多少钱
前言
在前端开发中,分页功能是一个常见的需求,特别是当需要展示大量数据时,它能有效提升用户体验。该文章结合运用了HTML,CSS,JS实现网页的分页按钮功能,并且可以选择每页显示的条数试试更新总页数及显示当前页和总数据条数。
代码整体功能概述
这段代码实现了一个简单的网页,从 JSON 文件中获取数据并以表格形式展示,同时提供分页功能。用户可以通过点击分页按钮、输入页码或者选择每页显示条数来浏览不同页面的数据。
效果展示
代码部分
HTML
<div class="content"><table><thead><tr><td>id</td><td>姓名</td><td>年龄</td><td>性别</td></tr></thead><tbody><tr><td>111</td><td>222</td><td>333</td><td></td></tr></tbody></table>
</div><div class="box"></div>
CSS部分
.box {position: fixed;left: 23%;top: 35%;/* border: solid; */width: 55%;/* background-color: aqua; */display: flex;justify-content: space-around;}.box input {width: 70px;}.pageNum {width: 20px;height: 22px;text-align: center;font-weight: 600;cursor: pointer;border: solid 1px;border-radius: 5px;}.endPage,.lastPage,.nextPage,.homePage {cursor: pointer;}.pageNum:hover {background-color: gray;/* 鼠标悬浮时的背景颜色 */color: white;/* 鼠标悬浮时的文本颜色 */}.endPage:hover,.lastPage:hover,.nextPage:hover,.homePage:hover {color: red;}table {margin: auto;border: solid;text-align: center;border-collapse: collapse;width: 280px;}th,td {padding: 10px;border: 1px solid black;/* 为表格、表头和单元格添加 1px 黑色实线边框 */}.content {/* background-color: darkgray; *//* width: 305px; */margin: auto;max-height: 265px;overflow: auto;}thead {height: 55px;position: sticky;top: 0;background-color: white;/* 可根据需要修改表头背景颜色 */z-index: 1;/* 确保表头在滚动时显示在内容之上 */}.start,.end ,.NO{color: red;font-weight: 600;}
JS部分
1.变量声明及数据获取部分
- 变量声明:定义了
data
用于存储从 JSON 文件获取的数据,pageSize
表示每页显示的记录数,selfPage
记录当前页码,totalPages
表示总页数。 - XMLHttpRequest 对象:使用
XMLHttpRequest
来获取./js/pages.json
文件的数据。open
方法设置请求方法为GET
,并指定异步请求。send
方法发送请求。 onreadystatechange
事件处理:当readyState
变为 4(表示请求已完成)且status
为 200(表示请求成功)时,将响应文本解析为 JSON 格式并存储到data
中,然后调用render
函数渲染页面。
let data;
// 每页显示5条
let pageSize = 5;
// 当前页
let selfPage = 0;
// 总页数
let totalPages;
let xhr = new XMLHttpRequest();
xhr.open('get', './js/pages.json', true);
xhr.send();
xhr.onreadystatechange = function() {if (xhr.readyState == 4 && xhr.status == 200) {let text = xhr.responseText;data = JSON.parse(text);render(data); // 数据加载成功后渲染页面console.log(data);}
};
2.页面渲染函数
- 计算总页数:使用
Math.ceil(data.length / pageSize)
计算总页数,向上取整以确保所有数据都能展示。 - 拼接表格内容:通过循环根据当前页码和每页显示条数,从
data
中提取相应数据并拼接成 HTML 表格行,设置为表格tbody
的内容。 - 拼接分页按钮:
- 首先拼接当前页码、数据范围、每页显示条数选择框以及首页和上一页按钮。
- 根据总页数和当前页码的不同情况,生成不同样式的分页按钮。总页数小于 6 时,直接生成所有页码按钮;总页数大于 6 时,根据当前页在前 3 页、后 3 页或中间部分,生成相应的部分页码按钮并加上省略号。
- 最后拼接前往指定页输入框、下一页和尾页按钮。
- 更新页面元素:将拼接好的分页按钮 HTML 代码插入到
.box
容器中,并设置下拉框的当前选中值为pageSize
。
function render(data) {// 计算总页数//总页数=数据的长度×每页显示的条数,并且向上取整totalPages = Math.ceil(data.length / pageSize);console.log(totalPages);// 内容字符串,后续往里面拼内容let textStr = '';//selfPage=0,pageSize=5,0×5=0;(0+1)×5=5for (let i = selfPage * pageSize; i < (selfPage + 1) * pageSize; i++) {//因为上面的for循环条件的原因,所以加一个判断//代表到最后一条数据了,就停止循环if (i > data.length - 1) {break;}// 拼接data中的name,age,sex数据textStr += `<tr><td>${[i+1]}</td><td>${data[i].name}</td><td>${data[i].age}</td><td>${data[i].sex}</td></tr>`;}//把拼接好的字符串放到tbody里document.getElementsByTagName('tbody')[0].innerHTML = textStr;// 计算当前页开始和结束的数据编号let startPage = selfPage * pageSize + 1;let endPage = Math.min((selfPage + 1) * pageSize, data.length);// 按钮字符串,后续往里拼分页部分let butStr = '';// value 表示当用户选择该选项时,该选项所代表的实际值butStr += `<div>第<span class="NO">${selfPage + 1}</span>页</div> <div >当前页是第<span class="start">${startPage}</span>条-第<span class="end">${endPage}</span>条,共${data.length}条数据</div><select id="show" onchange="selectNum()"><option value="5">5条/页</option><option value="10">10条/页</option><option value="20">20条/页</option></select><div class="homePage" onclick="firstPage()">首页</div><div class="lastPage" onclick="lastPage()">上一页</div>`;// 分页按钮的逻辑// 如果总页数小于6的话就生成简单的分页按钮if (totalPages < 6) {for (let i = 0; i < totalPages; i++) {// 当用户点击时.会调用targetPage函数并传i(当前生成的分页按钮所代表的页码)// 三元判断:如果当前页和i相等就变色butStr += `<div class="pageNum" onclick="targetPage(${i})"${selfPage === i? 'style="background-color:gray;"' : ''}>${i + 1}</div>`;}// 否则就是大于6页} else {// 当前页是前3页的话,就生成前3页和后续页的,分页按钮if (selfPage < 3) {butStr += `<div class="pageNum" onclick="targetPage(${0})" ${selfPage === 0? 'style="background-color:gray;"' : ''}>1</div><div class="pageNum" onclick="targetPage(${1})" ${selfPage === 1? 'style="background-color:gray;"' : ''}>2</div><div class="pageNum" onclick="targetPage(${2})" ${selfPage === 2? 'style="background-color:gray;"' : ''}>3</div><div class="pageNum" onclick="targetPage(${3})">4</div><div class="pageNum" onclick="targetPage(${4})">5</div>...<div class="pageNum" onclick="targetPage(${totalPages - 1})"${selfPage === totalPages - 1? 'style="background-color:gray;"' : ''}>${totalPages}</div>`;// 当前页是最后3页的话,就生成后3页和前面部分页的按钮(在11页点12页的时候,会把14页也渲染出来)} else if (selfPage >= totalPages - 3) {// 事件传参为总页数-5,但是显示的页数时总页数-4,// 少一个是因为传参是数组:从0开始。而显示页数是butStr += ` <div class="pageNum" onclick="targetPage(${0})" ${selfPage === 0? 'style="background-color:gray;"' : ''}>1</div>...<div class="pageNum" onclick="targetPage(${totalPages - 5})">${totalPages - 4}</div><div class="pageNum" onclick="targetPage(${totalPages - 4})">${totalPages - 3}</div><div class="pageNum" onclick="targetPage(${totalPages - 3})"${selfPage === totalPages - 3? 'style="background-color:gray;"' : ''}>${totalPages - 2}</div><div class="pageNum" onclick="targetPage(${totalPages - 2})"${selfPage === totalPages - 2? 'style="background-color:gray;"' : ''}>${totalPages - 1}</div><div class="pageNum" onclick="targetPage(${totalPages - 1})"${selfPage === totalPages - 1? 'style="background-color:gray;"' : ''}>${totalPages}</div>`;//当前页是中间(4 - 18页)的话,就生成前和后几页的分页按钮(点第4页会显示后面的第6页)} else {butStr += `<div class="pageNum" onclick="targetPage(${0})" ${selfPage === 0? 'style="background-color:gray;"' : ''}>1</div>...<div class="pageNum" onclick="targetPage(${selfPage - 2})">${selfPage - 1}</div><div class="pageNum" onclick="targetPage(${selfPage - 1})">${selfPage}</div><div class="pageNum" onclick="targetPage(${selfPage})" style="background-color:gray">${selfPage + 1}</div><div class="pageNum" onclick="targetPage(${selfPage + 1})">${selfPage + 2}</div><div class="pageNum" onclick="targetPage(${selfPage + 2})">${selfPage + 3}</div>...<div class="pageNum" onclick="targetPage(${totalPages - 1})"${selfPage === totalPages - 1? 'style="background-color:gray;"' : ''}>${totalPages}</div>`;}}// 底部分页的后半部分butStr += `前往<input type="number" class="pages" placeholder="请输入页数">页<div class="nextPage" onclick="nextPage()">下一页</div><div class="endPage" onclick="endPage()">尾页</div>`;// console.log(butStr);//把拼好的分页按钮,放到分页的容器里document.getElementsByClassName('box')[0].innerHTML = butStr;// 更新下拉框的选中状态,点一页显示多少条数据后会跟着变document.getElementById('show').value = pageSize;
}
3.分页操作函数
- 当用户点击分页按钮时调用,将当前页码
selfPage
设置为点击的页码index
,然后调用render
函数重新渲染页面,展示对应页码的数据。
function targetPage(index) {//下标等于当前页selfPage = index;// 重新调用渲染函数更新一下页面render(data);
}
4.下一页函数
- 点击下一页按钮时调用,检查当前页是否为最后一页,若是则提示用户;否则将当前页码
selfPage
加 1,再调用render
函数更新页面。
function nextPage() {// 如果当前是最后一页的话 ,就不能在下了if (selfPage == totalPages - 1) {alert('我是有底线的');// 当前页++到第二页} else {selfPage++;}// 重新调用渲染函数更新一下页面render(data);
}
5.上一页函数
- 点击上一页按钮时调用,检查当前页是否小于 0(防止越界),若是则设为第一页并提示用户;否则将当前页码
selfPage
减 1,然后调用render
函数更新页面。
function lastPage() {if (selfPage < 0) {selfPage = 0;alert('这就是第一页');} else {// 当前页--selfPage--;}render(data);
}
6.首页函数
- 点击首页按钮时调用,将当前页码
selfPage
设为 0,然后调用render
函数重新渲染页面,显示第一页的数据。
function firstPage() {// 让当前页等于0并重新渲染函数更新页面即可selfPage = 0;render(data);
}
7.尾页函数
- 点击尾页按钮时调用,将当前页码
selfPage
设为总页数减 1,然后调用render
函数重新渲染页面,显示最后一页的数据。
function endPage() {//让当前页等于总页数(totalPages - 1)的最后一页selfPage = totalPages - 1;render(data);
}
8.键盘事件(下拉框)
- 监听文档的
keydown
事件,当用户按下回车键时,获取输入框的值。检查输入值是否为有效页码(整数且在合理范围内),若是则更新当前页码并调用render
函数;否则提示用户输入有效数字。最后清空输入框。
document.addEventListener("keydown", function(e) {// 检查用户按下的是否为回车键if (e.key === "Enter") {// 获取input框里的值let value = document.getElementsByClassName('pages')[0].value.trim();//增加判断条件//1. 先将value转为数字Number,在使用Number.isInteget检查是否为整数// 2.并且把value转为整数(parsInt)并且大于0,防止输入负数// 3.并且把value转为整数(parsInt)并且小于等于总页数,防止输入超过页数的数if (Number.isInteger(Number(value)) && parseInt(value) > 0 && parseInt(value) <= totalPages) {// 令当前页为 转为整数的value-1(因为页是从0开始的,输入的数值是从1开始的.所以-1才更合理)selfPage = parseInt(value) - 1;render(data);} else {alert('请输入有效数字');}// 回车后清空输入框里的值document.getElementsByClassName('pages')[0].value = '';}
});
9.下拉框处理事件
- 当下拉框的值改变时调用,将当前页码
selfPage
设为 0,获取下拉框选择的每页显示条数并更新pageSize
,重新计算总页数后调用render
函数,以新的每页显示条数展示数据。
function selectNum() {//令当前页为0,方便按顺序展示数据selfPage = 0;//获取下拉框里的值let value = document.getElementById('show').value;//把这个值赋给显示的页数pageSize = value;//重新计算总页数:数据长度×现实的页数就是总长度,并向下取整totalPages = Math.ceil(data.length / pageSize);render(data);
}
JS总览
let data;// 每页显示5条let pageSize = 5;// 当前页let selfPage = 0;// 总页数let totalPages;let xhr = new XMLHttpRequest();xhr.open('get', './js/pages.json', true);xhr.send();xhr.onreadystatechange = function() {if (xhr.readyState == 4 && xhr.status == 200) {let text = xhr.responseText;data = JSON.parse(text);render(data); // 数据加载成功后渲染页面console.log(data);}};function render(data) {// 计算总页数//总页数=数据的长度×每页显示的条数,并且向上取整totalPages = Math.ceil(data.length / pageSize);console.log(totalPages);// 内容字符串,后续往里面拼内容let textStr = '';//selfPage=0,pageSize=5,0×5=0;(0+1)×5=5for (let i = selfPage * pageSize; i < (selfPage + 1) * pageSize; i++) {//因为上面的for循环条件的原因,所以加一个判断//代表到最后一条数据了,就停止循环if (i > data.length - 1) {break;}// 拼接data中的name,age,sex数据textStr += `<tr><td>${[i+1]}</td><td>${data[i].name}</td><td>${data[i].age}</td><td>${data[i].sex}</td></tr>`;}//把拼接好的字符串放到tbody里document.getElementsByTagName('tbody')[0].innerHTML = textStr;// 计算当前页开始和结束的数据编号let startPage = selfPage * pageSize + 1;let endPage = Math.min((selfPage + 1) * pageSize, data.length);// 按钮字符串,后续往里拼分页部分let butStr = '';// value 表示当用户选择该选项时,该选项所代表的实际值butStr += `<div>第<span class="NO">${selfPage + 1}</span>页</div> <div >当前页是第<span class="start">${startPage}</span>条-第<span class="end">${endPage}</span>条,共${data.length}条数据</div><select id="show" onchange="selectNum()"><option value="5">5条/页</option><option value="10">10条/页</option><option value="20">20条/页</option></select><div class="homePage" onclick="firstPage()">首页</div><div class="lastPage" onclick="lastPage()">上一页</div>`;// 分页按钮的逻辑// 如果总页数小于6的话就生成简单的分页按钮if (totalPages < 6) {for (let i = 0; i < totalPages; i++) {// 当用户点击时.会调用targetPage函数并传i(当前生成的分页按钮所代表的页码)// 三元判断:如果当前页和i相等就变色butStr +=`<div class="pageNum" onclick="targetPage(${i})"${selfPage === i? 'style="background-color:gray;"' : ''}>${i + 1}</div>`;}// 否则就是大于6页} else {// 当前页是前3页的话,就生成前3页和后续页的,分页按钮if (selfPage < 3) {butStr +=`<div class="pageNum" onclick="targetPage(${0})" ${selfPage === 0? 'style="background-color:gray;"' : ''}>1</div><div class="pageNum" onclick="targetPage(${1})" ${selfPage === 1? 'style="background-color:gray;"' : ''}>2</div><div class="pageNum" onclick="targetPage(${2})" ${selfPage === 2? 'style="background-color:gray;"' : ''}>3</div><div class="pageNum" onclick="targetPage(${3})">4</div><div class="pageNum" onclick="targetPage(${4})">5</div>...<div class="pageNum" onclick="targetPage(${totalPages - 1})"${selfPage === totalPages - 1? 'style="background-color:gray;"' : ''}>${totalPages}</div>`;// 当前页是最后3页的话,就生成后3页和前面部分页的按钮(在11页点12页的时候,会把14页也渲染出来)} else if (selfPage >= totalPages - 3) {// 事件传参为总页数-5,但是显示的页数时总页数-4,// 少一个是因为传参是数组:从0开始。而显示页数是butStr +=` <div class="pageNum" onclick="targetPage(${0})" ${selfPage === 0? 'style="background-color:gray;"' : ''}>1</div>...<div class="pageNum" onclick="targetPage(${totalPages - 5})">${totalPages - 4}</div><div class="pageNum" onclick="targetPage(${totalPages - 4})">${totalPages - 3}</div><div class="pageNum" onclick="targetPage(${totalPages - 3})"${selfPage === totalPages - 3? 'style="background-color:gray;"' : ''}>${totalPages - 2}</div><div class="pageNum" onclick="targetPage(${totalPages - 2})"${selfPage === totalPages - 2? 'style="background-color:gray;"' : ''}>${totalPages - 1}</div><div class="pageNum" onclick="targetPage(${totalPages - 1})"${selfPage === totalPages - 1? 'style="background-color:gray;"' : ''}>${totalPages}</div>`;//当前页是中间(4-18页)的话,就生成前和后几页的分页按钮(点第4页会显示后面的第6页)} else {butStr += `<div class="pageNum" onclick="targetPage(${0})" ${selfPage === 0? 'style="background-color:gray;"' : ''}>1</div>...<div class="pageNum" onclick="targetPage(${selfPage - 2})">${selfPage - 1}</div><div class="pageNum" onclick="targetPage(${selfPage - 1})">${selfPage}</div><div class="pageNum" onclick="targetPage(${selfPage})" style="background-color:gray">${selfPage + 1}</div><div class="pageNum" onclick="targetPage(${selfPage + 1})">${selfPage + 2}</div><div class="pageNum" onclick="targetPage(${selfPage + 2})">${selfPage + 3}</div>...<div class="pageNum" onclick="targetPage(${totalPages - 1})"${selfPage === totalPages - 1? 'style="background-color:gray;"' : ''}>${totalPages}</div>`;}}// 底部分页的后半部分butStr += `前往<input type="number" class="pages" placeholder="请输入页数">页<div class="nextPage" onclick="nextPage()">下一页</div><div class="endPage" onclick="endPage()">尾页</div>`;// console.log(butStr);//把拼好的分页按钮,放到分页的容器里document.getElementsByClassName('box')[0].innerHTML = butStr;// 更新下拉框的选中状态,点一页显示多少条数据后会跟着变document.getElementById('show').value = pageSize;}// 点击页码跳转页面// 在拼接字符串里每一个分页按钮上都绑定了function targetPage(index) {//下标等于当前页selfPage = index;// 重新调用渲染函数更新一下页面render(data);}// 下一页function nextPage() {// 如果当前是最后一页的话 ,就不能在下了if (selfPage == totalPages - 1) {alert('我是有底线的');// 当前页++到第二页} else {selfPage++;}// 重新调用渲染函数更新一下页面render(data);}// 上一页,和下一页逻辑一样function lastPage() {if (selfPage < 0) {selfPage = 0;alert('这就是第一页');} else {// 当前页--selfPage--;}render(data);}// 首页function firstPage() {// 让当前页等于0并重新渲染函数更新页面即可selfPage = 0;render(data);}// 尾页function endPage() {//让当前页等于总页数(totalPages - 1)的最后一页selfPage = totalPages - 1;render(data);}//回车跳转// 给整个文档上事件监听,键盘事件document.addEventListener("keydown", function(e) {// 检查用户按下的是否为回车键if (e.key === "Enter") {// 获取input框里的值let value = document.getElementsByClassName('pages')[0].value.trim();//增加判断条件//1. 先将value转为数字Number,在使用Number.isInteget检查是否为整数// 2.并且把value转为整数(parsInt)并且大于0,防止输入负数// 3.并且把value转为整数(parsInt)并且小于等于总页数,防止输入超过页数的数if (Number.isInteger(Number(value)) && parseInt(value) > 0 && parseInt(value) <= totalPages) {// 令当前页为 转为整数的value-1(因为页是从0开始的,输入的数值是从1开始的.所以-1才更合理)selfPage = parseInt(value) - 1;render(data);} else {alert('请输入有效数字');}// 回车后清空输入框里的值document.getElementsByClassName('pages')[0].value = '';}});//下拉框的onchange事件function selectNum() {//令当前页为0,方便按顺序展示数据selfPage = 0;//获取下拉框里的值let value = document.getElementById('show').value;//把这个值赋给显示的页数pageSize = value;//重新计算总页数:数据长度×现实的页数就是总长度,并向下取整totalPages = Math.ceil(data.length / pageSize);render(data);}
JSON数据
[{"name": "杨过","age": 20,"sex": "男"
}, {"name": "小龙女","age": 19,"sex": "女"
}, {"name": "黄飞鸿","age": 22,"sex": "男"
}, {"name": "蔡徐坤","age": 19,"sex": "男"
}, {"name": "刘德华","age": 19,"sex": "男"
}, {"name": "塞罗","age": 1999,"sex": "男"
}, {"name": "迪迦","age": 2222,"sex": "男"
}, {"name": "神仙","age": 8888,"sex": "女"
}, {"name": "神仙","age": 9999,"sex": "男"
}, {"name": "张三","age": 19,"sex": "男"
}, {"name": "李四","age": 20,"sex": "男"
}, {"name": "王五","age": 21,"sex": "男"
}, {"name": "赵六","age": 22,"sex": "男"
}, {"name": "杨好滴","age": 20,"sex": "女"
}, {"name": "郑数据","age": 19,"sex": "女"
}, {"name": "李氏含","age": 22,"sex": "男"
}, {"name": "张刹车","age": 19,"sex": "男"
}, {"name": "汉斯里","age": 20,"sex": "女"
}, {"name": "黄思敏","age": 19,"sex": "女"
}, {"name": "彭于晏","age": 22,"sex": "男"
}, {"name": "黑鹿","age": 19,"sex": "男"
}, {"name": "杨过","age": 20,"sex": "女"
}, {"name": "小龙女","age": 19,"sex": "女"
}, {"name": "黄飞鸿","age": 22,"sex": "男"
}, {"name": "蔡徐坤","age": 19,"sex": "男"
}, {"name": "杨过","age": 20,"sex": "女"
}, {"name": "小龙女","age": 19,"sex": "女"
}, {"name": "黄飞鸿","age": 22,"sex": "男"
}, {"name": "蔡徐坤","age": 19,"sex": "男"
}, {"name": "杨过","age": 20,"sex": "女"
}, {"name": "小龙女","age": 19,"sex": "女"
}, {"name": "黄飞鸿","age": 22,"sex": "男"
}, {"name": "蔡徐坤","age": 19,"sex": "男"
}, {"name": "杨过","age": 20,"sex": "女"
}, {"name": "小龙女","age": 19,"sex": "女"
}, {"name": "杨过","age": 20,"sex": "女"
}, {"name": "小龙女","age": 19,"sex": "女"
}, {"name": "黄飞鸿","age": 22,"sex": "男"
}, {"name": "蔡徐坤","age": 19,"sex": "男"
}, {"name": "刘德华","age": 19,"sex": "男"
}, {"name": "塞罗","age": 1999,"sex": "男"
}, {"name": "迪迦","age": 2222,"sex": "男"
}, {"name": "奥特之母","age": 8888,"sex": "女"
}, {"name": "神仙","age": 9999,"sex": "男"
}, {"name": "张三","age": 19,"sex": "男"
}, {"name": "李四","age": 20,"sex": "男"
}, {"name": "王五","age": 21,"sex": "男"
}, {"name": "赵六","age": 22,"sex": "男"
}, {"name": "杨好滴","age": 20,"sex": "女"
}, {"name": "郑数据","age": 19,"sex": "女"
}, {"name": "李氏含","age": 22,"sex": "男"
}, {"name": "张刹车","age": 19,"sex": "男"
}, {"name": "汉斯里","age": 20,"sex": "女"
}, {"name": "黄思敏","age": 19,"sex": "女"
}, {"name": "彭于晏","age": 22,"sex": "男"
}, {"name": "黑鹿","age": 19,"sex": "男"
}, {"name": "杨过","age": 20,"sex": "女"
}, {"name": "小龙女","age": 19,"sex": "女"
}, {"name": "黄飞鸿","age": 22,"sex": "男"
}, {"name": "蔡徐坤","age": 19,"sex": "男"
}, {"name": "杨过","age": 20,"sex": "女"
}, {"name": "车座子","age": 19,"sex": "女"
}, {"name": "黄飞鸿","age": 22,"sex": "男"
}, {"name": "蔡徐坤","age": 19,"sex": "男"
}, {"name": "杨过","age": 20,"sex": "女"
}, {"name": "小龙女","age": 19,"sex": "女"
}, {"name": "黄飞鸿","age": 22,"sex": "男"
}]
相关文章:

分页按钮功能
前言 在前端开发中,分页功能是一个常见的需求,特别是当需要展示大量数据时,它能有效提升用户体验。该文章结合运用了HTML,CSS,JS实现网页的分页按钮功能,并且可以选择每页显示的条数试试更新总页数及显示当…...

数据分析系列--⑦RapidMiner模型评价(基于泰坦尼克号案例含数据集)
一、前提 二、模型评估 1.改造⑥ 2.Cross Validation算子说明 2.1Cross Validation 的作用 2.1.1 模型评估 2.1.2 减少过拟合 2.1.3 数据利用 2.2 Cross Validation 的工作原理 2.2.1 数据分割 2.2.2 迭代训练与测试 2.2.3 结果汇总 …...

集合通讯概览
集合通信概览 (1)通信的算法 是根据通讯的链路组成的 (2)因为通信链路 跟硬件强相关,所以每个CCL的库都不一样 芯片与芯片、不同U之间是怎么通信的 多卡训练:多维并行(xxx并行在上一期已经讲述…...

【FreeRTOS 教程 八】直达任务通知
目录 一、FreeRTOS 直达任务通知: (1)直达任务通知基本介绍: (2)更新目标通知的值: (3)性能优势和使用限制: 二、直达任务通知 API: &#…...

Ubuntu 18.04安装Emacs 26.2问题解决
个人博客地址:Ubuntu 18.04安装Emacs 26.2问题解决 | 一张假钞的真实世界 no X development libraries were found checking for X... no checking for X... true configure: error: You seem to be running X, but no X development libraries were found. You …...

nodejs:js-mdict 的下载、安装、测试、build
js-mdict 项目的目录结构:js-mdict 项目教程 js-mdict 下载地址: js-mdict-master.zip 先解压到 D:\Source\ js-mdict 6.0.2 用了 ts (TypeScript) 和 Jest,增加了应用开发的难度,因为先要了解 ts 和 Jest。 参阅:测试与开发&a…...

CSS关系选择器详解
CSS关系选择器详解 学习前提什么是关系选择器?后代选择器(Descendant Combinator)语法示例注意事项 子代选择器(Child Combinator)语法示例注意事项 邻接兄弟选择器(Adjacent Sibling Combinator࿰…...

Python在线编辑器
from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…...

蓝桥杯备考:高精度算法之除法
我们除法的高精度其实也不完全是高精度,而是一个高精度作被除数除以一个低精度 模拟我们的小学除法 由于题目中我们的除数最大是1e9,当它真正是1e9的时候,t是有可能超过1e9的,所以要用long long...

笔试-业务逻辑4
应用 小明在玩一个数字加减游戏,输入4个正整数:s、t、a、b,其中s>1,b<105,a!b。只使用加法或者减法,使得st。 每回合,小明用当前的数字,加上或减去一个数字;目前有…...

《Linux服务与安全管理》| 数据库服务器安装和配置
《Linux服务与安全管理》| 数据库服务器安装和配置 目录 《Linux服务与安全管理》| 数据库服务器安装和配置 任务一: 安装PostgreSQL数据库,设置远程登录,客户端可以成功登录并操作数据库。 任务二: 安装MySQL数据库…...

麦芯 (MachCore) 应用开发教程 6:一台设备中多台电脑主从机的设置
麦芯是构建在windows系统上的设备应用操作系统,利用该系统可以快速高效的开发一款设备专用软件。希望进一步了解请email: acloud163.com 黄国强 2025/02/03 在麦芯(MachCore)应用开发过程中,多机协同工作的场景十分常见…...

RAG 与历史信息相结合
初始化模型 # Step 4. 初始化模型, 该行初始化与 智谱 的 GLM - 4 模型进行连接,将其设置为处理和生成响应。 chat ChatZhipuAI(model"glm-4",temperature0.8, ) 此提示告诉模型接收聊天历史记录和用户的最新问题,然后重新表述问题&#x…...

99,[7] buuctf web [羊城杯2020]easyphp
进入靶场 <?php// 使用 scandir 函数扫描当前目录(即脚本所在目录)下的所有文件和文件夹// 该函数会返回一个包含目录下所有文件和文件夹名称的数组$files scandir(./); // 遍历扫描得到的文件和文件夹名称数组foreach($files as $file) {// 使用 …...

BUUCTF_[安洵杯 2019]easy_web(preg_match绕过/MD5强碰撞绕过/代码审计)
打开靶场,出现下面的静态html页面,也没有找到什么有价值的信息。 查看页面源代码 在url里发现了img传参还有cmd 求img参数 这里先从img传参入手,这里我发现img传参好像是base64的样子 进行解码,解码之后还像是base64的样子再次进…...

Vue05
目录 一、学习目标 1.自定义指令 2.插槽 3.综合案例:商品列表 4.路由入门 二、自定义指令 1.指令介绍 2.自定义指令 3.自定义指令的语法 三、自定义指令-指令的值 1.需求 2.语法 3.代码示例 五、插槽-默认插槽 1.作用 2.需求 4.使用插槽的基本语法…...

ubuntu18.04环境下,Zotero 中pdf translate划线后不翻译问题解决
问题: 如果使用fastgithub,在/etc/profile中设置全局代理,系统重启后会产生划线后不翻译的问题,包括所有翻译代理均不行。终端中取消fastgithub代理,也不行。 解决: 1)不在/etc/profile中设置…...

基于Python的简单企业维修管理系统的设计与实现
以下是一个基于Python的简单企业维修管理系统的设计与实现,这里我们会使用Flask作为Web框架,SQLite作为数据库来存储相关信息。 1. 需求分析 企业维修管理系统主要功能包括: 维修工单的创建、查询、更新和删除。设备信息的管理。维修人员…...

【C++】B2120 单词的长度
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯我的做法代码实现:思路解析: 💯老师的第一种做法代码实现:思路解析: 💯老师的…...

2501,编写dll
DLL的优点 简单的说,dll有以下几个优点: 1)节省内存.同一个软件模块,若是源码重用,则会在不同可执行程序中编译,同时运行这些exe时,会在内存中重复加载这些模块的二进制码. 如果使用dll,则只在内存中加载一次,所有使用该dll的进程会共享此块内存(当然,每个进程会复制一份的d…...

【router路由的配置】
router路由的配置 App.vuerouter在main.ts引入插件 App.vue <template><RouterView /> </template><script setup lang"ts"></script><style scoped lang"scss"></style>router import { createRouter, creat…...

算法基础——一致性
引入 最早研究一致性的场景既不是大数据领域,也不是分布式系统,而是多路处理器。 可以将多路处理器理解为单机计算机系统内部的分布式场景,它有多个执行单元,每一个执行单元都有自己的存储(缓存),一个执行单元修改了…...

刷题记录 动态规划-6: 62. 不同路径
题目:62. 不同路径 难度:中等 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” &#x…...

docker直接运行arm下的docker
运行环境是树莓派A 处理器是 arm32v6 安装了docker,运行lamp 编译安装php的时候发现要按天来算,于是用电脑vm下的Ubuntu系统运行arm的docker 然后打包到a直接导入运行就可以了 第一种方法 sudo apt install qemu-user-static 导入直接运行就可以了…...

014-STM32单片机实现矩阵薄膜键盘设计
1.功能说明 本设计主要是利用STM32驱动矩阵薄膜键盘,当按下按键后OLED显示屏上会对应显示当前的按键键值,可以将此设计扩展做成电子秤、超市收银机、计算器等需要多个按键操作的单片机应用。 2.硬件接线 模块管脚STM32单片机管脚矩阵键盘行1PA0矩阵键盘…...

Sentinel 断路器在Spring Cloud使用
文章目录 Sentinel 介绍同类对比微服务雪崩问题问题原因问题解决方案请求限流线程隔离失败处理服务熔断解决雪崩问题的常见方案有哪些? Sentineldocker 安装账号/ 密码项目导入簇点链路请求限流线程隔离Fallback服务掉线时的处理流程 服务熔断 Sentinel 介绍 随着微…...

[内网安全] 内网渗透 - 学习手册
这是一篇专栏的目录文档,方便读者系统性的学习,笔者后续会持续更新文档内容。 如果没有特殊情况的话,大概是一天两篇的速度。(实验多或者节假日,可能会放缓) 笔者也是一边学习一边记录笔记,如果…...

算法总结-二分查找
文章目录 1.搜索插入位置1.答案2.思路 2.搜索二维矩阵1.答案2.思路 3.寻找峰值1.答案2.思路 4.搜索旋转排序数组1.答案2.思路 5.在排序数组中查找元素的第一个和最后一个位置1.答案2.思路 6.寻找旋转排序数组中的最小值1.答案2.思路 1.搜索插入位置 1.答案 package com.sunxi…...

基于python的Kimi AI 聊天应用
因为这几天deepseek有点状况,导致apikey一直生成不了,用kimi练练手。这是一个基于 Moonshot AI 的 Kimi 接口开发的聊天应用程序,使用 Python Tkinter 构建图形界面。 项目结构 项目由三个主要Python文件组成: 1. main_kimi.py…...

动手学深度学习-3.2 线性回归的从0开始
以下是代码的逐段解析及其实际作用: 1. 环境设置与库导入 %matplotlib inline import random import torch from d2l import torch as d2l作用: %matplotlib inline:在 Jupyter Notebook 中内嵌显示 matplotlib 图形。random:生成…...