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

SpringBoot + Vue + ElementUI 实现 el-table 分页功能详解

引言

在现代Web应用程序开发中,前后端分离架构越来越受欢迎。这种架构使得前端和后端开发可以并行进行,提高了开发效率。本文将详细讲解如何使用SpringBoot作为后端,Vue.js和ElementUI作为前端,实现一个带分页功能的数据表格(el-table)。分页功能在处理大量数据时必不可少,可以有效提升用户体验和系统性能。

分页概述

分页(Pagination)是Web应用程序中常见的需求,特别是在需要显示大量数据时。分页的目的是将数据分成多个页面,每次只显示一部分数据,从而避免加载和显示全部数据带来的性能问题。分页通常涉及以下几个概念:

  • 当前页(Current Page):用户当前正在查看的页面。
  • 每页条数(Page Size):每页显示的数据条数。
  • 总条数(Total Items):数据的总条数。
  • 总页数(Total Pages):总数据条数除以每页条数得到的总页数。

分页的关键点

在实现分页功能时,有几个关键点需要注意:

  1. 后端实现分页逻辑:后端需要提供分页接口,根据请求参数返回对应页的数据和总条数。
  2. 前端展示分页数据:前端需要展示分页数据,并提供分页控件让用户切换页面。
  3. 分页状态管理:前端需要管理分页状态,如当前页、每页条数等,并在状态变化时更新数据。

项目结构

首先,我们需要创建一个SpringBoot项目和一个Vue项目。假设你已经熟悉这两个框架的基本用法,下面是项目的基本结构:

SpringBoot项目结构
src
├── main
│   ├── java
│   │   └── com.example.demo
│   │       ├── controller
│   │       ├── entity
│   │       ├── repository
│   │       ├── service
│   │       └── DemoApplication.java
│   └── resources
│       ├── application.properties
│       └── data.sql
Vue项目结构
src
├── assets
├── components
├── views
│   └── TableView.vue
├── App.vue
└── main.js

后端实现

创建实体类

首先,在SpringBoot项目中创建一个实体类User,用于表示表格中的数据。

package com.example.demo.entity;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String email;// Getters and Setters
}

代码讲解:

  • @Entity:表示该类是一个JPA实体。
  • @Id:指定该字段为实体的主键。
  • @GeneratedValue(strategy = GenerationType.IDENTITY):主键自增策略。
  • Long id:主键ID。
  • String nameString email:用户的姓名和邮箱。
创建仓库接口

接下来,创建一个JPA仓库接口UserRepository,用于与数据库交互。

package com.example.demo.repository;import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

代码讲解:

  • @Repository:表示该接口是一个Spring Data JPA仓库。
  • JpaRepository<User, Long>:继承自JpaRepository,提供了常用的数据库操作方法,如增删改查。
创建服务类

在服务类中编写分页查询的逻辑。这里我们使用Spring Data JPA提供的分页功能。

package com.example.demo.service;import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public Page<User> getUsers(int page, int size) {return userRepository.findAll(PageRequest.of(page, size));}
}

代码讲解:

  • @Service:表示该类是一个服务类。
  • UserRepository userRepository:注入UserRepository实例。
  • getUsers(int page, int size):分页查询用户数据,返回一个Page对象。
创建控制器

最后,创建一个控制器UserController,提供分页查询的API。

package com.example.demo.controller;import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/users")public Page<User> getUsers(@RequestParam int page, @RequestParam int size) {return userService.getUsers(page, size);}
}

代码讲解:

  • @RestController:表示该类是一个RESTful控制器。
  • UserService userService:注入UserService实例。
  • @GetMapping("/users"):映射GET请求到/users路径。
  • @RequestParam int page, @RequestParam int size:从请求参数中获取分页信息。
  • getUsers(int page, int size):调用UserService的getUsers方法获取分页数据。
数据初始化

为了方便测试,可以在data.sql文件中初始化一些数据。

INSERT INTO user (name, email) VALUES ('John Doe', 'john@example.com');
INSERT INTO user (name, email) VALUES ('Jane Doe', 'jane@example.com');
-- 添加更多数据

前端实现

安装依赖

首先,确保在Vue项目中安装了axios以便与后端进行通信。

npm install axios
创建 TableView 组件

src/views/TableView.vue文件中创建表格组件。

<template><div><el-table :data="users" style="width: 100%"><el-table-column prop="id" label="ID"></el-table-column><el-table-column prop="name" label="Name"></el-table-column><el-table-column prop="email" label="Email"></el-table-column></el-table><el-pagination@current-change="handleCurrentChange":current-page="currentPage":page-size="pageSize"layout="total, prev, pager, next":total="totalUsers"></el-pagination></div>
</template><script>
import axios from 'axios';export default {data() {return {users: [],currentPage: 1,pageSize: 10,totalUsers: 0};},created() {this.fetchUsers();},methods: {fetchUsers() {axios.get(`/users`, {params: {page: this.currentPage - 1,size: this.pageSize}}).then(response => {this.users = response.data.content;this.totalUsers = response.data.totalElements;});},handleCurrentChange(page) {this.currentPage = page;this.fetchUsers();}}
};
</script><style scoped>
/* 添加样式以适应页面布局 */
</style>

