diff --git a/src/main.rs b/src/main.rs index 6daaaad..2056757 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,16 +2,16 @@ use actix_web::{App, HttpServer}; mod models; mod repositories; mod services; -mod routes; mod utils; +mod routes; + +use crate::routes::user_routes; #[actix_web::main] async fn main() -> std::io::Result<()> { - HttpServer::new(|| { App::new() - .service(routes::register_user) - .service(routes::get_all_user) + .configure(user_routes::register) }) .bind("127.0.0.1:8080")? .run() diff --git a/src/models/user.rs b/src/models/user.rs index b2cb6c5..334058f 100644 --- a/src/models/user.rs +++ b/src/models/user.rs @@ -1,4 +1,5 @@ -use mysql::serde; +use mysql::prelude::{FromRow}; +use mysql::{FromRowError, Row}; #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct User { @@ -7,4 +8,11 @@ pub struct User { pub age: i32, pub email: String, pub password: String, +} + +impl FromRow for User { + fn from_row_opt(row: Row) -> mysql::Result { + let (id, name, age, email, password) = mysql::from_row::<(i32, String, i32, String, String)>(row); + Ok(User { id, name, age, email, password }) + } } \ No newline at end of file diff --git a/src/repositories/user_repository.rs b/src/repositories/user_repository.rs index 7f05667..e216435 100644 --- a/src/repositories/user_repository.rs +++ b/src/repositories/user_repository.rs @@ -18,14 +18,79 @@ pub fn create_user(conn: &mut mysql::PooledConn, user: &User) -> Result<(), mysq ) } +/** + * 删除用户 + */ +pub fn delete_user(conn: &mut mysql::PooledConn, user: &User) -> Result<(), mysql::Error> { + conn.exec_drop( + r"DELETE FROM users WHERE id = :id", + params! { + "id" => &user.id, + }, + ) +} + +/** + * 更新用户 + */ +pub fn update_user(conn: &mut mysql::PooledConn, user: &User) -> Result<(), mysql::Error> { + 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_users(conn: &mut mysql::PooledConn) -> Result, mysql::Error> { +pub fn query_all_user(conn: &mut mysql::PooledConn) -> Result, mysql::Error> { 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(conn: &mut mysql::PooledConn, id: i32) -> Result, mysql::Error> { + 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(conn: &mut mysql::PooledConn, name: &str) -> Result, mysql::Error> { + conn.exec_first( + "SELECT id, name, age, email, password FROM users WHERE name = :name", + params! { + "name" => name, + }, + ) +} + +/** + * 根据邮箱查询用户 + */ +pub fn query_user_by_email(conn: &mut mysql::PooledConn, email: &str) -> Result, mysql::Error> { + conn.exec_first( + "SELECT id, name, age, email, password FROM users WHERE email = :email", + params! { + "email" => email, + }, + ) } \ No newline at end of file diff --git a/src/routes/mod.rs b/src/routes/mod.rs index 4137c65..8cda988 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -1,3 +1 @@ -mod user_routes; -pub use user_routes::register_user; -pub use user_routes::get_all_user; \ No newline at end of file +pub mod user_routes; \ No newline at end of file diff --git a/src/routes/user_routes.rs b/src/routes/user_routes.rs index 4eb6b00..1d3f38b 100644 --- a/src/routes/user_routes.rs +++ b/src/routes/user_routes.rs @@ -1,20 +1,20 @@ -use serde::Deserialize; use actix_web::{get, post, web, HttpResponse, Responder}; use crate::models::user::User; use crate::services::user_service; use crate::utils::pool; -#[derive(Deserialize)] -struct RegisterUser { - name: String, - age: i32, - email: String, - password: String, +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); } - #[post("/user/register")] -async fn register_user(user: web::Json) -> impl Responder { +async fn register_user(user: web::Json) -> impl Responder { let pool = pool::get_db_pool(); let mut conn = pool.get_conn().unwrap(); let mut new_user = User { @@ -28,10 +28,60 @@ async fn register_user(user: web::Json) -> impl Responder { HttpResponse::Ok().json("User registered successfully") } -#[get("/user/all")] -async fn get_all_user() -> impl Responder { +#[get("/user/query_all_user")] +async fn query_all_user() -> impl Responder { let pool = pool::get_db_pool(); let mut conn = pool.get_conn().unwrap(); - let users = user_service::select_all_users(&mut conn).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_db_pool(); + let mut conn = pool.get_conn().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_db_pool(); + let mut conn = pool.get_conn().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_db_pool(); + let mut conn = pool.get_conn().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_db_pool(); + let mut conn = pool.get_conn().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_db_pool(); + let mut conn = pool.get_conn().unwrap(); + user_service::delete_user(&mut conn, &user).unwrap(); + HttpResponse::Ok().json("User deleted successfully") } \ No newline at end of file diff --git a/src/services/user_service.rs b/src/services/user_service.rs index 5184f3c..1514542 100644 --- a/src/services/user_service.rs +++ b/src/services/user_service.rs @@ -15,6 +15,42 @@ pub fn create_user(conn: &mut PooledConn, user: &mut User) -> Result<(), mysql:: /** * 查询所有用户 */ -pub fn select_all_users(conn: &mut PooledConn) -> Result, mysql::Error> { - user_repository::query_all_users(conn) +pub fn query_all_user(conn: &mut PooledConn) -> Result, mysql::Error> { + user_repository::query_all_user(conn) +} + +pub fn query_user_by_id(conn: &mut PooledConn, id: i32) -> Result, mysql::Error> { + user_repository::query_user_by_id(conn, id) +} + +pub fn query_user_by_email(conn: &mut PooledConn, email: &str) -> Result, mysql::Error> { + user_repository::query_user_by_email(conn, email) +} + +pub fn query_user_by_name(conn: &mut PooledConn, name: &str) -> Result, mysql::Error> { + user_repository::query_user_by_name(conn, name) +} + +pub fn update_user(conn: &mut PooledConn, 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(), + })); + } + + user_repository::update_user(conn, user) +} + +pub fn delete_user(conn: &mut PooledConn, 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(), + })); + } + + user_repository::delete_user(conn, user) } \ No newline at end of file