diff --git a/domain/src/lib.rs b/domain/src/lib.rs index 8d3ab2f..c8702b6 100644 --- a/domain/src/lib.rs +++ b/domain/src/lib.rs @@ -1,5 +1,4 @@ pub mod entities; pub mod dto; pub mod vo; -pub mod pageable; pub mod db_result; \ No newline at end of file diff --git a/domain/src/vo/feedback.rs b/domain/src/vo/feedback.rs index 34703a5..f1da848 100644 --- a/domain/src/vo/feedback.rs +++ b/domain/src/vo/feedback.rs @@ -1,33 +1,33 @@ -use macros::Responsable; -use serde::Serialize; +// use macros::Responsable; +// use serde::Serialize; -use crate::entities::feedback::Feedback; +// use crate::entities::feedback::Feedback; -#[derive(Debug, Serialize, Responsable)] -pub struct FeedbackPageable { - pub data: Vec, - pub total: i64, - pub page: i64, - #[serde(rename = "pageSize")] - pub page_size: i64, -} +// #[derive(Debug, Serialize, Responsable)] +// pub struct FeedbackPageable { +// pub data: Vec, +// pub total: i64, +// pub page: i64, +// #[serde(rename = "pageSize")] +// pub page_size: i64, +// } -impl FeedbackPageable { - pub fn new(data: Vec, total: i64, page: i64, page_size: i64) -> Self { - FeedbackPageable { - data, - total, - page, - page_size, - } - } +// impl FeedbackPageable { +// pub fn new(data: Vec, total: i64, page: i64, page_size: i64) -> Self { +// FeedbackPageable { +// data, +// total, +// page, +// page_size, +// } +// } - pub fn empty(page: i64, page_size: i64) -> Self { - FeedbackPageable { - data: vec![], - total: 0, - page, - page_size, - } - } -} \ No newline at end of file +// pub fn empty(page: i64, page_size: i64) -> Self { +// FeedbackPageable { +// data: vec![], +// total: 0, +// page, +// page_size, +// } +// } +// } \ No newline at end of file diff --git a/domain/src/vo/mod.rs b/domain/src/vo/mod.rs index 7864cd1..e9ddf8c 100644 --- a/domain/src/vo/mod.rs +++ b/domain/src/vo/mod.rs @@ -1,2 +1,3 @@ pub mod account; -pub mod feedback; \ No newline at end of file +pub mod feedback; +pub mod pageable; \ No newline at end of file diff --git a/domain/src/pageable.rs b/domain/src/vo/pageable.rs similarity index 58% rename from domain/src/pageable.rs rename to domain/src/vo/pageable.rs index e6fbee8..3721a1c 100644 --- a/domain/src/pageable.rs +++ b/domain/src/vo/pageable.rs @@ -1,23 +1,20 @@ -use serde::Serialize; -use std::fmt::Debug; +use macros::Responsable; +use serde::{Deserialize, Serialize}; -#[derive(Debug, Serialize)] -pub struct Pageable +#[derive(Debug, Serialize, Deserialize, Responsable)] +pub struct Pageable where - T: Debug + Serialize, -{ - pub data: Vec, + D: Serialize, + { + pub data: Vec, pub total: i64, pub page: i64, #[serde(rename = "pageSize")] pub page_size: i64, } -impl Pageable -where - T: Debug + Serialize, -{ - pub fn new(data: Vec, total: i64, page: i64, page_size: i64) -> Self { +impl Pageable where D: Serialize { + pub fn new(data: Vec, total: i64, page: i64, page_size: i64) -> Self { Pageable { data, total, @@ -25,7 +22,6 @@ where page_size, } } - pub fn empty(page: i64, page_size: i64) -> Self { Pageable { data: vec![], @@ -34,4 +30,4 @@ where page_size, } } -} +} \ No newline at end of file diff --git a/macro/src/responsable.rs b/macro/src/responsable.rs index 78d7426..5b3d253 100644 --- a/macro/src/responsable.rs +++ b/macro/src/responsable.rs @@ -10,34 +10,16 @@ use syn::{Data, DeriveInput, Fields}; // 用于解析宏输入 pub fn gen_responsable(input: DeriveInput) -> TokenStream { let name = &input.ident; // 获取结构体名称 + let generics = &input.generics; // 获取泛型参数 + let (impl_generics, _ty_generics, where_clause) = generics.split_for_impl(); let gen = match input.data { Data::Struct(ref data) => match data.fields { Fields::Named(ref _fields) => { - // // 处理命名字段 - // let field_names = fields.named.iter().map(|f| &f.ident); // 获取所有字段名称 - // let field_types = fields.named.iter().map(|f| &f.ty); // 获取所有字段类型 - - // // 获取`status`属性 - // let status = match input.attrs.iter().find(|attr| attr.path().is_ident("status")) { - // Some(attr) => { - // let status_lit = attr.parse_args::().unwrap(); // 解析`status`属性值 - // quote! { #status_lit } // 生成状态码 - // }, - // None => quote! { hyper::StatusCode::OK }, // 默认状态码为`OK` - // }; - - // // 获取`headers`属性 - // let headers = match input.attrs.iter().find(|attr| attr.path().is_ident("headers")) { - // Some(attr) => { - // let headers_lit = attr.parse_args::().unwrap(); // 解析`headers`属性值 - // quote! { #headers_lit } // 生成头部信息 - // }, - // None => quote! { hyper::HeaderMap::new() }, // 默认头部信息为空 - // }; + // 处理命名字段 // 生成实现`IntoResponse` trait的代码 quote! { - impl axum::response::IntoResponse for #name { + impl #impl_generics axum::response::IntoResponse for #name #generics #where_clause { fn into_response(self) -> axum::http::Response { let mut builder = hyper::Response::builder(); // .status(#status) // 设置状态码 @@ -51,31 +33,11 @@ pub fn gen_responsable(input: DeriveInput) -> TokenStream { } }, Fields::Unnamed(ref _fields) => { - // // 处理未命名字段 - // let field_names = fields.unnamed.iter().enumerate().map(|(i, _)| i); // 获取所有字段索引 - // let field_types = fields.unnamed.iter().map(|f| &f.ty); // 获取所有字段类型 - - // // 获取`status`属性 - // let status = match input.attrs.iter().find(|attr| attr.path().is_ident("status")) { - // Some(attr) => { - // let status_lit = attr.parse_args::().unwrap(); // 解析`status`属性值 - // quote! { #status_lit } // 生成状态码 - // }, - // None => quote! { hyper::StatusCode::OK }, // 默认状态码为`OK` - // }; - - // // 获取`headers`属性 - // let headers = match input.attrs.iter().find(|attr| attr.path().is_ident("headers")) { - // Some(attr) => { - // let headers_lit = attr.parse_args::().unwrap(); // 解析`headers`属性值 - // quote! { #headers_lit } // 生成头部信息 - // }, - // None => quote! { hyper::HeaderMap::new() }, // 默认头部信息为空 - // }; + // 处理未命名字段 // 生成实现`IntoResponse` trait的代码 quote! { - impl axum::response::IntoResponse for #name { + impl #impl_generics axum::response::IntoResponse for #name #generics #where_clause { fn into_response(self) -> axum::http::Response { // let mut builder = hyper::Response::builder(); // .status(#status) // 设置状态码 @@ -89,28 +51,11 @@ pub fn gen_responsable(input: DeriveInput) -> TokenStream { } }, Fields::Unit => { - // // 处理无字段的结构体 - // // 获取`status`属性 - // let status = match input.attrs.iter().find(|attr| attr.path().is_ident("status")) { - // Some(attr) => { - // let status_lit = attr.parse_args::().unwrap(); // 解析`status`属性值 - // quote! { #status_lit } // 生成状态码 - // }, - // None => quote! { hyper::StatusCode::OK }, // 默认状态码为`OK` - // }; - - // // 获取`headers`属性 - // let headers = match input.attrs.iter().find(|attr| attr.path().is_ident("headers")) { - // Some(attr) => { - // let headers_lit = attr.parse_args::().unwrap(); // 解析`headers`属性值 - // quote! { #headers_lit } // 生成头部信息 - // }, - // None => quote! { hyper::HeaderMap::new() }, // 默认头部信息为空 - // }; + // 处理无字段的结构体 // 生成实现`IntoResponse` trait的代码 quote! { - impl axum::response::IntoResponse for #name { + impl #impl_generics axum::response::IntoResponse for #name #generics #where_clause { fn into_response(self) -> axum::http::Response { // let mut builder = hyper::Response::builder(); // .status(#status) // 设置状态码 diff --git a/server/src/controller/feedback_controller.rs b/server/src/controller/feedback_controller.rs index ea59a95..1110810 100644 --- a/server/src/controller/feedback_controller.rs +++ b/server/src/controller/feedback_controller.rs @@ -1,8 +1,8 @@ extern crate macros; -use domain::dto::feedback::FeedbackAdd; +use domain::entities::feedback::Feedback; +use domain::{dto::feedback::FeedbackAdd, vo::pageable::Pageable}; use domain::dto::pageable::PageParams; -use domain::vo::feedback::FeedbackPageable; use library::context::Context; use library::extractor::path_extractor::PathVar; use library::model::response::ResResult; @@ -26,7 +26,7 @@ pub async fn add_feedback( pub async fn get_feedback_list_by_page( context: Context, QueryParams(page_params): QueryParams, -) -> ResResult { +) -> ResResult> { service::feedback_service::get_feedback_list_by_page( context, page_params.page.unwrap(), @@ -39,7 +39,7 @@ pub async fn get_feedback_list_by_page( pub async fn get_feedback_list( context: Context, PathVar(page_params): PathVar, -) -> ResResult { +) -> ResResult> { service::feedback_service::get_feedback_list_by_page( context, page_params.page.unwrap(), diff --git a/server/src/service/feedback_service.rs b/server/src/service/feedback_service.rs index eef7fe2..1862f9c 100644 --- a/server/src/service/feedback_service.rs +++ b/server/src/service/feedback_service.rs @@ -1,6 +1,6 @@ use domain::dto::feedback::FeedbackAdd; use domain::entities::feedback::Feedback; -use domain::vo::feedback::FeedbackPageable; +use domain::vo::pageable::Pageable; use library::context::Context; use library::db; use library::model::response::ResResult; @@ -10,18 +10,18 @@ pub async fn get_feedback_list_by_page( context: Context, page: i64, page_size: i64, -) -> ResResult { +) -> ResResult> { if !context.account.unwrap().role.is_admin() { tracing::error!("非管理员用户,无法获取反馈信息列表"); - return Ok(FeedbackPageable::empty(page, page_size)); + return Ok(Pageable::::empty(page, page_size)); } let feedback_list = Feedback::search_feedback(page, page_size, db!()).await.ok(); if feedback_list.is_none() { tracing::error!("反馈信息为空"); - return Ok(FeedbackPageable::empty(page, page_size)); + return Ok(Pageable::::empty(page, page_size)); } let total = get_feedback_count().await; - Ok(FeedbackPageable::new( + Ok(Pageable::::new( feedback_list.unwrap(), total, page,