Nodejs分页设计配合bootstrap-paginator
Nodejs分页设计配合bootstrap-paginator
前言
分页功能是查询的必备功能,比如我要查询一个多于1000条记录的结果集。如果一次全部展示,不仅浪费带宽,增长等待时间,用户看到这么多的数据也会觉得的头疼。但是有了分页功能,可以根据用户的习惯,一页一页的处理少量的数据,展示少量的数据,就像是在看书一样的。
分页功能非常实用,但是实现起来也稍有复杂。不仅要考虑到前端的展示和传值问题,还要考虑后端面向数据的查询语句。不过我也发现了前端和后端对应的解决的方案。前端程序可以通过bootstrap-paginator项目来封装,而后端我是自己实现的。本来是准备使用mongoose-paginate项目,但他的设计过于简单,而且与bootstrap-paginator的一些传参习惯不符,自已实现其实更好控制。
目录
分页前端雏形bootstrap-paginator 分页后端查询mongoose 分页结果返回页面(后端->前端) 分页查询参数传递(前端->后端) 分页完整展现
请查看博客文章
http://blog.fens.me/nodejs-bootstrap-paginator/
Nodejs分页设计配合bootstrap-paginator
前言
分页功能是查询大量数据时不可或缺的一部分。例如,当你需要查询超过1000条记录的结果集时,一次性加载所有数据不仅会消耗大量的带宽,还会增加用户的等待时间。通过分页功能,可以将数据分成若干小块,每次只显示一部分,这样用户可以更方便地浏览和处理数据。
目录
- 分页前端雏形:bootstrap-paginator
- 分页后端查询:mongoose
- 分页结果返回页面(后端 -> 前端)
- 分页查询参数传递(前端 -> 后端)
- 分页完整展现
示例代码
1. 分页前端雏形:bootstrap-paginator
首先,我们需要在前端引入bootstrap-paginator
插件。你可以从GitHub下载或者直接通过CDN引入。
<!-- 引入必要的CSS和JS文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-paginator/0.8.4/bootstrap-paginator.min.js"></script>
接下来,我们创建一个简单的HTML结构:
<div id="example">
<table class="table table-striped">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
</tr>
</thead>
<tbody id="data"></tbody>
</table>
<ul id="pagination"></ul>
</div>
然后,初始化bootstrap-paginator
:
$(function () {
var options = {
bootstrapMajorVersion: 4,
currentPage: 1,
totalPages: 10,
numberOfPages: 5,
onPageClicked: function (event, originalEvent, type, page) {
loadPage(page);
}
};
$('#pagination').bootstrapPaginator(options);
});
2. 分页后端查询:mongoose
在后端,我们可以使用Mongoose来处理数据库查询。假设我们有一个名为User
的模型。
const mongoose = require('mongoose');
const User = mongoose.model('User', new mongoose.Schema({
name: String
}));
// 查询分页数据
async function loadPage(page, limit) {
const skip = (page - 1) * limit;
const users = await User.find().skip(skip).limit(limit);
return users;
}
3. 分页结果返回页面(后端 -> 前端)
后端将分页后的数据返回给前端,可以使用JSON格式:
app.get('/users', async (req, res) => {
const page = parseInt(req.query.page) || 1;
const limit = 10; // 每页显示10条记录
const users = await loadPage(page, limit);
res.json(users);
});
4. 分页查询参数传递(前端 -> 后端)
前端通过AJAX请求向后端传递分页参数:
function loadPage(page) {
$.ajax({
url: '/users',
method: 'GET',
data: { page: page },
success: function (data) {
$('#data').empty();
data.forEach(user => {
$('#data').append(`<tr><td>${user.id}</td><td>${user.name}</td></tr>`);
});
}
});
}
5. 分页完整展现
完整的分页展现包括前端的UI布局、数据加载和分页控件的交互。通过上述步骤,我们实现了前后端协同工作,以提供流畅的分页体验。
总结
通过上述步骤,我们展示了如何使用Node.js和Mongoose实现分页功能,并配合bootstrap-paginator
插件进行前端展示。希望这些示例代码能够帮助你更好地理解和实现分页功能。
针对 “Nodejs分页设计配合bootstrap-paginator” 这个主题,这里提供一个简单的分页设计示例,包括前端和后端的部分。
前端:Bootstrap Paginator 配置
首先需要引入 bootstrap
和 bootstrap-paginator
库:
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-paginator/0.8.4/bootstrap-paginator.min.js"></script>
接下来是 bootstrap-paginator
的初始化代码:
$(function() {
var totalPages = 50; // 假设有50页
$('#example').bootstrapPaginator({
bootstrapMajorVersion: 3, // 指定版本号
currentPage: 1, // 当前页码
totalPages: totalPages, // 总页数
numberOfPages: 10, // 显示多少页按钮
onPageClicked: function(event, originalEvent, type, page) {
fetchPageData(page);
}
});
});
function fetchPageData(pageNumber) {
$.ajax({
url: '/get-page-data',
data: { page: pageNumber },
success: function(response) {
$('#pageContent').html(response.data);
}
});
}
后端:Node.js + Express 实现
安装必要的依赖:
npm install express mongoose
创建一个简单的 Express 路由处理分页请求:
const express = require('express');
const app = express();
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true });
// 假设有一个名为 Article 的模型
const Article = mongoose.model('Article', new mongoose.Schema({ title: String }));
app.get('/get-page-data', async (req, res) => {
const page = parseInt(req.query.page, 10) || 1;
const perPage = 10; // 每页显示10条数据
const articles = await Article.find()
.skip((page - 1) * perPage)
.limit(perPage)
.exec();
res.json({ data: articles.map(article => article.title) });
});
app.listen(3000, () => console.log('Server running on port 3000'));
解释
- 前端部分:通过
bootstrap-paginator
插件,实现了分页导航栏,点击分页按钮时会调用fetchPageData
函数获取指定页码的数据。 - 后端部分:Express 路由
/get-page-data
接收客户端的分页请求,从数据库中获取相应页的数据,并返回给前端。
这种方式将前后端分离,便于扩展和维护。