66 lines
2.1 KiB
C++
66 lines
2.1 KiB
C++
// 文件名: 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<double>(mem_info.available_kb) / mem_info.total_kb) * 100.0
|
||
: 0.0;
|
||
|
||
|
||
return response;
|
||
});
|
||
|
||
// 未来在这里添加更多的路由,例如:
|
||
// CROW_ROUTE(m_app, "/api/devices")([this]{ ... });
|
||
} |