From 246c17ba39a17a121869b79c3c2e1ec305fc72b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=A4=A9?= Date: Fri, 2 Feb 2024 15:43:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E5=8F=96service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/handler.rs | 99 +++++++------------------------------------ src/lib.rs | 1 + src/service/member.rs | 83 ++++++++++++++++++++++++++++++++++++ src/service/mod.rs | 6 +++ src/util/mod.rs | 21 ++++++++- 5 files changed, 125 insertions(+), 85 deletions(-) create mode 100644 src/service/member.rs create mode 100644 src/service/mod.rs diff --git a/src/handler.rs b/src/handler.rs index b060b2b..8578295 100644 --- a/src/handler.rs +++ b/src/handler.rs @@ -1,26 +1,13 @@ -use std::sync::Arc; - use askama::Template; use axum::extract::{Path, Query, State}; use axum::Form; -use axum::http::{header, HeaderMap, StatusCode}; +use axum::http::{HeaderMap, StatusCode}; use axum::response::Html; use serde::Deserialize; -use crate::{db::member, err::Error, form, model, model::state::AppState, Result, view}; - -fn get_conn(state: &AppState) -> Arc { - state.pool.clone() -} - - -fn redirect(url: &str) -> Result<(StatusCode, HeaderMap, ())> { - let mut header = HeaderMap::new(); - header.insert(header::LOCATION, url.parse().unwrap()); - - Ok((StatusCode::FOUND, header, ())) -} - +use crate::{err::Error, form, model::state::AppState, Result, view}; +use crate::service::MemberService; +use crate::util::redirect; #[derive(Deserialize)] pub struct PageQuery { @@ -33,11 +20,7 @@ pub async fn index( State(state): State, Query(q): Query, ) -> Result> { - let conn = get_conn(&state); - - let p = member::list(&conn, q.page.unwrap_or(0)).await?; - - let tpl = view::Home { p, msg: q.msg }; + let tpl = MemberService::index(&state, q).await?; let html = tpl.render().map_err(Error::from)?; Ok(Html(html)) } @@ -46,18 +29,9 @@ pub async fn detail( State(state): State, Path(id): Path, ) -> Result> { - let conn = get_conn(&state); - - let m = member::find(&conn, id).await?; - - match m { - None => Err(Error::not_found("不存在的会员")), - Some(m) => { - let tpl = view::Detail { m }; - let html = tpl.render().map_err(Error::from)?; - Ok(Html(html)) - } - } + let tpl = MemberService::detail(&state, id).await?; + let html = tpl.render().map_err(Error::from)?; + Ok(Html(html)) } @@ -72,16 +46,7 @@ pub async fn add( State(state): State, Form(frm): Form, ) -> Result<(StatusCode, HeaderMap, ())> { - let conn = get_conn(&state); - - member::add(&conn, &model::member::Member { - name: frm.name, - balance: frm.balance, - types: frm.types, - dateline: chrono::Local::now(), - ..Default::default() - }).await?; - + MemberService::add(&state, frm).await?; redirect("/?msg=会员添加成功") } @@ -90,18 +55,9 @@ pub async fn edit_ui( State(state): State, Path(id): Path, ) -> Result> { - let conn = get_conn(&state); - - let m = member::find(&conn, id).await?; - - match m { - Some(m) => { - let tpl = view::Edit { m }; - let html = tpl.render().map_err(Error::from)?; - Ok(Html(html)) - } - None => Err(Error::not_found("不存在的会员")), - } + let tpl = MemberService::edit_ui(&state, id).await?; + let html = tpl.render().map_err(Error::from)?; + Ok(Html(html)) } @@ -110,16 +66,7 @@ pub async fn edit( Path(id): Path, Form(frm): Form, ) -> Result<(StatusCode, HeaderMap, ())> { - let conn = get_conn(&state); - - member::edit(&conn, &model::member::Member { - id, - name: frm.name, - balance: frm.balance, - types: frm.types, - ..Default::default() - }).await?; - + MemberService::edit(&state, id, frm).await?; redirect("/?msg=会员修改成功") } @@ -127,10 +74,7 @@ pub async fn del( State(state): State, Path(id): Path, ) -> Result<(StatusCode, HeaderMap, ())> { - let conn = get_conn(&state); - - member::del(&conn, id).await?; - + MemberService::del(&state, id).await?; redirect("/?msg=逻辑删除成功") } @@ -138,10 +82,7 @@ pub async fn real_del( State(state): State, Path(id): Path, ) -> Result<(StatusCode, HeaderMap, ())> { - let conn = get_conn(&state); - - member::real_del(&conn, id).await?; - + MemberService::real_del(&state, id).await?; redirect("/?msg=物理删除成功") } @@ -157,15 +98,7 @@ pub async fn tran( State(state): State, Form(frm): Form, ) -> Result<(StatusCode, HeaderMap, ())> { - let conn = get_conn(&state); - - let aff = member::tran(&conn, &model::member::Tran { - from_member: frm.from_member, - to_member: frm.to_member, - amount: frm.amount, - }).await?; - + let aff = MemberService::tran(&state, frm).await?; tracing::debug!("{:?}", aff); - redirect("/?msg=转账成功") } diff --git a/src/lib.rs b/src/lib.rs index 9ef3a09..9b39ed9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,5 +6,6 @@ pub mod model; pub mod view; pub mod form; pub mod util; +pub mod service; pub type Result = std::result::Result; \ No newline at end of file diff --git a/src/service/member.rs b/src/service/member.rs new file mode 100644 index 0000000..a97c4e8 --- /dev/null +++ b/src/service/member.rs @@ -0,0 +1,83 @@ +use crate::{form, model, view, util, Result}; +use crate::db::member; +use crate::err::Error; +use crate::handler::PageQuery; +use crate::model::state::AppState; + +pub struct MemberService; + +impl MemberService { + pub async fn index(state: &AppState, q: PageQuery) -> Result { + let conn = util::get_conn(&state); + + let p = member::list(&conn, q.page.unwrap_or(0)).await?; + + return Ok(view::Home { p, msg: q.msg }); + } + + pub async fn detail(state: &AppState, id: u32) -> Result { + let conn = util::get_conn(&state); + + let m = member::find(&conn, id).await?; + + match m { + None => Err(Error::not_found("不存在的会员")), + Some(m) => Ok(view::Detail { m }) + } + } + + pub async fn add(state: &AppState, frm: form::AddAndEdit) -> Result { + let conn = util::get_conn(&state); + + member::add(&conn, &model::member::Member { + name: frm.name, + balance: frm.balance, + types: frm.types, + dateline: chrono::Local::now(), + ..Default::default() + }).await + } + + pub async fn edit(state: &AppState, id: u32, frm: form::AddAndEdit) -> Result { + let conn = util::get_conn(&state); + + member::edit(&conn, &model::member::Member { + id, + name: frm.name, + balance: frm.balance, + types: frm.types, + ..Default::default() + }).await + } + + pub async fn edit_ui(state: &AppState, id: u32) -> Result { + let conn = util::get_conn(&state); + let m = member::find(&conn, id).await?; + + match m { + None => Err(Error::not_found("不存在的会员")), + Some(m) => Ok(view::Edit { m }) + } + } + + + pub async fn del(state: &AppState, id: u32) -> Result { + let conn = util::get_conn(&state); + member::del(&conn, id).await + } + + pub async fn real_del(state: &AppState, id: u32) -> Result { + let conn = util::get_conn(&state); + member::real_del(&conn, id).await + } + + pub async fn tran(state: &AppState, frm: form::Tran) -> Result<(u64, u64)> { + let conn = util::get_conn(&state); + + member::tran(&conn, &model::member::Tran { + from_member: frm.from_member, + to_member: frm.to_member, + amount: frm.amount, + }).await + } +} \ No newline at end of file diff --git a/src/service/mod.rs b/src/service/mod.rs new file mode 100644 index 0000000..f19826f --- /dev/null +++ b/src/service/mod.rs @@ -0,0 +1,6 @@ +mod member; + +pub use member::*; + + + diff --git a/src/util/mod.rs b/src/util/mod.rs index d9dd568..fe3d1b5 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -1,8 +1,24 @@ +use std::sync::Arc; + +use axum::http::{header, HeaderMap, StatusCode}; + +use crate::model::state::AppState; + +pub fn get_conn(state: &AppState) -> Arc { + state.pool.clone() +} + +pub fn redirect(url: &str) -> crate::Result<(StatusCode, HeaderMap, ())> { + let mut header = HeaderMap::new(); + header.insert(header::LOCATION, url.parse().unwrap()); + + Ok((StatusCode::FOUND, header, ())) +} pub mod default_datetime_format { use chrono::{DateTime, Local, NaiveDateTime}; - use serde::{self, Deserialize, Serializer, Deserializer}; + use serde::{self, Deserialize, Deserializer, Serializer}; const FORMAT: &'static str = "%Y-%m-%d %H:%M:%S"; @@ -16,6 +32,7 @@ pub mod default_datetime_format { let s = format!("{}", date.format(FORMAT)); serializer.serialize_str(&s) } + pub fn deserialize<'de, D>( deserializer: D, ) -> Result, D::Error> @@ -23,7 +40,7 @@ pub mod default_datetime_format { D: Deserializer<'de>, { let datetime_str = String::deserialize(deserializer)?; - let dt = NaiveDateTime::parse_from_str(&datetime_str, FORMAT).map_err(serde::de::Error::custom)?; + let dt = NaiveDateTime::parse_from_str(&datetime_str, FORMAT).map_err(serde::de::Error::custom)?; Ok(dt.and_local_timezone(Local).unwrap()) } } \ No newline at end of file