From 6247aae95e71f731b5ecd7598ac6e25b683dccb6 Mon Sep 17 00:00:00 2001 From: Krad Date: Tue, 23 Nov 2021 13:22:00 +0800 Subject: [PATCH] Simple UserOperationLog table. --- src/AdminSettingForm.cpp | 7 ++++- src/SelectFormWidget.cpp | 32 +++++++++---------- src/UserOperationLogForm.cpp | 43 ++++++++++++++++++++++++++ src/UserOperationLogForm.h | 23 ++++++++++++++ src/guimessagedialog.cpp | 1 + src/log/LogFileTableModel.cpp | 56 +++++++++++++++++++++++++++++++++ src/log/LogFileTableModel.h | 34 ++++++++++++++++++++ src/log/UserOperationLog.cpp | 58 ++++++++++++++++++++++++++++++++--- src/log/UserOperationLog.h | 8 +++++ src/mainwindow.cpp | 13 ++++++++ 10 files changed, 253 insertions(+), 22 deletions(-) create mode 100644 src/UserOperationLogForm.cpp create mode 100644 src/UserOperationLogForm.h create mode 100644 src/log/LogFileTableModel.cpp create mode 100644 src/log/LogFileTableModel.h diff --git a/src/AdminSettingForm.cpp b/src/AdminSettingForm.cpp index 324eda7..305efa9 100644 --- a/src/AdminSettingForm.cpp +++ b/src/AdminSettingForm.cpp @@ -11,6 +11,7 @@ #include #include "ui_tabformwidget.h" #include +#include "UserOperationLogForm.h" AdminSettingForm::AdminSettingForm(QWidget *parent, Qt::WindowFlags f) : TabFormWidget(parent) { @@ -19,7 +20,7 @@ AdminSettingForm::AdminSettingForm(QWidget *parent, Qt::WindowFlags f) : TabForm QListWidget* widget = new QListWidget(this); widget->setFixedWidth(250); QStringList menus; - menus<addItems(menus); widget->setSpacing(3); for (int i = 0; i < menus.count(); ++i) { @@ -46,6 +47,10 @@ AdminSettingForm::AdminSettingForm(QWidget *parent, Qt::WindowFlags f) : TabForm Info->setText("info"); stackedWidget->addWidget(Info); + UserOperationLogForm* operationLogForm = new UserOperationLogForm(this); + + stackedWidget->addWidget(operationLogForm); + QLabel* about = new QLabel(this); about->setText("About"); stackedWidget->addWidget(about); diff --git a/src/SelectFormWidget.cpp b/src/SelectFormWidget.cpp index 33e4d0b..1834088 100644 --- a/src/SelectFormWidget.cpp +++ b/src/SelectFormWidget.cpp @@ -25,22 +25,22 @@ SelectFormWidget::SelectFormWidget(QWidget *parent) : TabFormWidget(parent) { - const char* style="QHeaderView::section{background-color:#595959;" - " min-height:50px;max-height:50px;" - "font-weight:Bold; font-size:16px; border:1px solid #323232;}" - "QHeaderView::section:horizontal{border-bottom: 1px solid rgb(0,170,255);}" - "QHeaderView::section:vertical{min-height:36px;max-height:36px;}" - "QWidget#edit_patient{min-width:300px;max-width:300px;}" - "QTableView{border:none}" - "QTableView{alternate-background-color: #595959;selection-color:white;selection-background-color:#0078d8}" - "QToolButton#sexBtn{min-width:120px;max-width:120px;font-size:20px;padding:2px;}" - "QToolButton#sexBtn:disabled{color:silver}" - "QWidget#sexpanelwidget{border:1px solid silver;}" - "QWidget#sexpanelwidget:enabled{background-color: #515151;}" - "QToolButton#sexBtn:checked{border:2px solid darkorange;padding:0px;}" - ; - - this->setStyleSheet(this->styleSheet().append(style)); +// const char* style="QHeaderView::section{background-color:#595959;" +// " min-height:50px;max-height:50px;" +// "font-weight:Bold; font-size:16px; border:1px solid #323232;}" +// "QHeaderView::section:horizontal{border-bottom: 1px solid rgb(0,170,255);}" +// "QHeaderView::section:vertical{min-height:36px;max-height:36px;}" +// "QWidget#edit_patient{min-width:300px;max-width:300px;}" +// "QTableView{border:none}" +// "QTableView{alternate-background-color: #595959;selection-color:white;selection-background-color:#0078d8}" +// "QToolButton#sexBtn{min-width:120px;max-width:120px;font-size:20px;padding:2px;}" +// "QToolButton#sexBtn:disabled{color:silver}" +// "QWidget#sexpanelwidget{border:1px solid silver;}" +// "QWidget#sexpanelwidget:enabled{background-color: #515151;}" +// "QToolButton#sexBtn:checked{border:2px solid darkorange;padding:0px;}" +// ; +// +// this->setStyleSheet(this->styleSheet().append(style)); //init command bar QHBoxLayout* layout =new QHBoxLayout(); ui->commandWidget->setLayout(layout); diff --git a/src/UserOperationLogForm.cpp b/src/UserOperationLogForm.cpp new file mode 100644 index 0000000..db901a3 --- /dev/null +++ b/src/UserOperationLogForm.cpp @@ -0,0 +1,43 @@ +// +// Created by Krad on 2021/11/23. +// + +#include "UserOperationLogForm.h" +#include +#include +#include "log/UserOperationLog.h" +#include "log/LogFileTableModel.h" +#include + +UserOperationLogForm::UserOperationLogForm(QWidget *parent) { + QVBoxLayout* layout = new QVBoxLayout(this); + QWidget* header = new QWidget(this); + table = new QTableView(this); + layout->addWidget(header); + layout->addWidget(table); + //暂时先放构造函数,之后需要移除,等需要时再调用 + loadUserOperationLog(); +} + +UserOperationLogForm::~UserOperationLogForm() { + +} + +void UserOperationLogForm::loadUserOperationLog() { + LogFileTableModel* model = new LogFileTableModel(this); + QString filePath = UserOperationLog::Default()->currentLogFile(); + model->setFileName(filePath); + QStringList header; + header<<"Operation Date"<<"Operation Time"<<"User"<<"Operation"; + model->setHeader(header); +// UserOperationLog::getHistoryLogFiles(); + table->setModel(model); + table->setAlternatingRowColors(true); + table->setSelectionMode(QAbstractItemView::SingleSelection); + table->setEditTriggers(QAbstractItemView::NoEditTriggers); + table->setSelectionBehavior(QAbstractItemView::SelectRows); + table->verticalHeader()->setDefaultSectionSize(38); + table->horizontalHeader()->setStretchLastSection(true); + table->setColumnWidth(0,250); + table->setColumnWidth(1,250); +} diff --git a/src/UserOperationLogForm.h b/src/UserOperationLogForm.h new file mode 100644 index 0000000..94f98b4 --- /dev/null +++ b/src/UserOperationLogForm.h @@ -0,0 +1,23 @@ +// +// Created by Krad on 2021/11/23. +// + +#ifndef GUI_USEROPERATIONLOGFORM_H +#define GUI_USEROPERATIONLOGFORM_H + +#include +#include + +class UserOperationLogForm:public QWidget { + Q_OBJECT +public: + explicit UserOperationLogForm(QWidget *parent = nullptr); + ~UserOperationLogForm(); + void loadUserOperationLog(); + +private: + QTableView * table = nullptr; +}; + + +#endif //GUI_USEROPERATIONLOGFORM_H diff --git a/src/guimessagedialog.cpp b/src/guimessagedialog.cpp index f938cf4..7913e3f 100644 --- a/src/guimessagedialog.cpp +++ b/src/guimessagedialog.cpp @@ -65,6 +65,7 @@ void GUIMessageDialog::startLoading() { } accept(); EventCenter::Default()->triggerEvent(GUIEvents::RequestStop, nullptr, nullptr); + LOG_USER_OPERATION(Stop); }); timerID = startTimer(100); ui->btn_main->setText("Stop"); diff --git a/src/log/LogFileTableModel.cpp b/src/log/LogFileTableModel.cpp new file mode 100644 index 0000000..50c24e8 --- /dev/null +++ b/src/log/LogFileTableModel.cpp @@ -0,0 +1,56 @@ +// +// Created by Krad on 2021/11/23. +// + +#include +#include +#include "LogFileTableModel.h" + +LogFileTableModel::LogFileTableModel(QObject *parent) : QAbstractTableModel(parent) { + +} + +void LogFileTableModel::setFileName(QString fileName) { + logdata.clear(); + QFile f; + f.setFileName(fileName); + if (!f.exists()) return; + if(f.open(QFile::OpenModeFlag::ReadOnly | QFile::OpenModeFlag::Text)) + { + + QTextStream in(&f); + while(!in.atEnd()){ + logdata.push_back(in.readLine().split("\t")); + } + } +} + +QVariant LogFileTableModel::data(const QModelIndex &index, int role) const { + if (!index.isValid()) return QVariant(); + if (role == Qt::TextAlignmentRole) { + return Qt::AlignCenter; + } + if (role == Qt::DisplayRole || role == Qt::EditRole ) + { + return logdata[index.row()][index.column()]; + } + return QVariant(); +} + +int LogFileTableModel::rowCount(const QModelIndex &parent) const { + if (!logdata.isEmpty()) return logdata.count(); + return 0; +} + +int LogFileTableModel::columnCount(const QModelIndex &parent) const { + if (!logdata.isEmpty()) return logdata[0].count(); + return 0; +} + +QVariant LogFileTableModel::headerData(int section, Qt::Orientation orientation, int role) const { + if(role != Qt::DisplayRole) + return QVariant(); + if(orientation == Qt::Horizontal) + return headerStrings.at(section); + return QVariant(); +} diff --git a/src/log/LogFileTableModel.h b/src/log/LogFileTableModel.h new file mode 100644 index 0000000..49b73ca --- /dev/null +++ b/src/log/LogFileTableModel.h @@ -0,0 +1,34 @@ +// +// Created by Krad on 2021/11/23. +// + +#ifndef GUI_LOGFILETABLEMODEL_H +#define GUI_LOGFILETABLEMODEL_H + +#include +#include +#include +class LogFileTableModel : public QAbstractTableModel{ +public: + LogFileTableModel(QObject *parent = nullptr); + ~LogFileTableModel(){} + void setFileName(QString filename); + void setHeader(QStringList header){ + headerStrings = header; + } +protected: + //数据展示用 + QVariant data(const QModelIndex &index, int role) const; + //行数,重新实现 + int rowCount(const QModelIndex &parent) const; + //列数,重新实现 + int columnCount(const QModelIndex &parent) const; + //标头 + QVariant headerData(int section, Qt::Orientation orientation, int role) const; +private: + QList logdata; + QStringList headerStrings; +}; + + +#endif //GUI_LOGFILETABLEMODEL_H diff --git a/src/log/UserOperationLog.cpp b/src/log/UserOperationLog.cpp index 404e37b..378bf5e 100644 --- a/src/log/UserOperationLog.cpp +++ b/src/log/UserOperationLog.cpp @@ -7,12 +7,16 @@ #include #include "appvals/AppGlobalValues.h" #include "models/User.h" +#include +#include +const char * logDir = "./log"; + void UserOperationLog::init() { QDir log_dir("./"); - if (!log_dir.exists("./log")) log_dir.mkdir("log"); - currentFileName = "./log/" + QDate::currentDate().toString("yyyy-MM-dd")+QString("-op.log"); + if (!log_dir.exists(logDir)) log_dir.mkdir("log"); + currentFileName = logDir + QDate::currentDate().toString("/yyyy-MM-dd")+QString("-op.log"); logFile.setFileName(currentFileName); if (logFile.exists()) { @@ -23,11 +27,29 @@ void UserOperationLog::init() { out.setDevice(&logFile); } +const char space = ' '; +QString addSpace(char* str) +{ + QString s; + + for (int i = 0; str[i]!='\0'; ++i) { + if (str[i]>='A' && str[i]<='Z' && i>0) + { + s.append(space); + s.append(str[i]); + } else{ + s.append(str[i]); + } + } + return s; +} + + QString getOperationName(UserOperation operation) { switch (operation) { #define ADD_OPERATION(name)\ - case name: return #name; + case name: return addSpace(#name); USER_OPERATIONS() #undef ADD_OPERATION default: @@ -44,11 +66,11 @@ void UserOperationLog::log(UserOperation operation, bool processing) { QString operationName = getOperationName(operation); AppGlobalValues::setInProcessing(processing); QString UserName = User::Current()->getUserCode().isEmpty()?"anonymous":User::Current()->getUserCode(); - out << now.toString(Qt::DateFormat::ISODateWithMs)<<"\t"<setStyleSheet(style); ui->setupUi(this);