diff --git a/src/util.rs b/src/util.rs index e984aba..f2c20f2 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,4 +1,5 @@ pub mod datetime; pub mod log; +pub mod pagination; pub mod response; pub mod validator; \ No newline at end of file diff --git a/src/util/pagination.rs b/src/util/pagination.rs new file mode 100644 index 0000000..c8865bd --- /dev/null +++ b/src/util/pagination.rs @@ -0,0 +1,57 @@ +use serde::{Deserialize, Serialize}; +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, + } + } +} + +/// 分页查询参数 +#[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 + } +}