62 lines
1.3 KiB
Rust
62 lines
1.3 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
use serde_with::serde_as;
|
|
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,
|
|
}
|
|
}
|
|
}
|
|
|
|
/// 分页查询参数
|
|
#[serde_as]
|
|
#[derive(Debug, Deserialize, Validate)]
|
|
pub struct PaginationParams {
|
|
#[validate(range(min = 1))]
|
|
#[serde_as(as = "serde_with::DisplayFromStr")]
|
|
#[serde(default = "default_page")]
|
|
pub page: u32,
|
|
#[validate(range(min = -1, max = 100))]
|
|
#[serde_as(as = "serde_with::DisplayFromStr")]
|
|
#[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
|
|
}
|
|
}
|