实现用户管理功能,包括用户的增、删、改、查接口
This commit is contained in:
parent
58245e3b0d
commit
7b7f7492b9
@ -2,16 +2,16 @@ use actix_web::{App, HttpServer};
|
|||||||
mod models;
|
mod models;
|
||||||
mod repositories;
|
mod repositories;
|
||||||
mod services;
|
mod services;
|
||||||
mod routes;
|
|
||||||
mod utils;
|
mod utils;
|
||||||
|
mod routes;
|
||||||
|
|
||||||
|
use crate::routes::user_routes;
|
||||||
|
|
||||||
#[actix_web::main]
|
#[actix_web::main]
|
||||||
async fn main() -> std::io::Result<()> {
|
async fn main() -> std::io::Result<()> {
|
||||||
|
|
||||||
HttpServer::new(|| {
|
HttpServer::new(|| {
|
||||||
App::new()
|
App::new()
|
||||||
.service(routes::register_user)
|
.configure(user_routes::register)
|
||||||
.service(routes::get_all_user)
|
|
||||||
})
|
})
|
||||||
.bind("127.0.0.1:8080")?
|
.bind("127.0.0.1:8080")?
|
||||||
.run()
|
.run()
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
use mysql::serde;
|
use mysql::prelude::{FromRow};
|
||||||
|
use mysql::{FromRowError, Row};
|
||||||
|
|
||||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
||||||
pub struct User {
|
pub struct User {
|
||||||
@ -7,4 +8,11 @@ pub struct User {
|
|||||||
pub age: i32,
|
pub age: i32,
|
||||||
pub email: String,
|
pub email: String,
|
||||||
pub password: String,
|
pub password: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromRow for User {
|
||||||
|
fn from_row_opt(row: Row) -> mysql::Result<Self, FromRowError> {
|
||||||
|
let (id, name, age, email, password) = mysql::from_row::<(i32, String, i32, String, String)>(row);
|
||||||
|
Ok(User { id, name, age, email, password })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -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<Vec<User>, mysql::Error> {
|
pub fn query_all_user(conn: &mut mysql::PooledConn) -> Result<Vec<User>, mysql::Error> {
|
||||||
conn.query_map(
|
conn.query_map(
|
||||||
"SELECT id, name, age, email, password FROM users",
|
"SELECT id, name, age, email, password FROM users",
|
||||||
|(id, name, age, email, password)| {
|
|(id, name, age, email, password)| {
|
||||||
User { 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<Option<User>, mysql::Error> {
|
||||||
|
let result: Option<User> = 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<Option<User>, 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<Option<User>, mysql::Error> {
|
||||||
|
conn.exec_first(
|
||||||
|
"SELECT id, name, age, email, password FROM users WHERE email = :email",
|
||||||
|
params! {
|
||||||
|
"email" => email,
|
||||||
|
},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
@ -1,3 +1 @@
|
|||||||
mod user_routes;
|
pub mod user_routes;
|
||||||
pub use user_routes::register_user;
|
|
||||||
pub use user_routes::get_all_user;
|
|
||||||
@ -1,20 +1,20 @@
|
|||||||
use serde::Deserialize;
|
|
||||||
use actix_web::{get, post, web, HttpResponse, Responder};
|
use actix_web::{get, post, web, HttpResponse, Responder};
|
||||||
use crate::models::user::User;
|
use crate::models::user::User;
|
||||||
use crate::services::user_service;
|
use crate::services::user_service;
|
||||||
use crate::utils::pool;
|
use crate::utils::pool;
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
pub(crate) fn register(config: &mut web::ServiceConfig) {
|
||||||
struct RegisterUser {
|
config.service(register_user);
|
||||||
name: String,
|
config.service(query_all_user);
|
||||||
age: i32,
|
config.service(query_user_by_id);
|
||||||
email: String,
|
config.service(query_user_by_email);
|
||||||
password: String,
|
config.service(query_user_by_name);
|
||||||
|
config.service(update_user);
|
||||||
|
config.service(delete_user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[post("/user/register")]
|
#[post("/user/register")]
|
||||||
async fn register_user(user: web::Json<RegisterUser>) -> impl Responder {
|
async fn register_user(user: web::Json<User>) -> impl Responder {
|
||||||
let pool = pool::get_db_pool();
|
let pool = pool::get_db_pool();
|
||||||
let mut conn = pool.get_conn().unwrap();
|
let mut conn = pool.get_conn().unwrap();
|
||||||
let mut new_user = User {
|
let mut new_user = User {
|
||||||
@ -28,10 +28,60 @@ async fn register_user(user: web::Json<RegisterUser>) -> impl Responder {
|
|||||||
HttpResponse::Ok().json("User registered successfully")
|
HttpResponse::Ok().json("User registered successfully")
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/user/all")]
|
#[get("/user/query_all_user")]
|
||||||
async fn get_all_user() -> impl Responder {
|
async fn query_all_user() -> impl Responder {
|
||||||
let pool = pool::get_db_pool();
|
let pool = pool::get_db_pool();
|
||||||
let mut conn = pool.get_conn().unwrap();
|
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)
|
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_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<String>) -> 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<String>) -> 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<User>) -> 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<User>) -> 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")
|
||||||
}
|
}
|
||||||
@ -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<Vec<User>, mysql::Error> {
|
pub fn query_all_user(conn: &mut PooledConn) -> Result<Vec<User>, mysql::Error> {
|
||||||
user_repository::query_all_users(conn)
|
user_repository::query_all_user(conn)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn query_user_by_id(conn: &mut PooledConn, id: i32) -> Result<Option<User>, mysql::Error> {
|
||||||
|
user_repository::query_user_by_id(conn, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn query_user_by_email(conn: &mut PooledConn, email: &str) -> Result<Option<User>, mysql::Error> {
|
||||||
|
user_repository::query_user_by_email(conn, email)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn query_user_by_name(conn: &mut PooledConn, name: &str) -> Result<Option<User>, 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)
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user