From 7f21f9488ee5278287365c4f697273493e868ec4 Mon Sep 17 00:00:00 2001 From: Vladislav Ostapov Date: Thu, 18 Sep 2025 15:32:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D1=82=D0=BD=D1=83=D1=8E=20=D1=81=D0=BE?= =?UTF-8?q?=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D1=83=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/common/logs-data.js.j2 | 1 + .../template/common/logs-methods.js.j2 | 2 +- front-generator/template/common/logs.html.j2 | 1 + src/api-driver/structs.cpp | 18 ++++++++++++----- src/api-driver/structs.h | 4 ++-- src/main.cpp | 7 ++++++- src/server/request_parser.cpp | 20 ++++++++++--------- static/main-tdma.html | 8 +++++++- 8 files changed, 42 insertions(+), 19 deletions(-) diff --git a/front-generator/template/common/logs-data.js.j2 b/front-generator/template/common/logs-data.js.j2 index 4f77ff4..80dafb0 100644 --- a/front-generator/template/common/logs-data.js.j2 +++ b/front-generator/template/common/logs-data.js.j2 @@ -1,6 +1,7 @@ paramLogs: { submitClearLogs: false, submitUpdateLogs: false, + revercePreview: true, data: "", level: "" }, diff --git a/front-generator/template/common/logs-methods.js.j2 b/front-generator/template/common/logs-methods.js.j2 index 3ccb510..06be640 100644 --- a/front-generator/template/common/logs-methods.js.j2 +++ b/front-generator/template/common/logs-methods.js.j2 @@ -1,7 +1,7 @@ logsUpdate() { if (this.paramLogs.submitUpdateLogs) { return } this.paramLogs.submitUpdateLogs = true - fetch(`/api/get/manager.log?preview=1`, {method: 'GET', credentials: 'same-origin' }) + fetch(`/api/get/manager.log?preview${this.paramLogs.revercePreview ? '&reverse' : ''}`, {method: 'GET', credentials: 'same-origin', }) .then(async (resp) => { this.paramLogs.data = await resp.text() }) diff --git a/front-generator/template/common/logs.html.j2 b/front-generator/template/common/logs.html.j2 index fade68e..99d8504 100644 --- a/front-generator/template/common/logs.html.j2 +++ b/front-generator/template/common/logs.html.j2 @@ -6,6 +6,7 @@ "widget": "select", "label": "Фильтрация лога (отображение)", "name": "level", "values": [{"label": "Без фильтрации", "value": "''"}, {"label": "Информация", "value": "'info'"}, {"label": "Предупреждение", "value": "'warning'"}, {"label": "Ошибка", "value": "'error'"}, {"label": "Фатальная ошибка", "value": "'fatal'"}] }) | indent(8, true) }} +{{ build_widget('logs', {"widget": "checkbox", "label": "Обратная сортировка строк", "name": "revercePreview"},) | indent(8, true) }} Скачать все
{{ '{{ paramLogs.data }}' }}
diff --git a/src/api-driver/structs.cpp b/src/api-driver/structs.cpp index 3cad21a..71320f3 100644 --- a/src/api-driver/structs.cpp +++ b/src/api-driver/structs.cpp @@ -997,7 +997,7 @@ std::vector getLogFilesSorted(const std::string& path) { api_driver::obj::TerminalManagerLogs::TerminalManagerLogs(const std::string& path): logsFileDir(path) {} -std::string api_driver::obj::TerminalManagerLogs::loadPreview() { +std::string api_driver::obj::TerminalManagerLogs::loadPreview(bool isReverse) { auto logFiles = getLogFilesSorted(logsFileDir); if (logFiles.empty()) return "No log files found..."; @@ -1032,15 +1032,23 @@ std::string api_driver::obj::TerminalManagerLogs::loadPreview() { // Собираем результат в правильном порядке std::string result; result.reserve(lines.size() * 100); // Предполагаемая средняя длина строки - for (auto it = lines.rbegin(); it != lines.rend(); ++it) { - result += *it; - result += '\n'; + if (isReverse) { + for (auto line: lines) { + result += line; + result += '\n'; + } + } else { + for (auto it = lines.rbegin(); it != lines.rend(); ++it) { + result += *it; + result += '\n'; + } } return result; } -std::string api_driver::obj::TerminalManagerLogs::loadPreviewWithFilter(const std::string& logLevel) { +std::string api_driver::obj::TerminalManagerLogs::loadPreviewWithFilter(bool isReverse, const std::string& logLevel) { + std::ignore = isReverse; return "Logs level " + logLevel + " filtering not supported yet..."; } diff --git a/src/api-driver/structs.h b/src/api-driver/structs.h index bc29cca..6932ee0 100644 --- a/src/api-driver/structs.h +++ b/src/api-driver/structs.h @@ -263,9 +263,9 @@ namespace api_driver::obj { TerminalManagerLogs(const std::string& path); - std::string loadPreview(); + std::string loadPreview(bool isReverse); - std::string loadPreviewWithFilter(const std::string& logLevel); + std::string loadPreviewWithFilter(bool isReverse, const std::string& logLevel); void loadFullLog(std::vector& destData); diff --git a/src/main.cpp b/src/main.cpp index c03e2c0..aee8bcf 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -683,6 +683,11 @@ public: isPreview = true; } + bool isReversePreview = false; + if (req.url->params.find("reverse") != req.url->params.end()) { + isReversePreview = true; + } + std::string logLevelFilter; if (req.url->params.find("level") != req.url->params.end()) { logLevelFilter = req.url->params["level"]; @@ -692,7 +697,7 @@ public: rep.headers.push_back({.name = "Content-Type", .value = toString(mime_types::text_plain)}); rep.content.clear(); if (isPreview) { - auto result = logLevelFilter.empty() ? this->api->logs.loadPreview() : this->api->logs.loadPreviewWithFilter(logLevelFilter); + auto result = logLevelFilter.empty() ? this->api->logs.loadPreview(isReversePreview) : this->api->logs.loadPreviewWithFilter(isReversePreview, logLevelFilter); rep.content.insert(rep.content.end(), result.c_str(), result.c_str() + result.size()); } else { this->api->logs.loadFullLog(rep.content); diff --git a/src/server/request_parser.cpp b/src/server/request_parser.cpp index 21b8681..cf4e105 100644 --- a/src/server/request_parser.cpp +++ b/src/server/request_parser.cpp @@ -26,17 +26,19 @@ namespace http::server { } static void parseParams(Url& u, const std::string& query) { - std::istringstream iss(query); - std::string param; - while (std::getline(iss, param, '&')) { - size_t equal_pos = param.find('='); - if (equal_pos != std::string::npos) { - const std::string key = param.substr(0, equal_pos); - const std::string value = param.substr(equal_pos + 1); - u.params[key] = value; - } + std::istringstream iss(query); + std::string param; + while (std::getline(iss, param, '&')) { + size_t equal_pos = param.find('='); + if (equal_pos != std::string::npos) { + const std::string key = param.substr(0, equal_pos); + const std::string value = param.substr(equal_pos + 1); + u.params[key] = value; + } else { + u.params[param] = ""; } } + } Url::Url(const std::string &url) { size_t question_mark_pos = url.find('?'); diff --git a/static/main-tdma.html b/static/main-tdma.html index 53dd21d..3ba6d62 100644 --- a/static/main-tdma.html +++ b/static/main-tdma.html @@ -311,6 +311,11 @@ + + Скачать все
{{ paramLogs.data }}
@@ -452,6 +457,7 @@ paramLogs: { submitClearLogs: false, submitUpdateLogs: false, + revercePreview: true, data: "", level: "" }, @@ -955,7 +961,7 @@ logsUpdate() { if (this.paramLogs.submitUpdateLogs) { return } this.paramLogs.submitUpdateLogs = true - fetch(`/api/get/manager.log?preview=1`, {method: 'GET', credentials: 'same-origin' }) + fetch(`/api/get/manager.log?preview${this.paramLogs.revercePreview ? '&reverse' : ''}`, {method: 'GET', credentials: 'same-origin', }) .then(async (resp) => { this.paramLogs.data = await resp.text() })