代码讲解:

  • el-table:ElementUI的表格组件,用于展示数据。
  • el-table-column:表格列,定义每一列显示的数据字段。
  • el-pagination:ElementUI的分页组件,用于分页控制。
  • fetchUsers():使用axios请求后端API获取分页数据,并更新userstotalUsers
  • handleCurrentChange(page):当分页控件的当前页改变时,更新currentPage并重新获取数据。
修改 main.js

main.js中引入ElementUI。

import Vue from 'vue';
import App from './App.vue';
import router from './router';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';Vue.config.productionTip = false;
Vue.use(ElementUI);new Vue({router,render: h => h(App)
}).$mount('#app');

代码讲解:

  • import ElementUI from 'element-ui':引入ElementUI库。
  • Vue.use(ElementUI):注册ElementUI插件,使其在整个项目中可用。
配置代理

在开发环境中,我们需要配置代理以解决跨域问题。修改vue.config.js文件:

module.exports = {devServer: {proxy: {'/users': {target: 'http://localhost:8080',changeOrigin: true}}}
};

代码讲解:

  • proxy:配置代理,将对/users的请求转发到http://localhost:8080

运行项目

完成以上步骤后,可以分别启动SpringBoot和Vue项目。在SpringBoot项目根目录下运行:

./mvnw spring-boot:run

在Vue项目根目录下运行:

npm run serve

访问http://localhost:8080,可以看到分页功能已经实现。

总结

通过本文的讲解,我们了解了如何在SpringBoot和Vue.js中实现分页功能。从后端的分页逻辑实现,到前端的分页展示和状态管理,都进行了详细的介绍。在实际项目中,分页功能可以根据需求进行扩展和优化,例如添加搜索和排序功能,进一步提升用户体验。

希望本文能帮助你更好地理解和实现分页功能。如果有任何问题或建议,欢迎讨论。

进一步优化

在实际项目中,你可能需要进一步优化分页功能,例如:

  1. 搜索功能:在分页的基础上添加搜索条件,使用户可以根据关键字进行搜索。
  2. 排序功能:允许用户点击表头进行排序。
  3. 缓存分页数据:在切换分页时缓存已经加载的数据,减少不必要的网络请求。
  4. 错误处理:处理网络请求错误,如超时或服务器错误,向用户显示友好的错误信息。

通过这些优化,可以使分页功能更加完善,提升用户体验。

希望本文能够帮助你在项目中实现高效的分页功能。如果有任何问题或建议,欢迎在评论区讨论。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【信号】SIGCHLD信号--了解
  • error: subprocess-exited-with-error
  • 【数据库】MySQL聚合统计
  • 【vuetify】v-select 无法正常显示,踩坑记录!
  • Vue3生命周期钩子函数(Vue3生命周期)
  • vue3 一次二次封装element-plus组件引发的思考
  • 解决ubuntu 24.04 ibus出现卡死、高延迟问题
  • 解决uniapp视频video组件进入全屏再退出全屏后,cover-view失效的问题
  • Brave编译指南2024 Windows篇:拉取Brave源码(六)
  • SpringSecurity剖析
  • yjs04——matplotlib的使用(多个坐标图)
  • 探索源代码防泄漏与模块化沙箱的秘密
  • 高级实时通信:基于 Python 的 WebSocket 实现与异步推送解决方案
  • 房产销售系统开发:SpringBoot技术要点
  • 关于node安装的全局js库,提示‘not found’
  • gops —— Go 程序诊断分析工具
  • HTTP那些事
  • javascript从右向左截取指定位数字符的3种方法
  • node.js
  • node和express搭建代理服务器(源码)
  • 如何实现 font-size 的响应式
  • 提醒我喝水chrome插件开发指南
  • 我的面试准备过程--容器(更新中)
  • 物联网链路协议
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 移动端解决方案学习记录
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​HTTP与HTTPS:网络通信的安全卫士
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (1)(1.13) SiK无线电高级配置(五)
  • (4) PIVOT 和 UPIVOT 的使用
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (万字长文)Spring的核心知识尽揽其中
  • (正则)提取页面里的img标签
  • (转)3D模板阴影原理
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • ..回顾17,展望18
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .java 9 找不到符号_java找不到符号
  • .NET 给NuGet包添加Readme
  • .NET 漏洞分析 | 某ERP系统存在SQL注入
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 中的轻量级线程安全
  • .net解析传过来的xml_DOM4J解析XML文件
  • .NET命名规范和开发约定
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET实现之(自动更新)
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)