添加 UserInput 模型,更新用户服务以支持新用户注册功能,重构相关路由
This commit is contained in:
parent
5c8ac42e8a
commit
7f89249f83
@ -1 +1,2 @@
|
|||||||
pub mod user;
|
pub mod user;
|
||||||
|
pub mod user_input;
|
||||||
|
|||||||
@ -3,7 +3,7 @@ use mysql::{FromRowError, Row};
|
|||||||
|
|
||||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
||||||
pub struct User {
|
pub struct User {
|
||||||
pub id: i32,
|
pub id: Option<i32>,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub age: i32,
|
pub age: i32,
|
||||||
pub email: String,
|
pub email: String,
|
||||||
@ -15,7 +15,7 @@ impl FromRow for User {
|
|||||||
let (id, name, age, email, password) =
|
let (id, name, age, email, password) =
|
||||||
mysql::from_row::<(i32, String, i32, String, String)>(row);
|
mysql::from_row::<(i32, String, i32, String, String)>(row);
|
||||||
Ok(User {
|
Ok(User {
|
||||||
id,
|
id: Some(id),
|
||||||
name,
|
name,
|
||||||
age,
|
age,
|
||||||
email,
|
email,
|
||||||
|
|||||||
7
src/models/user_input.rs
Normal file
7
src/models/user_input.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
||||||
|
pub struct UserInput {
|
||||||
|
pub name: Option<String>,
|
||||||
|
pub age: Option<i32>,
|
||||||
|
pub email: Option<String>,
|
||||||
|
pub password: Option<String>,
|
||||||
|
}
|
||||||
@ -1,25 +1,24 @@
|
|||||||
use crate::models::user::User;
|
use crate::models::user::User;
|
||||||
use mysql::params;
|
use mysql::params;
|
||||||
use mysql::prelude::Queryable;
|
use mysql::prelude::Queryable;
|
||||||
use r2d2::Pool;
|
|
||||||
use r2d2_mysql::MySqlConnectionManager;
|
|
||||||
|
|
||||||
pub struct UserRepository<'a> {
|
pub struct UserRepository<'a> {
|
||||||
pub pool: &'a mut Pool<MySqlConnectionManager>,
|
pub pool: &'a mut r2d2::Pool<r2d2_mysql::MySqlConnectionManager>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> UserRepository<'a> {
|
impl<'a> UserRepository<'a> {
|
||||||
pub fn new(pool: &'a mut Pool<MySqlConnectionManager>) -> UserRepository {
|
pub fn new(pool: &'a mut r2d2::Pool<r2d2_mysql::MySqlConnectionManager>) -> UserRepository {
|
||||||
UserRepository { pool }
|
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 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(
|
conn.exec_drop(
|
||||||
r"INSERT INTO users (id, name, age, email, password) VALUES (:id, :name, :age, :email, :password)",
|
sql,
|
||||||
params! {
|
params! {
|
||||||
"id" => &user.id,
|
"id" => &user.id,
|
||||||
"name" => &user.name,
|
"name" => &user.name,
|
||||||
@ -30,91 +29,90 @@ impl<'a> UserRepository<'a> {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* 删除用户
|
// * 删除用户
|
||||||
*/
|
// */
|
||||||
pub fn delete_user(&mut self, user: &User) -> Result<(), mysql::Error> {
|
// pub fn delete_user(&mut self, user: &User) -> Result<(), mysql::Error> {
|
||||||
let mut conn = self.pool.get().unwrap();
|
// let mut conn = self.pool.get().unwrap();
|
||||||
conn.exec_drop(
|
// conn.exec_drop(
|
||||||
r"DELETE FROM users WHERE id = :id",
|
// r"DELETE FROM users WHERE id = :id",
|
||||||
params! {
|
// params! {
|
||||||
"id" => &user.id,
|
// "id" => &user.id,
|
||||||
},
|
// },
|
||||||
)
|
// )
|
||||||
}
|
// }
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* 更新用户
|
// * 更新用户
|
||||||
*/
|
// */
|
||||||
pub fn update_user(&mut self, user: &User) -> Result<(), mysql::Error> {
|
// pub fn update_user(&mut self, user: &User) -> Result<(), mysql::Error> {
|
||||||
let mut conn = self.pool.get().unwrap();
|
// let mut conn = self.pool.get().unwrap();
|
||||||
conn.exec_drop(
|
// conn.exec_drop(
|
||||||
r"UPDATE users SET name = :name, age = :age, email = :email, password = :password WHERE id = :id",
|
// r"UPDATE users SET name = :name, age = :age, email = :email, password = :password WHERE id = :id",
|
||||||
params! {
|
// params! {
|
||||||
"id" => &user.id,
|
// "id" => &user.id,
|
||||||
"name" => &user.name,
|
// "name" => &user.name,
|
||||||
"age" => &user.age,
|
// "age" => &user.age,
|
||||||
"email" => &user.email,
|
// "email" => &user.email,
|
||||||
"password" => &user.password,
|
// "password" => &user.password,
|
||||||
},
|
// },
|
||||||
)
|
// )
|
||||||
}
|
// }
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* 查询所有用户
|
// * 查询所有用户
|
||||||
*/
|
// */
|
||||||
|
// pub fn query_all_user(&mut self) -> Result<Vec<User>, 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<Vec<User>, mysql::Error> {
|
// /**
|
||||||
let mut conn = self.pool.get().unwrap();
|
// * 根据ID查询用户
|
||||||
conn.query_map(
|
// */
|
||||||
"SELECT id, name, age, email, password FROM users",
|
// pub fn query_user_by_id(&mut self, id: i32) -> Result<Option<User>, mysql::Error> {
|
||||||
|(id, name, age, email, password)| User {
|
// let mut conn = self.pool.get().unwrap();
|
||||||
id,
|
// let result: Option<User> = conn.exec_first(
|
||||||
name,
|
// "SELECT id, name, age, email, password FROM users WHERE id = :id",
|
||||||
age,
|
// params! {
|
||||||
email,
|
// "id" => id,
|
||||||
password,
|
// },
|
||||||
},
|
// )?;
|
||||||
)
|
// Ok(result)
|
||||||
}
|
// }
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* 根据ID查询用户
|
// * 根据用户名查询用户
|
||||||
*/
|
// */
|
||||||
pub fn query_user_by_id(&mut self, id: i32) -> Result<Option<User>, mysql::Error> {
|
// pub fn query_user_by_name(&mut self, name: &str) -> Result<Option<User>, mysql::Error> {
|
||||||
let mut conn = self.pool.get().unwrap();
|
// let mut conn = self.pool.get().unwrap();
|
||||||
let result: Option<User> = conn.exec_first(
|
// conn.exec_first(
|
||||||
"SELECT id, name, age, email, password FROM users WHERE id = :id",
|
// "SELECT id, name, age, email, password FROM users WHERE name = :name",
|
||||||
params! {
|
// params! {
|
||||||
"id" => id,
|
// "name" => name,
|
||||||
},
|
// },
|
||||||
)?;
|
// )
|
||||||
Ok(result)
|
// }
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* 根据用户名查询用户
|
// * 根据邮箱查询用户
|
||||||
*/
|
// */
|
||||||
pub fn query_user_by_name(&mut self, name: &str) -> Result<Option<User>, mysql::Error> {
|
// pub fn query_user_by_email(&mut self, email: &str) -> Result<Option<User>, mysql::Error> {
|
||||||
let mut conn = self.pool.get().unwrap();
|
// let mut conn = self.pool.get().unwrap();
|
||||||
conn.exec_first(
|
// conn.exec_first(
|
||||||
"SELECT id, name, age, email, password FROM users WHERE name = :name",
|
// "SELECT id, name, age, email, password FROM users WHERE email = :email",
|
||||||
params! {
|
// params! {
|
||||||
"name" => name,
|
// "email" => email,
|
||||||
},
|
// },
|
||||||
)
|
// )
|
||||||
}
|
// }
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据邮箱查询用户
|
|
||||||
*/
|
|
||||||
pub fn query_user_by_email(&mut self, email: &str) -> Result<Option<User>, 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,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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::services::user_service;
|
||||||
use crate::utils::pool;
|
use crate::utils::pool;
|
||||||
use actix_web::{get, post, web, HttpResponse, Responder};
|
use actix_web::{post, web, HttpResponse, Responder};
|
||||||
use serde::Deserialize;
|
|
||||||
|
|
||||||
pub(crate) fn register(config: &mut web::ServiceConfig) {
|
pub(crate) fn register(config: &mut web::ServiceConfig) {
|
||||||
config.service(register_user);
|
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")]
|
#[post("/user/register")]
|
||||||
async fn register_user(user: web::Json<RegisterUser>) -> impl Responder {
|
async fn register_user(mut user: web::Json<UserInput>) -> impl Responder {
|
||||||
let pool = pool::get_database_pool().unwrap();
|
let mut pool = pool::get_database_pool().unwrap();
|
||||||
let mut conn = pool.get().unwrap();
|
let mut user_repository = user_repository::UserRepository::new(&mut pool);
|
||||||
let mut new_user = User {
|
let mut user_service = user_service::UserService::new(&mut user_repository);
|
||||||
id: 0,
|
user_service.create_user(&mut user).unwrap();
|
||||||
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();
|
|
||||||
HttpResponse::Ok().json("SUCCESS")
|
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<i32>) -> 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<String>) -> 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<String>) -> 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<User>) -> 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<User>) -> 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")
|
|
||||||
}
|
|
||||||
|
|||||||
@ -1,81 +1,31 @@
|
|||||||
use crate::models::user::User;
|
use crate::{
|
||||||
use crate::repositories::user_repository;
|
models::{user::User, user_input::UserInput},
|
||||||
|
repositories::user_repository::UserRepository,
|
||||||
|
};
|
||||||
use bcrypt::{hash, DEFAULT_COST};
|
use bcrypt::{hash, DEFAULT_COST};
|
||||||
use mysql;
|
use mysql::*;
|
||||||
use r2d2::PooledConnection;
|
|
||||||
use r2d2_mysql::{MySqlConnectionManager, mysql::PooledConn};
|
|
||||||
|
|
||||||
/**
|
pub struct UserService<'a> {
|
||||||
|
repository: &'a mut UserRepository<'a>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> UserService<'a> {
|
||||||
|
pub fn new(repository: &'a mut UserRepository<'a>) -> Self {
|
||||||
|
UserService { repository }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
* 新建用户
|
* 新建用户
|
||||||
*/
|
*/
|
||||||
pub fn create_user(
|
pub fn create_user(&mut self, user: &UserInput) -> Result<(), mysql::Error> {
|
||||||
conn: &mut PooledConn,
|
|
||||||
user: &mut User,
|
|
||||||
) -> Result<(), mysql::Error> {
|
|
||||||
let mut new_user = User {
|
let mut new_user = User {
|
||||||
password: hash(&user.password, DEFAULT_COST).unwrap(),
|
id: Some(0),
|
||||||
..user.clone()
|
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(),
|
||||||
};
|
};
|
||||||
|
|
||||||
user_repository::create_user(conn, &mut new_user)
|
self.repository.create_user(&mut &mut new_user)
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询所有用户
|
|
||||||
*/
|
|
||||||
pub fn query_all_user(
|
|
||||||
conn: &mut PooledConnection<MySqlConnectionManager>,
|
|
||||||
) -> Result<Vec<User>, mysql::Error> {
|
|
||||||
user_repository::query_all_user(conn)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn query_user_by_id(
|
|
||||||
conn: &mut PooledConnection<MySqlConnectionManager>,
|
|
||||||
id: i32,
|
|
||||||
) -> Result<Option<User>, mysql::Error> {
|
|
||||||
user_repository::query_user_by_id(conn, id)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn query_user_by_email(
|
|
||||||
conn: &mut PooledConnection<MySqlConnectionManager>,
|
|
||||||
email: &str,
|
|
||||||
) -> Result<Option<User>, mysql::Error> {
|
|
||||||
user_repository::query_user_by_email(conn, email)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn query_user_by_name(
|
|
||||||
conn: &mut PooledConnection<MySqlConnectionManager>,
|
|
||||||
name: &str,
|
|
||||||
) -> Result<Option<User>, mysql::Error> {
|
|
||||||
user_repository::query_user_by_name(conn, name)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn update_user(
|
|
||||||
conn: &mut PooledConnection<MySqlConnectionManager>,
|
|
||||||
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 PooledConnection<MySqlConnectionManager>,
|
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user