springboot+Vue实现分页

devtools/2024/9/24 14:57:27/

文章目录


今天开发的有一个场景就是需要从远程ssh服务器上加载一个文件展示到前端,但是一次性拉过来有几万条数据,一下载加载整个文件会导致前端非常非常的卡,于是要使用分页解决,我之前看过的有mybatis的分页查询解决方案,哪个是封装好的,但是我的场景是查询文件实现分页展示,因此需要写一个个性化的分页逻辑。

一、后端

后端使用的是springboot,用的是java连接远程服务器读取文件然后返回一个list列表。

用到了依赖

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>

大致的逻辑就是说后端先通过你自己的方式获取到文件,有一个page,pagesize这两个参数控制要读取的内容从哪到哪。返回这一小段即可。前端每次点击上一页,下一页,页面大小实际上就是控制这两个参数进行数据读取。

public List<SyslogMessage> readRemoteFilePaged(int page, int pageSize) throws JSchException, SftpException, IOException {JSch jsch = new JSch();Session session = jsch.getSession(user, host, port);session.setPassword(password);session.setConfig("StrictHostKeyChecking", "no"); // 注意:生产环境中应该使用更安全的方式处理host keysession.connect();ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");channelSftp.connect();// 计算跳过的行数int skipLines = (page - 1) * pageSize;int currentLine = 0;List<SyslogMessage> loglist = new ArrayList<>();InputStream inputStream = channelSftp.get(remoteFilePath);try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {String line;while ((line = reader.readLine()) != null) {// 跳过指定数量的行if (currentLine < skipLines) {currentLine++;continue;}// 读取指定数量的行if (loglist.size() < pageSize) {loglist.add(new SyslogMessage(line));} else {break; // 达到每页大小,退出循环}}}channelSftp.disconnect();session.disconnect();return loglist;}

二、前端

前端使用的是Vue,主要就是用到了element中的el-pagination组件,使用handleSizeChange和handleCurrentChange控制页面大小以及当前页数。每次切换时都是用axios用这两个参数像后端请求数据,很方便,注意url要用` `而不是单引号

<template><div><div class="pagination-container">  <h1 class="server-log-title">133服务器sys日志</h1>  </div>  <el-table :data="syslog" style="width: 100%" :row-class-name="tableRowClassName"><el-table-columnprop="log"label="日志"width="auto"></el-table-column>   </el-table><div class="pagination-container"><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":page-sizes="[50, 100, 150, 200]":page-size="pageSize"layout="total, sizes, prev, pager, next, jumper":total="1000000"></el-pagination></div></div>
</template><script>
import axios from 'axios'
export default {data() {return {name: 'Ecust',syslog: [],currentPage:10,pageSize:50,totalLogCount:0}},methods:{tableRowClassName({row, rowIndex}) {if (row.log && row.log.includes('高资源')) {console.log()return 'warning-row';} else{return 'success-row';}},async fetchLogs(){try {let url=`http://localhost:5678/syslog/page?page=${this.currentPage}&pageSize=${this.pageSize}`await axios.get(url).then((response)=>{this.syslog = response.data// console.log(response)})} catch (error) {console.log('Error:', error)}},handleSizeChange(val) {  this.pageSize = val  this.currentPage = 1 // 当每页条数改变时,重置页码为第一页  this.fetchLogs()  },  handleCurrentChange(val) {  this.currentPage = val  this.fetchLogs()  }  },created() {this.fetchLogs()}
}
</script><style>
.el-table .warning-row {background: oldlace;}.el-table .success-row {background: #f0f9eb;}
</style><style scoped>.pagination-container {  display: flex;  justify-content: center; /* 水平居中 */  align-items: center; /* 垂直居中,如果需要的话 */  height: 100px; /* 或者其他你需要的高度 */  }.pagination-container2 {  display: flex;  justify-content: center; /* 水平居中 */  align-items: center; /* 垂直居中 */  height: 100vh; /* 使用视口高度来垂直居中,或者根据需要调整 */  margin: 0; /* 移除默认的外边距 */  padding: 20px; /* 添加一些内边距 */  background-color: #f5f5f5; /* 添加背景色 */  
}  .server-log-title {  font-family: 'Arial', sans-serif; /* 使用一个常见的无衬线字体 */  color: #333; /* 字体颜色 */  font-size: 2em; /* 字体大小 */  text-align: center; /* 文本居中 */  margin: 0; /* 移除默认的外边距 */  padding: 0; /* 移除默认的内边距 */  letter-spacing: 1px; /* 字母间距 */  text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1); /* 文本阴影,增加立体感 */  
} 
</style>

http://www.ppmy.cn/devtools/16493.html

相关文章

力扣---填充每个节点的下一个右侧节点指针 II

给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL 。 初始状态下&#xff0c;所有 next 指针都…

时间默认显示当前日期及系统时间

要将 xtdsSj 绑定到当前日期和系统时间&#xff0c;你可以在组件的 data 中初始化 xtdsSj 属性为当前日期及系统时间的字符串。然后&#xff0c;在组件创建时更新 xtdsSj&#xff0c;确保它始终显示当前日期和系统时间。 1.系统读数时间默认显示当前日期及系统时间 <templa…

【C++题解】1043. 行李托运价格

问题&#xff1a;1043. 行李托运价格 类型&#xff1a;分支 题目描述&#xff1a; 某车站行李托运收费标准是&#xff1a; 10 公斤或 10 公斤以下&#xff0c;收费 2.5 元&#xff0c;超过 10 公斤的行李&#xff0c;按每超过 1 公斤增加 1.5 元进行收费。 试编一程序&#x…

linux第八章 git连接本地仓库和gitee

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

MySQL中explain的用法

执行结果各字段的含义 EXPLAIN SQL语句 如&#xff1a; EXPLAIN SELECT * FROM test 执行结果&#xff1a; 列名描述id在一个大的查询语句中每个SELECT关键字都对应一个 唯一的idselect_typeSELECT关键字对应的那个查询的类型table表名partitions匹配的分区信息type针对单表…

linux环境下的MySQL UDF提权

linux环境下的MySQL UDF提权 ##1. 背景介绍 ###UDF UDF&#xff08;user defined function&#xff09;用户自定义函数,是MySQL的一个扩展接口&#xff0c;称为用户自定义函数,是用来拓展MySQL的技术手段&#xff0c;用户通过自定义函数来实现在MySQL中无法实现的功能。文件…

TCP为什么需要3次握手?

一、3次握手过程 客户端向服务端发送一个表示建立连接的SYN报文段&#xff0c;服务端从IP数据报中提取出TCP SYN报文段&#xff0c;为该TCP连接分配需要的缓存和变量&#xff0c;并向客户端发送表示允许连接的报文段ACK。客户端在收到ACK报文段之后&#xff0c;也要给该连接分配…

Golang实现一个批量自动化执行树莓派指令的软件(1)文本加密配置命令行交互实现

简介 实现一个在配置文件设置信息&#xff0c;一运行就可以自动执行设定指令的软件。 这次实现的是 &#xff1a; 1. 加密解密模块&#xff0c; 用于加密密码&#xff0c; 在配置时配置已加密的密码就可以&#xff1b; 2. 需要配置&#xff0c;自然也就有配置文件的序列化反序列…