// NAC资产一键上链系统 - 主程序 use actix_web::{web, App, HttpServer, middleware::Logger}; use std::env; mod database; mod error; mod response; mod models; mod services; mod handlers; mod middleware; use database::DbPool; use services::Orchestrator; use nac_sdk::adapters::{NACAdapter, config::NACConfig}; #[actix_web::main] async fn main() -> std::io::Result<()> { // 初始化日志 env_logger::init_from_env(env_logger::Env::new().default_filter_or("info")); log::info!("========== NAC资产一键上链系统启动 =========="); // 加载环境变量 dotenv::dotenv().ok(); // 数据库连接 let database_url = env::var("DATABASE_URL") .unwrap_or_else(|_| "sqlite://nac_onboarding.db".to_string()); log::info!("连接数据库: {}", database_url); let pool = DbPool::connect(&database_url).await .expect("Failed to connect to database"); // 初始化数据库表 log::info!("初始化数据库表..."); database::init_db(&pool).await .expect("Failed to initialize database"); // 创建NAC SDK适配器 log::info!("初始化NAC SDK适配器..."); let nac_config = NACConfig::default(); let adapter = NACAdapter::new(&nac_config).await .expect("Failed to create NAC adapter"); // 创建编排引擎 log::info!("初始化编排引擎..."); let orchestrator = Orchestrator::new(pool.clone(), adapter); // 服务器配置 let host = env::var("HOST").unwrap_or_else(|_| "0.0.0.0".to_string()); let port = env::var("PORT").unwrap_or_else(|_| "8080".to_string()); let bind_address = format!("{}:{}", host, port); log::info!("========== 服务器启动成功 =========="); log::info!("监听地址: {}", bind_address); log::info!("API文档: http://{}/api/docs", bind_address); // 启动HTTP服务器 HttpServer::new(move || { App::new() // 中间件 .wrap(Logger::default()) .wrap(middleware::create_cors()) // 共享状态 .app_data(web::Data::new(pool.clone())) .app_data(web::Data::new(orchestrator.clone())) // 静态文件 .service(actix_files::Files::new("/", "./static").index_file("index.html")) // API路由 .service( web::scope("/api") // 认证API(无需认证) .service( web::scope("/auth") .route("/register", web::post().to(handlers::register)) .route("/login", web::post().to(handlers::login)) ) // 资产API(需要认证) .service( web::scope("/assets") .wrap(middleware::AuthMiddleware) .route("", web::post().to(handlers::create_asset)) .route("", web::get().to(handlers::list_assets)) .route("/{asset_id}", web::get().to(handlers::get_asset)) .route("/{asset_id}/onboard", web::post().to(handlers::submit_onboarding)) .route("/{asset_id}/progress", web::get().to(handlers::query_progress)) .route("/{asset_id}/retry", web::post().to(handlers::retry_onboarding)) ) // 管理API(需要管理员权限) .service( web::scope("/admin") .wrap(middleware::AuthMiddleware) .route("/stats", web::get().to(handlers::get_stats)) .route("/users", web::get().to(handlers::list_all_users)) .route("/assets", web::get().to(handlers::list_all_assets)) .route("/records", web::get().to(handlers::list_all_records)) ) // 用户API(需要认证) .service( web::scope("/user") .wrap(middleware::AuthMiddleware) .route("/me", web::get().to(handlers::me)) ) ) }) .bind(&bind_address)? .run() .await }