From 7f89249f83bb90c004d76ae84bca3877220ea8e2 Mon Sep 17 00:00:00 2001 From: rsgl Date: Sat, 16 Nov 2024 23:45:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20UserInput=20=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=EF=BC=8C=E6=9B=B4=E6=96=B0=E7=94=A8=E6=88=B7=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E4=BB=A5=E6=94=AF=E6=8C=81=E6=96=B0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E5=8A=9F=E8=83=BD=EF=BC=8C=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/models/mod.rs | 1 + src/models/user.rs | 4 +- src/models/user_input.rs | 7 ++ src/repositories/user_repository.rs | 174 ++++++++++++++-------------- src/routes/user_routes.rs | 94 ++------------- src/services/user_service.rs | 94 ++++----------- 6 files changed, 126 insertions(+), 248 deletions(-) create mode 100644 src/models/user_input.rs diff --git a/src/models/mod.rs b/src/models/mod.rs index 22d12a3..4795a40 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -1 +1,2 @@ pub mod user; +pub mod user_input; diff --git a/src/models/user.rs b/src/models/user.rs index e5e37ed..7c23e81 100644 --- a/src/models/user.rs +++ b/src/models/user.rs @@ -3,7 +3,7 @@ use mysql::{FromRowError, Row}; #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct User { - pub id: i32, + pub id: Option, pub name: String, pub age: i32, pub email: String, @@ -15,7 +15,7 @@ impl FromRow for User { let (id, name, age, email, password) = mysql::from_row::<(i32, String, i32, String, String)>(row); Ok(User { - id, + id: Some(id), name, age, email, diff --git a/src/models/user_input.rs b/src/models/user_input.rs new file mode 100644 index 0000000..68857cf --- /dev/null +++ b/src/models/user_input.rs @@ -0,0 +1,7 @@ +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct UserInput { + pub name: Option, + pub age: Option, + pub email: Option, + pub password: Option, +} diff --git a/src/repositories/user_repository.rs b/src/repositories/user_repository.rs index 3ded52e..f9c5060 100644 --- a/src/repositories/user_repository.rs +++ b/src/repositories/user_repository.rs @@ -1,25 +1,24 @@ use crate::models::user::User; use mysql::params; use mysql::prelude::Queryable; -use r2d2::Pool; -use r2d2_mysql::MySqlConnectionManager; pub struct UserRepository<'a> { - pub pool: &'a mut Pool, + pub pool: &'a mut r2d2::Pool, } impl<'a> UserRepository<'a> { - pub fn new(pool: &'a mut Pool) -> UserRepository { + pub fn new(pool: &'a mut r2d2::Pool) -> UserRepository { UserRepository { pool } } /** * 新建用户 */ - pub fn create_user(&mut self, user: &User) -> Result<(), mysql::Error> { + pub fn create_user(&mut self, user: &mut User) -> Result<(), mysql::Error> { let mut conn = self.pool.get().unwrap(); + let sql = r"INSERT INTO users (id, name, age, email, password) VALUES (:id, :name, :age, :email, :password)"; conn.exec_drop( - r"INSERT INTO users (id, name, age, email, password) VALUES (:id, :name, :age, :email, :password)", + sql, params! { "id" => &user.id, "name" => &user.name, @@ -30,91 +29,90 @@ impl<'a> UserRepository<'a> { ) } - /** - * 删除用户 - */ - pub fn delete_user(&mut self, user: &User) -> Result<(), mysql::Error> { - let mut conn = self.pool.get().unwrap(); - conn.exec_drop( - r"DELETE FROM users WHERE id = :id", - params! { - "id" => &user.id, - }, - ) - } + // /** + // * 删除用户 + // */ + // pub fn delete_user(&mut self, user: &User) -> Result<(), mysql::Error> { + // let mut conn = self.pool.get().unwrap(); + // conn.exec_drop( + // r"DELETE FROM users WHERE id = :id", + // params! { + // "id" => &user.id, + // }, + // ) + // } - /** - * 更新用户 - */ - pub fn update_user(&mut self, user: &User) -> Result<(), mysql::Error> { - let mut conn = self.pool.get().unwrap(); - conn.exec_drop( - r"UPDATE users SET name = :name, age = :age, email = :email, password = :password WHERE id = :id", - params! { - "id" => &user.id, - "name" => &user.name, - "age" => &user.age, - "email" => &user.email, - "password" => &user.password, - }, - ) - } + // /** + // * 更新用户 + // */ + // pub fn update_user(&mut self, user: &User) -> Result<(), mysql::Error> { + // let mut conn = self.pool.get().unwrap(); + // conn.exec_drop( + // r"UPDATE users SET name = :name, age = :age, email = :email, password = :password WHERE id = :id", + // params! { + // "id" => &user.id, + // "name" => &user.name, + // "age" => &user.age, + // "email" => &user.email, + // "password" => &user.password, + // }, + // ) + // } - /** - * 查询所有用户 - */ + // /** + // * 查询所有用户 + // */ + // pub fn query_all_user(&mut self) -> Result, mysql::Error> { + // let mut conn = self.pool.get().unwrap(); + // conn.query_map( + // "SELECT id, name, age, email, password FROM users", + // |(id, name, age, email, password)| User { + // id, + // name, + // age, + // email, + // password, + // }, + // ) + // } - pub fn query_all_user(&mut self) -> Result, mysql::Error> { - let mut conn = self.pool.get().unwrap(); - conn.query_map( - "SELECT id, name, age, email, password FROM users", - |(id, name, age, email, password)| User { - id, - name, - age, - email, - password, - }, - ) - } + // /** + // * 根据ID查询用户 + // */ + // pub fn query_user_by_id(&mut self, id: i32) -> Result, mysql::Error> { + // let mut conn = self.pool.get().unwrap(); + // let result: Option = conn.exec_first( + // "SELECT id, name, age, email, password FROM users WHERE id = :id", + // params! { + // "id" => id, + // }, + // )?; + // Ok(result) + // } - /** - * 根据ID查询用户 - */ - pub fn query_user_by_id(&mut self, id: i32) -> Result, mysql::Error> { - let mut conn = self.pool.get().unwrap(); - let result: Option = conn.exec_first( - "SELECT id, name, age, email, password FROM users WHERE id = :id", - params! { - "id" => id, - }, - )?; - Ok(result) - } + // /** + // * 根据用户名查询用户 + // */ + // pub fn query_user_by_name(&mut self, name: &str) -> Result, mysql::Error> { + // let mut conn = self.pool.get().unwrap(); + // conn.exec_first( + // "SELECT id, name, age, email, password FROM users WHERE name = :name", + // params! { + // "name" => name, + // }, + // ) + // } - /** - * 根据用户名查询用户 - */ - pub fn query_user_by_name(&mut self, name: &str) -> Result, mysql::Error> { - let mut conn = self.pool.get().unwrap(); - conn.exec_first( - "SELECT id, name, age, email, password FROM users WHERE name = :name", - params! { - "name" => name, - }, - ) - } - - /** - * 根据邮箱查询用户 - */ - pub fn query_user_by_email(&mut self, email: &str) -> Result, mysql::Error> { - let mut conn = self.pool.get().unwrap(); - conn.exec_first( - "SELECT id, name, age, email, password FROM users WHERE email = :email", - params! { - "email" => email, - }, - ) - } + // /** + // * 根据邮箱查询用户 + // */ + // pub fn query_user_by_email(&mut self, email: &str) -> Result, mysql::Error> { + // let mut conn = self.pool.get().unwrap(); + // conn.exec_first( + // "SELECT id, name, age, email, password FROM users WHERE email = :email", + // params! { + // "email" => email, + // }, + // ) + // } } diff --git a/src/routes/user_routes.rs b/src/routes/user_routes.rs index f73a315..2f1b05d 100644 --- a/src/routes/user_routes.rs +++ b/src/routes/user_routes.rs @@ -1,96 +1,18 @@ -use crate::models::user::User; +use crate::models::user_input::UserInput; +use crate::repositories::user_repository; use crate::services::user_service; use crate::utils::pool; -use actix_web::{get, post, web, HttpResponse, Responder}; -use serde::Deserialize; +use actix_web::{post, web, HttpResponse, Responder}; pub(crate) fn register(config: &mut web::ServiceConfig) { config.service(register_user); - config.service(query_all_user); - config.service(query_user_by_id); - config.service(query_user_by_email); - config.service(query_user_by_name); - config.service(update_user); - config.service(delete_user); -} - -#[derive(Deserialize)] -struct RegisterUser { - name: String, - age: i32, - email: String, - password: String, } #[post("/user/register")] -async fn register_user(user: web::Json) -> impl Responder { - let pool = pool::get_database_pool().unwrap(); - let mut conn = pool.get().unwrap(); - let mut new_user = User { - id: 0, - name: user.name.clone(), - age: user.age, - email: user.email.clone(), - password: user.password.clone(), - }; - user_service::create_user(&mut conn, &mut new_user).unwrap(); +async fn register_user(mut user: web::Json) -> impl Responder { + let mut pool = pool::get_database_pool().unwrap(); + let mut user_repository = user_repository::UserRepository::new(&mut pool); + let mut user_service = user_service::UserService::new(&mut user_repository); + user_service.create_user(&mut user).unwrap(); HttpResponse::Ok().json("SUCCESS") } - -#[get("/user/query_all_user")] -async fn query_all_user() -> impl Responder { - let pool = pool::get_database_pool().unwrap(); - let mut conn = pool.get().unwrap(); - let users = user_service::query_all_user(&mut conn).unwrap(); - HttpResponse::Ok().json(users) -} - -#[get("/user/{id}")] -async fn query_user_by_id(path: web::Path) -> impl Responder { - let id = path.into_inner(); - let pool = pool::get_database_pool().unwrap(); - let mut conn = pool.get().unwrap(); - - match user_service::query_user_by_id(&mut conn, id) { - Ok(user) => HttpResponse::Ok().json(user), - Err(_) => HttpResponse::NotFound().json("User not found"), - } -} - -#[get("/user/{email}")] -async fn query_user_by_email(path: web::Path) -> impl Responder { - let pool = pool::get_database_pool().unwrap(); - let mut conn = pool.get().unwrap(); - let email = path.into_inner(); - match user_service::query_user_by_email(&mut conn, email.as_str()) { - Ok(user) => HttpResponse::Ok().json(user), - Err(_) => HttpResponse::NotFound().json("User not found"), - } -} - -#[get("/user/{name}")] -async fn query_user_by_name(path: web::Path) -> impl Responder { - let pool = pool::get_database_pool().unwrap(); - let mut conn = pool.get().unwrap(); - let name = path.into_inner(); - match user_service::query_user_by_name(&mut conn, name.as_str()) { - Ok(user) => HttpResponse::Ok().json(user), - Err(_) => HttpResponse::NotFound().json("User not found"), - } -} - -#[post("/user/update")] -async fn update_user(user: web::Json) -> impl Responder { - let pool = pool::get_database_pool().unwrap(); - let mut conn = pool.get().unwrap(); - user_service::update_user(&mut conn, &user).unwrap(); - HttpResponse::Ok().json("User updated successfully") -} - -#[post("/user/delete")] -async fn delete_user(user: web::Json) -> impl Responder { - let pool = pool::get_database_pool().unwrap(); - let mut conn = pool.get().unwrap(); - user_service::delete_user(&mut conn, &user).unwrap(); - HttpResponse::Ok().json("User deleted successfully") -} diff --git a/src/services/user_service.rs b/src/services/user_service.rs index 508d671..2e1555a 100644 --- a/src/services/user_service.rs +++ b/src/services/user_service.rs @@ -1,81 +1,31 @@ -use crate::models::user::User; -use crate::repositories::user_repository; +use crate::{ + models::{user::User, user_input::UserInput}, + repositories::user_repository::UserRepository, +}; use bcrypt::{hash, DEFAULT_COST}; -use mysql; -use r2d2::PooledConnection; -use r2d2_mysql::{MySqlConnectionManager, mysql::PooledConn}; +use mysql::*; -/** - * 新建用户 - */ -pub fn create_user( - conn: &mut PooledConn, - user: &mut User, -) -> Result<(), mysql::Error> { - let mut new_user = User { - password: hash(&user.password, DEFAULT_COST).unwrap(), - ..user.clone() - }; - - user_repository::create_user(conn, &mut new_user) +pub struct UserService<'a> { + repository: &'a mut UserRepository<'a>, } -/** - * 查询所有用户 - */ -pub fn query_all_user( - conn: &mut PooledConnection, -) -> Result, mysql::Error> { - user_repository::query_all_user(conn) -} - -pub fn query_user_by_id( - conn: &mut PooledConnection, - id: i32, -) -> Result, mysql::Error> { - user_repository::query_user_by_id(conn, id) -} - -pub fn query_user_by_email( - conn: &mut PooledConnection, - email: &str, -) -> Result, mysql::Error> { - user_repository::query_user_by_email(conn, email) -} - -pub fn query_user_by_name( - conn: &mut PooledConnection, - name: &str, -) -> Result, mysql::Error> { - user_repository::query_user_by_name(conn, name) -} - -pub fn update_user( - conn: &mut PooledConnection, - user: &User, -) -> Result<(), mysql::Error> { - if user_repository::query_user_by_id(conn, user.id)?.is_none() { - return Err(mysql::Error::MySqlError(mysql::MySqlError { - code: 1062, - message: "User not found".to_string(), - state: "".to_string(), - })); +impl<'a> UserService<'a> { + pub fn new(repository: &'a mut UserRepository<'a>) -> Self { + UserService { repository } } - user_repository::update_user(conn, user) -} + /** + * 新建用户 + */ + pub fn create_user(&mut self, user: &UserInput) -> Result<(), mysql::Error> { + let mut new_user = User { + id: Some(0), + name: user.name.as_ref().unwrap().to_string(), + age: *user.age.as_ref().unwrap(), + email: user.email.as_ref().unwrap().to_string(), + password: hash(user.password.as_ref().unwrap(), DEFAULT_COST).unwrap(), + }; -pub fn delete_user( - conn: &mut PooledConnection, - user: &User, -) -> Result<(), mysql::Error> { - if user_repository::query_user_by_id(conn, user.id)?.is_none() { - return Err(mysql::Error::MySqlError(mysql::MySqlError { - code: 1062, - message: "User not found".to_string(), - state: "".to_string(), - })); + self.repository.create_user(&mut &mut new_user) } - - user_repository::delete_user(conn, user) }