Quellcode durchsuchen

feat: add homepage

YaoH vor 1 Monat
Ursprung
Commit
88891bad34
10 geänderte Dateien mit 199 neuen und 104 gelöschten Zeilen
  1. 4 3
      CMakeLists.txt
  2. 26 0
      backendapimanager.cpp
  3. 1 0
      backendapimanager.h
  4. 93 1
      homepage.cpp
  5. 6 2
      homepage.h
  6. 63 55
      homepage.ui
  7. 1 38
      login/loginwindow.cpp
  8. 3 2
      mainwindow.cpp
  9. 2 2
      mqtt/mqttclient.cpp
  10. 0 1
      registryManager/registrymanager.cpp

+ 4 - 3
CMakeLists.txt

@@ -24,8 +24,8 @@ else()
 endif()
 
 
-find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Gui Widgets Mqtt Sql Network WebEngineWidgets SerialPort)
-find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Gui Widgets  Mqtt Sql Network WebEngineWidgets SerialPort)  # 添加 Widgets
+find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Gui Widgets Mqtt Sql Network WebEngineWidgets SerialPort Charts)
+find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Gui Widgets  Mqtt Sql Network WebEngineWidgets SerialPort Charts)  # 添加 Widgets
 
 
 # 定义源文件列表
@@ -108,6 +108,7 @@ set(HEADERS
 
 # 定义 UI 文件列表
 set(FORMS
+    homepage.ui
     PageWidget.ui
     addresspage.ui
     blastProject/blastprojectpage.ui
@@ -158,7 +159,7 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
 )
 
 target_link_libraries(pc_system Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Gui
-    Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql  Qt${QT_VERSION_MAJOR}::Network
+    Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql  Qt${QT_VERSION_MAJOR}::Network Qt${QT_VERSION_MAJOR}::Charts
     Qt${QT_VERSION_MAJOR}::Mqtt Qt${QT_VERSION_MAJOR}::WebEngineWidgets OpenSSL::Crypto OpenSSL::SSL Qt${QT_VERSION_MAJOR}::SerialPort)
 
 include(GNUInstallDirs)

+ 26 - 0
backendapimanager.cpp

@@ -1,5 +1,7 @@
 #include "backendapimanager.h"
 
+#include <QtCore/qlogging.h>
+
 #include <QEventLoop>
 
 #include "logger.h"
@@ -134,6 +136,30 @@ QJsonArray backendAPIManager::getSysUsers() {
     return result;
 }
 
+QJsonArray backendAPIManager::getDailyBlastedCount(int days) {
+    if (!s_instance) return QJsonArray();
+
+    QJsonObject params;
+    params.insert("days", days);
+    QNetworkReply *reply = s_instance->sendRequest("blastrecord/daily_counts", params, "GET");
+
+    QEventLoop loop;
+    QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
+    loop.exec();
+
+    QJsonArray result;
+    if (reply->error() == QNetworkReply::NoError) {
+        QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
+        result = response.object()["data"].toArray();
+    } else {
+        Logger::getInstance().error(
+            QString("GetDailyBlastedCount request failed. error message: %1").arg(reply->errorString()));
+    }
+
+    reply->deleteLater();
+    return result;
+}
+
 QJsonArray backendAPIManager::getHAddresses() {
     if (!s_instance) return QJsonArray();
 

+ 1 - 0
backendapimanager.h

@@ -23,6 +23,7 @@ class backendAPIManager : public QObject {
     static bool uploadBlastEquipments(const QJsonObject &regDetsData);
     static QJsonArray getSysUsers();
     static QJsonArray getHAddresses();
+    static QJsonArray getDailyBlastedCount(int days);
     static QJsonObject getBlastRecords(int page, int pageSize, QJsonObject params);
 
    signals:

+ 93 - 1
homepage.cpp

@@ -1,7 +1,99 @@
 #include "homepage.h"
 
+#include <QDate>
+#include <QJsonArray>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QList>
+#include <QPainter>
+#include <QPair>
+#include <QtCharts/QBarCategoryAxis>
+#include <QtCharts/QBarSeries>
+#include <QtCharts/QBarSet>
+#include <QtCharts/QChart>
+#include <QtCharts/QChartView>
+#include <QtCharts/QValueAxis>
+
+#include "backendapimanager.h"
 #include "ui_homepage.h"
 
-Homepage::Homepage(QWidget *parent) : QWidget(parent), ui(new Ui::Homepage) { ui->setupUi(this); }
+Homepage::Homepage(QWidget *parent) : QWidget(parent), ui(new Ui::homepage) {
+    ui->setupUi(this);
+
+    QJsonArray dailyCount;
+    dailyCount = backendAPIManager::getDailyBlastedCount(15);
+
+    QDate today = QDate::currentDate();
+    QString dateTodayStr = QDate::currentDate().toString("yyyy-MM-dd");
 
+    QList<QPair<QDate, int>> data;
+    // 根据today,倒退15天,检查dailyCount中date是否和日期匹配,如果匹配设置数据,不匹配则设置0
+    for (int i = 0; i < 15; ++i) {
+        QDate date = today.addDays(-i);
+        QString dateStr = date.toString("yyyy-MM-dd");
+        bool found = false;
+
+        if (dailyCount[0].toObject().value("blast_at").toString() == dateStr) {
+            if (dateStr == dateTodayStr) {
+                m_todayCount = dailyCount[0].toObject().value("count").toInt();
+            }
+            data.append(qMakePair(date, dailyCount[0].toObject().value("count").toInt()));
+            dailyCount.removeFirst();  // 移除已处理的元素
+        } else {
+            data.append(qMakePair(date, 0));
+        }
+    }
+    draw(data);
+}
 Homepage::~Homepage() { delete ui; }
+
+void Homepage::draw(QList<QPair<QDate, int>> data) {
+    // 2. Bar Set and Series
+    QBarSet *set = new QBarSet("");
+    QStringList categories;
+    int totalCount = 0;
+    for (const auto &entry : data) {
+        *set << entry.second;
+        categories << entry.first.toString("MM-dd");
+        totalCount += entry.second;
+    }
+    if (totalCount == 0) {
+        set->setLabel("无爆破数据");
+    } else {
+        set->setLabel("总计: " + QString::number(totalCount));
+    }
+
+    QBarSeries *series = new QBarSeries();
+    series->append(set);
+    series->setLabelsVisible(true);
+
+    // 3. Create Chart
+    QChart *chart = new QChart();
+    chart->addSeries(series);
+    chart->setTitle("近15日已上传爆破数据统计");
+
+    // 4. X-axis (Category with Dates)
+    QBarCategoryAxis *axisX = new QBarCategoryAxis();
+    axisX->append(categories);
+    axisX->setTitleText("日期");
+    chart->addAxis(axisX, Qt::AlignBottom);
+    series->attachAxis(axisX);
+
+    // 5. Y-axis (Count)
+    QValueAxis *axisY = new QValueAxis();
+    axisY->setTitleText("数量");
+    axisY->setLabelFormat("%d");
+    chart->addAxis(axisY, Qt::AlignLeft);
+    series->attachAxis(axisY);
+
+    // 6. Show Chart
+    QChartView *chartView = new QChartView(chart);
+    chartView->setRenderHint(QPainter::Antialiasing);
+
+    // Add the chart view to the widget's layout
+    QVBoxLayout *layout = new QVBoxLayout(ui->chartWidget);
+    layout->addWidget(chartView);
+    ui->chartWidget->setLayout(layout);
+
+    ui->todayBlastCount->display(m_todayCount);
+}

+ 6 - 2
homepage.h

@@ -4,7 +4,7 @@
 #include <QWidget>
 
 namespace Ui {
-class Homepage;
+class homepage;
 }
 
 class Homepage : public QWidget {
@@ -14,8 +14,12 @@ class Homepage : public QWidget {
     explicit Homepage(QWidget *parent = nullptr);
     ~Homepage();
 
+    void draw(QList<QPair<QDate, int>> data);
+
    private:
-    Ui::Homepage *ui;
+    Ui::homepage *ui;
+
+    int m_todayCount = 0;  // 今日爆破数量
 };
 
 #endif  // HOMEPAGE_H

+ 63 - 55
homepage.ui

@@ -6,70 +6,78 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>1096</width>
-    <height>642</height>
+    <width>1132</width>
+    <height>800</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Form</string>
   </property>
-  <widget class="QWidget" name="verticalLayoutWidget">
-   <property name="geometry">
-    <rect>
-     <x>70</x>
-     <y>80</y>
-     <width>461</width>
-     <height>80</height>
-    </rect>
-   </property>
-   <layout class="QVBoxLayout" name="verticalLayout">
-    <item>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QFrame" name="searchBox">
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>50</height>
+      </size>
+     </property>
+     <property name="frameShape">
+      <enum>QFrame::Shape::StyledPanel</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Shadow::Raised</enum>
+     </property>
+     <widget class="QLCDNumber" name="todayBlastCount">
+      <property name="geometry">
+       <rect>
+        <x>130</x>
+        <y>10</y>
+        <width>111</width>
+        <height>31</height>
+       </rect>
+      </property>
+      <property name="frameShape">
+       <enum>QFrame::Shape::NoFrame</enum>
+      </property>
+     </widget>
      <widget class="QLabel" name="label">
+      <property name="geometry">
+       <rect>
+        <x>20</x>
+        <y>10</y>
+        <width>101</width>
+        <height>31</height>
+       </rect>
+      </property>
       <property name="text">
-       <string>今日爆破数:</string>
+       <string>    今日爆破: </string>
+      </property>
+      <property name="margin">
+       <number>0</number>
+      </property>
+      <property name="indent">
+       <number>-3</number>
       </property>
      </widget>
-    </item>
-   </layout>
-  </widget>
-  <widget class="QWidget" name="verticalLayoutWidget_2">
-   <property name="geometry">
-    <rect>
-     <x>539</x>
-     <y>79</y>
-     <width>381</width>
-     <height>81</height>
-    </rect>
-   </property>
-   <layout class="QVBoxLayout" name="verticalLayout_2">
-    <item>
-     <widget class="QLCDNumber" name="lcdNumber"/>
-    </item>
-   </layout>
-  </widget>
-  <widget class="QLabel" name="label_2">
-   <property name="geometry">
-    <rect>
-     <x>82</x>
-     <y>200</y>
-     <width>341</width>
-     <height>20</height>
-    </rect>
-   </property>
-   <property name="text">
-    <string>本周爆破数:</string>
-   </property>
-  </widget>
-  <widget class="QLCDNumber" name="lcdNumber_2">
-   <property name="geometry">
-    <rect>
-     <x>580</x>
-     <y>190</y>
-     <width>331</width>
-     <height>61</height>
-    </rect>
-   </property>
-  </widget>
+    </widget>
+   </item>
+   <item>
+    <widget class="QFrame" name="dataWidget">
+     <property name="frameShape">
+      <enum>QFrame::Shape::StyledPanel</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Shadow::Raised</enum>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_3">
+      <item>
+       <widget class="QWidget" name="chartWidget" native="true"/>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
  </widget>
  <resources/>
  <connections/>

+ 1 - 38
login/loginwindow.cpp

@@ -52,7 +52,6 @@ void LoginWindow::on_btnLogin_clicked() {
         jsonData["password"] = password;
         QJsonDocument doc(jsonData);
         QByteArray data = doc.toJson();
-        qDebug() << "Login request data:" << apiBackendUrl;
         QUrl fullUrl = apiBackendUrl.resolved(QUrl("login/pc"));  // 替换为实际的服务器接口地址
         QNetworkRequest request(fullUrl);                         // 替换为实际的服务器接口地址
         request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
@@ -105,45 +104,9 @@ void LoginWindow::on_btnLogin_clicked() {
                                 RegistryManager::instance()->setCurentLoginUserId(userIdStr);
                                 QString Authority = responseObj["currentAuthority"].toString();
                                 globalAuthority = "Bearer " + Authority;
+                                backendAPIManager::setAuthToken(globalAuthority);
                                 this->close();
                                 MainWindow *mainWindow = new MainWindow();
-                                backendAPIManager::setAuthToken(globalAuthority);
-
-                                /*TODO: delete test code
-                                QString jsonString =
-                                    "{\"app_version\":\"1.52\",\"blast_latitude\":\"30."
-                                    "21122186731856\",\"blast_longitude\":\"120.22146062951883\","
-                                    "\"blast_time\":\"2025-06-03 "
-                                    "12:00:00\",\"company_code\":\"3701234300003\",\"equipment_"
-                                    "sn\":\"F34A0000001\",\"error_deto_count\":\"0\",\"operator_"
-                                    "identity\":\"330781198509079292\",\"operator_name\":\"栋工\","
-                                    "\"phone\":\"18611112222\",\"project_htid\":\"\",\"project_"
-                                    "name\":\"sidf\",\"project_xmbh\":\"\",\"reg_deto_count\":"
-                                    "\"2\",\"regs\":[{\"after_test_bus_i\":\"41\",\"after_test_bus_"
-                                    "v\":\"8006\",\"before_blasting_i\":\"49\",\"before_blasting_"
-                                    "v\":\"13492\",\"bus_leakage_current_i\":\"0\",\"dets\":[{"
-                                    "\"delay_time\":\"0.0\",\"freq\":\"0\",\"in_code\":"
-                                    "\"005AC8360A4C01A7\",\"out_code\":\"2411104F18000\","
-                                    "\"status\":\"0x00\",\"tag\":\"1-1-1\",\"uid\":"
-                                    "\"24211104F18000\"},{\"delay_time\":\"80.0\",\"freq\":\"0\","
-                                    "\"in_code\":\"015AC8360A4C014E\",\"out_code\":"
-                                    "\"2411104F18001\",\"status\":\"0x00\",\"tag\":\"1-2-1\","
-                                    "\"uid\":\"24211104F18001\"}],\"equipment_sn\":\"null\","
-                                    "\"equipment_version\":\"null\",\"error_deto_count\":\"0\","
-                                    "\"net_charged_i\":\"49\",\"net_charged_v\":\"13501\",\"reg_"
-                                    "deto_count\":\"2\"}]}";
-                                QJsonObject myJsonObject =
-                                    QJsonDocument::fromJson(jsonString.toUtf8()).object();
-                                qDebug()
-                                    << "debug"
-                                    << QDateTime::fromString(myJsonObject["blast_time"].toString(),
-                                                             "yyyy-MM-dd hh:mm:ss")
-                                           .toString(Qt::ISODateWithMs);
-                                int row = 1;
-                                firingWidget *wt = new firingWidget(row, false, "111");
-                                wt->testonBlastSucess(myJsonObject);
-                                //<< Delete
-                                */
 
                                 QScreen *screen = QGuiApplication::primaryScreen();
                                 QRect screenGeometry = screen->geometry();

+ 3 - 2
mainwindow.cpp

@@ -25,8 +25,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
     try {
         this->setWindowFlags(Qt::FramelessWindowHint | Qt::Window);
         this->setWindowState(Qt::WindowMaximized);  // Maximizes the window
-
-        // this->setFixedSize(1360, 864);
+        this->setStyleSheet("QWidget { font-size: 16px; }");
+        this->setStyleSheet("QPushButton { font-size: 16px; }");
         ui->setupUi(this);
         LoadingWidget::init(ui->stackedWidget);
 
@@ -64,6 +64,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
         QMessageBox::critical(this, "Error", "Application crashed: Unknown exception");
         throw;
     }
+    this->switchPage(ui->btnHome);  // 默认显示首页
 }
 
 void MainWindow::updateProjectTitleLabel(const QString &newTitle) { ui->projectTitleLable->setText(newTitle); }

+ 2 - 2
mqtt/mqttclient.cpp

@@ -66,7 +66,7 @@ void MqttClient::subscribeToTopics(const QStringList &topics) {
 }
 
 void MqttClient::disconnectFromMqttBroker() {
-    Logger::getInstance().info("MQTT client disconnecting from broker" + _mqClient->state());
+    Logger::getInstance().info("MQTT client disconnecting from broker");
     if (_mqClient->state() == QMqttClient::Connected) {
         _mqClient->disconnectFromHost();
     }
@@ -115,7 +115,7 @@ void MqttClient::onStateChanged(QMqttClient::ClientState state) {
             Logger::getInstance().info("mqtt connected");
             break;
         default:
-            Logger::getInstance().info("mqtt other state" + state);
+            Logger::getInstance().info("mqtt other state: " + QString::number(static_cast<int>(state)));
             break;
     }
 }

+ 0 - 1
registryManager/registrymanager.cpp

@@ -31,7 +31,6 @@ bool RegistryManager::saveUserInfo(const QString &userId, const QString &usernam
     settings.setValue("Password", password);
     settings.setValue("Identity", identity);
     settings.setValue("CertName", certName);
-    qDebug() << "saved user info" << username << password << identity;
     settings.endGroup();
 
     if (settings.status() == QSettings::NoError) {