From bfe14e41fa5b07771d78af4511ba18d706bc23cc Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 28 七月 2025 17:07:52 +0800
Subject: [PATCH] 1.Spooling Config功能EAP模拟测试;
---
SourceCode/Bond/BondEq/DBManager/SystemLogManager.cpp | 184 +++++++++++++++++++++++++++++++++++----------
1 files changed, 142 insertions(+), 42 deletions(-)
diff --git a/SourceCode/Bond/BondEq/DBManager/SystemLogManager.cpp b/SourceCode/Bond/BondEq/DBManager/SystemLogManager.cpp
index 92a6502..935c997 100644
--- a/SourceCode/Bond/BondEq/DBManager/SystemLogManager.cpp
+++ b/SourceCode/Bond/BondEq/DBManager/SystemLogManager.cpp
@@ -1,38 +1,36 @@
#include "stdafx.h"
-#include "SystemLogManager.h"
-#include <iostream>
#include <sstream>
+#include <iostream>
#include <stdexcept>
+#include <ctime>
-// 静态成员变量初始化
-std::unique_ptr<SystemLogManager> SystemLogManager::m_instance = nullptr;
+// 静态成员初始化
std::mutex SystemLogManager::m_mutex;
// 获取单例实例
SystemLogManager& SystemLogManager::getInstance() {
- if (m_instance == nullptr) {
- std::lock_guard<std::mutex> lock(m_mutex);
- if (m_instance == nullptr) {
- m_instance = std::unique_ptr<SystemLogManager>(new SystemLogManager());
- }
- }
- return *m_instance;
+ static SystemLogManager instance;
+ return instance;
}
// 构造函数
SystemLogManager::SystemLogManager() : m_pDB(nullptr) {}
+// 析构函数
+SystemLogManager::~SystemLogManager() {
+ m_pDB = nullptr; // 清除指针引用
+}
+
// 设置数据库连接
-void SystemLogManager::setDatabase(std::unique_ptr<BL::Database>& db) {
+void SystemLogManager::setDatabase(BL::Database* db) {
std::lock_guard<std::mutex> lock(m_mutex);
- m_pDB = &db;
+ m_pDB = db;
}
// 初始化日志表
bool SystemLogManager::initializeLogTable() {
- if (!m_pDB || !(*m_pDB)) {
- std::cerr << "Database connection is not set." << std::endl;
- return false;
+ if (!m_pDB) {
+ throw std::runtime_error("Database connection is not set.");
}
const std::string createTableQuery = R"(
@@ -41,17 +39,24 @@
log_type TEXT NOT NULL,
event TEXT NOT NULL,
username TEXT NOT NULL,
- timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
+ timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
)
)";
- return (*m_pDB)->executeQuery(createTableQuery);
+
+ return m_pDB->executeQuery(createTableQuery);
}
-// 添加日志
-bool SystemLogManager::log(LogType logType, const std::string& event, const std::string& username) {
- if (!m_pDB || !(*m_pDB)) {
- std::cerr << "Database connection is not set." << std::endl;
- return false;
+// 添加日志(使用当前用户)
+bool SystemLogManager::log(LogType logType, const std::string& event) {
+ if (!m_pDB) {
+ throw std::runtime_error("Database connection is not set.");
+ }
+
+ cleanOldLogs();
+
+ std::string username = UserManager::getInstance().getCurrentUser();
+ if (username.empty()) {
+ username = "SYSTEM";
}
std::ostringstream query;
@@ -59,47 +64,142 @@
<< "'" << logTypeToString(logType) << "', "
<< "'" << event << "', "
<< "'" << username << "')";
- return (*m_pDB)->executeQuery(query.str());
+
+ std::lock_guard<std::mutex> lock(m_mutex);
+ return m_pDB->executeQuery(query.str());
+}
+
+// 添加日志(指定用户)
+bool SystemLogManager::log(LogType logType, const std::string& event, const std::string& username) {
+ if (!m_pDB) {
+ throw std::runtime_error("Database connection is not set.");
+ }
+
+ cleanOldLogs();
+
+ std::ostringstream query;
+ query << "INSERT INTO system_logs (log_type, event, username) VALUES ("
+ << "'" << logTypeToString(logType) << "', "
+ << "'" << event << "', "
+ << "'" << username << "')";
+
+ std::lock_guard<std::mutex> lock(m_mutex);
+ return m_pDB->executeQuery(query.str());
}
// 获取日志内容
std::vector<std::vector<std::string>> SystemLogManager::getLogs(int startPosition, int count) {
- std::vector<std::vector<std::string>> logs;
-
- if (!m_pDB || !(*m_pDB)) {
- std::cerr << "Database connection is not set." << std::endl;
- return logs;
+ if (!m_pDB) {
+ throw std::runtime_error("Database connection is not set.");
}
std::ostringstream query;
-
- // 如果 startPosition 和 count 都是 -1,获取全部数据
if (startPosition == -1 && count == -1) {
- query << "SELECT id, log_type, event, username, timestamp FROM system_logs";
+ query << "SELECT id, log_type, event, username, datetime(timestamp, 'localtime') FROM system_logs";
}
else {
- query << "SELECT id, log_type, event, username, timestamp FROM system_logs "
+ query << "SELECT id, log_type, event, username, datetime(timestamp, 'localtime') FROM system_logs "
<< "LIMIT " << count << " OFFSET " << startPosition;
}
- auto results = (*m_pDB)->fetchResults(query.str());
- for (const auto& row : results) {
- logs.push_back(row);
+ return m_pDB->fetchResults(query.str());
+}
+
+// 获取筛选后的日志数据
+std::vector<std::vector<std::string>> SystemLogManager::getFilteredLogs(
+ const std::string& logType,
+ const std::string& username,
+ const std::string& description,
+ const std::string& startTime,
+ const std::string& endTime,
+ int pageNumber,
+ int pageSize)
+{
+ if (!m_pDB) {
+ throw std::runtime_error("Database connection is not set.");
}
- return logs;
+ std::ostringstream query;
+ query << "SELECT id, log_type, event, username, datetime(timestamp, 'localtime') FROM system_logs WHERE 1=1";
+
+ if (logType != "ALL") {
+ query << " AND log_type = '" << logType << "'";
+ }
+ if (username != "ALL") {
+ query << " AND username = '" << username << "'";
+ }
+ if (!description.empty()) {
+ query << " AND event LIKE '%" << description << "%'";
+ }
+ if (!startTime.empty()) {
+ query << " AND timestamp >= '" << startTime << "'";
+ }
+ if (!endTime.empty()) {
+ query << " AND timestamp <= '" << endTime << "'";
+ }
+
+ int offset = (pageNumber - 1) * pageSize;
+ query << " ORDER BY timestamp DESC LIMIT " << pageSize << " OFFSET " << offset;
+
+ return m_pDB->fetchResults(query.str());
+}
+
+// 获取符合条件的日志总数
+int SystemLogManager::getTotalLogCount(
+ const std::string& logType,
+ const std::string& username,
+ const std::string& description,
+ const std::string& startTime,
+ const std::string& endTime)
+{
+ if (!m_pDB) {
+ throw std::runtime_error("Database connection is not set.");
+ }
+
+ std::ostringstream query;
+ query << "SELECT COUNT(*) FROM system_logs WHERE 1=1";
+
+ if (logType != "ALL") {
+ query << " AND log_type = '" << logType << "'";
+ }
+ if (username != "ALL") {
+ query << " AND username = '" << username << "'";
+ }
+ if (!description.empty()) {
+ query << " AND event LIKE '%" << description << "%'";
+ }
+ if (!startTime.empty()) {
+ query << " AND timestamp >= '" << startTime << "'";
+ }
+ if (!endTime.empty()) {
+ query << " AND timestamp <= '" << endTime << "'";
+ }
+
+ auto results = m_pDB->fetchResults(query.str());
+ return (!results.empty() && !results[0].empty()) ? std::stoi(results[0][0]) : 0;
+}
+
+// 清理超过指定天数的旧日志
+void SystemLogManager::cleanOldLogs(int daysToKeep) {
+ if (!m_pDB) {
+ throw std::runtime_error("Database connection is not set.");
+ }
+
+ std::ostringstream query;
+ query << "DELETE FROM system_logs WHERE timestamp < datetime('now', '-" << daysToKeep << " days')";
+ m_pDB->executeQuery(query.str());
}
// 转换日志类型为字符串
-std::string SystemLogManager::logTypeToString(LogType logType) const {
+std::string SystemLogManager::logTypeToString(LogType logType) {
switch (logType) {
case LogType::Info:
- return _T("信息");
+ return "信息";
case LogType::Error:
- return _T("错误");
+ return "错误";
case LogType::Operation:
- return _T("操作");
+ return "操作";
default:
- return _T("未知");
+ return "未知";
}
}
--
Gitblit v1.9.3