// 文件名: src/web/web_server.cc #include "web_server.h" #include "spdlog/spdlog.h" WebServer::WebServer(SystemMonitor::SystemMonitor& monitor, uint16_t port) : m_monitor(monitor), m_port(port) { // Crow默认会输出很多调试信息,我们可以将其日志级别调高, // 以便只显示警告和错误,让我们的终端更干净。 m_app.loglevel(crow::LogLevel::Warning); // 调用函数来设置所有的API路由 setup_routes(); } WebServer::~WebServer() { stop(); } void WebServer::start() { if (m_thread.joinable()) { spdlog::warn("Web server is already running."); return; } // Crow的 run() 方法是一个阻塞操作,它会一直运行直到被停止。 // 因此,我们必须在一个独立的线程中启动它,否则它会卡住我们的主程序。 m_thread = std::thread([this]() { spdlog::info("Starting Web server on port {}", m_port); m_app.port(m_port).run(); spdlog::info("Web server has stopped."); }); } void WebServer::stop() { m_app.stop(); if (m_thread.joinable()) { m_thread.join(); } } void WebServer::setup_routes() { // ---------------------------------------------------------------- // 定义第一个API路由: GET /api/system/status // ---------------------------------------------------------------- CROW_ROUTE(m_app, "/api/system/status") ([this] { auto cpu_util = m_monitor.getCpuUtilization(); auto mem_info = m_monitor.getMemoryInfo(); crow::json::wvalue response; response["cpu_usage_percentage"] = cpu_util.totalUsagePercentage; response["memory_total_kb"] = mem_info.total_kb; response["memory_free_kb"] = mem_info.available_kb; response["memory_usage_percentage"] = (mem_info.total_kb > 0) ? (1.0 - static_cast(mem_info.available_kb) / mem_info.total_kb) * 100.0 : 0.0; return response; }); // 未来在这里添加更多的路由,例如: // CROW_ROUTE(m_app, "/api/devices")([this]{ ... }); }