From fdb4f10ba48874152c2bb8696cb6bff1ae546fc9 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 4 Mar 2026 13:37:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E5=88=86=E9=A1=B5=E5=B7=A5=E5=85=B7=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util.rs | 1 + src/util/pagination.rs | 57 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/util/pagination.rs 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 + } +}