重构用户模型,删除不再使用的用户输入模型,添加 dotenv 依赖以支持环境变量配置,更新用户服务以使用新的用户结构,优化数据库连接字符串构建

This commit is contained in:
rsgl 2024-11-24 23:07:19 +08:00
parent ea98d5625a
commit e28e759364
11 changed files with 115 additions and 75 deletions

6
.env Normal file
View File

@ -0,0 +1,6 @@
RUST_LOG=info
DB_MYSQL_USER=rsgl
DB_MYSQL_PASSWORD=0andrx
DB_MYSQL_URL=122.152.201.90
DB_MYSQL_PORT=9912
DB_MYSQL_NAME=test_server

109
Cargo.lock generated
View File

@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb"
dependencies = [
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -182,7 +182,7 @@ dependencies = [
"actix-router",
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -345,7 +345,7 @@ dependencies = [
"regex",
"rustc-hash",
"shlex",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -405,7 +405,7 @@ dependencies = [
"proc-macro-crate",
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -480,9 +480,9 @@ checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da"
[[package]]
name = "bytestring"
version = "1.3.1"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72"
checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f"
dependencies = [
"bytes",
]
@ -584,9 +584,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "cpufeatures"
version = "0.2.15"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6"
checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3"
dependencies = [
"libc",
]
@ -687,7 +687,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -698,7 +698,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
dependencies = [
"darling_core",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -707,6 +707,7 @@ version = "0.1.0"
dependencies = [
"actix-web",
"bcrypt",
"dotenv",
"env_logger",
"log",
"mysql",
@ -737,7 +738,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustc_version",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -748,7 +749,7 @@ checksum = "65f152f4b8559c4da5d574bafc7af85454d706b4c5fe8b530d508cacbb6807ea"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -769,9 +770,15 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
name = "dotenv"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
[[package]]
name = "either"
version = "1.13.0"
@ -898,7 +905,7 @@ checksum = "e99b8b3c28ae0e84b604c75f721c21dc77afb3706076af5e8216d15fd1deaae3"
dependencies = [
"frunk_proc_macro_helpers",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -910,7 +917,7 @@ dependencies = [
"frunk_core",
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -922,7 +929,7 @@ dependencies = [
"frunk_core",
"frunk_proc_macro_helpers",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -1198,7 +1205,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -1273,9 +1280,9 @@ dependencies = [
[[package]]
name = "itoa"
version = "1.0.11"
version = "1.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
checksum = "540654e97a3f4470a492cd30ff187bc95d89557a903a2bbf112e2fae98104ef2"
[[package]]
name = "jobserver"
@ -1339,9 +1346,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
[[package]]
name = "litemap"
version = "0.7.3"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704"
checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
[[package]]
name = "local-channel"
@ -1463,7 +1470,7 @@ dependencies = [
"proc-macro-error2",
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
"termcolor",
"thiserror",
]
@ -1615,7 +1622,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -1742,14 +1749,14 @@ dependencies = [
"proc-macro-error-attr2",
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
name = "proc-macro2"
version = "1.0.89"
version = "1.0.92"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e"
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
dependencies = [
"unicode-ident",
]
@ -1961,9 +1968,9 @@ dependencies = [
[[package]]
name = "rustix"
version = "0.38.40"
version = "0.38.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0"
checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6"
dependencies = [
"bitflags",
"errno",
@ -1986,9 +1993,9 @@ checksum = "ece8e78b2f38ec51c51f5d475df0a7187ba5111b2a28bdc761ee05b075d40a71"
[[package]]
name = "schannel"
version = "0.1.26"
version = "0.1.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1"
checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
dependencies = [
"windows-sys 0.59.0",
]
@ -2060,7 +2067,7 @@ checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -2202,9 +2209,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.87"
version = "2.0.89"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d"
checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e"
dependencies = [
"proc-macro2",
"quote",
@ -2219,7 +2226,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -2267,7 +2274,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
@ -2412,15 +2419,15 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
name = "unicode-ident"
version = "1.0.13"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
[[package]]
name = "url"
version = "2.5.3"
version = "2.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada"
checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
dependencies = [
"form_urlencoded",
"idna",
@ -2611,9 +2618,9 @@ dependencies = [
[[package]]
name = "yoke"
version = "0.7.4"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5"
checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
dependencies = [
"serde",
"stable_deref_trait",
@ -2623,13 +2630,13 @@ dependencies = [
[[package]]
name = "yoke-derive"
version = "0.7.4"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95"
checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
"synstructure",
]
@ -2651,27 +2658,27 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]
name = "zerofrom"
version = "0.1.4"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55"
checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e"
dependencies = [
"zerofrom-derive",
]
[[package]]
name = "zerofrom-derive"
version = "0.1.4"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5"
checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
"synstructure",
]
@ -2700,7 +2707,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.87",
"syn 2.0.89",
]
[[package]]

View File

@ -15,3 +15,4 @@ bcrypt = "0.15.1"
thiserror = "1.0"
log = "0.4"
env_logger = "0.9"
dotenv = "0.15"

View File

@ -20,4 +20,12 @@ src/
|-- models/ # 模型层
|-- mod.rs
|-- user.rs
```
```
cargo build
cargo run
# Windows
export RUST_LOG=info
```

View File

@ -1,24 +1,34 @@
use actix_web::{web, App, HttpServer};
use dotenv::dotenv;
use log::{error, info};
use r2d2_mysql::MySqlConnectionManager;
use std::env;
use std::io;
mod models;
mod repositories;
mod routes;
mod services;
mod utils;
use crate::routes::user_routes;
#[actix_web::main]
async fn main() -> io::Result<()> {
env_logger::init();
dotenv().ok();
info!("Starting server!!!!!!!!");
info!("rust demo -_- 正在启动中...");
let db_url = env::var("DB_MYSQL_URL").unwrap();
let db_port = env::var("DB_MYSQL_PORT").unwrap();
let db_user = env::var("DB_MYSQL_USER").unwrap();
let db_password = env::var("DB_MYSQL_PASSWORD").unwrap();
let db_name = env::var("DB_MYSQL_NAME").unwrap();
let url = "mysql://root:0andrx@122.152.201.90:9912/test_server";
let opts = match r2d2_mysql::mysql::Opts::from_url(url) {
let url = format!(
"mysql://{}:{}@{}:{}/{}",
db_user, db_password, db_url, db_port, db_name
);
let opts = match r2d2_mysql::mysql::Opts::from_url(&url) {
Ok(opts) => opts,
Err(e) => {
eprintln!("Failed to parse MySQL connection URL: {}", e);

View File

@ -1,2 +1 @@
pub mod user;
pub mod user_input;

View File

@ -1,6 +0,0 @@
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct UserInput {
pub account: Option<String>,
pub name: Option<String>,
pub password: Option<String>,
}

View File

@ -1,6 +1,6 @@
use crate::repositories::user_repository::UserRepository;
use crate::services::user_service;
use crate::{models::user_input::UserInput, services::user_service::UserServiceError};
use crate::{models::user::User, services::user_service::UserServiceError};
use actix_web::{post, web, HttpResponse, Responder};
use r2d2_mysql::MySqlConnectionManager;
use serde::Serialize;
@ -16,14 +16,33 @@ pub(crate) fn register(config: &mut web::ServiceConfig) {
config.service(register_user);
}
#[derive(serde::Deserialize)]
struct UserFrom {
account: String,
name: String,
password: String,
}
#[post("/user/register")]
async fn register_user(
user: web::Json<UserInput>,
user_from: web::Form<UserFrom>,
pool: web::Data<r2d2::Pool<MySqlConnectionManager>>,
) -> impl Responder {
let user_repository = UserRepository::new(pool.get_ref().clone());
let user_service = user_service::UserService::new(user_repository);
match user_service.create_user(&user) {
let user = User {
id: None,
account: Some(user_from.account.clone()),
name: Some(user_from.name.clone()),
birth: None,
email: None,
password: Some(user_from.password.clone()),
phone: None,
status: None,
created_time: None,
updated_time: None,
};
match user_service.insert_user(&user) {
Ok(_) => HttpResponse::Ok().json(ApiResponse {
status: "success".to_string(),
message: Some("User created successfully".to_string()),

View File

@ -1,5 +1,5 @@
use crate::{
models::user_input::UserInput,
models::user::User,
repositories::user_repository::{UserRepository, UserRepositoryError},
};
use bcrypt::{hash, DEFAULT_COST};
@ -8,17 +8,14 @@ use thiserror::Error;
#[derive(Error, Debug)]
pub enum UserServiceError {
#[error("mysql error: {0}")]
#[error("数据库异常: {0}")]
MySqlError(#[from] UserRepositoryError),
#[error("Missing field: {0}")]
#[error("缺少字段: {0}")]
MissingField(&'static str),
#[error("User already exists")]
#[error("用户已存在")]
UserAlreadyExists,
#[error("Password hashing failed: {0}")]
HashError(#[from] bcrypt::BcryptError),
}
pub struct UserService {
@ -31,9 +28,9 @@ impl UserService {
}
/**
*
*
*/
pub fn create_user(&self, user: &UserInput) -> Result<(), UserServiceError> {
pub fn insert_user(&self, user: &User) -> Result<(), UserServiceError> {
let account = user
.account
.as_ref()

View File

@ -1 +0,0 @@
pub mod pool;

View File