✨ 新功能: - 实现 DatabaseUserStore 结构体,支持 SQLite 数据库操作 - 创建 UserStore trait 抽象层,支持多种存储后端 - 添加数据库连接和表初始化功能 - 支持通过环境变量配置数据库 URL 🔧 技术改进: - 使用 SQLx 进行异步数据库操作 - 实现 trait-based 存储架构,便于扩展 - 添加完整的 CRUD 数据库操作 - 支持数据库错误处理和类型转换 🧪 测试验证: - 所有 API 端点正常工作 - 数据持久化到 SQLite 文件 - 用户创建、查询、登录功能完整 - 重复用户名检查正常工作 📁 文件变更: - 新增: src/storage/database.rs - SQLite 存储实现 - 新增: src/storage/traits.rs - 存储抽象 trait - 更新: src/storage/mod.rs - 导出新模块 - 更新: src/routes/mod.rs - 支持 trait 对象 - 更新: src/handlers/user.rs - 使用 trait 抽象 - 更新: src/main.rs - 数据库初始化逻辑 - 更新: Cargo.toml - 添加 SQLx 依赖 - 新增: .env - 数据库配置文件 🎯 学习目标达成: - 掌握 Rust 数据库集成 - 理解 trait 抽象设计模式 - 学习异步数据库操作 - 实践配置管理
48 lines
1.4 KiB
Rust
48 lines
1.4 KiB
Rust
//! Rust User API 服务器主程序
|
|
|
|
use std::net::SocketAddr;
|
|
use std::sync::Arc;
|
|
use tracing_subscriber;
|
|
use rust_user_api::{
|
|
config::Config,
|
|
routes::create_routes,
|
|
storage::{memory::MemoryUserStore, database::DatabaseUserStore, UserStore},
|
|
};
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
// 初始化日志
|
|
tracing_subscriber::fmt::init();
|
|
|
|
// 加载配置
|
|
let config = Config::from_env();
|
|
|
|
// 根据配置创建存储实例
|
|
let store: Arc<dyn UserStore> = if let Some(database_url) = &config.database_url {
|
|
println!("🗄️ 使用 SQLite 数据库存储: {}", database_url);
|
|
|
|
// 创建数据库存储
|
|
let db_store = DatabaseUserStore::from_url(database_url)
|
|
.await
|
|
.expect("无法连接到数据库");
|
|
|
|
Arc::new(db_store)
|
|
} else {
|
|
println!("💾 使用内存存储");
|
|
Arc::new(MemoryUserStore::new())
|
|
};
|
|
|
|
// 创建路由
|
|
let app = create_routes(store);
|
|
|
|
// 启动服务器
|
|
let addr: SocketAddr = config.server_address().parse()
|
|
.expect("无效的服务器地址");
|
|
|
|
println!("🚀 服务器启动在 http://{}", addr);
|
|
println!("📚 API 文档: http://{}/", addr);
|
|
println!("❤️ 健康检查: http://{}/health", addr);
|
|
|
|
let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
|
|
axum::serve(listener, app).await.unwrap();
|
|
} |