feat: 添加通用的分页工具模块
This commit is contained in:
parent
3311823800
commit
fdb4f10ba4
|
|
@ -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;
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue