#include "logquery.h"
|
#include "ui_logquery.h"
|
#include <QTcpSocket>
|
#include <QMessageBox>
|
#include <QStandardItemModel>
|
#pragma execution_character_set("utf-8")
|
|
|
|
LogQuery::LogQuery(QWidget *parent) :
|
QMainWindow(parent),
|
ui(new Ui::LogQuery)
|
{
|
ui->setupUi(this);
|
|
m_client = nullptr;//置空
|
|
}
|
|
LogQuery::LogQuery(QTcpSocket *client, QWidget *parent):
|
QMainWindow(parent),
|
ui(new Ui::LogQuery)
|
{
|
ui->setupUi(this);
|
|
connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(onComboBoxIndexChanged(int)));
|
ui->dateTimeEdit_end->setDateTime(QDateTime::currentDateTime());
|
//拉伸 效果
|
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
|
ui->spinBox->setValue(10);
|
|
// int nWidth = ui->tableView->width();
|
// ui->tableView->setColumnWidth(0, qRound(nWidth*0.1));
|
// ui->tableView->setColumnWidth(1, qRound(nWidth*0.5));
|
// ui->tableView->setColumnWidth(2, qRound(nWidth*0.3));
|
// ui->tableView->setColumnWidth(3, qRound(nWidth*0.15));
|
// ui->tableView->setColumnWidth(4, qRound(nWidth*0.15));
|
// ui->tableView->setColumnWidth(5, qRound(nWidth*0.3));
|
// ui->tableView->setColumnWidth(6, qRound(nWidth*0.3));
|
// ui->tableView->setColumnWidth(7, qRound(nWidth*0.3));
|
// ui->tableView->setColumnWidth(8, qRound(nWidth*0.3));
|
|
|
|
m_client = client;//共享套接字
|
}
|
|
LogQuery::~LogQuery()
|
{
|
delete ui;
|
}
|
|
void LogQuery::on_pushButton_search_clicked()
|
{
|
QString selectedFilter = ui->comboBox->currentText();
|
QByteArray request;
|
|
// 动态分配请求结构体
|
int size = sizeof(LogQueryReq) + sizeof(ParsedLog);
|
LogQueryReq* req = (LogQueryReq*)new char[size];
|
|
req->head.type = LOGSEARCH_REQ;
|
req->head.len = size;
|
|
// 初始化请求数据
|
initializeRequestData(req);
|
|
// 根据选定的筛选条件填充请求数据
|
if (selectedFilter == "时间") {
|
|
QString startTime = ui->dateTimeEdit_start->dateTime().toString("yyyy-MM-dd HH:mm:ss");
|
QString endTime = ui->dateTimeEdit_end->dateTime().toString("yyyy-MM-dd HH:mm:ss");
|
|
// 将开始时间和结束时间设置到请求中
|
strcpy(req->startTime, startTime.toLocal8Bit().constData());
|
strcpy(req->endTime, endTime.toLocal8Bit().constData());
|
} else if (selectedFilter == "日志内容" || selectedFilter == "日志级别" || selectedFilter == "设备ID") {
|
QString filterValue = ui->lineEdit->text();
|
if (filterValue.isEmpty()) {
|
QMessageBox::warning(this, "警告", "请输入筛选条件!");
|
delete[] req; // 释放内存
|
return;
|
}
|
|
// 根据筛选条件填充相应的字段
|
if (selectedFilter == "日志内容") {
|
|
strcpy(req->content, filterValue.toLocal8Bit().data());
|
} else if (selectedFilter == "日志级别") {
|
|
strcpy(req->level, filterValue.toLocal8Bit().data());
|
} else if (selectedFilter == "设备ID") {
|
|
strcpy(req->deviceId, filterValue.toLocal8Bit().data());
|
}
|
} else {
|
QMessageBox::warning(this, "警告", "请选择有效的筛选条件!");
|
delete[] req; // 释放内存
|
return;
|
}
|
|
// 将结构体转为 QByteArray
|
request = QByteArray((char*)(req), req->head.len);
|
|
// 发送请求
|
if (m_client != nullptr) {
|
qDebug() << __FUNCTION__ << m_client->write(request);
|
}
|
|
// 释放内存
|
delete[] req;
|
currentPage = 1;
|
// 重新计算总页数
|
totalPages = (logs.size() + logsPerPage - 1) / logsPerPage;
|
displayCurrentPage();
|
updatePageLabel();
|
|
}
|
|
void LogQuery::queryResSlot(LogQueryRes *res)
|
{
|
if (res->status == 1) {
|
// 解析日志数据
|
logs.clear();
|
|
int maxLogs = ui->spinBox->value();
|
int logCount = (res->head.len - sizeof(LogQueryRes)) / sizeof(ParsedLog);
|
qDebug()<<"logcount = "<<logCount;
|
int displayCount = qMin(maxLogs, logCount); // 显示数量不超过最大值
|
for (int i = 0; i < displayCount; ++i) {
|
logs.append(res->parsedLog[i]);
|
}
|
|
totalPages = (logs.size()+logsPerPage -1)/ logsPerPage;//计算总页数
|
currentPage = 1; // 重置页码
|
updatePageLabel();//更新标签
|
displayCurrentPage(); // 显示第一页
|
}
|
else{
|
ui->tableView->setModel(nullptr);
|
QMessageBox::warning(this, "警告", "无相关内容");
|
|
}
|
}
|
|
void LogQuery::initializeRequestData(LogQueryReq *req)
|
{
|
req->startTime[0] = '\0';
|
req->endTime[0] = '\0';
|
req->level[0] = '\0';
|
req->deviceId[0] = '\0';
|
req->content[0] = '\0';
|
}
|
|
void LogQuery::updatePageLabel()
|
{
|
ui->label_currentPage->setText(QString("当前页:%1 / %2").arg(currentPage).arg(totalPages));
|
// 如果只有一页或者没有数据,禁用上下页按钮
|
ui->pushButton_up->setEnabled(currentPage > 1); // 禁用上一页按钮
|
ui->pushButton_down->setEnabled(currentPage < totalPages); // 禁用下一页按钮
|
}
|
|
|
void LogQuery::on_pushButton_up_clicked()
|
{
|
if (currentPage > 0) {
|
--currentPage;
|
updatePageLabel();
|
displayCurrentPage(); // 显示上一页
|
}
|
}
|
|
void LogQuery::on_pushButton_down_clicked()
|
{
|
if (currentPage < totalPages) {
|
++currentPage;
|
updatePageLabel();
|
displayCurrentPage();
|
}
|
}
|
|
void LogQuery::onComboBoxIndexChanged(int index)
|
{
|
ui->lineEdit->clear();
|
}
|
|
void LogQuery::displayCurrentPage()
|
{
|
QStandardItemModel* model = new QStandardItemModel();
|
model->setHorizontalHeaderLabels({"ID", "时间", "设备ID", "日志级别", "日志内容", "用户ID", "错误文件名", "错误行号", "错误函数名"});
|
|
int start = (currentPage -1)* logsPerPage;
|
int end = qMin(start + logsPerPage, logs.size());
|
|
// 填充当前页的日志条目
|
for (int i = start; i < end; ++i) {
|
ParsedLog parsedLog = logs[i];
|
QList<QStandardItem *> rowItems;
|
|
rowItems.append(new QStandardItem(QString::number(parsedLog.id)));
|
rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.timeStamp)));
|
rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.deviceId)));
|
rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.level)));
|
rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.content)));
|
rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.userId)));
|
rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.fileName)));
|
rowItems.append(new QStandardItem(QString::number(parsedLog.problemLine)));
|
rowItems.append(new QStandardItem(QString::fromLocal8Bit(parsedLog.functionName)));
|
|
model->appendRow(rowItems);
|
}
|
|
// 更新表格视图
|
ui->tableView->setModel(model);
|
ui->tableView->resizeColumnsToContents();
|
}
|