diff --git a/Cargo.lock b/Cargo.lock index 10ce221..bb0c478 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -293,6 +293,19 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bcrypt" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e65938ed058ef47d92cf8b346cc76ef48984572ade631927e9937b5ffc7662c7" +dependencies = [ + "base64 0.22.1", + "blowfish", + "getrandom", + "subtle", + "zeroize", +] + [[package]] name = "bigdecimal" version = "0.4.6" @@ -351,6 +364,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blowfish" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7" +dependencies = [ + "byteorder", + "cipher", +] + [[package]] name = "borsh" version = "1.5.1" @@ -456,9 +479,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.35" +version = "1.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57c4b4da2a9d619dd035f27316d7a426305b75be93d09e92f2b9229c34feaf" +checksum = "baee610e9452a8f6f0a1b6194ec09ff9e2d85dea54432acdae41aa0761c95d70" dependencies = [ "jobserver", "libc", @@ -486,6 +509,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clang-sys" version = "1.8.1" @@ -663,6 +696,7 @@ name = "demo" version = "0.1.0" dependencies = [ "actix-web", + "bcrypt", "mysql", "serde", "serde_derive", @@ -1167,6 +1201,15 @@ dependencies = [ "hashbrown 0.15.1", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "io-enum" version = "1.1.3" @@ -1214,9 +1257,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "libloading" @@ -2069,6 +2112,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "1.0.109" @@ -2220,9 +2269,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -2567,6 +2616,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + [[package]] name = "zerovec" version = "0.10.4" diff --git a/Cargo.toml b/Cargo.toml index 9e259a4..5406498 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,3 +9,4 @@ actix-web = "4" serde = "1.0" serde_derive = "1.0" uuid = { version = "1.11.0", features = ["v4"] } +bcrypt = "0.15.1" diff --git a/src/main.rs b/src/main.rs index 63f4d72..6daaaad 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,8 +7,11 @@ mod utils; #[actix_web::main] async fn main() -> std::io::Result<()> { + HttpServer::new(|| { - App::new().service(routes::register_user) + App::new() + .service(routes::register_user) + .service(routes::get_all_user) }) .bind("127.0.0.1:8080")? .run() diff --git a/src/models/user.rs b/src/models/user.rs index 3aa0c67..b2cb6c5 100644 --- a/src/models/user.rs +++ b/src/models/user.rs @@ -6,4 +6,5 @@ pub struct User { pub name: String, pub age: i32, pub email: String, + pub password: String, } \ No newline at end of file diff --git a/src/repositories/user_repository.rs b/src/repositories/user_repository.rs index 608b7cb..7f05667 100644 --- a/src/repositories/user_repository.rs +++ b/src/repositories/user_repository.rs @@ -7,24 +7,25 @@ use crate::models::user::User; */ pub fn create_user(conn: &mut mysql::PooledConn, user: &User) -> Result<(), mysql::Error> { conn.exec_drop( - r"INSERT INTO users (id, name, age, email) VALUES (:id, :name, :age, :email)", + r"INSERT INTO users (id, name, age, email, password) VALUES (:id, :name, :age, :email, :password)", 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> { -// conn.query_map( -// "SELECT id, name, email FROM users", -// |(id, name, age, email)| { -// User { id, name, age, email } -// }, -// ) -// } \ No newline at end of file +/** + * 查询所有用户 + */ +pub fn query_all_users(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 } + }, + ) +} \ No newline at end of file diff --git a/src/routes/mod.rs b/src/routes/mod.rs index cde4b90..4137c65 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -1,2 +1,3 @@ mod user_routes; -pub use user_routes::register_user; \ No newline at end of file +pub use user_routes::register_user; +pub use user_routes::get_all_user; \ No newline at end of file diff --git a/src/routes/user_routes.rs b/src/routes/user_routes.rs index f49b769..4eb6b00 100644 --- a/src/routes/user_routes.rs +++ b/src/routes/user_routes.rs @@ -1,5 +1,5 @@ use serde::Deserialize; -use actix_web::{post, web, HttpResponse, Responder}; +use actix_web::{get, post, web, HttpResponse, Responder}; use crate::models::user::User; use crate::services::user_service; use crate::utils::pool; @@ -9,18 +9,29 @@ struct RegisterUser { name: String, age: i32, email: String, + password: String, } -#[post("/users/register")] + +#[post("/user/register")] async fn register_user(user: web::Json) -> impl Responder { let pool = pool::get_db_pool(); let mut conn = pool.get_conn().unwrap(); - let new_user = User { + let mut new_user = User { id: 0, name: user.name.clone(), age: user.age, email: user.email.clone(), + password: user.password.clone(), }; - let users = user_service::create_user(&mut conn, &new_user).unwrap(); + user_service::create_user(&mut conn, &mut new_user).unwrap(); HttpResponse::Ok().json("User registered successfully") +} + +#[get("/user/all")] +async fn get_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(); + HttpResponse::Ok().json(users) } \ No newline at end of file diff --git a/src/services/user_service.rs b/src/services/user_service.rs index b82de73..5184f3c 100644 --- a/src/services/user_service.rs +++ b/src/services/user_service.rs @@ -2,10 +2,19 @@ use mysql::PooledConn; use crate::models::user::User; use crate::repositories::user_repository; use mysql; +use bcrypt::{hash, DEFAULT_COST}; /** * 新建用户 */ -pub fn create_user(conn: &mut PooledConn, user: &User) -> Result<(), mysql::Error> { +pub fn create_user(conn: &mut PooledConn, user: &mut User) -> Result<(), mysql::Error> { + user.password = hash(&user.password, DEFAULT_COST).unwrap(); user_repository::create_user(conn, user) +} + +/** + * 查询所有用户 + */ +pub fn select_all_users(conn: &mut PooledConn) -> Result, mysql::Error> { + user_repository::query_all_users(conn) } \ No newline at end of file