From 8b7410d0c79ae760558cca75aafe186e757678db Mon Sep 17 00:00:00 2001 From: LingandRX Date: Wed, 6 Nov 2024 21:50:58 +0800 Subject: [PATCH] init user --- Cargo.lock | 6 ++++++ Cargo.toml | 3 +++ README.md | 23 ++++++++++++++++++++ src/main.rs | 33 ++++++++++++----------------- src/models/mod.rs | 1 + src/models/user.rs | 9 ++++++++ src/repositories/mod.rs | 1 + src/repositories/user_repository.rs | 30 ++++++++++++++++++++++++++ src/routes/mod.rs | 2 ++ src/routes/user_routes.rs | 26 +++++++++++++++++++++++ src/services/mod.rs | 1 + src/services/user_service.rs | 11 ++++++++++ src/utils/mod.rs | 1 + src/utils/pool.rs | 9 ++++++++ 14 files changed, 137 insertions(+), 19 deletions(-) create mode 100644 README.md create mode 100644 src/models/mod.rs create mode 100644 src/models/user.rs create mode 100644 src/repositories/mod.rs create mode 100644 src/repositories/user_repository.rs create mode 100644 src/routes/mod.rs create mode 100644 src/routes/user_routes.rs create mode 100644 src/services/mod.rs create mode 100644 src/services/user_service.rs create mode 100644 src/utils/mod.rs create mode 100644 src/utils/pool.rs diff --git a/Cargo.lock b/Cargo.lock index cde34a8..10ce221 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -664,6 +664,9 @@ version = "0.1.0" dependencies = [ "actix-web", "mysql", + "serde", + "serde_derive", + "uuid", ] [[package]] @@ -2333,6 +2336,9 @@ name = "uuid" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +dependencies = [ + "getrandom", +] [[package]] name = "vcpkg" diff --git a/Cargo.toml b/Cargo.toml index 6ff6f16..9e259a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,6 @@ edition = "2021" [dependencies] mysql = "25.0.1" actix-web = "4" +serde = "1.0" +serde_derive = "1.0" +uuid = { version = "1.11.0", features = ["v4"] } diff --git a/README.md b/README.md new file mode 100644 index 0000000..3bac069 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +## Rust分层架构 + +1. 表示层(Presentation Layer):负责处理 HTTP 请求和响应,通常包含路由和控制器。 +2. 业务逻辑层(Business Logic Layer):包含服务和业务逻辑,实现核心应用功能。 +3. 数据访问层(Data Access Layer):与数据库或其他存储系统进行交互。 +4. 模型层(Model Layer):定义应用程序的数据结构。 + +```angular2html +src/ +|-- main.rs +|-- routes/ # 表示层 +| |-- mod.rs +| |-- user_routes.rs +|-- services/ # 业务逻辑层 +| |-- mod.rs +| |-- user_service.rs +|-- repositories/ # 数据访问层 +| |-- mod.rs +| |-- user_repository.rs +|-- models/ # 模型层 + |-- mod.rs + |-- user.rs +``` \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index f023af9..63f4d72 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,21 +1,16 @@ -use mysql::*; -use mysql::prelude::*; -fn main() -> Result<()> { - // 连接mysql - let url = "mysql://root:0andrx@122.152.201.90:9912/test_server"; - let pool = Pool::new(url)?; - let mut conn = pool.get_conn()?; +use actix_web::{App, HttpServer}; +mod models; +mod repositories; +mod services; +mod routes; +mod utils; - // 执行查询 - conn.query_drop( - r"CREATE TABLE IF NOT EXISTS users ( - id INT PRIMARY KEY AUTO_INCREMENT, - name TEXT NOT NULL, - age INT NOT NULL - )" - )?; - - println!("Created users table"); - - Ok(()) +#[actix_web::main] +async fn main() -> std::io::Result<()> { + HttpServer::new(|| { + App::new().service(routes::register_user) + }) + .bind("127.0.0.1:8080")? + .run() + .await } diff --git a/src/models/mod.rs b/src/models/mod.rs new file mode 100644 index 0000000..018ff2e --- /dev/null +++ b/src/models/mod.rs @@ -0,0 +1 @@ +pub mod user; \ No newline at end of file diff --git a/src/models/user.rs b/src/models/user.rs new file mode 100644 index 0000000..3aa0c67 --- /dev/null +++ b/src/models/user.rs @@ -0,0 +1,9 @@ +use mysql::serde; + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct User { + pub id: i32, + pub name: String, + pub age: i32, + pub email: String, +} \ No newline at end of file diff --git a/src/repositories/mod.rs b/src/repositories/mod.rs new file mode 100644 index 0000000..0017864 --- /dev/null +++ b/src/repositories/mod.rs @@ -0,0 +1 @@ +pub mod user_repository; \ No newline at end of file diff --git a/src/repositories/user_repository.rs b/src/repositories/user_repository.rs new file mode 100644 index 0000000..608b7cb --- /dev/null +++ b/src/repositories/user_repository.rs @@ -0,0 +1,30 @@ +use mysql::params; +use mysql::prelude::Queryable; +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)", + params! { + "id" => &user.id, + "name" => &user.name, + "age" => &user.age, + "email" => &user.email, + }, + ) +} + +// /** +// * 查询所有用户 +// */ +// 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 diff --git a/src/routes/mod.rs b/src/routes/mod.rs new file mode 100644 index 0000000..cde4b90 --- /dev/null +++ b/src/routes/mod.rs @@ -0,0 +1,2 @@ +mod user_routes; +pub use user_routes::register_user; \ No newline at end of file diff --git a/src/routes/user_routes.rs b/src/routes/user_routes.rs new file mode 100644 index 0000000..f49b769 --- /dev/null +++ b/src/routes/user_routes.rs @@ -0,0 +1,26 @@ +use serde::Deserialize; +use actix_web::{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, +} + +#[post("/users/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 { + id: 0, + name: user.name.clone(), + age: user.age, + email: user.email.clone(), + }; + let users = user_service::create_user(&mut conn, &new_user).unwrap(); + HttpResponse::Ok().json("User registered successfully") +} \ No newline at end of file diff --git a/src/services/mod.rs b/src/services/mod.rs new file mode 100644 index 0000000..fffae05 --- /dev/null +++ b/src/services/mod.rs @@ -0,0 +1 @@ +pub mod user_service; \ No newline at end of file diff --git a/src/services/user_service.rs b/src/services/user_service.rs new file mode 100644 index 0000000..b82de73 --- /dev/null +++ b/src/services/user_service.rs @@ -0,0 +1,11 @@ +use mysql::PooledConn; +use crate::models::user::User; +use crate::repositories::user_repository; +use mysql; + +/** + * 新建用户 + */ +pub fn create_user(conn: &mut PooledConn, user: &User) -> Result<(), mysql::Error> { + user_repository::create_user(conn, user) +} \ No newline at end of file diff --git a/src/utils/mod.rs b/src/utils/mod.rs new file mode 100644 index 0000000..60f0c7a --- /dev/null +++ b/src/utils/mod.rs @@ -0,0 +1 @@ +pub mod pool; \ No newline at end of file diff --git a/src/utils/pool.rs b/src/utils/pool.rs new file mode 100644 index 0000000..821f2f4 --- /dev/null +++ b/src/utils/pool.rs @@ -0,0 +1,9 @@ +use mysql::*; + +/** + * 获取数据库连接池 + */ +pub fn get_db_pool() -> Pool { + let url = "mysql://root:0andrx@122.152.201.90:9912/test_server"; + Pool::new(url).expect("TODO: panic message") +}