From d1561081484ff948b34ed8577742fd0d52c2410f Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 4 Mar 2026 15:19:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BA=20get=5Ftag=5Flist=20?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=B7=BB=E5=8A=A0=E5=88=86=E9=A1=B5=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/handler/tag.rs | 29 +++++++++++++++++++++++++---- src/service.rs | 41 +++++++++++++++++++++++++++++++++++------ 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/src/handler/tag.rs b/src/handler/tag.rs index 8d8fc73..65e3d4a 100644 --- a/src/handler/tag.rs +++ b/src/handler/tag.rs @@ -1,17 +1,38 @@ -use axum::{Json, extract::{Path, State}, http::StatusCode, response::IntoResponse}; +use axum::{Json, extract::{Path, Query, State}, http::StatusCode, response::IntoResponse}; use serde::Deserialize; use uuid::Uuid; use validator::Validate; -use crate::util::response::ApiErr; +use crate::util::{response::ApiErr, pagination::{PaginatedResponse, PaginationParams}}; use crate::{AppState}; /// 获取所有标签 +#[derive(Deserialize, Validate)] +pub struct GetTagListQuery { + #[serde(flatten)] + pub pagination: PaginationParams, +} + pub async fn get_tag_list( State(state): State, + Query(query): Query, ) -> Result { - let tags = crate::service::get_all_tags(&state.pool).await?; - Ok(Json(tags)) + query.validate()?; + let pool = &state.pool; + + // 获取总数 + let total = crate::service::get_tags_count(pool).await?; + + // 获取分页数据 + let tags = crate::service::get_tags_paginated( + pool, + query.pagination.page_size, + query.pagination.offset(), + ).await?; + + let response = PaginatedResponse::new(tags, total, query.pagination.page, query.pagination.page_size); + + Ok(Json(response)) } /// 获取标签下的点位信息 diff --git a/src/service.rs b/src/service.rs index 6352acc..d076cfe 100644 --- a/src/service.rs +++ b/src/service.rs @@ -219,17 +219,46 @@ pub async fn get_points_paginated( // ==================== Tag 相关服务函数 ==================== -/// 获取所有标签 -pub async fn get_all_tags( +/// 获取标签总数 +pub async fn get_tags_count( pool: &PgPool, -) -> Result, sqlx::Error> { - query_as::<_, crate::model::Tag>( - r#"SELECT * FROM tag ORDER BY created_at"# +) -> Result { + sqlx::query_scalar::<_, i64>( + r#"SELECT COUNT(*) FROM tag"#, ) - .fetch_all(pool) + .fetch_one(pool) .await } +/// 获取分页标签列表 +pub async fn get_tags_paginated( + pool: &PgPool, + page_size: i32, + offset: u32, +) -> Result, sqlx::Error> { + if page_size == 0 { + Ok(vec![]) + } else if page_size == -1 { + sqlx::query_as::<_, crate::model::Tag>( + r#"SELECT * FROM tag ORDER BY created_at"#, + ) + .fetch_all(pool) + .await + } else { + sqlx::query_as::<_, crate::model::Tag>( + r#" + SELECT * FROM tag + ORDER BY created_at + LIMIT $1 OFFSET $2 + "#, + ) + .bind(page_size) + .bind(offset as i64) + .fetch_all(pool) + .await + } +} + /// 根据ID获取标签 pub async fn get_tag_by_id( pool: &PgPool,