Express框架开发接口之实现分页功能

news2024/11/17 3:55:20

1、是什么?

在我们做数据查询的时候,如果数据量很大,比如几万条数据,放在一个页面显示的话显然不友好,这时候就需要采用分页显示的形式,如每次只显示10条数据
 


要实现分页功能,实际上就是从结果集中显示第110条记录作为第1页,显示第1120条记录作为第2页,以此类推
因此,分页实际上就是从结果集中截取出第M~N条记录

2、实现方法

前端实现分页功能,需要后端返回必要的数据,如总的页数,总的数据量,当前页,当前的数据


{
"totalCount": 1836,   // 总的条数
"totalPages": 92,  // 总页数
"currentPage": 1   // 当前页数
"data": [     // 当前页的数据
{
...
}
]]

后端采用mysql作为数据的持久性存储
下面以用户列表为例:当前数据共有八条

实现

前端向后端发送页面数page以及每页显示数据的数量pageSize,默认情况每条取10条数据,则每一条的数据的起始位置start为

 const startIndex = (page - 1) * pageSize;
        console.log(startIndex);//当page=1时startIndex=0

当我们确定了limit和start值后就可以查询数据库

const sql =`select *from users limit ${pageSize} offset ${start}`

上诉的代码意思是截取从start到start+pageSize之间的数据

//获取所有用户
exports.allUser = (req, res) => {
    (async function () {
        // 先定义获取的参数
        var param = ''
        //   根据请求方法接收params
        if (req.method == "POST") {
            param = req.body
        } else {
            param = req.query || req.param
        }
        console.log(param);
        if (param.page == '' || param.page == null || param.page == undefined) {
            res.send({ status: 1, message: "缺少必传参数page" });
        }
        // 从请求中获取页码和每页数据项数量
        const page = param.page  //页码
        const pageSize = param.pageSize || 5// 默认每页显示 10 条数据

        // 计算查询的起始索引
        const startIndex = (page - 1) * pageSize;
        console.log(startIndex);//当page=1时startIndex=0
        // 查询数据库获取所有用户
        let result = await handleDB(res, "users", "limit", "users数据库查询出错", { startIndex, pageSize });
        // 判断用户列表是否为空,用户为空返回用户列表为空
        if (result.length == 0) return res.send({ stutus: 1, message: '用户列表为空!' })

        // 创建一个新的对象,排除 password 属性
        const dataWithoutPassword = result.map(({ password, ...rest }) => rest);
        // 查询总记录数
        let results = await handleDB(res, "users", "find", "users数据库查询出错",);
        const total = results.length
        res.send({
            status: 0, message: '获取所有用户成功',
            total: total,
            totalPages: Math.ceil(total / pageSize),
            currentPage: page,
            data: dataWithoutPassword,

        });
    })();
}
  1. totalPages: 这个属性表示总共有多少页数据。它的计算通常是通过将总记录数 (total) 除以每页显示的记录数 (pageSize) 来得到的,然后使用 Math.ceil 函数向上取整以确保总页数是整数。总页数告诉你有多少页数据可供用户浏览。如果有100条记录,每页显示10条,那么总页数就是10页。
  2. currentPage: 这个属性表示当前所处的页数。用户通常能够浏览多个页,这个属性用来标识用户当前正在浏览的页数。例如,如果用户点击了第三页,那么currentPage 就会被设置为3。这对于跟踪用户浏览数据非常有用,以便正确地显示用户所在的位置。
  3. total:这个属性表示总共有多少条数据

3、测试

下面数据也是5条,由于窗口可视有限看不到

当前数据3条

4、总结

// 从请求中获取页码和每页数据项数量
        const page = param.page  //页码
        const pageSize = param.pageSize || 5// 默认每页显示 10 条数据

首页要获取到page(页码)和pageSize(每页显示多少条数据)然后根据当前页面的索引page

5、优化

规范接收的page和pageSize参数

接收的page和pageSize参数转化为整数

且page大于等于1

且pageSize大于等于0

