// main.rs /** * 主程序入口,提供数据库连接和相关API接口。 * * 接口: * - GET /api/install: 测试数据库连接 * - GET /api/sql: 执行SQL查询并返回结果 */ mod config; // 配置模块 mod database; mod secret; use chrono::Duration; // 数据库模块 use database::relational; // 引入关系型数据库 use once_cell::sync::Lazy; // 用于延迟初始化 use rocket::{get, http::Status, launch, response::status, routes, serde::json::Json}; // 引入Rocket框架相关功能 use std::sync::Arc; // 引入Arc用于线程安全的引用计数 use tokio::sync::Mutex; // 引入Mutex用于异步锁 // 全局数据库连接变量 static DB: Lazy>>> = Lazy::new(|| Arc::new(Mutex::new(None))); /** * 初始化数据库连接 */ async fn init_db(database: config::DbConfig) -> Result<(), Box> { let database = relational::Database::init(database).await?; // 初始化数据库 *DB.lock().await = Some(database); // 保存数据库实例 Ok(()) } /** * 获取数据库的引用 */ async fn get_db() -> Result> { DB.lock() .await .clone() .ok_or_else(|| "Database not initialized".into()) // 返回错误信息 } /** * 测试数据库接口 */ #[get("/sql")] async fn ssql() -> Result>>, status::Custom> { let db = get_db().await.map_err(|e| { status::Custom( Status::InternalServerError, format!("Database error: {}", e), // 数据库错误信息 ) })?; let query_result = db .get_db() .query("SELECT * FROM info".to_string()) .await .map_err(|e| status::Custom(Status::InternalServerError, format!("Query error: {}", e)))?; Ok(Json(query_result)) // 返回查询结果 } /** * 数据库安装接口 */ #[get("/install")] async fn install() -> status::Custom { get_db() .await .map(|_| status::Custom(Status::Ok, "Database connected successfully".into())) // 连接成功 .unwrap_or_else(|e| { status::Custom( Status::InternalServerError, format!("Failed to connect: {}", e), // 连接失败信息 ) }) } /** * 启动Rocket应用 */ #[launch] async fn rocket() -> _ { let config = config::Config::read().expect("Failed to read config"); // 读取配置 init_db(config.db_config) .await .expect("Failed to connect to database"); // 初始化数据库连接 rocket::build().mount("/", routes![install, ssql]) // 挂载API路由 } // fn main(){ // // secret::generate_key().expect("msg"); // // 创建claims // let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs() as i64; // // 创建 Claims // let claims = secret::CustomClaims { // user_id: String::from("lsy"), // device_ua: String::from("lsy"), // }; // let t=String::from("eyJhbGciOiJFZERTQSJ9.eyJleHAiOjE3MzE3NTczMDMsIm5iZiI6MTczMTc1NzI4MywiaWF0IjoxNzMxNzU3MjgzLCJ1c2VyX2lkIjoibHN5IiwiZGV2aWNlX3VhIjoibHN5In0.C8t5XZFSKnnDVmc6WkY-gzGNSAP7lNAjP9yBjhdvIRO7r_QjDnfcm0INIqCt5cyvnRlE2rFJIx_axOfLx2QJAw"); // // 生成JWT // let token = secret::generate_jwt(claims,Duration::seconds(20)).expect("msg"); // println!("{}", token); // // 验证JWT // let a=secret::validate_jwt(&t).expect("msg"); // println!("\n\n{}",a.user_id) // }