From f56f083a7e59e58dd44913b11ce4e959fb0475cc Mon Sep 17 00:00:00 2001
From: LAPTOP-T815PCOQ\25526 <mr.liuyang@126.com>
Date: 星期三, 20 十一月 2024 19:16:44 +0800
Subject: [PATCH] 1. 添加运行日志界面2.运行日志基本功能已经完成
---
SourceCode/Bond/BondEq/DBManager/SystemLogManager.cpp | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 159 insertions(+), 3 deletions(-)
diff --git a/SourceCode/Bond/BondEq/DBManager/SystemLogManager.cpp b/SourceCode/Bond/BondEq/DBManager/SystemLogManager.cpp
index 92a6502..d4efa64 100644
--- a/SourceCode/Bond/BondEq/DBManager/SystemLogManager.cpp
+++ b/SourceCode/Bond/BondEq/DBManager/SystemLogManager.cpp
@@ -1,5 +1,4 @@
#include "stdafx.h"
-#include "SystemLogManager.h"
#include <iostream>
#include <sstream>
#include <stdexcept>
@@ -41,18 +40,49 @@
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);
}
// 添加日志
+bool SystemLogManager::log(LogType logType, const std::string& event) {
+ if (!m_pDB || !(*m_pDB)) {
+ std::cerr << "Database connection is not set." << std::endl;
+ return false;
+ }
+
+ // 清理旧日志
+ cleanOldLogs(30);
+
+ std::string strUsername = UserManager::getInstance().getCurrentUser();
+ if (strUsername.empty()) {
+ strUsername = "SYSTEM";
+ }
+
+ std::ostringstream query;
+ query << "INSERT INTO system_logs (log_type, event, username) VALUES ("
+ << "'" << logTypeToString(logType) << "', "
+ << "'" << event << "', "
+ << "'" << strUsername << "')";
+ return (*m_pDB)->executeQuery(query.str());
+}
+
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;
}
+
+ std::vector<std::string> vecUserInfo = UserManager::getInstance().getUserInfo(username);
+ if (username.empty() || vecUserInfo.empty()) {
+ std::cerr << "Username empty." << std::endl;
+ return false;
+ }
+
+ // 清理旧日志
+ cleanOldLogs(30);
std::ostringstream query;
query << "INSERT INTO system_logs (log_type, event, username) VALUES ("
@@ -90,6 +120,132 @@
return logs;
}
+// 获取筛选后的日志数据
+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 || !(*m_pDB)) {
+ throw std::runtime_error("Database connection is not set.");
+ }
+
+ // 构建基础 SQL 查询
+ std::ostringstream query;
+ query << "SELECT id, log_type, event, username, timestamp 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 << "'";
+ }
+
+ // 分页逻辑:设置 LIMIT 和 OFFSET
+ int offset = (pageNumber - 1) * pageSize;
+ query << " ORDER BY timestamp DESC"; // 按时间降序排列
+ query << " 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 || !(*m_pDB)) {
+ throw std::runtime_error("Database connection is not set.");
+ }
+
+ // 构建基础 SQL 查询
+ 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());
+
+ // 返回记录总数
+ if (!results.empty() && !results[0].empty()) {
+ return std::stoi(results[0][0]); // 第一行第一列是计数值
+ }
+
+ return 0; // 如果没有结果,返回 0
+}
+
+void SystemLogManager::cleanOldLogs(int daysToKeep)
+{
+ if (!m_pDB || !(*m_pDB)) {
+ throw std::runtime_error("Database connection is not set.");
+ }
+
+ // 获取当前日期并计算截断日期
+ time_t now = time(nullptr);
+ tm timeInfo;
+ localtime_s(&timeInfo, &now);
+ timeInfo.tm_mday -= daysToKeep; // 计算指定天数之前的日期
+ mktime(&timeInfo); // 规范化日期
+
+ char buffer[20];
+ strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &timeInfo);
+ std::string cutoffDate(buffer);
+
+ std::ostringstream query;
+ query << "DELETE FROM system_logs WHERE timestamp < '" << cutoffDate << "'";
+ bool ret = (*m_pDB)->executeQuery(query.str());
+ if (!ret) {
+ throw std::runtime_error("System Log cleanup operation failed.");
+ }
+}
+
// 转换日志类型为字符串
std::string SystemLogManager::logTypeToString(LogType logType) const {
switch (logType) {
@@ -102,4 +258,4 @@
default:
return _T("未知");
}
-}
+}
\ No newline at end of file
--
Gitblit v1.9.3