diff --git a/OfficeAssistant_msvc.VC.db b/OfficeAssistant_msvc.VC.db index afee156..9cbee02 100644 Binary files a/OfficeAssistant_msvc.VC.db and b/OfficeAssistant_msvc.VC.db differ diff --git a/OfficeAssistant_msvc/MyButton.cpp b/OfficeAssistant_msvc/MyButton.cpp index 3602c43..b9ecc60 100644 --- a/OfficeAssistant_msvc/MyButton.cpp +++ b/OfficeAssistant_msvc/MyButton.cpp @@ -1,86 +1,87 @@ -// -// Created by HW on 2023/07/26. -// -#define TEXT_SIZE 7 -#include "MyButton.h" -MyButton::MyButton(ButtonStruct &buttonStruct,int width,int height,QList *buttons,QWidget *parent) : QPushButton(parent) { - this->buttons=buttons; - this->width2=width; - this->height2=height; - this->text=buttonStruct.text; - this->url = buttonStruct.url; - this->logo=buttonStruct.image; - this->logo_cover = buttonStruct.image_cover; - QString style = "background-color:"; - style += buttonStruct.background_color; - style += ";border:none;"; - this->setStyleSheet(style); - this->text_color = buttonStruct.text_color; - this->text_cover_color = buttonStruct.text_cover_color; - this->checked = false; -} - -MyButton::~MyButton() { -} - -void MyButton::paintEvent(QPaintEvent *e) { - QPushButton::paintEvent(e); - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - int logo_width=width()/3; - int logo_x=width()/3; - int logo_y=(height()-logo_width)/3; - setContentsMargins(0,0,0,0); - QFont ft; - ft.setPixelSize(TEXT_SIZE); - //±ðÎÊÎÒΪɶ³Ë3£¬ÎÒÒ²²»ÖªµÀ - int text_x=(width()-TEXT_SIZE*text.length()*scale*3)/2; - int text_y=(logo_width+logo_y+10); - QRectF logo_rect(logo_x, logo_y, logo_width, logo_width); - QRectF text_rect(text_x,text_y, TEXT_SIZE*text.length()*scale*3,TEXT_SIZE*scale*3); - - if(checked){ - painter.setPen(text_cover_color); - painter.drawImage(logo_rect, *logo_cover); - painter.drawText(text_rect, Qt::AlignCenter, text); - } - else { - painter.setPen(text_color); - painter.drawImage(logo_rect, *logo); - painter.drawText(text_rect, Qt::AlignCenter, text); - } - -} -QSize MyButton::sizeHint() const { - return QSize(width2,height2); -} - -void MyButton::enterEvent(QEvent *event) { - QWidget::enterEvent(event); - checked = true; - update(); -} - -void MyButton::leaveEvent(QEvent *event) { - QWidget::leaveEvent(event); - checked = false; - update(); -} - -void MyButton::mousePressEvent(QMouseEvent *event) { - QPushButton::mousePressEvent(event); -} - -void MyButton::mouseReleaseEvent(QMouseEvent *event) { - QPushButton::mouseReleaseEvent(event); - for(auto button:*buttons){ - button->setChecked(false); - button->update(); - } - if(checked) - checked=false; - else - checked=true; - emit clicked1(text, url); -} - +// +// Created by HW on 2023/07/26. +// +#define TEXT_SIZE 7 +#include "MyButton.h" +MyButton::MyButton(ButtonStruct &buttonStruct,int width,int height,QList *buttons,QWidget *parent) : QPushButton(parent) { + this->buttons=buttons; + this->width2=width; + this->height2=height; + this->text=buttonStruct.text; + this->url = buttonStruct.url; + this->logo=buttonStruct.image; + this->logo_cover = buttonStruct.image_cover; + this->background_color = buttonStruct.background_color; + QString style = "background-color:"; + style += buttonStruct.background_color; + style += ";border:none;"; + this->setStyleSheet(style); + this->text_color = buttonStruct.text_color; + this->text_cover_color = buttonStruct.text_cover_color; + this->checked = false; +} + +MyButton::~MyButton() { +} + +void MyButton::paintEvent(QPaintEvent *e) { + QPushButton::paintEvent(e); + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + int logo_width=width()/3; + int logo_x=width()/3; + int logo_y=(height()-logo_width)/3; + setContentsMargins(0,0,0,0); + QFont ft; + ft.setPixelSize(TEXT_SIZE); + //±ðÎÊÎÒΪɶ³Ë3£¬ÎÒÒ²²»ÖªµÀ + int text_x=(width()-TEXT_SIZE*text.length()*scale*3)/2; + int text_y=(logo_width+logo_y+10); + QRectF logo_rect(logo_x, logo_y, logo_width, logo_width); + QRectF text_rect(text_x,text_y, TEXT_SIZE*text.length()*scale*3,TEXT_SIZE*scale*3); + + if(checked){ + painter.setPen(text_cover_color); + painter.drawImage(logo_rect, *logo_cover); + painter.drawText(text_rect, Qt::AlignCenter, text); + } + else { + painter.setPen(text_color); + painter.drawImage(logo_rect, *logo); + painter.drawText(text_rect, Qt::AlignCenter, text); + } + +} +QSize MyButton::sizeHint() const { + return QSize(width2,height2); +} + +void MyButton::enterEvent(QEvent *event) { + QWidget::enterEvent(event); + checked = true; + update(); +} + +void MyButton::leaveEvent(QEvent *event) { + QWidget::leaveEvent(event); + checked = false; + update(); +} + +void MyButton::mousePressEvent(QMouseEvent *event) { + QPushButton::mousePressEvent(event); +} + +void MyButton::mouseReleaseEvent(QMouseEvent *event) { + QPushButton::mouseReleaseEvent(event); + for(auto button:*buttons){ + button->setChecked(false); + button->update(); + } + if(checked) + checked=false; + else + checked=true; + emit clicked1(text, url); +} + diff --git a/OfficeAssistant_msvc/MyButton.h b/OfficeAssistant_msvc/MyButton.h index cce91fb..3b9934e 100644 --- a/OfficeAssistant_msvc/MyButton.h +++ b/OfficeAssistant_msvc/MyButton.h @@ -1,68 +1,69 @@ -// -// Created by HW on 2023/07/26. -// - -#ifndef OFFICEASSISTANT_MYBUTTON_H -#define OFFICEASSISTANT_MYBUTTON_H - -#include -#include -#include -#include -#include -#include "globalvariables.h" -#include "buttonstruct.h" - -class MyButton: public QPushButton{ -Q_OBJECT -signals: - void clicked1(QString text, QString url); -public: - MyButton(ButtonStruct &buttonStruct,int width,int height,QList *buttons,QWidget *parent=nullptr); - ~MyButton() override; - QString getText(){ - return text; - } - - QSize sizeHint() const override; - void setChecked(bool checked){ - this->checked=checked; - } - QSize getLogicalSize() const { - if(scale>=1.25){ - return QSize(width2,height2); - } - else{ - return QSize(width2,height2); - }; - } - void setSize(int width,int height,int logicalwidth,int logicalheight){ - this->width2=width; - this->height2=height; - this->logicalwidth=logicalwidth; - this->logicalheight=logicalheight; - } -protected: - void paintEvent(QPaintEvent *e) override; - void enterEvent(QEvent *event) override; - void leaveEvent(QEvent *event) override; - void mousePressEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; -private: - QColor text_color; - QColor text_cover_color; - QList *buttons; - QImage *logo; - QImage *logo_cover; - QVBoxLayout *layout; - QString text; - QString url; - int width2; - int height2; - int logicalwidth; - int logicalheight; - bool checked=false; -}; - - -#endif //OFFICEASSISTANT_MYBUTTON_H +// +// Created by HW on 2023/07/26. +// + +#ifndef OFFICEASSISTANT_MYBUTTON_H +#define OFFICEASSISTANT_MYBUTTON_H + +#include +#include +#include +#include +#include +#include "globalvariables.h" +#include "buttonstruct.h" + +class MyButton: public QPushButton{ +Q_OBJECT +signals: + void clicked1(QString text, QString url); +public: + MyButton(ButtonStruct &buttonStruct,int width,int height,QList *buttons,QWidget *parent=nullptr); + ~MyButton() override; + QString getText(){ + return text; + } + + QSize sizeHint() const override; + void setChecked(bool checked){ + this->checked=checked; + } + QSize getLogicalSize() const { + if(scale>=1.25){ + return QSize(width2,height2); + } + else{ + return QSize(width2,height2); + }; + } + void setSize(int width,int height,int logicalwidth,int logicalheight){ + this->width2=width; + this->height2=height; + this->logicalwidth=logicalwidth; + this->logicalheight=logicalheight; + } +protected: + void paintEvent(QPaintEvent *e) override; + void enterEvent(QEvent *event) override; + void leaveEvent(QEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; +private: + QColor text_color; + QColor text_cover_color; + QString background_color; + QList *buttons; + QImage *logo; + QImage *logo_cover; + QVBoxLayout *layout; + QString text; + QString url; + int width2; + int height2; + int logicalwidth; + int logicalheight; + bool checked=false; +}; + + +#endif //OFFICEASSISTANT_MYBUTTON_H diff --git a/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj b/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj index d599502..a676907 100644 --- a/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj +++ b/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj @@ -1,145 +1,145 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {A49230DF-A869-4AA1-8ACA-3C7322530E46} - QtVS_v304 - $(MSBuildProjectDirectory)\QtMsBuild - 8.1 - - - - Application - v140_xp - - - Application - v140_xp - - - - - - - 5.6.3_msvc2015 - core;gui;widgets;network - debug - - - 5.6.3_msvc2015 - core;gui;widgets - release - - - - - - - - - - - - - - - - - - - - - - $(ProjectDir)\$(Configuration);.\;%(AdditionalIncludeDirectories) - - - - - $(ProjectDir)\$(Configuration);.\;%(AdditionalIncludeDirectories) - - - - - true - true - ProgramDatabase - Disabled - MultiThreadedDebugDLL - - - Console - true - - - - - true - true - None - MaxSpeed - MultiThreadedDLL - - - Windows - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {A49230DF-A869-4AA1-8ACA-3C7322530E46} + QtVS_v304 + $(MSBuildProjectDirectory)\QtMsBuild + 8.1 + + + + Application + v140_xp + + + Application + v140_xp + + + + + + + 5.6.3_msvc2015 + core;gui;widgets;network + debug + + + 5.6.3_msvc2015 + core;gui;widgets + release + + + + + + + + + + + + + + + + + + + + + + $(ProjectDir)\$(Configuration);.\;%(AdditionalIncludeDirectories) + + + + + $(ProjectDir)\$(Configuration);.\;%(AdditionalIncludeDirectories) + + + + + true + true + ProgramDatabase + Disabled + MultiThreadedDebugDLL + + + Console + true + + + + + true + true + None + MaxSpeed + MultiThreadedDLL + + + Windows + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj.filters b/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj.filters index 07c050c..cf3df22 100644 --- a/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj.filters +++ b/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj.filters @@ -1,132 +1,132 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - qrc;rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {99349809-55BA-4b9d-BF79-8FDBB0286EB3} - ui - - - {639EADAA-A684-42e4-A9AD-28FC9BCB8F7C} - ts - - - - - Resource Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Form Files - - - Form Files - - - Form Files - - - Form Files - - - Form Files - - - Form Files - - - - - Resource Files - - - - - Resource Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {99349809-55BA-4b9d-BF79-8FDBB0286EB3} + ui + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + qrc;rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {639EADAA-A684-42e4-A9AD-28FC9BCB8F7C} + ts + + + + + Resource Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Form Files + + + Form Files + + + Form Files + + + Form Files + + + Form Files + + + Form Files + + + + + Resource Files + + + + + Resource Files + + \ No newline at end of file diff --git a/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj.user b/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj.user index 9add229..493b678 100644 --- a/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj.user +++ b/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj.user @@ -1,13 +1,13 @@ - - - - 79c86fb12b36dfa33d1a537c9af100b4c7928a9c - WindowsLocalDebugger - - - 2023-08-01T03:05:45.8140795Z - - - 2023-08-01T03:05:46.4588999Z - + + + + 79c86fb12b36dfa33d1a537c9af100b4c7928a9c + WindowsLocalDebugger + + + 2023-08-03T08:03:42.8435391Z + + + 2023-08-03T08:03:43.2818738Z + \ No newline at end of file diff --git a/OfficeAssistant_msvc/navbar.cpp b/OfficeAssistant_msvc/navbar.cpp index 181c6a4..e3e7add 100644 --- a/OfficeAssistant_msvc/navbar.cpp +++ b/OfficeAssistant_msvc/navbar.cpp @@ -1,228 +1,261 @@ -// -// Created by HW on 2023/07/26. -// - -// You may need to build the project (run Qt uic code generator) to get "ui_NavBar.h" resolved - -#include "navbar.h" -#include "ui_NavBar.h" -#include "config.h" -#include -#include -#include -#include "mainwindowlayout.h" -#include "globalvariables.h" -#ifdef _DEBUG -#pragma comment(lib, "Qt5Svgd.lib") -#else -#pragma comment(lib, "Qt5Svg.lib") -#endif -QString url_param; -NavBar::NavBar(ConfigResponse *configResponse, MainScreen *mainScreen,QWidget *parent) : - QWidget(parent), ui(new Ui::NavBar) { - ui->setupUi(this); - //this->setAttribute(Qt::WA_DeleteOnClose); - buffer = new QByteArray; - /*QString style = "background-color:"; - style += configResponse->basic.backgroud_color.toUpper(); - style += ";"; - setStyleSheet(style);*/ - //setStyleSheet("margin:0"); - setContentsMargins(0, 0, 0, 0); - if (configResponse->succeed&&configResponse->menus.empty()!=true) { - getLogoFromInternet(configResponse); - } - else { - getLogoFromLocal(); - } - layout2 = new QHBoxLayout; - layout_right = new QHBoxLayout; - layout_left = new QHBoxLayout; - logo_label = new QLabel(this); - //*logo = logo->scaled(this->width() / (5 / scale), this->height()); - logo_label->setScaledContents(true); - logo_label->setPixmap(QPixmap::fromImage(*logo)); - logo_label->setMaximumHeight(parent->height() / 8); - layout_left->addWidget(logo_label); - layout_left->setAlignment(Qt::AlignCenter); - for (auto buttonStruct : buttonStructs) { - MyButton *myButton = new MyButton(buttonStruct, height(), height(), &buttons,this); - myButton->setMaximumHeight(parent->height() / 8); - layout_right->addWidget(myButton); - //myButton->show(); - connect(myButton, &MyButton::clicked1, mainWindowLayout, &MainWindowLayout::clickButton); - buttons << myButton; - } - layout_right->setAlignment(Qt::AlignLeft); - if (!buttonStructs.empty()) { - connect(this, &NavBar::firstUrl, mainScreen, &MainScreen::firstUrl); - emit firstUrl(buttonStructs[0].url); - } - layout2->addLayout(layout_left, 1); - layout2->addLayout(layout_right, 4); - layout_right->setMargin(0); - layout2->setMargin(0); - //layout2->setAlignment(Qt::AlignJustify); - this->setLayout(layout2); - logo_label->show(); -} - -NavBar::~NavBar() { - for (auto buttonStruct : buttonStructs) { - delete buttonStruct.image; - delete buttonStruct.image_cover; - } - for(auto button : buttons){ - layout_right->removeWidget(button); - delete button; - } - layout2->removeWidget(logo_label); - delete logo_label; - delete logo; - //delete layout_left; - delete layout_right; - delete layout2; - delete ui; -} - -void NavBar::paintEvent(QPaintEvent *event) { - QWidget::paintEvent(event); - - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - - QRectF rect(0, 0, this->width(), this->height()); - painter.fillRect(rect, qColor); - -} -void NavBar::resizeEvent(QResizeEvent *event) { - QWidget::resizeEvent(event); - for(auto button:buttons){ - button->setMaximumSize(event->size().height(), event->size().height()); - button->update(); - } - logo_label->setMaximumSize(event->size().width() / 5, event->size().height()); -} -void NavBar::getLogoFromInternet(ConfigResponse *configResponse) { - qColor.setNamedColor(configResponse->basic.backgroud_color); - - QUrl url_logo(configResponse->basic.logo_url); - QNetworkRequest *request_logo = new QNetworkRequest(url_logo); - manager = new QNetworkAccessManager; - reply = manager->get(*request_logo); - QTimer timer; - timer.setInterval(5000); - connect(reply, &QNetworkReply::finished, &eventLoop,&QEventLoop::quit); - connect(&timer, &QTimer::timeout,this, &NavBar::cancelDownload); - eventLoop.exec(); - timer.stop(); - buffer = new QByteArray; - delete request_logo; - if (downloadSuccess == true) { - *buffer = reply->readAll(); - logo = new QImage(); - logo->loadFromData(*buffer); - buffer->clear(); - for (auto button : configResponse->menus) { - QUrl url_image(button.img); - QNetworkRequest *request_image = new QNetworkRequest(url_image); - reply = manager->get(*request_image); - QTimer timer; - timer.setInterval(5000); - connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); - connect(&timer, &QTimer::timeout, this, &NavBar::cancelDownload); - eventLoop.exec(); - timer.stop(); - if (!downloadSuccess) { - break; - } - *buffer = reply->readAll(); - QSvgRenderer *render_image = new QSvgRenderer(*buffer); - QImage *image = new QImage(200, 200, QImage::Format_ARGB32); - QPainter painter_image(image); - render_image->render(&painter_image); - - QUrl url_image_cover(button.img_cover); - QNetworkRequest *request_image_cover = new QNetworkRequest(url_image_cover); - reply = manager->get(*request_image_cover); - timer.setInterval(5000); - connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); - connect(&timer, &QTimer::timeout, this, &NavBar::cancelDownload); - if (!downloadSuccess) { - break; - } - *buffer = reply->readAll(); - QSvgRenderer *render_image_cover = new QSvgRenderer(*buffer); - QImage *image_cover = new QImage(200, 200, QImage::Format_ARGB32); - QPainter painter_image_cover(image_cover); - render_image_cover->render(&painter_image_cover); - ButtonStruct buttonStruct; - buttonStruct.image = image; - buttonStruct.image_cover = image_cover; - buttonStruct.text = button.title; - buttonStruct.url = button.url; - buttonStruct.background_color = configResponse->basic.backgroud_color; - buttonStruct.text_color.setNamedColor(configResponse->basic.title_color); - buttonStruct.text_cover_color.setNamedColor(configResponse->basic.title_cover_color); - buttonStructs << buttonStruct; - delete request_image; - delete render_image; - delete request_image_cover; - delete render_image_cover; - } - } - delete manager; - manager = nullptr; - -} -void NavBar::storeToBuffer() { - buffer = new QByteArray; - -} -void NavBar::cancelDownload() { - disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); - eventLoop.quit(); - reply->abort(); - downloadSuccess = false; -} - -void NavBar::getLogoFromLocal() { - QString dir = QApplication::applicationDirPath(); - QFile file(dir + DEFAULT_FILE); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QMessageBox::warning(nullptr, QString::fromLocal8Bit("´íÎó"), QString::fromLocal8Bit("ÎÞ·¨´ò¿ªÅäÖÃÎļþ")); - exit(1); - } - buffer->clear(); - *buffer = file.readAll(); - file.close(); - QJsonDocument *qJsonDocument = new QJsonDocument; - *qJsonDocument = QJsonDocument::fromJson(*buffer); - QJsonObject *obj_root = new QJsonObject; - if (qJsonDocument->isObject()) { - *obj_root = qJsonDocument->object(); - delete qJsonDocument; - QString logo_path = obj_root->value("basic").toObject().value("logo").toString(); - logo = new QImage(logo_path); - QString color= obj_root->value("basic").toObject().value("backgroud_color").toString(); - qColor.setNamedColor(color); - QJsonArray *array = new QJsonArray; - *array = obj_root->value("menu").toArray(); - for (auto obj : *array) { - ButtonStruct buttonStruct; - buttonStruct.text = obj.toObject().value("title").toString(); - buttonStruct.url = QString(BASE_URL)+obj.toObject().value("url").toString(); - buttonStruct.image = new QImage(obj.toObject().value("img").toString()); - buttonStruct.image_cover = new QImage(obj.toObject().value("img_cover").toString()); - buttonStructs << buttonStruct; - } - delete array; - } - else { - QMessageBox::warning(nullptr, QString::fromLocal8Bit("´íÎó"), QString::fromLocal8Bit("ÅäÖÃÎļþËð»µ")); - delete obj_root; - exit(1); - } - delete obj_root; - +// +// Created by HW on 2023/07/26. +// + +// You may need to build the project (run Qt uic code generator) to get "ui_NavBar.h" resolved + +#include "navbar.h" +#include "ui_NavBar.h" +#include "config.h" +#include +#include +#include +#include "mainwindowlayout.h" +#include "globalvariables.h" +#ifdef _DEBUG +#pragma comment(lib, "Qt5Svgd.lib") +#else +#pragma comment(lib, "Qt5Svg.lib") +#endif +QString url_param; +void ConvertImageToTransparent(QImage &img) +{ + img = img.convertToFormat(QImage::Format_ARGB32); + union myrgb + { + uint rgba; + uchar rgba_bits[4]; + }; + myrgb* mybits = (myrgb*)img.bits(); + int len = img.width()*img.height(); + while (len--> 0) + { + mybits->rgba_bits[3] = (mybits->rgba == 0xFFFFFFFF) ? 0 : 255; + mybits++; + } +} + +NavBar::NavBar(ConfigResponse *configResponse, MainScreen *mainScreen,QWidget *parent) : + QWidget(parent), ui(new Ui::NavBar) { + ui->setupUi(this); + //this->setAttribute(Qt::WA_DeleteOnClose); + buffer = new QByteArray; + /*QString style = "background-color:"; + style += configResponse->basic.backgroud_color.toUpper(); + style += ";"; + setStyleSheet(style);*/ + //setStyleSheet("margin:0"); + setContentsMargins(0, 0, 0, 0); + if (configResponse->succeed&&configResponse->menus.empty()!=true) { + getLogoFromInternet(configResponse); + } + else { + getLogoFromLocal(); + } + layout2 = new QHBoxLayout; + layout_right = new QHBoxLayout; + layout_left = new QHBoxLayout; + logo_label = new QLabel(this); + //*logo = logo->scaled(this->width() / (5 / scale), this->height()); + logo_label->setScaledContents(true); + logo_label->setPixmap(QPixmap::fromImage(*logo)); + logo_label->setMaximumHeight(parent->height() / 8); + layout_left->addWidget(logo_label); + layout_left->setAlignment(Qt::AlignCenter); + for (auto buttonStruct : buttonStructs) { + MyButton *myButton = new MyButton(buttonStruct, height(), height(), &buttons,this); + myButton->setMaximumHeight(parent->height() / 8); + layout_right->addWidget(myButton); + //myButton->show(); + connect(myButton, &MyButton::clicked1, mainWindowLayout, &MainWindowLayout::clickButton); + buttons << myButton; + } + layout_right->setAlignment(Qt::AlignLeft); + if (!buttonStructs.empty()) { + connect(this, &NavBar::firstUrl, mainScreen, &MainScreen::firstUrl); + emit firstUrl(buttonStructs[0].url); + } + layout2->addLayout(layout_left, 1); + layout2->addLayout(layout_right, 4); + layout_right->setMargin(0); + layout2->setMargin(0); + //layout2->setAlignment(Qt::AlignJustify); + this->setLayout(layout2); + logo_label->show(); +} + +NavBar::~NavBar() { + for (auto buttonStruct : buttonStructs) { + delete buttonStruct.image; + delete buttonStruct.image_cover; + } + for(auto button : buttons){ + layout_right->removeWidget(button); + delete button; + } + layout2->removeWidget(logo_label); + delete logo_label; + delete logo; + //delete layout_left; + delete layout_right; + delete layout2; + delete ui; +} + +void NavBar::paintEvent(QPaintEvent *event) { + QWidget::paintEvent(event); + + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + + QRectF rect(0, 0, this->width(), this->height()); + painter.fillRect(rect, qColor); + +} +void NavBar::resizeEvent(QResizeEvent *event) { + QWidget::resizeEvent(event); + for(auto button:buttons){ + button->setMaximumSize(event->size().height(), event->size().height()); + button->update(); + } + logo_label->setMaximumSize(event->size().width() / 5, event->size().height()); +} +void NavBar::getLogoFromInternet(ConfigResponse *configResponse) { + qColor.setNamedColor(configResponse->basic.backgroud_color); + + QUrl url_logo(configResponse->basic.logo_url); + QNetworkRequest *request_logo = new QNetworkRequest(url_logo); + manager = new QNetworkAccessManager; + reply = manager->get(*request_logo); + QTimer timer; + timer.setInterval(5000); + connect(reply, &QNetworkReply::finished, &eventLoop,&QEventLoop::quit); + connect(&timer, &QTimer::timeout,this, &NavBar::cancelDownload); + eventLoop.exec(); + timer.stop(); + buffer = new QByteArray; + delete request_logo; + reply->close(); + if (downloadSuccess == true) { + *buffer = reply->readAll(); + logo = new QImage(); + logo->loadFromData(*buffer); + buffer->clear(); + for (auto button : configResponse->menus) { + QUrl url_image(button.img); + QNetworkRequest *request_image = new QNetworkRequest(url_image); + reply = manager->get(*request_image); + QTimer timer; + timer.setInterval(5000); + connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); + connect(&timer, &QTimer::timeout, this, &NavBar::cancelDownload); + eventLoop.exec(); + timer.stop(); + if (!downloadSuccess) { + break; + } + *buffer = reply->readAll(); + + QSvgRenderer *render_image = new QSvgRenderer(*buffer); + + QImage *image = new QImage(200, 200, QImage::Format_ARGB32); + QPainter painter_image(image); + painter_image.setCompositionMode(QPainter::CompositionMode_Clear); // Çå³ý»­²¼ + painter_image.fillRect(rect(), Qt::transparent); // Ìî³ä͸Ã÷É« + painter_image.setCompositionMode(QPainter::CompositionMode_SourceOver); // »Ö¸´Ä¬ÈÏÖµ + render_image->render(&painter_image); + buffer->clear(); + reply->close(); + + QUrl url_image_cover(button.img_cover); + QNetworkRequest *request_image_cover = new QNetworkRequest(url_image_cover); + reply = manager->get(*request_image_cover); + timer.setInterval(5000); + connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); + connect(&timer, &QTimer::timeout, this, &NavBar::cancelDownload); + if (!downloadSuccess) { + break; + } + eventLoop.exec(); + *buffer = reply->readAll(); + qDebug() << *buffer; + QSvgRenderer *render_image_cover = new QSvgRenderer(*buffer); + QImage *image_cover = new QImage(200, 200, QImage::Format_ARGB32); + QPainter painter_image_cover(image_cover); + painter_image_cover.setCompositionMode(QPainter::CompositionMode_Clear); // Çå³ý»­²¼ + painter_image_cover.fillRect(rect(), Qt::transparent); // Ìî³ä͸Ã÷É« + painter_image_cover.setCompositionMode(QPainter::CompositionMode_SourceOver); // »Ö¸´Ä¬ÈÏÖµ + render_image_cover->render(&painter_image_cover); + buffer->clear(); + reply->close(); + + ButtonStruct buttonStruct; + buttonStruct.image = image; + buttonStruct.image_cover = image_cover; + buttonStruct.text = button.title; + buttonStruct.url = button.url; + buttonStruct.background_color = configResponse->basic.backgroud_color; + buttonStruct.text_color.setNamedColor(configResponse->basic.title_color); + buttonStruct.text_cover_color.setNamedColor(configResponse->basic.title_cover_color); + buttonStructs << buttonStruct; + delete request_image; + delete render_image; + delete request_image_cover; + delete render_image_cover; + } + } + delete manager; + manager = nullptr; + +} +void NavBar::storeToBuffer() { + buffer = new QByteArray; + +} +void NavBar::cancelDownload() { + disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); + eventLoop.quit(); + reply->abort(); + downloadSuccess = false; +} + +void NavBar::getLogoFromLocal() { + QString dir = QApplication::applicationDirPath(); + QFile file(dir + DEFAULT_FILE); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QMessageBox::warning(nullptr, QString::fromLocal8Bit("´íÎó"), QString::fromLocal8Bit("ÎÞ·¨´ò¿ªÅäÖÃÎļþ")); + exit(1); + } + buffer->clear(); + *buffer = file.readAll(); + file.close(); + QJsonDocument *qJsonDocument = new QJsonDocument; + *qJsonDocument = QJsonDocument::fromJson(*buffer); + QJsonObject *obj_root = new QJsonObject; + if (qJsonDocument->isObject()) { + *obj_root = qJsonDocument->object(); + delete qJsonDocument; + QString logo_path = obj_root->value("basic").toObject().value("logo").toString(); + logo = new QImage(logo_path); + QString color= obj_root->value("basic").toObject().value("backgroud_color").toString(); + qColor.setNamedColor(color); + QJsonArray *array = new QJsonArray; + *array = obj_root->value("menu").toArray(); + for (auto obj : *array) { + ButtonStruct buttonStruct; + buttonStruct.text = obj.toObject().value("title").toString(); + buttonStruct.url = QString(BASE_URL)+obj.toObject().value("url").toString(); + buttonStruct.image = new QImage(obj.toObject().value("img").toString()); + buttonStruct.image_cover = new QImage(obj.toObject().value("img_cover").toString()); + buttonStructs << buttonStruct; + } + delete array; + } + else { + QMessageBox::warning(nullptr, QString::fromLocal8Bit("´íÎó"), QString::fromLocal8Bit("ÅäÖÃÎļþËð»µ")); + delete obj_root; + exit(1); + } + delete obj_root; + } \ No newline at end of file diff --git a/OfficeAssistant_msvc/netio.cpp b/OfficeAssistant_msvc/netio.cpp index d39fe52..a7b7cd5 100644 --- a/OfficeAssistant_msvc/netio.cpp +++ b/OfficeAssistant_msvc/netio.cpp @@ -1,544 +1,574 @@ -// -// Created by HW on 2023/07/27. -// - -#include -#include -#include -#include -#include "netio.h" -#include "config.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "globalvariables.h" -#pragma comment(lib, "wbemuuid.lib") -#ifdef _DEBUG -#pragma comment(lib, "Qt5Networkd.lib") -#else -#pragma comment(lib, "Qt5Network.lib") -#endif -#pragma comment(lib,"comsuppw.lib") -//¶Áȡע²á±í»ñÈ¡MachineUUID - - -RequestBodyBase::RequestBodyBase(){ - wchar_t unix_time[65]={0}; - wsprintf(unix_time,L"%ld",std::time(0)); - QString request_id=QString::fromWCharArray(unix_time); - //´ò¿ªÅäÖÃÎļþ - QString dir=QApplication::applicationDirPath(); - QFile *infFile=new QFile(dir+"/config/information.kmd"); - if(!infFile->open(QIODevice::ReadOnly|QIODevice::Text)){ - QMessageBox::critical(nullptr,QString::fromLocal8Bit("´íÎó"), QString::fromLocal8Bit("ÎÞ·¨´ò¿ªÅäÖÃÎļþ")); - delete infFile; - exit(1); - } - //¶ÁÈ¡ÅäÖÃÎļþ - QByteArray bytes; - bytes=infFile->readAll(); - infFile->close(); - delete infFile; - //ת»¯Îªjson - qJsonDocument=QJsonDocument::fromJson(bytes); - if(qJsonDocument.isObject()){ - //¶ÁÈ¡Êý¾Ý£¬Ð´Èë¶ÔÓ¦×Ö¶Î - QJsonObject obj_root=qJsonDocument.object(); - if(obj_root.value("product")==QJsonValue::Undefined){ - QMessageBox::warning(nullptr, QString::fromLocal8Bit("´íÎó"), QString::fromLocal8Bit("ÅäÖÃÎļþËð»µ")); - exit(1); - } - product=obj_root.value("product").toString(); - if(obj_root.value("parter_id")==QJsonValue::Undefined){ - QMessageBox::warning(nullptr, QString::fromLocal8Bit("´íÎó"), QString::fromLocal8Bit("ÅäÖÃÎļþËð»µ")); - exit(1); - } - parter_id=obj_root.value("parter_id").toString(); - }else{ - //´¦Àí´íÎó - QMessageBox::warning(nullptr, QString::fromLocal8Bit("´íÎó"), QString::fromLocal8Bit("ÅäÖÃÎļþËð»µ")); - exit(1); - } - //»ñÈ¡²Ù×÷ϵͳ°æ±¾ - this->os="Windows"; - OSVERSIONINFOEX os; - os.dwOSVersionInfoSize=sizeof(os); - GetVersionEx((OSVERSIONINFO *)&os); - switch(os.dwMajorVersion){//Ö÷°æ±¾ºÅ - case 5: //²»¼æÈÝWindows 2000£¬Òò´Ë5.xÒ»¶¨ÊÇWindows XP - os_version="Windows XP"; - break; - case 6: - switch(os.dwMinorVersion){ //´Î°æ±¾ºÅ - case 0: - os_version="Windows Vista or Windows Server 2008"; - break; - case 1: - os_version="Windows 7 or Windows Server 2008 R2"; - break; - case 2: - os_version="Windows 8 or Windows Server 2012"; - break; - case 3: - os_version="Windows 8.1 or Windows Server 2012 R2"; - break; - default: - os_version="Unknown"; - } - case 10: //Õ⼸¸öϵͳ¶¼ÊÇ10.0 - os_version="Windows 10, Windows 11, Windows Server 2016 or Windows Server 2019"; - break; - default: - os_version="Unknown"; - } - this->release = RELEASE; - this->version = VERSION; - //¶ÁÈ¡MachineGUID²¢È¡MD5×÷Ϊdevice_id - QByteArray hash = QCryptographicHash::hash(getMachineGUID().toUtf8(), QCryptographicHash::Md5); - device_id = hash.toHex(); - //¼ÓÈëjsonÐòÁÐ - QJsonValue value = device_id; - QJsonObject obj_root = qJsonDocument.object(); - obj_root.insert("device_id", value); - QJsonValue version_json = this->version; - obj_root.insert("version", version_json); - QJsonValue release_json = this->release; - obj_root.insert("release", release_json); - qJsonDocument.setObject(obj_root); - QJsonValue os_json(this->os); - QJsonValue os_version_json(this->os_version); - QString key_hash = QCryptographicHash::hash(QString(KEY).toUtf8(), QCryptographicHash::Md5).toHex(); - QByteArray request_id_byte = request_id.toUtf8(); - QByteArray sign_byte= QCryptographicHash::hash(key_hash.toUtf8()+request_id_byte, QCryptographicHash::Md5); - sign = sign_byte.toHex(); - QJsonValue sign_json(sign); - QJsonValue requestId_json=QJsonValue(request_id); - obj_root=qJsonDocument.object(); - //²åÈërequest_id - obj_root.insert(QString::fromLocal8Bit("request_id"),requestId_json); - obj_root.insert(QString::fromLocal8Bit("os"), os_json); - obj_root.insert(QString::fromLocal8Bit("os_version"), os_version_json); - obj_root.insert(QString::fromLocal8Bit("sign"), sign_json); - qJsonDocument.setObject(obj_root); - url_param = "?"; - url_param += "product="; - url_param += product; - url_param += "&parter_id="; - url_param += parter_id; - url_param += "&os="; - url_param += this->os; - url_param += "&os_version="; - url_param += os_version; - url_param += "&device_id="; - url_param += device_id; - url_param += "&request_id="; - url_param += request_id; - url_param += "&version="; - url_param += version; - url_param += "&release="; - url_param += release; - url_param += "&sign="; - url_param += sign; - qDebug() << url_param; -} - - - -void ConfigRequest::sendRequest(ConfigResponse *configResponse) { - timer = new QTimer(this); - QNetworkAccessManager *httpMgr = new QNetworkAccessManager(); - QNetworkRequest requestInfo; - //HTTPÇëÇó - //ÇëÇóÍ· - QString url = CONFIG_URL; - requestInfo.setUrl(QUrl(CONFIG_URL)); - requestInfo.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json")); - //±£´æÏìÓ¦µÄ±äÁ¿ - reply = httpMgr->post(requestInfo,qJsonDocument.toJson()); - qDebug() << qJsonDocument.toJson(); - //¿ªÆôÒ»¸öÑ­»·£¬Ö±µ½³¬Ê±»òÕß»ñÈ¡µ½Êý¾ÝΪֹ - connect(reply,&QNetworkReply::finished, &eventLoop, &QEventLoop::quit); - //ÉèÖö¨Ê±Æ÷·ÀÖ¹³¬Ê± - connect(timer,&QTimer::timeout,this,&ConfigRequest::cancelDownload); - timer->start(5000); - //Æô¶¯Ñ­»· - eventLoop.exec(); - timer->stop(); - //delete httpMgr; - QJsonDocument result; - configResponse->succeed = false; - //memset(configResponse,0,sizeof(*configResponse)); - auto error = reply->error(); - //Èç¹ûûÓдíÎó - if(reply->error() == QNetworkReply::NoError) { - result = QJsonDocument::fromJson(reply->readAll()); - }else{ - //Èç¹ûÓдíÎó - configResponse->succeed=false; - //delete reply; - delete timer; - delete httpMgr; - return; - } - qDebug() << result.toJson(); - - //Èç¹ûÊý¾ÝÍêÕû - if(result.isObject()){ - QJsonObject obj_root=result.object(); - QJsonArray array; - - array = obj_root.value("data").toObject().value("menu").toArray(); - QJsonObject obj_basic = obj_root.value("data").toObject().value("basic").toObject(); - configResponse->basic.logo_url = obj_basic.value("logo").toString(); - configResponse->basic.device_id = obj_basic.value("device_id").toString(); - configResponse->basic.dev_id = obj_basic.value("dev_id").toString(); - configResponse->basic.token = obj_basic.value("token").toString(); - configResponse->basic.backgroud_color = obj_basic.value("backgroud_color").toString(); - configResponse->basic.title_color = obj_basic.value("title_color").toString(); - configResponse->basic.title_cover_color = obj_basic.value("title_cover_color").toString(); - auto i=0; - for(auto value:array){ - QJsonObject object=value.toObject(); - Menu menu; - menu.img=object.value("img").toString(); - menu.img_cover=object.value("img_cover").toString(); - menu.title=object.value("title").toString(); - menu.func=object.value("func").toString(); - menu.url=object.value("url").toString(); - configResponse->menus << menu; - i++; - } - configResponse->succeed = true; - }else{ - //Êý¾Ý²»ÍêÕû - configResponse->succeed=false; - //delete reply; - delete timer; - delete httpMgr; - return; - } - delete httpMgr; -} -void RequestBodyBase::cancelDownload() { - disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); - eventLoop.quit(); - reply->abort(); -} -void RequestBodyBase::sendRequest() { - timer = new QTimer(this); - QNetworkAccessManager *httpMgr = new QNetworkAccessManager(); - QNetworkRequest requestInfo; - //HTTPÇëÇó - //ÇëÇóÍ· - requestInfo.setUrl(QUrl(OP_URL)); - requestInfo.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json")); - //±£´æÏìÓ¦µÄ±äÁ¿ - reply = httpMgr->post(requestInfo,qJsonDocument.toJson()); - //¿ªÆôÒ»¸öÑ­»·£¬Ö±µ½³¬Ê±»òÕß»ñÈ¡µ½Êý¾ÝΪֹ - connect(reply,&QNetworkReply::finished, this, &RequestBodyBase::cancelDownload); - //ÉèÖö¨Ê±Æ÷·ÀÖ¹³¬Ê± - connect(timer,&QTimer::timeout,&eventLoop,&QEventLoop::quit); - timer->start(5000); - //Æô¶¯Ñ­»· - eventLoop.exec(); - delete timer; - delete httpMgr; - delete reply; -} - - -DeviceRequest::DeviceRequest() : RequestBodyBase() { - //CPU - QString cpu = QSysInfo::currentCpuArchitecture(); - //ÄÚ´æ´óС - MEMORYSTATUSEX status; - status.dwLength = sizeof(status); - GlobalMemoryStatusEx(&status); - int ram = status.ullTotalPhys / 1024 / 1024; - //Ó²ÅÌ´óС - QStorageInfo storage = QStorageInfo::root(); - int disk = storage.bytesTotal() / static_cast(1024 * 1024 * 1024); - //ÏÔ¿¨ÐͺŠ- QStringList gpus; - BOOL success; - DWORD deviceIndex = 0; - DISPLAY_DEVICE displayDevice; - displayDevice.cb = sizeof(displayDevice); - while (EnumDisplayDevices(NULL, deviceIndex, &displayDevice, 0)) { - WCHAR valueName[128]; - DWORD valueSize; - DWORD valueType; - BYTE valueData[MAX_PATH]; - HKEY hKey; - WCHAR keyName[128]; - wsprintf(keyName, L"SYSTEM\\CurrentControlSet\\Control\\Video\\%s\\HardwareInformation", - displayDevice.DeviceID); - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { - valueSize = sizeof(valueData); - wsprintf(valueName, L"HardwareInformation.AdapterString"); - if (RegQueryValueEx(hKey, valueName, NULL, &valueType, valueData, &valueSize) == ERROR_SUCCESS) { - Q_ASSERT(valueType == REG_SZ); - QString adapterString = QString::fromWCharArray((wchar_t *) valueData, valueSize / sizeof(wchar_t) - 1); - gpus.append(adapterString); - } - RegCloseKey(hKey); - } - deviceIndex++; - displayDevice.cb = sizeof(displayDevice); - } - //Ö÷°åÐͺŠ- QString motherboard = QSysInfo::prettyProductName(); - //WMI»ñÈ¡Íø¿¨ÐͺŠ- HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED); - if (FAILED(hr)) { - std::cerr << "Failed to initialize COM library." << std::endl; - return; - } - QStringList netCards; - hr = CoInitializeSecurity( - NULL, - -1, - NULL, - NULL, - RPC_C_AUTHN_LEVEL_DEFAULT, - RPC_C_IMP_LEVEL_IMPERSONATE, - NULL, - EOAC_NONE, - NULL - ); - if (FAILED(hr)) { - std::cerr << "Failed to initialize security." << std::endl; - CoUninitialize(); - return; - } - - IWbemLocator* pLoc = NULL; - hr = CoCreateInstance( - CLSID_WbemLocator, - NULL, - CLSCTX_INPROC_SERVER, - IID_IWbemLocator, - (LPVOID*)&pLoc - ); - if (FAILED(hr)) { - std::cerr << "Failed to create IWbemLocator object." << std::endl; - CoUninitialize(); - return; - } - - IWbemServices* pSvc = NULL; - hr = pLoc->ConnectServer( - _bstr_t(L"ROOT\\CIMV2"), - NULL, - NULL, - 0, - NULL, - 0, - 0, - &pSvc - ); - if (FAILED(hr)) { - std::cerr << "Failed to connect to WMI service." << std::endl; - pLoc->Release(); - CoUninitialize(); - return; - } - - hr = CoSetProxyBlanket( - pSvc, - RPC_C_AUTHN_WINNT, - RPC_C_AUTHZ_NONE, - NULL, - RPC_C_AUTHN_LEVEL_CALL, - RPC_C_IMP_LEVEL_IMPERSONATE, - NULL, - EOAC_NONE - ); - if (FAILED(hr)) { - std::cerr << "Failed to set security blanket." << std::endl; - pSvc->Release(); - pLoc->Release(); - CoUninitialize(); - return; - } - - IEnumWbemClassObject* pEnumerator = NULL; - hr = pSvc->ExecQuery( - _bstr_t("WQL"), - _bstr_t("SELECT * FROM Win32_NetworkAdapter WHERE PhysicalAdapter = TRUE AND NetConnectionStatus = 3"), - WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, - NULL, - &pEnumerator - ); - if (FAILED(hr)) { - std::cerr << "Failed to execute WQL query for Win32_NetworkAdapter." << std::endl; - pSvc->Release(); - pLoc->Release(); - CoUninitialize(); - return; - } - IWbemClassObject* pClassObj = NULL; - ULONG uReturn = 0; - while (pEnumerator) { - hr = pEnumerator->Next(WBEM_INFINITE, 1, &pClassObj, &uReturn); - if (uReturn == 0) { - break; - } - - VARIANT vtProp; - hr = pClassObj->Get(L"Caption", 0, &vtProp, 0, 0); - if (SUCCEEDED(hr)) { - QString str=QString::fromWCharArray(vtProp.bstrVal); - VariantClear(&vtProp); - netCards.append(str); - } - - pClassObj->Release(); - } - //WMI»ñÈ¡Éù¿¨ÐͺŠ- hr = pSvc->ExecQuery( - _bstr_t("WQL"), - _bstr_t("SELECT * FROM Win32_SoundDevice"), - WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, - NULL, - &pEnumerator - ); - if (FAILED(hr)) { - std::cerr << "Failed to execute WQL query for Win32_SoundDevice." << std::endl; - pSvc->Release(); - pLoc->Release(); - CoUninitialize(); - return; - } - QStringList audioCards; - while (pEnumerator) { - hr = pEnumerator->Next(WBEM_INFINITE, 1, &pClassObj, &uReturn); - if (uReturn == 0) { - break; - } - - VARIANT vtProp; - hr = pClassObj->Get(L"Name", 0, &vtProp, 0, 0); - if (SUCCEEDED(hr)) { - QString str=QString::fromWCharArray(vtProp.bstrVal); - VariantClear(&vtProp); - audioCards.append(str); - } - - pClassObj->Release(); - } - hr = pSvc->ExecQuery( - bstr_t("WQL"), - bstr_t("SELECT * FROM Win32_PhysicalMemory"), - WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, - NULL, - &pEnumerator - ); - if (FAILED(hr)) - { - std::cout << "Query failed. Error code: " << hr << std::endl; - pSvc->Release(); - pLoc->Release(); - CoUninitialize(); - return; - } - QStringList RAMModel; - while (pEnumerator) - { - hr = pEnumerator->Next(WBEM_INFINITE, 1, &pClassObj, &uReturn); - if (uReturn == 0) - { - break; - } - - VARIANT vtProp; - hr = pClassObj->Get(L"Manufacturer", 0, &vtProp, 0, 0); - if (SUCCEEDED(hr)) - { - std::wcout << "Manufacturer: " << vtProp.bstrVal << std::endl; - VariantClear(&vtProp); - } - - hr = pClassObj->Get(L"PartNumber", 0, &vtProp, 0, 0); - if (SUCCEEDED(hr)) - { - RAMModel.append(QString::fromWCharArray(vtProp.bstrVal)); - VariantClear(&vtProp); - } - - pClassObj->Release(); - } - pSvc->Release(); - pLoc->Release(); - CoUninitialize(); - DISPLAY_DEVICE d = { sizeof(DISPLAY_DEVICE) }; - ::EnumDisplayDevices(NULL, 0, &d, 0); - QString monitor=QString::fromWCharArray(d.DeviceString, wcslen(d.DeviceString)); - //·¢ËÍ - //¹¹ÔìJSON - QJsonDocument *device=new QJsonDocument; - QJsonObject *object=new QJsonObject; - object->insert("CPU",QJsonValue(cpu)); - object->insert("RAM",QJsonValue(ram)); - object->insert("Hard_Disk",QJsonValue(disk)); - QJsonArray *gpu_array=new QJsonArray; - for(auto gpu:gpus) { - gpu_array->append(gpu); - } - object->insert("GPU",*gpu_array); - delete gpu_array; - object->insert("Mother_Board",motherboard); - QJsonArray *RAMModel_json=new QJsonArray; - for(auto RAM:RAMModel){ - RAMModel_json->append(RAM); - } - object->insert("Net_Card",*RAMModel_json); - delete RAMModel_json; - QJsonArray *netCards_json=new QJsonArray; - for(auto netCard:netCards){ - netCards_json->append(netCard); - } - object->insert("Net_Card",*netCards_json); - delete netCards_json; - QJsonArray *audioCards_json=new QJsonArray; - for(auto audioCard:audioCards){ - audioCards_json->append(audioCard); - } - object->insert("Audio_Card",*audioCards_json); - delete audioCards_json; - object->insert("Monitor",monitor); - device->setObject(*object); - delete object; - QJsonObject obj_root=qJsonDocument.object(); - obj_root.insert("data",QString(device->toJson())); - delete device; - qJsonDocument.setObject(obj_root); - timer = new QTimer(this); - QNetworkAccessManager *httpMgr = new QNetworkAccessManager(); - QNetworkRequest requestInfo; - //HTTPÇëÇó - //ÇëÇóÍ· - requestInfo.setUrl(QUrl(DEVICE_URL)); - requestInfo.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json")); - //±£´æÏìÓ¦µÄ±äÁ¿ - reply = httpMgr->post(requestInfo,qJsonDocument.toJson()); - //¿ªÆôÒ»¸öÑ­»·£¬Ö±µ½³¬Ê±»òÕß»ñÈ¡µ½Êý¾ÝΪֹ - connect(reply,&QNetworkReply::finished, &eventLoop, &QEventLoop::quit); - //ÉèÖö¨Ê±Æ÷·ÀÖ¹³¬Ê± - connect(timer,&QTimer::timeout,this,&DeviceRequest::cancelDownload); - timer->start(5000); - //Æô¶¯Ñ­»· - eventLoop.exec(); - delete httpMgr; -} +// +// Created by HW on 2023/07/27. +// + +#include +#include +#include +#include +#include "netio.h" +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "globalvariables.h" +#pragma comment(lib, "wbemuuid.lib") +#ifdef _DEBUG +#pragma comment(lib, "Qt5Networkd.lib") +#else +#pragma comment(lib, "Qt5Network.lib") +#endif +#pragma comment(lib,"comsuppw.lib") +//¶Áȡע²á±í»ñÈ¡MachineUUID +bool IsWin11AndLater() +{ + + //Windows 10 ´ÓÄÚ²¿°æ±¾ 10240 ¿ªÊ¼£¬ÒÔÄÚ²¿°æ±¾ 19044 ½áÊø¡£Windows 11 ´ÓÄÚ²¿°æ±¾ 22000 ¿ªÊ¼£¬ÄÇô£º + //Environment.OSVersion.Version.Build >= 22000; + NTSTATUS(WINAPI * RtlGetVersion)(LPOSVERSIONINFOEXW); + OSVERSIONINFOEXW osInfo; + *(FARPROC*)&RtlGetVersion = GetProcAddress(GetModuleHandleA("ntdll"), "RtlGetVersion"); + if (NULL != RtlGetVersion) + { + osInfo.dwOSVersionInfoSize = sizeof(osInfo); + RtlGetVersion(&osInfo); + + return (osInfo.dwMajorVersion >= 10 && osInfo.dwBuildNumber >= 22000); + } + + return false; +} +RequestBodyBase::RequestBodyBase(){ + wchar_t unix_time[65]={0}; + wsprintf(unix_time,L"%ld",std::time(0)); + QString request_id=QString::fromWCharArray(unix_time); + //´ò¿ªÅäÖÃÎļþ + QString dir=QApplication::applicationDirPath(); + QFile *infFile=new QFile(dir+"/config/information.kmd"); + if(!infFile->open(QIODevice::ReadOnly|QIODevice::Text)){ + QMessageBox::critical(nullptr,QString::fromLocal8Bit("´íÎó"), QString::fromLocal8Bit("ÎÞ·¨´ò¿ªÅäÖÃÎļþ")); + delete infFile; + exit(1); + } + //¶ÁÈ¡ÅäÖÃÎļþ + QByteArray bytes; + bytes=infFile->readAll(); + infFile->close(); + delete infFile; + //ת»¯Îªjson + qJsonDocument=QJsonDocument::fromJson(bytes); + if(qJsonDocument.isObject()){ + //¶ÁÈ¡Êý¾Ý£¬Ð´Èë¶ÔÓ¦×Ö¶Î + QJsonObject obj_root=qJsonDocument.object(); + if(obj_root.value("product")==QJsonValue::Undefined){ + QMessageBox::warning(nullptr, QString::fromLocal8Bit("´íÎó"), QString::fromLocal8Bit("ÅäÖÃÎļþËð»µ")); + exit(1); + } + product=obj_root.value("product").toString(); + if(obj_root.value("parter_id")==QJsonValue::Undefined){ + QMessageBox::warning(nullptr, QString::fromLocal8Bit("´íÎó"), QString::fromLocal8Bit("ÅäÖÃÎļþËð»µ")); + exit(1); + } + parter_id=obj_root.value("parter_id").toString(); + }else{ + //´¦Àí´íÎó + QMessageBox::warning(nullptr, QString::fromLocal8Bit("´íÎó"), QString::fromLocal8Bit("ÅäÖÃÎļþËð»µ")); + exit(1); + } + //»ñÈ¡²Ù×÷ϵͳ°æ±¾ + this->os="Windows"; + OSVERSIONINFOEXW os; + os.dwOSVersionInfoSize=sizeof(os); + GetVersionEx((OSVERSIONINFO *)&os); + NTSTATUS(WINAPI * RtlGetVersion)(LPOSVERSIONINFOEXW); + *(FARPROC*)&RtlGetVersion = GetProcAddress(GetModuleHandleA("ntdll"), "RtlGetVersion"); + if (RtlGetVersion != nullptr) { + RtlGetVersion(&os); + switch (os.dwMajorVersion) {//Ö÷°æ±¾ºÅ + case 5: //²»¼æÈÝWindows 2000£¬Òò´Ë5.xÒ»¶¨ÊÇWindows XP + os_version = "Windows XP"; + break; + case 6: + switch (os.dwMinorVersion) { //´Î°æ±¾ºÅ + case 0: + os_version = "Windows Vista or Windows Server 2008"; + break; + case 1: + os_version = "Windows 7 or Windows Server 2008 R2"; + break; + case 2: + os_version = "Windows 8 or Windows Server 2012"; + break; + case 3: + os_version = "Windows 8.1 or Windows Server 2012 R2"; + break; + default: + os_version = "Unknown"; + } + case 10: //Õ⼸¸öϵͳ¶¼ÊÇ10.0 + if (IsWin11AndLater()) { + os_version = "Windows 11 or Windows Server 2022"; + } + else { + os_version = "Windows 10, Windows Server 2016 or Windows Server 2019"; + } + break; + default: + os_version = "Unknown"; + } + } + else { + os_version = "Unknown"; + } + + this->release = RELEASE; + this->version = VERSION; + //¶ÁÈ¡MachineGUID²¢È¡MD5×÷Ϊdevice_id + QByteArray hash = QCryptographicHash::hash(getMachineGUID().toUtf8(), QCryptographicHash::Md5); + device_id = hash.toHex(); + //¼ÓÈëjsonÐòÁÐ + QJsonValue value = device_id; + QJsonObject obj_root = qJsonDocument.object(); + obj_root.insert("device_id", value); + QJsonValue version_json = this->version; + obj_root.insert("version", version_json); + QJsonValue release_json = this->release; + obj_root.insert("release", release_json); + qJsonDocument.setObject(obj_root); + QJsonValue os_json(this->os); + QJsonValue os_version_json(this->os_version); + QString key_hash = QCryptographicHash::hash(QString(KEY).toUtf8(), QCryptographicHash::Md5).toHex(); + QByteArray request_id_byte = request_id.toUtf8(); + QByteArray sign_byte= QCryptographicHash::hash(key_hash.toUtf8()+request_id_byte, QCryptographicHash::Md5); + sign = sign_byte.toHex(); + QJsonValue sign_json(sign); + QJsonValue requestId_json=QJsonValue(request_id); + obj_root=qJsonDocument.object(); + //²åÈërequest_id + obj_root.insert(QString::fromLocal8Bit("request_id"),requestId_json); + obj_root.insert(QString::fromLocal8Bit("os"), os_json); + obj_root.insert(QString::fromLocal8Bit("os_version"), os_version_json); + obj_root.insert(QString::fromLocal8Bit("sign"), sign_json); + qJsonDocument.setObject(obj_root); + url_param = "?"; + url_param += "product="; + url_param += product; + url_param += "&parter_id="; + url_param += parter_id; + url_param += "&os="; + url_param += this->os; + url_param += "&os_version="; + url_param += os_version; + url_param += "&device_id="; + url_param += device_id; + url_param += "&request_id="; + url_param += request_id; + url_param += "&version="; + url_param += version; + url_param += "&release="; + url_param += release; + url_param += "&sign="; + url_param += sign; + qDebug() << url_param; +} + + + +void ConfigRequest::sendRequest(ConfigResponse *configResponse) { + timer = new QTimer(this); + QNetworkAccessManager *httpMgr = new QNetworkAccessManager(); + QNetworkRequest requestInfo; + //HTTPÇëÇó + //ÇëÇóÍ· + QString url = CONFIG_URL; + requestInfo.setUrl(QUrl(CONFIG_URL)); + requestInfo.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json")); + //±£´æÏìÓ¦µÄ±äÁ¿ + reply = httpMgr->post(requestInfo,qJsonDocument.toJson()); + qDebug() << qJsonDocument.toJson(); + //¿ªÆôÒ»¸öÑ­»·£¬Ö±µ½³¬Ê±»òÕß»ñÈ¡µ½Êý¾ÝΪֹ + connect(reply,&QNetworkReply::finished, &eventLoop, &QEventLoop::quit); + //ÉèÖö¨Ê±Æ÷·ÀÖ¹³¬Ê± + connect(timer,&QTimer::timeout,this,&ConfigRequest::cancelDownload); + timer->start(5000); + //Æô¶¯Ñ­»· + eventLoop.exec(); + timer->stop(); + //delete httpMgr; + QJsonDocument result; + configResponse->succeed = false; + //memset(configResponse,0,sizeof(*configResponse)); + auto error = reply->error(); + //Èç¹ûûÓдíÎó + if(reply->error() == QNetworkReply::NoError) { + result = QJsonDocument::fromJson(reply->readAll()); + }else{ + //Èç¹ûÓдíÎó + configResponse->succeed=false; + //delete reply; + delete timer; + delete httpMgr; + return; + } + qDebug() << result.toJson(); + + //Èç¹ûÊý¾ÝÍêÕû + if(result.isObject()){ + QJsonObject obj_root=result.object(); + QJsonArray array; + + array = obj_root.value("data").toObject().value("menu").toArray(); + QJsonObject obj_basic = obj_root.value("data").toObject().value("basic").toObject(); + configResponse->basic.logo_url = obj_basic.value("logo").toString(); + configResponse->basic.device_id = obj_basic.value("device_id").toString(); + configResponse->basic.dev_id = obj_basic.value("dev_id").toString(); + configResponse->basic.token = obj_basic.value("token").toString(); + configResponse->basic.backgroud_color = obj_basic.value("backgroud_color").toString(); + configResponse->basic.title_color = obj_basic.value("title_color").toString(); + configResponse->basic.title_cover_color = obj_basic.value("title_cover_color").toString(); + auto i=0; + for(auto value:array){ + QJsonObject object=value.toObject(); + Menu menu; + menu.img=object.value("img").toString(); + menu.img_cover=object.value("img_cover").toString(); + menu.title=object.value("title").toString(); + menu.func=object.value("func").toString(); + menu.url=object.value("url").toString(); + configResponse->menus << menu; + i++; + } + configResponse->succeed = true; + }else{ + //Êý¾Ý²»ÍêÕû + configResponse->succeed=false; + //delete reply; + delete timer; + delete httpMgr; + return; + } + delete httpMgr; +} +void RequestBodyBase::cancelDownload() { + disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit); + eventLoop.quit(); + reply->abort(); +} +void RequestBodyBase::sendRequest() { + timer = new QTimer(this); + QNetworkAccessManager *httpMgr = new QNetworkAccessManager(); + QNetworkRequest requestInfo; + //HTTPÇëÇó + //ÇëÇóÍ· + requestInfo.setUrl(QUrl(OP_URL)); + requestInfo.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json")); + //±£´æÏìÓ¦µÄ±äÁ¿ + reply = httpMgr->post(requestInfo,qJsonDocument.toJson()); + //¿ªÆôÒ»¸öÑ­»·£¬Ö±µ½³¬Ê±»òÕß»ñÈ¡µ½Êý¾ÝΪֹ + connect(reply,&QNetworkReply::finished, this, &RequestBodyBase::cancelDownload); + //ÉèÖö¨Ê±Æ÷·ÀÖ¹³¬Ê± + connect(timer,&QTimer::timeout,&eventLoop,&QEventLoop::quit); + timer->start(5000); + //Æô¶¯Ñ­»· + eventLoop.exec(); + delete timer; + delete httpMgr; + delete reply; +} + + +DeviceRequest::DeviceRequest() : RequestBodyBase() { + //CPU + QString cpu = QSysInfo::currentCpuArchitecture(); + //ÄÚ´æ´óС + MEMORYSTATUSEX status; + status.dwLength = sizeof(status); + GlobalMemoryStatusEx(&status); + int ram = status.ullTotalPhys / 1024 / 1024; + //Ó²ÅÌ´óС + QStorageInfo storage = QStorageInfo::root(); + int disk = storage.bytesTotal() / static_cast(1024 * 1024 * 1024); + //ÏÔ¿¨ÐͺŠ+ QStringList gpus; + BOOL success; + DWORD deviceIndex = 0; + DISPLAY_DEVICE displayDevice; + displayDevice.cb = sizeof(displayDevice); + while (EnumDisplayDevices(NULL, deviceIndex, &displayDevice, 0)) { + WCHAR valueName[128]; + DWORD valueSize; + DWORD valueType; + BYTE valueData[MAX_PATH]; + HKEY hKey; + WCHAR keyName[128]; + wsprintf(keyName, L"SYSTEM\\CurrentControlSet\\Control\\Video\\%s\\HardwareInformation", + displayDevice.DeviceID); + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { + valueSize = sizeof(valueData); + wsprintf(valueName, L"HardwareInformation.AdapterString"); + if (RegQueryValueEx(hKey, valueName, NULL, &valueType, valueData, &valueSize) == ERROR_SUCCESS) { + Q_ASSERT(valueType == REG_SZ); + QString adapterString = QString::fromWCharArray((wchar_t *) valueData, valueSize / sizeof(wchar_t) - 1); + gpus.append(adapterString); + } + RegCloseKey(hKey); + } + deviceIndex++; + displayDevice.cb = sizeof(displayDevice); + } + //Ö÷°åÐͺŠ+ QString motherboard = QSysInfo::prettyProductName(); + //WMI»ñÈ¡Íø¿¨ÐͺŠ+ HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED); + if (FAILED(hr)) { + std::cerr << "Failed to initialize COM library." << std::endl; + return; + } + QStringList netCards; + hr = CoInitializeSecurity( + NULL, + -1, + NULL, + NULL, + RPC_C_AUTHN_LEVEL_DEFAULT, + RPC_C_IMP_LEVEL_IMPERSONATE, + NULL, + EOAC_NONE, + NULL + ); + if (FAILED(hr)) { + std::cerr << "Failed to initialize security." << std::endl; + CoUninitialize(); + return; + } + + IWbemLocator* pLoc = NULL; + hr = CoCreateInstance( + CLSID_WbemLocator, + NULL, + CLSCTX_INPROC_SERVER, + IID_IWbemLocator, + (LPVOID*)&pLoc + ); + if (FAILED(hr)) { + std::cerr << "Failed to create IWbemLocator object." << std::endl; + CoUninitialize(); + return; + } + + IWbemServices* pSvc = NULL; + hr = pLoc->ConnectServer( + _bstr_t(L"ROOT\\CIMV2"), + NULL, + NULL, + 0, + NULL, + 0, + 0, + &pSvc + ); + if (FAILED(hr)) { + std::cerr << "Failed to connect to WMI service." << std::endl; + pLoc->Release(); + CoUninitialize(); + return; + } + + hr = CoSetProxyBlanket( + pSvc, + RPC_C_AUTHN_WINNT, + RPC_C_AUTHZ_NONE, + NULL, + RPC_C_AUTHN_LEVEL_CALL, + RPC_C_IMP_LEVEL_IMPERSONATE, + NULL, + EOAC_NONE + ); + if (FAILED(hr)) { + std::cerr << "Failed to set security blanket." << std::endl; + pSvc->Release(); + pLoc->Release(); + CoUninitialize(); + return; + } + + IEnumWbemClassObject* pEnumerator = NULL; + hr = pSvc->ExecQuery( + _bstr_t("WQL"), + _bstr_t("SELECT * FROM Win32_NetworkAdapter WHERE PhysicalAdapter = TRUE AND NetConnectionStatus = 3"), + WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, + NULL, + &pEnumerator + ); + if (FAILED(hr)) { + std::cerr << "Failed to execute WQL query for Win32_NetworkAdapter." << std::endl; + pSvc->Release(); + pLoc->Release(); + CoUninitialize(); + return; + } + IWbemClassObject* pClassObj = NULL; + ULONG uReturn = 0; + while (pEnumerator) { + hr = pEnumerator->Next(WBEM_INFINITE, 1, &pClassObj, &uReturn); + if (uReturn == 0) { + break; + } + + VARIANT vtProp; + hr = pClassObj->Get(L"Caption", 0, &vtProp, 0, 0); + if (SUCCEEDED(hr)) { + QString str=QString::fromWCharArray(vtProp.bstrVal); + VariantClear(&vtProp); + netCards.append(str); + } + + pClassObj->Release(); + } + //WMI»ñÈ¡Éù¿¨ÐͺŠ+ hr = pSvc->ExecQuery( + _bstr_t("WQL"), + _bstr_t("SELECT * FROM Win32_SoundDevice"), + WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, + NULL, + &pEnumerator + ); + if (FAILED(hr)) { + std::cerr << "Failed to execute WQL query for Win32_SoundDevice." << std::endl; + pSvc->Release(); + pLoc->Release(); + CoUninitialize(); + return; + } + QStringList audioCards; + while (pEnumerator) { + hr = pEnumerator->Next(WBEM_INFINITE, 1, &pClassObj, &uReturn); + if (uReturn == 0) { + break; + } + + VARIANT vtProp; + hr = pClassObj->Get(L"Name", 0, &vtProp, 0, 0); + if (SUCCEEDED(hr)) { + QString str=QString::fromWCharArray(vtProp.bstrVal); + VariantClear(&vtProp); + audioCards.append(str); + } + + pClassObj->Release(); + } + hr = pSvc->ExecQuery( + bstr_t("WQL"), + bstr_t("SELECT * FROM Win32_PhysicalMemory"), + WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, + NULL, + &pEnumerator + ); + if (FAILED(hr)) + { + std::cout << "Query failed. Error code: " << hr << std::endl; + pSvc->Release(); + pLoc->Release(); + CoUninitialize(); + return; + } + QStringList RAMModel; + while (pEnumerator) + { + hr = pEnumerator->Next(WBEM_INFINITE, 1, &pClassObj, &uReturn); + if (uReturn == 0) + { + break; + } + + VARIANT vtProp; + hr = pClassObj->Get(L"Manufacturer", 0, &vtProp, 0, 0); + if (SUCCEEDED(hr)) + { + std::wcout << "Manufacturer: " << vtProp.bstrVal << std::endl; + VariantClear(&vtProp); + } + + hr = pClassObj->Get(L"PartNumber", 0, &vtProp, 0, 0); + if (SUCCEEDED(hr)) + { + RAMModel.append(QString::fromWCharArray(vtProp.bstrVal)); + VariantClear(&vtProp); + } + + pClassObj->Release(); + } + pSvc->Release(); + pLoc->Release(); + CoUninitialize(); + DISPLAY_DEVICE d = { sizeof(DISPLAY_DEVICE) }; + ::EnumDisplayDevices(NULL, 0, &d, 0); + QString monitor=QString::fromWCharArray(d.DeviceString, wcslen(d.DeviceString)); + //·¢ËÍ + //¹¹ÔìJSON + QJsonDocument *device=new QJsonDocument; + QJsonObject *object=new QJsonObject; + object->insert("CPU",QJsonValue(cpu)); + object->insert("RAM",QJsonValue(ram)); + object->insert("Hard_Disk",QJsonValue(disk)); + QJsonArray *gpu_array=new QJsonArray; + for(auto gpu:gpus) { + gpu_array->append(gpu); + } + object->insert("GPU",*gpu_array); + delete gpu_array; + object->insert("Mother_Board",motherboard); + QJsonArray *RAMModel_json=new QJsonArray; + for(auto RAM:RAMModel){ + RAMModel_json->append(RAM); + } + object->insert("Net_Card",*RAMModel_json); + delete RAMModel_json; + QJsonArray *netCards_json=new QJsonArray; + for(auto netCard:netCards){ + netCards_json->append(netCard); + } + object->insert("Net_Card",*netCards_json); + delete netCards_json; + QJsonArray *audioCards_json=new QJsonArray; + for(auto audioCard:audioCards){ + audioCards_json->append(audioCard); + } + object->insert("Audio_Card",*audioCards_json); + delete audioCards_json; + object->insert("Monitor",monitor); + device->setObject(*object); + delete object; + QJsonObject obj_root=qJsonDocument.object(); + obj_root.insert("data",QString(device->toJson())); + delete device; + qJsonDocument.setObject(obj_root); + timer = new QTimer(this); + QNetworkAccessManager *httpMgr = new QNetworkAccessManager(); + QNetworkRequest requestInfo; + //HTTPÇëÇó + //ÇëÇóÍ· + requestInfo.setUrl(QUrl(DEVICE_URL)); + requestInfo.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json")); + //±£´æÏìÓ¦µÄ±äÁ¿ + reply = httpMgr->post(requestInfo,qJsonDocument.toJson()); + //¿ªÆôÒ»¸öÑ­»·£¬Ö±µ½³¬Ê±»òÕß»ñÈ¡µ½Êý¾ÝΪֹ + connect(reply,&QNetworkReply::finished, &eventLoop, &QEventLoop::quit); + //ÉèÖö¨Ê±Æ÷·ÀÖ¹³¬Ê± + connect(timer,&QTimer::timeout,this,&DeviceRequest::cancelDownload); + timer->start(5000); + //Æô¶¯Ñ­»· + eventLoop.exec(); + delete httpMgr; +} diff --git a/OfficeAssistant_msvc/netio.h b/OfficeAssistant_msvc/netio.h index 521d3b3..0799869 100644 --- a/OfficeAssistant_msvc/netio.h +++ b/OfficeAssistant_msvc/netio.h @@ -1,113 +1,116 @@ -// -// Created by HW on 2023/07/27. -// - -#ifndef OFFICEASSISTANT_NETIO_H -#define OFFICEASSISTANT_NETIO_H -#include -#include -#include -#include -#include -#include -#include -#include - - -typedef struct { - QString img; - QString img_cover; - QString title; - QString func; - QString url; -} Menu; -typedef struct { - bool succeed; - struct { - QString logo_url; - QString device_id; - QString dev_id; - QString token; - QString backgroud_color; - QString title_color; - QString title_cover_color; - }basic; - QList menus; -}ConfigResponse; - -class RequestBodyBase:public QObject{ - Q_OBJECT; -public: - RequestBodyBase(); - virtual void sendRequest(); -protected: - QString product; - QString parter_id; - QString os; - QString os_version; - QString device_id; - QString request_id; - QString version; - QString release; - QString sign; - QJsonDocument qJsonDocument; - QNetworkReply *reply; - QEventLoop eventLoop; - QTimer *timer; -protected slots: - void cancelDownload(); -}; -class ConfigRequest:public RequestBodyBase{ -public: - ConfigRequest():RequestBodyBase(){} - void sendRequest(ConfigResponse * configResponse); -}; -class OpRequest:public RequestBodyBase{ -public: - OpRequest(QString Op,QString OpValue):RequestBodyBase(),op(Op),op_value(OpValue){ - QJsonObject obj_root=qJsonDocument.object(); - QJsonValue value=op; - obj_root.insert("op",op); - value=op_value; - obj_root.insert("op_value",op_value); - qJsonDocument.setObject(obj_root); - } - QString getOpValue(){ - return op_value; - } - QString getOp(){ - return op; - } - void setOpValue(QString op_value){ - this->op_value=op_value; - } - void setOp(QString op){ - this->op=op; - } - void sendRequest(); -protected: - QString op; - QString op_value; -}; - -class DeviceRequest:RequestBodyBase{ - DeviceRequest(); -}; - -class OpenMulitiWechat:public RequestBodyBase{ -public: - OpenMulitiWechat(): RequestBodyBase(){} -}; -inline QString getMachineGUID() { - HKEY hKey; - RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Cryptography", - 0, KEY_READ | KEY_WOW64_64KEY, &hKey); - DWORD dwType1 = REG_SZ; - DWORD dwLen = MAX_PATH; - WCHAR buf[100]; - RegQueryValueExA(hKey, "MachineGuid", 0, &dwType1, (LPBYTE)buf, &dwLen); - QString guid = QString::fromWCharArray(buf); - return guid; -} - -#endif //OFFICEASSISTANT_NETIO_H +// +// Created by HW on 2023/07/27. +// + +#ifndef OFFICEASSISTANT_NETIO_H +#define OFFICEASSISTANT_NETIO_H +#include +#include +#include +#include +#include +#include +#include +#include + + +typedef struct { + QString img; + QString img_cover; + QString title; + QString func; + QString url; +} Menu; +typedef struct { + bool succeed; + struct { + QString logo_url; + QString device_id; + QString dev_id; + QString token; + QString backgroud_color; + QString title_color; + QString title_cover_color; + }basic; + QList menus; +}ConfigResponse; + +class RequestBodyBase:public QObject{ + Q_OBJECT; +public: + RequestBodyBase(); + virtual void sendRequest(); +protected: + QString product; + QString parter_id; + QString os; + QString os_version; + QString device_id; + QString request_id; + QString version; + QString release; + QString sign; + QJsonDocument qJsonDocument; + QNetworkReply *reply; + QEventLoop eventLoop; + QTimer *timer; +protected slots: + void cancelDownload(); +}; +class ConfigRequest:public RequestBodyBase{ +public: + ConfigRequest():RequestBodyBase(){} + void sendRequest(ConfigResponse * configResponse); +}; +class OpRequest:public RequestBodyBase{ +public: + OpRequest(QString Op,QString OpValue):RequestBodyBase(),op(Op),op_value(OpValue){ + QJsonObject obj_root=qJsonDocument.object(); + QJsonValue value=op; + obj_root.insert("op",op); + value=op_value; + obj_root.insert("op_value",op_value); + qJsonDocument.setObject(obj_root); + } + QString getOpValue(){ + return op_value; + } + QString getOp(){ + return op; + } + void setOpValue(QString op_value){ + this->op_value=op_value; + } + void setOp(QString op){ + this->op=op; + } + void sendRequest(); +protected: + QString op; + QString op_value; +}; + +class DeviceRequest:RequestBodyBase{ + DeviceRequest(); +}; + +class OpenMulitiWechat:public RequestBodyBase{ +public: + OpenMulitiWechat(): RequestBodyBase(){} +}; +inline QString getMachineGUID() { + HKEY hKey; + RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Cryptography", + 0, KEY_READ | KEY_WOW64_64KEY, &hKey); + DWORD dwType1 = REG_SZ; + DWORD dwLen = MAX_PATH; + WCHAR buf[100]; + RegQueryValueExA(hKey, "MachineGuid", 0, &dwType1, (LPBYTE)buf, &dwLen); + QString guid = QString::fromWCharArray(buf); + return guid; +} + +class SoftwareRequest :public RequestBodyBase { + +}; +#endif //OFFICEASSISTANT_NETIO_H