2023-08-17 01:10:27 +08:00
|
|
|
|
//
|
2023-08-03 16:16:02 +08:00
|
|
|
|
// Created by HW on 2023/07/27.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
#include <QProcess>
|
|
|
|
|
#include <QScreen>
|
|
|
|
|
#include <QCryptographicHash>
|
|
|
|
|
#include <wbemidl.h>
|
|
|
|
|
#include "netio.h"
|
|
|
|
|
#include "config.h"
|
|
|
|
|
#include <cstdlib>
|
|
|
|
|
#include <ctime>
|
|
|
|
|
#include <QEventLoop>
|
|
|
|
|
#include <QTimer>
|
|
|
|
|
#include <cstring>
|
|
|
|
|
#include <QJsonArray>
|
|
|
|
|
#include <QSysInfo>
|
|
|
|
|
#include <QStorageInfo>
|
|
|
|
|
#include <comutil.h>
|
|
|
|
|
#include <iostream>
|
|
|
|
|
#include <QGuiApplication>
|
|
|
|
|
#include <QApplication>
|
|
|
|
|
#include <ctime>
|
|
|
|
|
#include <qDebug>
|
|
|
|
|
#include "globalvariables.h"
|
2023-08-08 15:15:19 +08:00
|
|
|
|
#include "buttonstruct.h"
|
2023-08-03 16:16:02 +08:00
|
|
|
|
#pragma comment(lib, "wbemuuid.lib")
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
#pragma comment(lib, "Qt5Networkd.lib")
|
|
|
|
|
#else
|
|
|
|
|
#pragma comment(lib, "Qt5Network.lib")
|
|
|
|
|
#endif
|
|
|
|
|
#pragma comment(lib,"comsuppw.lib")
|
2023-08-21 15:10:19 +08:00
|
|
|
|
QString background_color;
|
|
|
|
|
QString text_color;
|
2023-08-26 22:13:39 +08:00
|
|
|
|
QString text_cover_color;
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//读取注册表获取MachineUUID
|
2023-08-03 16:16:02 +08:00
|
|
|
|
bool IsWin11AndLater()
|
|
|
|
|
{
|
|
|
|
|
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//Windows 10 从内部版本 10240 开始,以内部版本 19044 结束。Windows 11 从内部版本 22000 开始,那么:
|
2023-08-03 16:16:02 +08:00
|
|
|
|
//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);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//打开配置文件
|
2023-08-03 16:16:02 +08:00
|
|
|
|
QString dir=QApplication::applicationDirPath();
|
|
|
|
|
QFile *infFile=new QFile(dir+"/config/information.kmd");
|
|
|
|
|
if(!infFile->open(QIODevice::ReadOnly|QIODevice::Text)){
|
2023-08-17 01:10:27 +08:00
|
|
|
|
QMessageBox::critical(nullptr,QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("无法打开配置文件"));
|
2023-08-03 16:16:02 +08:00
|
|
|
|
delete infFile;
|
2023-08-13 12:16:22 +08:00
|
|
|
|
exit_manager.exit(1);
|
2023-08-03 16:16:02 +08:00
|
|
|
|
}
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//读取配置文件
|
2023-08-03 16:16:02 +08:00
|
|
|
|
QByteArray bytes;
|
|
|
|
|
bytes=infFile->readAll();
|
|
|
|
|
infFile->close();
|
|
|
|
|
delete infFile;
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//转化为json
|
2023-08-03 16:16:02 +08:00
|
|
|
|
qJsonDocument=QJsonDocument::fromJson(bytes);
|
|
|
|
|
if(qJsonDocument.isObject()){
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//读取数据,写入对应字段
|
2023-08-03 16:16:02 +08:00
|
|
|
|
QJsonObject obj_root=qJsonDocument.object();
|
|
|
|
|
if(obj_root.value("product")==QJsonValue::Undefined){
|
2023-08-17 01:10:27 +08:00
|
|
|
|
QMessageBox::critical(nullptr, QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("配置文件损坏"));
|
2023-08-13 12:16:22 +08:00
|
|
|
|
exit_manager.exit(1);
|
2023-08-03 16:16:02 +08:00
|
|
|
|
}
|
|
|
|
|
product=obj_root.value("product").toString();
|
2023-08-13 12:16:22 +08:00
|
|
|
|
if(obj_root.value("partner_id")==QJsonValue::Undefined){
|
2023-08-17 01:10:27 +08:00
|
|
|
|
QMessageBox::critical(nullptr , QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("配置文件损坏"));
|
2023-08-13 12:16:22 +08:00
|
|
|
|
exit_manager.exit(1);
|
2023-08-03 16:16:02 +08:00
|
|
|
|
}
|
2023-08-13 12:16:22 +08:00
|
|
|
|
parter_id=obj_root.value("partner_id").toString();
|
2023-08-03 16:16:02 +08:00
|
|
|
|
}else{
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//处理错误
|
|
|
|
|
QMessageBox::critical(nullptr, QString::fromLocal8Bit("错误"), QString::fromLocal8Bit("配置文件损坏"));
|
2023-08-13 12:16:22 +08:00
|
|
|
|
exit_manager.exit(1);
|
2023-08-03 16:16:02 +08:00
|
|
|
|
}
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//获取操作系统版本
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
switch (os.dwMajorVersion) {//主版本号
|
|
|
|
|
case 5: //不兼容Windows 2000,因此5.x一定是Windows XP
|
2023-08-03 16:16:02 +08:00
|
|
|
|
os_version = "Windows XP";
|
|
|
|
|
break;
|
|
|
|
|
case 6:
|
2023-08-17 01:10:27 +08:00
|
|
|
|
switch (os.dwMinorVersion) { //次版本号
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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";
|
|
|
|
|
}
|
2023-08-17 01:10:27 +08:00
|
|
|
|
case 10: //这几个系统都是10.0
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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;
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//读取MachineGUID并取MD5作为device_id
|
2023-08-03 16:16:02 +08:00
|
|
|
|
QByteArray hash = QCryptographicHash::hash(getMachineGUID().toUtf8(), QCryptographicHash::Md5);
|
|
|
|
|
device_id = hash.toHex();
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//加入json序列
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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();
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//插入request_id
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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);
|
2023-08-18 20:51:05 +08:00
|
|
|
|
url_param = "&product=";
|
2023-08-03 16:16:02 +08:00
|
|
|
|
url_param += product;
|
2023-08-18 19:09:55 +08:00
|
|
|
|
url_param += "&partner_id=";
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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);
|
2023-08-21 15:10:19 +08:00
|
|
|
|
QJsonObject obj_root = qJsonDocument.object();
|
|
|
|
|
obj_root.insert("autostart", autostart);
|
|
|
|
|
qJsonDocument.setObject(obj_root);
|
2023-08-13 12:16:22 +08:00
|
|
|
|
|
2023-08-03 16:16:02 +08:00
|
|
|
|
QNetworkAccessManager *httpMgr = new QNetworkAccessManager();
|
|
|
|
|
QNetworkRequest requestInfo;
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//HTTP请求
|
|
|
|
|
//请求头
|
2023-08-03 16:16:02 +08:00
|
|
|
|
QString url = CONFIG_URL;
|
|
|
|
|
requestInfo.setUrl(QUrl(CONFIG_URL));
|
|
|
|
|
requestInfo.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//保存响应的变量
|
2023-08-03 16:16:02 +08:00
|
|
|
|
reply = httpMgr->post(requestInfo,qJsonDocument.toJson());
|
|
|
|
|
qDebug() << qJsonDocument.toJson();
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//开启一个循环,直到超时或者获取到数据为止
|
2023-08-03 16:16:02 +08:00
|
|
|
|
connect(reply,&QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//设置定时器防止超时
|
2023-08-03 16:16:02 +08:00
|
|
|
|
connect(timer,&QTimer::timeout,this,&ConfigRequest::cancelDownload);
|
|
|
|
|
timer->start(5000);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//启动循环
|
2023-08-03 16:16:02 +08:00
|
|
|
|
eventLoop.exec();
|
|
|
|
|
timer->stop();
|
|
|
|
|
//delete httpMgr;
|
|
|
|
|
QJsonDocument result;
|
2023-08-13 12:16:22 +08:00
|
|
|
|
QByteArray buffer;
|
2023-08-03 16:16:02 +08:00
|
|
|
|
configResponse->succeed = false;
|
|
|
|
|
//memset(configResponse,0,sizeof(*configResponse));
|
|
|
|
|
auto error = reply->error();
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//如果没有错误
|
2023-08-03 16:16:02 +08:00
|
|
|
|
if(reply->error() == QNetworkReply::NoError) {
|
2023-08-13 12:16:22 +08:00
|
|
|
|
buffer = reply->readAll();
|
2023-08-03 16:16:02 +08:00
|
|
|
|
}else{
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//如果有错误
|
2023-08-03 16:16:02 +08:00
|
|
|
|
configResponse->succeed=false;
|
|
|
|
|
//delete reply;
|
|
|
|
|
delete timer;
|
|
|
|
|
delete httpMgr;
|
|
|
|
|
return;
|
|
|
|
|
}
|
2023-08-08 15:15:19 +08:00
|
|
|
|
//qDebug() << result.toJson();
|
2023-08-13 12:16:22 +08:00
|
|
|
|
result = QJsonDocument::fromJson(buffer);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//如果数据完整
|
2023-08-03 16:16:02 +08:00
|
|
|
|
if(result.isObject()){
|
|
|
|
|
QJsonObject obj_root=result.object();
|
|
|
|
|
QJsonArray array;
|
2023-08-15 11:17:09 +08:00
|
|
|
|
|
2023-08-03 16:16:02 +08:00
|
|
|
|
array = obj_root.value("data").toObject().value("menu").toArray();
|
2023-08-17 01:10:27 +08:00
|
|
|
|
QJsonObject obj_data = obj_root.value("data").toObject();
|
2023-08-21 15:10:19 +08:00
|
|
|
|
if(!obj_data.value("basic").isObject())
|
|
|
|
|
{
|
|
|
|
|
configResponse->succeed=false;
|
|
|
|
|
delete timer;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
QJsonObject obj_basic=obj_data.value("basic").toObject();
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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();
|
2023-08-21 15:10:19 +08:00
|
|
|
|
|
2023-08-03 16:16:02 +08:00
|
|
|
|
auto i=0;
|
|
|
|
|
for(auto value:array){
|
|
|
|
|
QJsonObject object=value.toObject();
|
2023-08-08 15:15:19 +08:00
|
|
|
|
Button button;
|
2023-08-26 22:13:39 +08:00
|
|
|
|
button.img = object.value("logo").toString();
|
|
|
|
|
button.png = object.value("img").toString();
|
2023-08-18 19:09:55 +08:00
|
|
|
|
button.img_name = object.value("img_name").toString();
|
|
|
|
|
button.name = object.value("name").toString();
|
|
|
|
|
button.type = object.value("type").toString();
|
|
|
|
|
button.sort = object.value("sort").toInt();
|
|
|
|
|
button.status = object.value("status").toInt();
|
|
|
|
|
button.is_navbar = object.value("is_navbar").toBool();
|
|
|
|
|
button.is_elite = object.value("is_elite").toBool();
|
|
|
|
|
button.orig_name = object.value("orig_name").toString();
|
|
|
|
|
button.categroy_id = object.value("categroy_id").toString();
|
2023-08-08 15:15:19 +08:00
|
|
|
|
button.op = object.value("op").toString();
|
2023-08-18 19:09:55 +08:00
|
|
|
|
button.func = object.value("func").toString();
|
|
|
|
|
button.url = object.value("url").toString();
|
|
|
|
|
button.dev = object.value("dev").toString();
|
|
|
|
|
button.locked = object.value("locked").toBool();
|
|
|
|
|
button.is_delete = object.value("is_delete").toBool();
|
|
|
|
|
button.version = object.value("version").toString();
|
2023-08-08 15:15:19 +08:00
|
|
|
|
configResponse->buttons << button;
|
2023-08-03 16:16:02 +08:00
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
configResponse->succeed = true;
|
2023-08-15 11:17:09 +08:00
|
|
|
|
QFile file(QApplication::applicationDirPath() + DEFAULT_NAVBAR_FILLE);
|
|
|
|
|
if (file.open(QIODevice::Text | QIODevice::WriteOnly))
|
|
|
|
|
{
|
|
|
|
|
file.write(result.toJson());
|
|
|
|
|
file.close();
|
|
|
|
|
}
|
2023-08-03 16:16:02 +08:00
|
|
|
|
}else{
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//数据不完整
|
2023-08-03 16:16:02 +08:00
|
|
|
|
configResponse->succeed=false;
|
|
|
|
|
//delete reply;
|
|
|
|
|
delete timer;
|
|
|
|
|
delete httpMgr;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
delete httpMgr;
|
|
|
|
|
}
|
|
|
|
|
void RequestBodyBase::cancelDownload() {
|
2023-08-13 12:16:22 +08:00
|
|
|
|
downloadSuccess = false;
|
2023-08-03 16:16:02 +08:00
|
|
|
|
disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
|
|
|
|
|
eventLoop.quit();
|
|
|
|
|
reply->abort();
|
|
|
|
|
}
|
|
|
|
|
void RequestBodyBase::sendRequest() {
|
|
|
|
|
timer = new QTimer(this);
|
|
|
|
|
QNetworkAccessManager *httpMgr = new QNetworkAccessManager();
|
|
|
|
|
QNetworkRequest requestInfo;
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//HTTP请求
|
|
|
|
|
//请求头
|
2023-08-03 16:16:02 +08:00
|
|
|
|
requestInfo.setUrl(QUrl(OP_URL));
|
|
|
|
|
requestInfo.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//保存响应的变量
|
2023-08-03 16:16:02 +08:00
|
|
|
|
reply = httpMgr->post(requestInfo,qJsonDocument.toJson());
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//开启一个循环,直到超时或者获取到数据为止
|
2023-08-03 16:16:02 +08:00
|
|
|
|
connect(reply,&QNetworkReply::finished, this, &RequestBodyBase::cancelDownload);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//设置定时器防止超时
|
2023-08-03 16:16:02 +08:00
|
|
|
|
connect(timer,&QTimer::timeout,&eventLoop,&QEventLoop::quit);
|
|
|
|
|
timer->start(5000);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//启动循环
|
2023-08-03 16:16:02 +08:00
|
|
|
|
eventLoop.exec();
|
|
|
|
|
delete timer;
|
|
|
|
|
delete httpMgr;
|
|
|
|
|
delete reply;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DeviceRequest::DeviceRequest() : RequestBodyBase() {
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//内存大小
|
2023-08-03 16:16:02 +08:00
|
|
|
|
MEMORYSTATUSEX status;
|
|
|
|
|
status.dwLength = sizeof(status);
|
|
|
|
|
GlobalMemoryStatusEx(&status);
|
|
|
|
|
int ram = status.ullTotalPhys / 1024 / 1024;
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//硬盘大小
|
2023-08-03 16:16:02 +08:00
|
|
|
|
QStorageInfo storage = QStorageInfo::root();
|
|
|
|
|
int disk = storage.bytesTotal() / static_cast<qulonglong>(1024 * 1024 * 1024);
|
2023-08-26 22:13:39 +08:00
|
|
|
|
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//WMI获取网卡型号
|
2023-08-26 22:13:39 +08:00
|
|
|
|
HRESULT hr = CoInitializeEx(0, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
|
2023-08-03 16:16:02 +08:00
|
|
|
|
if (FAILED(hr)) {
|
|
|
|
|
std::cerr << "Failed to initialize COM library." << std::endl;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
QStringList netCards;
|
2023-08-26 22:13:39 +08:00
|
|
|
|
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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"),
|
2023-08-26 22:13:39 +08:00
|
|
|
|
_bstr_t("SELECT * FROM Win32_NetworkAdapter WHERE PhysicalAdapter = TRUE"),
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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();
|
|
|
|
|
}
|
2023-08-26 22:13:39 +08:00
|
|
|
|
pEnumerator->Release();
|
|
|
|
|
pEnumerator = nullptr;
|
|
|
|
|
// 获取 CPU 信息
|
|
|
|
|
hr = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_Processor"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
|
|
|
|
|
IWbemClassObject* pclsObj = NULL;
|
|
|
|
|
uReturn = 0;
|
|
|
|
|
QString cpu;
|
|
|
|
|
while (pEnumerator) {
|
|
|
|
|
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
|
|
|
|
|
if (0 == uReturn) break;
|
|
|
|
|
|
|
|
|
|
VARIANT vtProp;
|
|
|
|
|
hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
|
|
|
|
|
if (SUCCEEDED(hr)) {
|
|
|
|
|
cpu=QString::fromWCharArray(vtProp.bstrVal);
|
|
|
|
|
VariantClear(&vtProp);
|
|
|
|
|
}
|
|
|
|
|
pclsObj->Release();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取主板信息
|
|
|
|
|
QString motherboard;
|
|
|
|
|
hr = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_BaseBoard"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
|
|
|
|
|
while (pEnumerator) {
|
|
|
|
|
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
|
|
|
|
|
if (0 == uReturn) break;
|
|
|
|
|
|
|
|
|
|
VARIANT vtProp;
|
|
|
|
|
hr = pclsObj->Get(L"Product", 0, &vtProp, 0, 0);
|
|
|
|
|
if (SUCCEEDED(hr)) {
|
|
|
|
|
motherboard=QString::fromWCharArray(vtProp.bstrVal);
|
|
|
|
|
VariantClear(&vtProp);
|
|
|
|
|
}
|
|
|
|
|
pclsObj->Release();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pEnumerator->Release();
|
|
|
|
|
pEnumerator=nullptr;
|
|
|
|
|
//WMI获取显卡型号
|
|
|
|
|
hr = pSvc->ExecQuery(
|
|
|
|
|
bstr_t("WQL"),
|
|
|
|
|
bstr_t("SELECT * FROM Win32_VideoController"),
|
|
|
|
|
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
|
|
|
|
|
NULL,
|
|
|
|
|
&pEnumerator);
|
|
|
|
|
|
|
|
|
|
if (FAILED(hr))
|
|
|
|
|
{
|
|
|
|
|
std::cerr << "Query failed." << std::endl;
|
|
|
|
|
pSvc->Release();
|
|
|
|
|
pLoc->Release();
|
|
|
|
|
CoUninitialize();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
QStringList graphicsCards;
|
|
|
|
|
pclsObj->Release();
|
|
|
|
|
pclsObj = NULL;
|
|
|
|
|
uReturn = 0;
|
|
|
|
|
while (pEnumerator)
|
|
|
|
|
{
|
|
|
|
|
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
|
|
|
|
|
if (0 == uReturn) break;
|
|
|
|
|
|
|
|
|
|
VARIANT vtProp;
|
|
|
|
|
hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
|
|
|
|
|
if (SUCCEEDED(hr))
|
|
|
|
|
{
|
|
|
|
|
graphicsCards<< QString::fromWCharArray(vtProp.bstrVal);
|
|
|
|
|
VariantClear(&vtProp);
|
|
|
|
|
}
|
|
|
|
|
pclsObj->Release();
|
|
|
|
|
}
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//WMI获取声卡型号
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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))
|
|
|
|
|
{
|
2023-08-26 22:13:39 +08:00
|
|
|
|
RAMModel<<QString::fromWCharArray(vtProp.bstrVal);
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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();
|
2023-08-26 22:13:39 +08:00
|
|
|
|
|
|
|
|
|
DISPLAY_DEVICE dd;
|
|
|
|
|
ZeroMemory(&dd, sizeof(dd));
|
|
|
|
|
dd.cb = sizeof(dd);
|
|
|
|
|
int deviceIndex = 0;
|
|
|
|
|
QStringList monitors;
|
|
|
|
|
// 枚举显卡设备
|
|
|
|
|
while (EnumDisplayDevices(0, deviceIndex, &dd, 0))
|
|
|
|
|
{
|
|
|
|
|
DISPLAY_DEVICE monitor;
|
|
|
|
|
ZeroMemory(&monitor, sizeof(monitor));
|
|
|
|
|
monitor.cb = sizeof(monitor);
|
|
|
|
|
int monitorIndex = 0;
|
|
|
|
|
|
|
|
|
|
// 对每个显卡枚举其连接的显示器
|
|
|
|
|
while (EnumDisplayDevices(dd.DeviceName, monitorIndex, &monitor, 0))
|
|
|
|
|
{
|
|
|
|
|
// 打印显示器型号
|
|
|
|
|
monitors<<QString::fromWCharArray(monitor.DeviceString);
|
|
|
|
|
monitorIndex++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
deviceIndex++;
|
|
|
|
|
}
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//发送
|
|
|
|
|
//构造JSON
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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;
|
2023-08-26 22:13:39 +08:00
|
|
|
|
|
|
|
|
|
for(auto gpu:graphicsCards)
|
|
|
|
|
{
|
|
|
|
|
gpu_array->append(gpu);
|
|
|
|
|
}
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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;
|
2023-08-26 22:13:39 +08:00
|
|
|
|
QJsonArray *monitors_json=new QJsonArray;
|
|
|
|
|
for(auto monitor:monitors)
|
|
|
|
|
{
|
|
|
|
|
monitors_json->append(monitor);
|
|
|
|
|
}
|
|
|
|
|
object->insert("Monitor",*monitors_json);
|
|
|
|
|
delete monitors_json;
|
2023-08-03 16:16:02 +08:00
|
|
|
|
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;
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//HTTP请求
|
|
|
|
|
//请求头
|
2023-08-03 16:16:02 +08:00
|
|
|
|
requestInfo.setUrl(QUrl(DEVICE_URL));
|
|
|
|
|
requestInfo.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//保存响应的变量
|
2023-08-26 22:13:39 +08:00
|
|
|
|
qDebug()<<qJsonDocument.toJson();
|
2023-08-03 16:16:02 +08:00
|
|
|
|
reply = httpMgr->post(requestInfo,qJsonDocument.toJson());
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//开启一个循环,直到超时或者获取到数据为止
|
2023-08-03 16:16:02 +08:00
|
|
|
|
connect(reply,&QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//设置定时器防止超时
|
2023-08-03 16:16:02 +08:00
|
|
|
|
connect(timer,&QTimer::timeout,this,&DeviceRequest::cancelDownload);
|
|
|
|
|
timer->start(5000);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//启动循环
|
2023-08-03 16:16:02 +08:00
|
|
|
|
eventLoop.exec();
|
2023-08-26 22:13:39 +08:00
|
|
|
|
qDebug()<<reply->error();
|
|
|
|
|
qDebug()<<reply->readAll();
|
2023-08-03 16:16:02 +08:00
|
|
|
|
delete httpMgr;
|
|
|
|
|
}
|
2023-08-15 11:17:09 +08:00
|
|
|
|
bool SoftwareRequest::sendRequest(QHash<QString,QString>&startMenu, QHash<QString, Record> *records, QJsonArray &software_exists)
|
2023-08-08 15:15:19 +08:00
|
|
|
|
{
|
|
|
|
|
timer = new QTimer(this);
|
|
|
|
|
QNetworkAccessManager* httpMgr = new QNetworkAccessManager();
|
|
|
|
|
QNetworkRequest requestInfo;
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//HTTP请求
|
|
|
|
|
//请求头
|
2023-08-08 15:15:19 +08:00
|
|
|
|
QJsonArray array;
|
|
|
|
|
for(auto record : *records)
|
|
|
|
|
{
|
2023-08-10 15:36:08 +08:00
|
|
|
|
QJsonObject object;
|
|
|
|
|
object.insert("orig_name", record.orig_name);
|
|
|
|
|
object.insert("path", record.path);
|
|
|
|
|
array.append(object);
|
2023-08-08 15:15:19 +08:00
|
|
|
|
}
|
2023-08-13 12:16:22 +08:00
|
|
|
|
QJsonArray menu_list;
|
|
|
|
|
for(auto name:startMenu.keys())
|
|
|
|
|
{
|
|
|
|
|
QJsonObject object;
|
|
|
|
|
object.insert("name", name);
|
|
|
|
|
object.insert("path", startMenu[name]);
|
|
|
|
|
menu_list.append(object);
|
|
|
|
|
}
|
2023-08-08 15:15:19 +08:00
|
|
|
|
QJsonObject obj_root = qJsonDocument.object();
|
2023-08-13 12:16:22 +08:00
|
|
|
|
QJsonObject object;
|
|
|
|
|
object.insert("reg", array);
|
|
|
|
|
object.insert("start", menu_list);
|
2023-08-18 19:09:55 +08:00
|
|
|
|
object.insert("app", software_exists);
|
2023-08-13 12:16:22 +08:00
|
|
|
|
obj_root.insert("data", object);
|
|
|
|
|
obj_root.insert("type", "update");
|
2023-08-08 15:15:19 +08:00
|
|
|
|
qJsonDocument.setObject(obj_root);
|
|
|
|
|
QString url = SOFTWARE_URL;
|
|
|
|
|
requestInfo.setUrl(url);
|
|
|
|
|
requestInfo.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//保存响应的变量
|
2023-08-08 15:15:19 +08:00
|
|
|
|
reply = httpMgr->post(requestInfo, qJsonDocument.toJson());
|
|
|
|
|
qDebug() << qJsonDocument.toJson();
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//开启一个循环,直到超时或者获取到数据为止
|
2023-08-08 15:15:19 +08:00
|
|
|
|
connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//设置定时器防止超时
|
2023-08-08 15:15:19 +08:00
|
|
|
|
connect(timer, &QTimer::timeout, this, &SoftwareRequest::cancelDownload);
|
|
|
|
|
timer->start(5000);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//启动循环
|
2023-08-08 15:15:19 +08:00
|
|
|
|
eventLoop.exec();
|
|
|
|
|
timer->stop();
|
2023-08-13 12:16:22 +08:00
|
|
|
|
delete timer;
|
2023-08-08 15:15:19 +08:00
|
|
|
|
QJsonDocument result;
|
|
|
|
|
// auto error = reply->error();
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//如果没有错误
|
2023-08-13 12:16:22 +08:00
|
|
|
|
qDebug() << reply->error();
|
2023-08-18 19:09:55 +08:00
|
|
|
|
auto result2=reply->readAll();
|
2023-08-08 15:15:19 +08:00
|
|
|
|
if (reply->error() == QNetworkReply::NoError) {
|
2023-08-18 19:09:55 +08:00
|
|
|
|
result = QJsonDocument::fromJson(result2);
|
2023-08-08 15:15:19 +08:00
|
|
|
|
}
|
|
|
|
|
else {
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//如果有错误
|
2023-08-08 15:15:19 +08:00
|
|
|
|
delete httpMgr;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
//qDebug() << result.toJson();
|
2023-08-18 19:09:55 +08:00
|
|
|
|
records->clear();
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//如果数据完整
|
2023-08-08 15:15:19 +08:00
|
|
|
|
if (result.isObject()) {
|
|
|
|
|
QJsonObject obj_root2 = result.object();
|
|
|
|
|
QJsonArray array = obj_root2.value("data").toObject().value("menu").toArray();
|
|
|
|
|
for (auto value : array) {
|
|
|
|
|
QJsonObject object = value.toObject();
|
|
|
|
|
QString orig_name = object.value("orig_name").toString();
|
2023-08-13 12:16:22 +08:00
|
|
|
|
if (orig_name.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
delete httpMgr;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
QNetworkAccessManager manager;
|
|
|
|
|
downloadSuccess = true;
|
|
|
|
|
QUrl url_logo(object.value("img").toString());
|
|
|
|
|
QNetworkRequest* request_logo = new QNetworkRequest(url_logo);
|
|
|
|
|
reply = manager.get(*request_logo);
|
|
|
|
|
QTimer timer;
|
|
|
|
|
timer.setInterval(5000);
|
|
|
|
|
connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
|
|
|
|
|
connect(&timer, &QTimer::timeout, this, &SoftwareRequest::cancelDownload);
|
|
|
|
|
eventLoop.exec();
|
|
|
|
|
timer.stop();
|
|
|
|
|
QByteArray buffer;
|
|
|
|
|
delete request_logo;
|
|
|
|
|
reply->close();
|
2023-08-15 11:17:09 +08:00
|
|
|
|
QString dir = QApplication::applicationDirPath() + "/images/svg/";
|
|
|
|
|
if ((reply->error() == QNetworkReply::NoError)&&(downloadSuccess == true)) {
|
2023-08-13 12:16:22 +08:00
|
|
|
|
buffer = reply->readAll();
|
|
|
|
|
QFile file(dir + orig_name + ".svg");
|
|
|
|
|
if (file.open(QIODevice::WriteOnly | QIODevice::Text))
|
|
|
|
|
{
|
|
|
|
|
file.write(buffer);
|
|
|
|
|
file.close();
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-08-18 19:09:55 +08:00
|
|
|
|
Record record;
|
|
|
|
|
record.orig_name = orig_name;
|
|
|
|
|
record.path = object.value("path").toString();
|
|
|
|
|
record.img = dir + orig_name + ".svg";
|
|
|
|
|
record.name = object.value("name").toString();
|
|
|
|
|
record.version = object.value("version").toString();
|
|
|
|
|
record.app_id=object.value("app_id").toString();
|
|
|
|
|
record.locked=object.value("locked").toBool();
|
|
|
|
|
record.type=object.value("type").toString();
|
|
|
|
|
record.category_id=object.value("category_id").toString();
|
|
|
|
|
record.status=object.value("status").toBool();
|
|
|
|
|
record.op=object.value("op").toString();
|
|
|
|
|
record.func=object.value("func").toString();
|
|
|
|
|
record.initial_position=object.value("initial_position").toString();
|
|
|
|
|
record.url=object.value("url").toString();
|
|
|
|
|
record.logo=object.value("logo").toString();
|
|
|
|
|
record.img=object.value("img").toString();
|
|
|
|
|
record.is_navbar=object.value("is_navbar").toBool();
|
|
|
|
|
record.is_elite=object.value("is_elite").toBool();
|
|
|
|
|
records->insert(orig_name, record);
|
2023-08-08 15:15:19 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//数据不完整
|
2023-08-08 15:15:19 +08:00
|
|
|
|
//delete reply;
|
|
|
|
|
delete httpMgr;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
delete httpMgr;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-13 12:16:22 +08:00
|
|
|
|
QString OpenWeChatRequest::sendRequest(bool notuse)
|
|
|
|
|
{
|
2023-08-15 11:17:09 +08:00
|
|
|
|
QJsonObject obj_root = qJsonDocument.object();
|
|
|
|
|
obj_root.insert("func", "wxdk");
|
|
|
|
|
qJsonDocument.setObject(obj_root);
|
2023-08-13 12:16:22 +08:00
|
|
|
|
timer = new QTimer(this);
|
|
|
|
|
QNetworkAccessManager* httpMgr = new QNetworkAccessManager();
|
|
|
|
|
QNetworkRequest requestInfo;
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//HTTP请求
|
|
|
|
|
//请求头
|
2023-08-13 12:16:22 +08:00
|
|
|
|
requestInfo.setUrl(QUrl(WECHAT_URL));
|
|
|
|
|
requestInfo.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//保存响应的变量
|
2023-08-13 12:16:22 +08:00
|
|
|
|
reply = httpMgr->post(requestInfo, qJsonDocument.toJson());
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//开启一个循环,直到超时或者获取到数据为止
|
2023-08-13 12:16:22 +08:00
|
|
|
|
connect(reply, &QNetworkReply::finished, this, &OpenWeChatRequest::cancelDownload);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//设置定时器防止超时
|
2023-08-13 12:16:22 +08:00
|
|
|
|
connect(timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
|
|
|
|
|
timer->start(5000);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//启动循环
|
2023-08-13 12:16:22 +08:00
|
|
|
|
eventLoop.exec();
|
|
|
|
|
timer->stop();
|
2023-08-18 19:09:55 +08:00
|
|
|
|
qDebug() << reply->error();
|
2023-08-13 12:16:22 +08:00
|
|
|
|
QByteArray buffer = reply->readAll();
|
|
|
|
|
QJsonDocument reply_json = QJsonDocument::fromJson(buffer);
|
2023-08-18 19:09:55 +08:00
|
|
|
|
|
|
|
|
|
if(!reply_json.isObject())
|
2023-08-13 12:16:22 +08:00
|
|
|
|
{
|
|
|
|
|
delete timer;
|
|
|
|
|
delete httpMgr;
|
2023-08-15 11:17:09 +08:00
|
|
|
|
//delete reply;
|
2023-08-13 12:16:22 +08:00
|
|
|
|
return "ok";
|
|
|
|
|
}
|
|
|
|
|
delete timer;
|
|
|
|
|
delete httpMgr;
|
|
|
|
|
return reply_json.object().value("msg").toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OpRequest::sendRequest()
|
|
|
|
|
{
|
|
|
|
|
timer = new QTimer(this);
|
|
|
|
|
QJsonObject object = qJsonDocument.object();
|
|
|
|
|
object.insert(op, op_value);
|
|
|
|
|
qJsonDocument.setObject(object);
|
|
|
|
|
QNetworkAccessManager* httpMgr = new QNetworkAccessManager();
|
|
|
|
|
QNetworkRequest requestInfo;
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//HTTP请求
|
|
|
|
|
//请求头
|
2023-08-13 12:16:22 +08:00
|
|
|
|
requestInfo.setUrl(QUrl(OP_URL));
|
|
|
|
|
requestInfo.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//保存响应的变量
|
2023-08-13 12:16:22 +08:00
|
|
|
|
reply = httpMgr->post(requestInfo, qJsonDocument.toJson());
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//开启一个循环,直到超时或者获取到数据为止
|
2023-08-13 12:16:22 +08:00
|
|
|
|
connect(reply, &QNetworkReply::finished, this, &OpRequest::cancelDownload);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//设置定时器防止超时
|
2023-08-13 12:16:22 +08:00
|
|
|
|
connect(timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
|
|
|
|
|
timer->start(5000);
|
2023-08-17 01:10:27 +08:00
|
|
|
|
//启动循环
|
2023-08-13 12:16:22 +08:00
|
|
|
|
eventLoop.exec();
|
|
|
|
|
timer->stop();
|
|
|
|
|
delete timer;
|
|
|
|
|
delete httpMgr;
|
|
|
|
|
delete reply;
|
|
|
|
|
}
|
|
|
|
|
|