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

67、数据访问-crud实验-分页数据展示

67、数据访问-crud实验-分页数据展示

分页数据展示是数据访问中常见的功能,用于将大量数据分割成多个页面显示,提升用户体验和系统性能。以下是分页数据展示的相关介绍:

#### 基本原理

1. **确定每页显示数量**:设定每页显示的数据条数(`pageSize`),如每页显示10条。

2. **计算总页数**:根据总数据量(`totalCount`)和每页显示数量,计算总页数(`totalPage`):

   $$

   totalPage = \lceil \frac{totalCount}{pageSize} \rceil

   $$

3. **获取当前页数据**:根据当前页码(`currentPage`),计算数据起始位置(`offset`),从数据源中获取对应的数据:

   $$

   offset = (currentPage - 1) \times pageSize

   $$

   查询语句示例(使用MySQL的`LIMIT`和`OFFSET`):

   ```sql

   SELECT * FROM table LIMIT pageSize OFFSET offset

   ```

#### 实现步骤

**后端实现:**

1. **接收分页参数**

   - 接收前端传递的当前页码(`currentPage`)和每页显示数量(`pageSize`)。

2. **查询数据**

   - 根据分页参数,查询当前页的数据和总数据量。

   - 使用数据库的分页功能,如MySQL的`LIMIT`和`OFFSET`,或借助分页插件(如MyBatis的PageHelper)。

3. **封装分页结果**

   - 将当前页数据、总数据量、总页数等封装成分页对象,返回给前端。

**前端实现:**

1. **发送分页请求**

   - 向后端发送包含当前页码和每页显示数量的请求。

2. **展示数据**

   - 接收后端返回的分页数据,展示当前页的数据。

3. **分页导航**

   - 根据总页数生成分页导航,支持用户点击页码、上一页、下一页等操作。

   - 更新当前页码,重新发送请求获取数据。

#### 示例代码

**后端(Java + Spring Boot):**

```java

// 分页查询方法

@GetMapping("/data")

public PageData fetchData(@RequestParam(defaultValue = "1") int page,

                          @RequestParam(defaultValue = "10") int size) {

    // 使用PageHelper进行分页查询

    PageHelper.startPage(page, size);

    List<Data> dataList = dataService.getAllData();

    

    // 封装分页结果

    PageInfo<Data> pageInfo = new PageInfo<>(dataList);

    PageData pageData = new PageData();

    pageData.setList(dataList);

    pageData.setTotal(pageInfo.getTotal());

    pageData.setSize(size);

    pageData.setPage(page);

    pageData.setPages(pageInfo.getPages());

    

    return pageData;

}

// 分页数据对象

public class PageData {

    private List<?> list;

    private long total;

    private int size;

    private int page;

    private int pages;

    // 省略getter和setter方法

}

```

**前端(Vue.js):**

```html

<template>

  <div>

    <!-- 数据列表 -->

    <ul>

      <li v-for="item in dataList" :key="item.id">{{ item.name }}</li>

    </ul>

    

    <!-- 分页导航 -->

    <div class="pagination">

      <button @click="prevPage" :disabled="page === 1">上一页</button>

      <span v-for="pageNum in pages" :key="pageNum" @click="gotoPage(pageNum)">

        {{ pageNum }}

      </span>

      <button @click="nextPage" :disabled="page === pages">下一页</button>

    </div>

  </div>

</template>

<script>

export default {

  data() {

    return {

      dataList: [], // 当前页数据

      total: 0, // 总数据量

      size: 10, // 每页显示数量

      page: 1, // 当前页码

      pages: 0, // 总页数

    };

  },

  

  methods: {

    fetchData() {

      // 发送分页请求

      axios.get('/data', {

        params: {

          page: this.page,

          size: this.size,

        },

      }).then((res) => {

        // 处理返回的分页数据

        this.dataList = res.data.list;

        this.total = res.data.total;

        this.pages = res.data.pages;

      });

    },

    

    prevPage() {

      if (this.page > 1) {

        this.page--;

      }

      this.fetchData();

    },

    

    nextPage() {

      if (this.page < this.pages) {

        this.page++;

      }

      this.fetchData();

    },

    

    gotoPage(pageNum) {

      this.page = pageNum;

      this.fetchData();

    },

  },

  

  mounted() {

    this.fetchData();

  },

};

</script>

```

#### 优化与注意事项

- **性能优化**

  - 避免一次性查询所有数据,仅查询当前页所需数据。

  - 对于大数据量,考虑使用延迟加载或无限滚动等技术。

- **用户体验**

  - 提供清晰的分页导航,显示当前页码和总页数。

  - 支持跳转到指定页码和快捷键操作。

- **安全性**

  - 对分页参数进行校验,防止恶意请求。

  - 避免暴露敏感数据,如总数据量等。

通过以上步骤,可以实现分页数据展示功能,提升系统的可用性和性能。

http://www.lryc.cn/news/572511.html

相关文章:

  • ROS学习之服务通信
  • flink的多种部署模式
  • 【LLM学习笔记3】搭建基于chatgpt的问答系统(下)
  • 面试-操作系统
  • 【Dify 沙箱网络问题排查与解决】
  • 工程师生活:清除电热水壶(锅)水垢方法
  • 3DTiles三维模型
  • Python-循环结构解析
  • windows 11 安装和配置 WSL #1 Ubuntu
  • 30.all和any
  • 动态规划:01 背包(闫氏DP分析法)
  • python脚本间的相互调用
  • 磐基PaaS平台MongoDB组件SSPL许可证风险与合规性分析(上)
  • Git(三):分支管理
  • 达梦数据库锁超时问题
  • 使用Dagster资产工厂模式高效管理重复ETL任务
  • 识别网络延迟与带宽瓶颈
  • M1芯片macOS安装Xinference部署大模型
  • Datawhale 网络爬虫技术入门第2次笔记
  • QT6与VS下实现没有CMD窗口的C++控制台程序
  • 日本生活:日语语言学校-日语作文-沟通无国界(3)-题目:わたしの友達
  • 编程马拉松的定义、运作与发展
  • C语言标准I/O库详解:文件操作与缓冲区机制
  • Qt蓝图式技能编辑器状态机模块设计与实现
  • html实现登录与注册功能案例(不写死且只使用js)
  • 深入解析select模型:FD_SET机制与1024限制的终极指南
  • Linux系统远程操作和程序编译
  • 23.ssr和csr的对比?如何依赖node.js实现
  • [11-5]硬件SPI读写W25Q64 江协科技学习笔记(20个知识点)
  • 嵌入式编译工具链熟悉与游戏移植