From 734226a33a927c977859c98359c7e51e60acd55d Mon Sep 17 00:00:00 2001 From: zhaojingkui <1553836110@qq.com> Date: Thu, 13 Feb 2025 12:58:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/appPowerMangerWebUI/index.html | 157 +++++++++++++++++++---------- src/appPowerMangerWebUI/main.cpp | 57 +++++++++-- src/pPowerManger/SQLiteDB.cpp | 5 + src/pPowerManger/SQLiteDB.h | 5 + 4 files changed, 160 insertions(+), 64 deletions(-) diff --git a/src/appPowerMangerWebUI/index.html b/src/appPowerMangerWebUI/index.html index 0cff833..2f90468 100644 --- a/src/appPowerMangerWebUI/index.html +++ b/src/appPowerMangerWebUI/index.html @@ -16,11 +16,20 @@ padding: 20px; height: 100vh; display: grid; - grid-template-rows: auto 1fr 1fr; + grid-template-rows: auto auto 1fr 1fr; grid-template-columns: 1fr 1fr; gap: 20px; } + .db-status-panel { + grid-column: 1 / -1; + background-color: #333; + border: 1px solid #61dafb; + border-radius: 8px; + padding: 20px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + } + .control-panel { grid-column: 1 / -1; display: flex; @@ -32,16 +41,6 @@ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } - .db-status-panel { - grid-column: 1 / -1; - background-color: #333; - border: 1px solid #61dafb; - border-radius: 8px; - padding: 20px; - margin-top: 20px; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - } - .db-status { display: flex; align-items: center; @@ -123,22 +122,22 @@ .log-panel { grid-column: 1; - grid-row: 3; + grid-row: 4; } .ccu-state-panel { grid-column: 2; - grid-row: 2; + grid-row: 3; } .dis-sys-panel { grid-column: 1; - grid-row: 2; + grid-row: 3; } .state-machine-panel { grid-column: 2; - grid-row: 3; + grid-row: 4; } pre { @@ -148,10 +147,44 @@ font-size: 13px; line-height: 1.4; } + + .file-input { + display: none; + } + + .file-label { + display: inline-block; + padding: 10px 15px; + background: #61dafb; + color: #282c34; + border-radius: 4px; + cursor: pointer; + margin-left: 10px; + } +
+ +
+
+

MOOSDB

+
+ + 正在连接MOOSDB... +
+
+
+

本地数据库

+
+ + 正在连接数据库... +
+
+
+
+
-
- -
- -
-

数据库操作

-
- - 正在连接数据库... -
@@ -204,6 +227,32 @@
diff --git a/src/appPowerMangerWebUI/main.cpp b/src/appPowerMangerWebUI/main.cpp index fd2e9fe..192b4de 100644 --- a/src/appPowerMangerWebUI/main.cpp +++ b/src/appPowerMangerWebUI/main.cpp @@ -10,6 +10,7 @@ #include #include #include "../pPowerManger/SQLiteDB.h" +#include using namespace std; @@ -24,38 +25,72 @@ string read_file(const string& path) { int main() { crow::SimpleApp app; SQLiteDB db("/home/zjk/project/H100/H100PowerManger/data/power_data.db"); - // 初始化 SQLite 数据库 + MOOS::MOOSAsyncCommClient moosClient; + moosClient.Run("localhost", 9000, "appPowerMangerWebUI"); - // 路由返回 HTML 页面 + // 定义路由,处理根路径的请求 CROW_ROUTE(app, "/")([](){ // 读取 HTML 文件 string html_content = read_file("/home/zjk/project/H100/H100PowerManger/src/appPowerMangerWebUI/index.html"); return html_content; }); - + // 定义路由,处理 /api/power-data 的请求 CROW_ROUTE(app, "/api/db-status") ([&db]() { crow::json::wvalue response; if (db.isDatabaseConnected("/home/zjk/project/H100/H100PowerManger/data", "power_data.db")) { response["connected"] = true; - response["database"] = "YourDatabaseName"; // 替换为实际的数据库名称 + response["database"] = db.getDBPatch(); // 替换为实际的数据库名称 } else { response["connected"] = false; } return response; }); - + // 定义路由,处理 /api/power-data 的请求 CROW_ROUTE(app, "/api/download-db") ([&db]() { std::ifstream file("/home/zjk/project/H100/H100PowerManger/data/power_data.db", std::ios::binary); if (!file) { return crow::response(404, "Database file not found"); } - std::vector buffer((std::istreambuf_iterator(file)), std::istreambuf_iterator()); - // 将 buffer.size() 转换为 std::string - std::string contentLength = std::to_string(buffer.size()); - crow::response response(buffer.size(), contentLength, "application/octet-stream"); - response.add_header("Content-Disposition", "attachment; filename=power_data.db"); + + // 获取文件大小 + file.seekg(0, std::ios::end); + size_t fileSize = file.tellg(); + file.seekg(0, std::ios::beg); + + // 创建响应对象 + crow::response response; + response.code = 200; + response.set_header("Content-Type", "application/octet-stream"); + response.set_header("Content-Disposition", "attachment; filename=power_data.db"); + response.set_header("Content-Length", std::to_string(fileSize)); + + // 直接返回文件流 + response.body = std::string((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + file.close(); + + return response; + }); + // 定义路由,处理 /api/moos-db 的请求 + CROW_ROUTE(app, "/api/moos-db") + ([&moosClient]() -> crow::json::wvalue { + crow::json::wvalue response; + if (moosClient.IsConnected()) { + response["connected"] = true; + response["host"] = moosClient.GetDBHostname(); + response["port"] = std::to_string(moosClient.GetDBHostPort()); + } + else { + response["connected"] = false; + } + return response; + }); + // 定义路由,处理 /api/moos-notify 的请求(POST) + CROW_ROUTE(app, "/api/moos-notify") + ([&moosClient]() { + crow::json::wvalue response; + response["message"] = "Received MOOS notification"; return response; }); @@ -63,4 +98,4 @@ int main() { app.port(18080).multithreaded().run(); return 0; -} \ No newline at end of file +} diff --git a/src/pPowerManger/SQLiteDB.cpp b/src/pPowerManger/SQLiteDB.cpp index 738f5d7..aa6db58 100644 --- a/src/pPowerManger/SQLiteDB.cpp +++ b/src/pPowerManger/SQLiteDB.cpp @@ -8,6 +8,7 @@ SQLiteDB::SQLiteDB(const std::string& dbPath) { std::cerr << "Error opening database: " << sqlite3_errmsg(m_db) << std::endl; m_db = nullptr; } + m_dbPath = dbPath; } SQLiteDB::~SQLiteDB() { @@ -151,3 +152,7 @@ std::vector SQLiteDB::getPowerData(int limit) { return data; } + +string SQLiteDB::getDBPatch(){ + return m_dbPath; +} \ No newline at end of file diff --git a/src/pPowerManger/SQLiteDB.h b/src/pPowerManger/SQLiteDB.h index 8d27bef..2c4a8d2 100644 --- a/src/pPowerManger/SQLiteDB.h +++ b/src/pPowerManger/SQLiteDB.h @@ -7,6 +7,7 @@ #include "json/json.h" // #include +using namespace std; struct PowerData { std::string timestamp; double voltage; @@ -38,8 +39,12 @@ public: //使用函数 bool isDatabaseConnected(const std::string& path, const std::string& dbName); + //获取数据库状态函数 + string getDBPatch(); + private: sqlite3* m_db; + string m_dbPath; }; #endif // SQLITEDB_H