feat: 添加通用的分页工具模块
This commit is contained in:
parent
3311823800
commit
fdb4f10ba4
|
|
@ -1,4 +1,5 @@
|
|||
pub mod datetime;
|
||||
pub mod log;
|
||||
pub mod pagination;
|
||||
pub mod response;
|
||||
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