//获取所有用户
exports.allUser = (req, res) => {
    (async function () {
        // 先定义获取的参数
        var param = '';
        // 根据请求方法接收params
        if (req.method == "POST") {
            param = req.body;
        } else {
            param = req.query || req.param;
        }
        if (param.page == '' || param.page == null || param.page == undefined) {
            res.send({ status: 1, message: "缺少必传参数page" });
        } else {
            // 从请求中获取页码和每页数据项数量
            const page = parseInt(param.page, 10); // 将page参数解析为整数,使用十进制表示
            const pageSize = parseInt(param.pageSize, 10); // 将pageSize参数解析为整数

            // 验证page和pageSize是否是有效的整数
            if (!Number.isInteger(page) || page < 1) {
                res.send({ status: 1, message: "参数page必须是有效的整数且大于等于1" });
            } else if (!Number.isInteger(pageSize) || pageSize < 0) {
                res.send({ status: 1, message: "参数pageSize必须是有效的整数且大于等于0" });
            } else {
                // 计算查询的起始索引
                const startIndex = (page - 1) * pageSize;
                console.log(startIndex); // 当page=1时startIndex=0
                // 查询数据库获取所有用户
                let result = await handleDB(res, "users", "limit", "users数据库查询出错", { startIndex, pageSize });
                // 判断用户列表是否为空,用户为空返回用户列表为空
                if (result.length == 0) return res.send({ status: 1, message: '用户列表为空!' });

                // 创建一个新的对象,排除 password 属性
                const dataWithoutPassword = result.map(({ password, ...rest }) => rest);
                // 查询总记录数
                let results = await handleDB(res, "users", "find", "users数据库查询出错");
                const total = results.length;
                res.send({
                    status: 0, message: '获取所有用户成功',
                    total: total,
                    totalPages: Math.ceil(total / pageSize),
                    currentPage: page,
                    data: dataWithoutPassword,
                });
            }
        }

    })();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1156108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录Day33 LeetCode T62不同路径 LeetCode T63 不同路径II

前言 动规五部曲 1.确定dp数组含义 2.确定递推公式 3.初始化数组 4.确定遍历方式 5.打印dp数组查看分析问题 LeetCode T62 不同路径 题目链接:62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 注:n行m列而不是m行n列 1.确定dp数组含义 代表到达此下标有多少条…

云尘-AI-Web-1.0

继续&#xff01; 开扫 继续先测试web sql注入 直接sqlmap跑 通过注入 &#xff08;sqlmap查询方式省略&#xff09; 存在systemuser 不知道会不会是电脑的密码 我们解密一下然后直接试试看 然后失败 这里就没有思路了 但是我们刚刚存在一个目录 我们再扫扫看 无果 换另一个…

C# Onnx DBNet 检测条形码

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Numerics; using System.Runtime.InteropServices.…

【广州华锐互动】风景区规划VR虚拟现实教学系统

风景区规划VR虚拟现实教学系统是一种新兴的教学工具&#xff0c;它可以通过虚拟现实技术&#xff0c;为学生提供一种沉浸式的、实时的、全方位的景区规划体验。 在风景区规划VR虚拟现实教学系统中&#xff0c;学生可以通过虚拟现实技术&#xff0c;实时地与景区进行交互。他们可…

人大金仓助力中国人民银行征信中心业务系统异地容灾优化升级

日前&#xff0c;人大金仓助力中国人民银行应收账款融资服务平台异地容灾项目顺利上线&#xff0c;保证了平台系统运行的连续性和数据安全&#xff0c;为充分发挥平台的融资功能&#xff0c;缓解中小微企业融资难提供了强有力的保障。 缓解中小微企业融资难 中国人民银行构于2…

「Qt中文教程指南」如何创建基于Qt Widget的应用程序(四)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文描述了如何使用…

【音视频 | wav】wav音频文件格式详解——包含RIFF规范、完整的各个块解析、PCM转wav代码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Kafka - 3.x 消费者 生产经验不完全指北

文章目录 生产经验之Consumer事务生产经验—数据积压&#xff08;消费者如何提高吞吐量&#xff09; 生产经验之Consumer事务 Kafka引入了消费者事务&#xff08;Consumer Transactions&#xff09;来确保在消息处理期间维护端到端的数据一致性。这使得消费者能够以事务的方式…

springboot2.x使用@RestControllerAdvice实现通用异常捕获

文章目录 demo地址实现效果引入基础类准备1.通用枚举与错误状态枚举2.定义通用返回结果3.自定义业务异常 统一异常捕获测试 demo地址 demo工程地址 实现效果 当我们输入1时&#xff0c;正常的返回通用的响应结果当我们输入2时&#xff0c;抛出异常&#xff0c;被捕获然后返回…

43基于matlab针对压缩重构感知中的稀疏优化问题,实现L1范数最小化问题求解。

基于matlab针对压缩重构感知中的稀疏优化问题&#xff0c;实现L1范数最小化问题求解&#xff0c;首先构造信号&#xff0c;并进行离散余弦变换&#xff0c;保证稀疏度&#xff0c;采用多个方法进行稀疏重构&#xff0c;分别有&#xff0c;&#xff08;1&#xff09;基于L1正则的…

代数结构上的泛型算法

一&#xff0c;半群算法 //半群 class SemiGroup { public://枚举只去掉1个数&#xff08;v.size()>1&#xff09;&#xff0c;剩下的数做p累积运算的结果template<typename T, typename Tfunc>static vector<T> allExceptOne(vector<T>& v, Tfunc p…

SOLIDWORKS 2024最新版价格:SW专业版|白金版多少钱一套?

从一开始&#xff0c;SOLIDWORKS 就一直站在让设计对每位设计师和工程师来说都触手可及的最前沿。我们的任务是通过功能强大且易于使用的产品开发解决方案&#xff0c;在创造、协作和提供创新的产品体验方面助您一臂之力。SOLIDWORKS 2024 延续了这一期望&#xff0c;同时开启了…

带你从0开始学习自动化框架Airtest

现在市面上做UI自动化的框架很多&#xff0c;包括我们常用的Web自动化框架Selenium&#xff0c;移动端自动化框架Appium。 虽然Selenium和Appium分属同源&#xff0c;而且API都有很多相同的地方&#xff0c;可以无损耗切换&#xff0c;但是还是需要引入不同的库&#xff0c;而…

PO- array数据只能接收到一条的问题处理

问题描述&#xff1a; 发送方明明是array多条数据&#xff0c;接收方通过PO接收后只有一条数据 原因分析&#xff1a; SAP AAE类适配器是按照XML格式识别&#xff0c;虽然设置为[0unbound]&#xff0c;但是由于JSON的array[]格式过来后不会自动变成多组XML&#xff0c;所以需…

【探索AI潜能,连结现代通讯】相隔万里,我们与AI一同赏月。

1️⃣写在前面 近年来&#xff0c;AI得到了迅猛的发展&#xff0c;尤其是大模型的出现受到了广泛的关注和讨论。ChatGPT、文心一言等纷纷登场&#xff0c;可谓是百家争鸣。 而AI大模型所延申出的子项目如AI绘画、AI写作等&#xff0c;在各自的领域展示出了惊人的潜力。 最圆…

风格化角色渲染方法

一、前言 二、基础结构 种类较多的风格化渲染风格 解帧分析 三、光照 漫反射和高光 增加卡通风 头发的高光 环状高光&#xff0c;物理性质的不同 解决高光形状不可控的问题 瞳孔的焦散效应 四、阴影 五、描边 六、Other

全网最详细的centos中修改tomact的端口号

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专…

linux--线程共享内存

Linux线程共享内存空间是指多个线程可以访问同一个内存区域&#xff0c;这些线程共享该内存区域的内容。 代码&#xff1a; #include <stdio.h> #include <pthread.h>// share memoryint data 0; //定义一个全局变量datavoid *fun1(void *arg) {printf("t1:…

基于SSM的开放性实验室管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;JSP 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Redis代替session实现用户验证

一、Redis代替session实现用户验证。 下图是session的实现登录需要实现的代码模块&#xff0c;虽然可以实现完整功能&#xff0c;但是仍然存在一些问题。 在以往使用session当作用户验证的过程中&#xff0c;会有session共享的问题&#xff0c;每次承担请求的tomcat是不一样…