From ec6b061ed775421d906312f903bb83506cf0e26f Mon Sep 17 00:00:00 2001 From: liyunjia Date: Mon, 22 Apr 2024 21:45:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0feedback=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/controller/feedback.rs | 29 +++++++++++++++++++ api/src/controller/mod.rs | 3 +- api/src/router.rs | 4 ++- domain/src/dto/feedback.rs | 11 +++++++ domain/src/dto/mod.rs | 4 ++- domain/src/dto/pageable.rs | 7 +++++ domain/src/entities/feedback.rs | 3 +- domain/src/entities/mod.rs | 2 +- library/src/resp/mod.rs | 3 +- library/src/resp/pageable.rs | 24 ++++++++++++++++ service/src/feedback.rs | 51 +++++++++++++++++++++++++++++++++ service/src/lib.rs | 2 +- 12 files changed, 136 insertions(+), 7 deletions(-) create mode 100644 api/src/controller/feedback.rs create mode 100644 domain/src/dto/feedback.rs create mode 100644 domain/src/dto/pageable.rs create mode 100644 library/src/resp/pageable.rs diff --git a/api/src/controller/feedback.rs b/api/src/controller/feedback.rs new file mode 100644 index 0000000..10909bb --- /dev/null +++ b/api/src/controller/feedback.rs @@ -0,0 +1,29 @@ +use axum::extract::Query; +use axum::Json; +use axum_extra::extract::WithRejection; +use validator::Validate; +use domain::dto::feedback::FeedbackAdd; +use domain::dto::pageable::PageParams; +use domain::entities::feedback; +use library::resp::pageable::Pageable; +use library::resp::rejection::IRejection; +use library::resp::response::{ResErr, ResOK, ResResult}; + +/// 添加反馈信息 +pub async fn add_feedback( + WithRejection(Json(req), _): IRejection> +) -> ResResult> { + if let Err(err) = req.validate() { + return Err(ResErr::ErrParams(Some(err.to_string()))); + } + + service::feedback::add_feedback(req).await?; + Ok(ResOK(None)) +} + +/// 获取反馈信息列表 +pub async fn get_feedback_list_by_page( + Query(pageParams): Query +) -> ResResult>> { + service::feedback::get_feedback_list_by_page(pageParams.page, pageParams.page_size).await +} \ No newline at end of file diff --git a/api/src/controller/mod.rs b/api/src/controller/mod.rs index fcb7558..d8cb849 100644 --- a/api/src/controller/mod.rs +++ b/api/src/controller/mod.rs @@ -1 +1,2 @@ -pub mod player_info; \ No newline at end of file +pub mod player_info; +pub mod feedback; \ No newline at end of file diff --git a/api/src/router.rs b/api/src/router.rs index 2e50768..f57481f 100644 --- a/api/src/router.rs +++ b/api/src/router.rs @@ -8,7 +8,9 @@ use tower_http::trace::TraceLayer; pub(crate) fn init() -> Router { let open = Router::new().route("/", get(|| async { "hello" })); - let auth = Router::new().route("/game_accounts", post(controller::player_info::create)); + let auth = Router::new() + .route("/game_accounts", post(controller::player_info::create)) + .route("/feedback", post(controller::feedback::add_feedback).get(controller::feedback::get_feedback_list_by_page)); Router::new() .nest("/", open) diff --git a/domain/src/dto/feedback.rs b/domain/src/dto/feedback.rs new file mode 100644 index 0000000..23a3938 --- /dev/null +++ b/domain/src/dto/feedback.rs @@ -0,0 +1,11 @@ +use sea_orm::prelude::DateTime; +use serde::{Deserialize, Serialize}; +use validator::Validate; + +#[derive(Debug, Validate, Deserialize, Serialize)] +pub struct FeedbackAdd { + #[validate(required(message = "用户ID不能为空"))] + pub user_id: Option, + #[validate(required, length(min = 1, message = "反馈内容不能为空"))] + pub content: Option +} \ No newline at end of file diff --git a/domain/src/dto/mod.rs b/domain/src/dto/mod.rs index fcb7558..484ac63 100644 --- a/domain/src/dto/mod.rs +++ b/domain/src/dto/mod.rs @@ -1 +1,3 @@ -pub mod player_info; \ No newline at end of file +pub mod player_info; +pub mod feedback; +pub mod pageable; \ No newline at end of file diff --git a/domain/src/dto/pageable.rs b/domain/src/dto/pageable.rs new file mode 100644 index 0000000..74da2f0 --- /dev/null +++ b/domain/src/dto/pageable.rs @@ -0,0 +1,7 @@ +use serde::Deserialize; + +#[derive(Deserialize)] +pub struct PageParams { + pub page: u64, + pub page_size: u64, +} \ No newline at end of file diff --git a/domain/src/entities/feedback.rs b/domain/src/entities/feedback.rs index e7c2eda..d7dd13f 100644 --- a/domain/src/entities/feedback.rs +++ b/domain/src/entities/feedback.rs @@ -1,7 +1,8 @@ use sea_orm::entity::prelude::*; use sea_orm::prelude::DateTime; +use serde::{Deserialize, Serialize}; -#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)] +#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel, Serialize, Deserialize)] #[sea_orm(table_name = "feedback")] pub struct Model { #[sea_orm(primary_key)] diff --git a/domain/src/entities/mod.rs b/domain/src/entities/mod.rs index b3e554b..0e9fcb6 100644 --- a/domain/src/entities/mod.rs +++ b/domain/src/entities/mod.rs @@ -3,4 +3,4 @@ pub mod prelude; pub mod account; pub mod player_info; -mod feedback; +pub mod feedback; diff --git a/library/src/resp/mod.rs b/library/src/resp/mod.rs index a6f2028..eb0d3bd 100644 --- a/library/src/resp/mod.rs +++ b/library/src/resp/mod.rs @@ -1,3 +1,4 @@ pub mod rejection; pub mod response; -pub mod status; \ No newline at end of file +pub mod status; +pub mod pageable; \ No newline at end of file diff --git a/library/src/resp/pageable.rs b/library/src/resp/pageable.rs new file mode 100644 index 0000000..46ede8e --- /dev/null +++ b/library/src/resp/pageable.rs @@ -0,0 +1,24 @@ +use std::fmt::Debug; +use serde::Serialize; + +#[derive(Debug, Serialize)] +pub struct Pageable where T: Debug + Serialize { + pub data: Vec, + pub total: u64, +} + +impl Pageable where T: Debug + Serialize { + pub fn new(data: Vec, total: u64) -> Self { + Self { + data, + total, + } + } + + pub fn empty() -> Self { + Self { + data: vec![], + total: 0, + } + } +} \ No newline at end of file diff --git a/service/src/feedback.rs b/service/src/feedback.rs index 8b13789..c43a9ad 100644 --- a/service/src/feedback.rs +++ b/service/src/feedback.rs @@ -1 +1,52 @@ +use sea_orm::{EntityTrait, PaginatorTrait}; +use sea_orm::ActiveValue::Set; +use domain::dto::feedback::FeedbackAdd; +use domain::entities::feedback; +use domain::entities::prelude::Feedback; +use library::db; +use library::resp::pageable::Pageable; +use library::resp::response::{ResOK, ResResult}; +/// 获取反馈信息列表 +pub async fn get_feedback_list_by_page(page: u64, page_size: u64) -> ResResult>> { + let feedback_list = Feedback::find() + .paginate(db!(), page_size) + .fetch_page(page) + .await + .ok(); + if feedback_list.is_none() { + tracing::error!("反馈信息为空"); + return Ok(ResOK(Some(Pageable::::empty()))); + } + let total = get_feedback_count().await; + Ok(ResOK(Some(Pageable::new(feedback_list.unwrap(), total)))) +} + +/// 获取反馈信息总数 +async fn get_feedback_count() -> u64 { + let count = Feedback::find().count(db!()).await.ok(); + if count.is_none() { + tracing::error!("反馈信息为空"); + return 0; + } + count.unwrap() +} + +/// 添加反馈信息 +pub async fn add_feedback(req: FeedbackAdd) -> ResResult> { + let now = chrono::Local::now().naive_local(); + + let model = feedback::ActiveModel { + user_id: Set(req.user_id.unwrap()), + content: Set(req.content.unwrap()), + created_at: Set(now), + ..Default::default() + }; + + if let Err(err) = Feedback::insert(model).exec(db!()).await { + tracing::error!(error = ?err, "添加反馈信息失败"); + return Err(library::resp::response::ResErr::ErrSystem(None)); + } + + Ok(ResOK(None)) +} \ No newline at end of file diff --git a/service/src/lib.rs b/service/src/lib.rs index 0fc0804..0ff037a 100644 --- a/service/src/lib.rs +++ b/service/src/lib.rs @@ -1,2 +1,2 @@ pub mod player_info; -mod feedback; +pub mod feedback;