feat: 添加通用的分页工具模块

This commit is contained in:
caoqianming 2026-03-04 13:37:58 +08:00
parent 3311823800
commit fdb4f10ba4
2 changed files with 58 additions and 0 deletions

View File

@ -1,4 +1,5 @@
pub mod datetime; pub mod datetime;
pub mod log; pub mod log;
pub mod pagination;
pub mod response; pub mod response;
pub mod validator; pub mod validator;

57
src/util/pagination.rs Normal file
View File

@ -0,0 +1,57 @@
use serde::{Deserialize, Serialize};
use validator::Validate;
/// 分页响应结构
#[derive(Serialize)]
pub struct PaginatedResponse<T> {
pub data: Vec<T>,
pub total: i64,
pub page: u32,
pub page_size: i32,
pub total_pages: u32,
}
impl<T> PaginatedResponse<T> {
/// 创建分页响应
pub fn new(data: Vec<T>, total: i64, page: u32, page_size: i32) -> Self {
let total_pages = if page_size > 0 {
((total as f64) / (page_size as f64)).ceil() as u32
} else {
0
};
Self {
data,
total,
page,
page_size,
total_pages,
}
}
}
/// 分页查询参数
#[derive(Deserialize, Validate)]
pub struct PaginationParams {
#[validate(range(min = 1))]
#[serde(default = "default_page")]
pub page: u32,
#[validate(range(min = -1, max = 100))]
#[serde(default = "default_page_size")]
pub page_size: i32,
}
fn default_page() -> u32 {
1
}
fn default_page_size() -> i32 {
20
}
impl PaginationParams {
/// 计算偏移量
pub fn offset(&self) -> u32 {
(self.page - 1) * self.page_size.max(0) as u32
}
}