use serde::{Deserialize, Serialize}; use serde_with::serde_as; use validator::Validate; /// 分页响应结构 #[derive(Serialize)] pub struct PaginatedResponse { pub data: Vec, pub total: i64, pub page: u32, pub page_size: i32, pub total_pages: u32, } impl PaginatedResponse { /// 创建分页响应 pub fn new(data: Vec, 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 } }