node-blog/PAGINATION_README.md
2025-06-24 11:42:12 +08:00

183 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 分页功能说明
## 概述
博客系统已集成完整的分页功能,支持以下页面的分页显示:
- **首页博客文章列表** - 每页显示5篇文章
- **管理员后台文章管理** - 每页显示10篇文章
- **管理员后台用户管理** - 每页显示10个用户
- **管理员后台评论管理** - 每页显示10条评论
## 功能特性
### 1. 通用分页组件
- **文件位置**: `views/components/pagination.ejs`
- **功能**: 可复用的分页UI组件
- **特性**:
- 响应式设计
- 智能页码显示最多显示5个页码
- 上一页/下一页导航
- 首页/末页快速跳转
- 省略号显示
- 当前页高亮
- 分页信息显示
### 2. 分页工具函数
- **文件位置**: `utils/pagination.js`
- **主要函数**:
- `getPaginationInfo()` - 计算分页信息
- `paginateQuery()` - 执行分页查询
- `addPaginationToQuery()` - 为查询添加分页
### 3. 分页样式
- **设计风格**: 现代化Bootstrap风格
- **颜色主题**: 蓝色主题(#3498db
- **交互效果**: 悬停动画、过渡效果
- **响应式**: 支持移动端适配
## 使用方法
### 1. 后端路由中使用分页
```javascript
const { paginateQuery } = require('./utils/pagination');
// 在路由中使用
router.get('/posts', async (req, res) => {
const page = parseInt(req.query.page) || 1;
const limit = 10;
const result = await paginateQuery(
Post, // Mongoose模型
{}, // 查询条件
{ sort: { createdAt: -1 } }, // 查询选项
page, // 当前页码
limit // 每页数量
);
res.render('template', {
posts: result.data,
pagination: result.pagination,
baseUrl: '/posts',
query: {}
});
});
```
### 2. 前端模板中使用分页组件
```ejs
<!-- 在模板中引入分页组件 -->
<%- include('components/pagination', {
currentPage: pagination.currentPage,
totalPages: pagination.totalPages,
baseUrl: baseUrl,
query: query
}) %>
```
### 3. 分页参数说明
- `currentPage`: 当前页码
- `totalPages`: 总页数
- `baseUrl`: 基础URL用于生成分页链接
- `query`: 查询参数对象(用于保持其他查询参数)
## 分页配置
### 首页文章列表
- **每页数量**: 5篇文章
- **排序**: 按创建时间倒序
- **URL**: `/`
### 管理员后台
- **文章管理**: 每页10篇文章
- **用户管理**: 每页10个用户
- **评论管理**: 每页10条评论
## 分页组件特性
### 1. 智能页码显示
- 当前页前后各显示2页
- 最多显示5个页码
- 自动显示首页和末页
- 使用省略号表示跳过的页码
### 2. 导航功能
- 上一页/下一页按钮
- 首页/末页快速跳转
- 页码直接跳转
- 禁用状态处理
### 3. 查询参数保持
- 自动保持URL中的查询参数
- 支持搜索、筛选等功能
- 分页不影响其他查询条件
### 4. 响应式设计
- 移动端适配
- 触摸友好的按钮大小
- 清晰的视觉层次
## 样式定制
分页组件的样式可以通过修改 `views/components/pagination.ejs` 中的CSS来自定义
```css
.pagination-wrapper {
margin-top: 30px;
}
.page-link {
color: #3498db;
border-color: #dee2e6;
transition: all 0.3s ease;
}
.page-item.active .page-link {
background-color: #3498db;
border-color: #3498db;
color: white;
}
```
## 测试
运行分页功能测试:
```bash
node test_pagination.js
```
## 注意事项
1. **数据库性能**: 分页查询使用 `skip``limit`,大数据量时建议使用索引优化
2. **内存使用**: 分页组件会计算总记录数,确保数据库连接稳定
3. **URL参数**: 分页参数使用 `page` 参数,避免与其他参数冲突
4. **错误处理**: 分页组件包含完整的错误处理机制
## 扩展功能
### 1. 添加搜索功能
```javascript
// 在查询条件中添加搜索
const searchQuery = req.query.search ? { title: { $regex: req.query.search, $options: 'i' } } : {};
const result = await paginateQuery(Post, searchQuery, options, page, limit);
```
### 2. 添加筛选功能
```javascript
// 添加分类筛选
const categoryFilter = req.query.category ? { category: req.query.category } : {};
const result = await paginateQuery(Post, categoryFilter, options, page, limit);
```
### 3. 自定义每页数量
```javascript
// 允许用户选择每页显示数量
const limit = parseInt(req.query.limit) || 10;
const result = await paginateQuery(Post, {}, options, page, limit);
```
分页功能已完全集成到博客系统中,提供了良好的用户体验和性能优化。