|
@@ -1,5 +1,7 @@
|
|
#include "blastopepage.h"
|
|
#include "blastopepage.h"
|
|
|
|
|
|
|
|
+#include <QtCore/qlogging.h>
|
|
|
|
+
|
|
#include <QFont>
|
|
#include <QFont>
|
|
#include <QProcessEnvironment>
|
|
#include <QProcessEnvironment>
|
|
#include <QWebEngineSettings>
|
|
#include <QWebEngineSettings>
|
|
@@ -51,16 +53,27 @@ void BlastOpePage::InitFace() {
|
|
Logger::getInstance().info("start init face verification");
|
|
Logger::getInstance().info("start init face verification");
|
|
LoadingWidget::showLoading(this, "请求创建人脸识别...");
|
|
LoadingWidget::showLoading(this, "请求创建人脸识别...");
|
|
|
|
|
|
- layout = new QVBoxLayout(this);
|
|
|
|
- // TODO: relase the qwebengineview when not successfully verified
|
|
|
|
- view = new QWebEngineView(this);
|
|
|
|
- view->setAttribute(Qt::WA_OpaquePaintEvent);
|
|
|
|
|
|
+ // Clean up existing resources BEFORE creating new ones
|
|
|
|
+ closeWebViewAndRestoreUI();
|
|
|
|
+
|
|
|
|
+ m_faceVerifyLayout = new QVBoxLayout(this);
|
|
|
|
+ // Create new WebEngineView
|
|
|
|
+ m_faceverifyWebView = new QWebEngineView(this);
|
|
|
|
+ m_faceverifyWebView->setAttribute(Qt::WA_OpaquePaintEvent);
|
|
|
|
+
|
|
|
|
+ // Configure web settings for better performance
|
|
|
|
+ QWebEngineSettings *settings = m_faceverifyWebView->settings();
|
|
|
|
+ settings->setAttribute(QWebEngineSettings::JavascriptEnabled, true);
|
|
|
|
+ settings->setAttribute(QWebEngineSettings::LocalStorageEnabled, true);
|
|
|
|
+ settings->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true);
|
|
|
|
|
|
- QWebEnginePage *page = view->page();
|
|
|
|
|
|
+ QWebEnginePage *page = m_faceverifyWebView->page();
|
|
|
|
|
|
QJsonObject metaInfo = getMetaInfo();
|
|
QJsonObject metaInfo = getMetaInfo();
|
|
if (metaInfo["certName"] == "" || metaInfo["certNo"] == "") {
|
|
if (metaInfo["certName"] == "" || metaInfo["certNo"] == "") {
|
|
QMessageBox::information(nullptr, "获取用户信息错误", "未获得用户的身份证信息,请联系管理员");
|
|
QMessageBox::information(nullptr, "获取用户信息错误", "未获得用户的身份证信息,请联系管理员");
|
|
|
|
+ LoadingWidget::hideLoading();
|
|
|
|
+ closeWebViewAndRestoreUI(); // Clean up on error
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -78,6 +91,8 @@ void BlastOpePage::InitFace() {
|
|
QString("创建人脸识别请求服务器返回错误: userName: %1. response: %2")
|
|
QString("创建人脸识别请求服务器返回错误: userName: %1. response: %2")
|
|
.arg(metaInfo["certName"].toString(), QString::fromUtf8(QJsonDocument(response).toJson())));
|
|
.arg(metaInfo["certName"].toString(), QString::fromUtf8(QJsonDocument(response).toJson())));
|
|
QMessageBox::critical(nullptr, "错误", "无法创建人脸识别,请确认后台录入的身份信息正确");
|
|
QMessageBox::critical(nullptr, "错误", "无法创建人脸识别,请确认后台录入的身份信息正确");
|
|
|
|
+ LoadingWidget::hideLoading();
|
|
|
|
+ closeWebViewAndRestoreUI(); // Clean up on error
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
if (response.contains("data") && response["data"].isObject()) {
|
|
if (response.contains("data") && response["data"].isObject()) {
|
|
@@ -94,29 +109,77 @@ void BlastOpePage::InitFace() {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!certifyUrl.isEmpty()) {
|
|
if (!certifyUrl.isEmpty()) {
|
|
- view->load(QUrl(certifyUrl));
|
|
|
|
-
|
|
|
|
- layout->addWidget(view);
|
|
|
|
|
|
+ LoadingWidget::showLoading(this, "加载人脸识别页面...");
|
|
|
|
+
|
|
|
|
+ // Handle page load events
|
|
|
|
+ QObject::connect(m_faceverifyWebView, &QWebEngineView::loadStarted, this,
|
|
|
|
+ [this]() { qDebug() << "Face verification page loading started"; });
|
|
|
|
+
|
|
|
|
+ QObject::connect(m_faceverifyWebView, &QWebEngineView::loadFinished, this, [this](bool success) {
|
|
|
|
+ if (!success) {
|
|
|
|
+ Logger::getInstance().error("Face verification page failed to load");
|
|
|
|
+ QMessageBox::warning(nullptr, "加载失败", "人脸识别页面加载失败,请重试");
|
|
|
|
+ LoadingWidget::hideLoading();
|
|
|
|
+ closeWebViewAndRestoreUI();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ qDebug() << "Face verification page loaded successfully";
|
|
|
|
+ LoadingWidget::hideLoading();
|
|
|
|
+ });
|
|
|
|
|
|
- layout->setStretchFactor(view, 1);
|
|
|
|
|
|
+ // Load URL and add to layout
|
|
|
|
+ m_faceverifyWebView->load(QUrl(certifyUrl));
|
|
|
|
+ m_faceVerifyLayout->addWidget(m_faceverifyWebView);
|
|
|
|
+ m_faceVerifyLayout->setStretchFactor(m_faceverifyWebView, 1);
|
|
|
|
|
|
|
|
+ // Connect URL change signal
|
|
QObject::connect(page, &QWebEnginePage::urlChanged, this, &BlastOpePage::onUrlChanged);
|
|
QObject::connect(page, &QWebEnginePage::urlChanged, this, &BlastOpePage::onUrlChanged);
|
|
} else {
|
|
} else {
|
|
QMessageBox::information(nullptr, "提示", "人脸识别请求失败");
|
|
QMessageBox::information(nullptr, "提示", "人脸识别请求失败");
|
|
Logger::getInstance().error("FaceVerificationInit: Failed to get certifyUrl");
|
|
Logger::getInstance().error("FaceVerificationInit: Failed to get certifyUrl");
|
|
LoadingWidget::hideLoading();
|
|
LoadingWidget::hideLoading();
|
|
|
|
+ closeWebViewAndRestoreUI(); // Clean up on error
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void BlastOpePage::closeWebViewAndRestoreUI() {
|
|
void BlastOpePage::closeWebViewAndRestoreUI() {
|
|
- if (view) {
|
|
|
|
- layout->removeWidget(view);
|
|
|
|
- delete view;
|
|
|
|
- view = nullptr;
|
|
|
|
|
|
+ // Safely disconnect signals first
|
|
|
|
+ if (m_faceverifyWebView) {
|
|
|
|
+ // Disconnect specific signals instead of wildcard disconnect
|
|
|
|
+ if (m_faceverifyWebView->page()) {
|
|
|
|
+ QWebEnginePage *page = m_faceverifyWebView->page();
|
|
|
|
+ // Disconnect specific signals to avoid wildcard issues
|
|
|
|
+ QObject::disconnect(page, &QWebEnginePage::featurePermissionRequested, this, nullptr);
|
|
|
|
+ QObject::disconnect(page, &QWebEnginePage::urlChanged, this, nullptr);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Stop any ongoing operations
|
|
|
|
+ m_faceverifyWebView->stop();
|
|
|
|
+
|
|
|
|
+ // Remove from layout before deleting
|
|
|
|
+ if (m_faceVerifyLayout) {
|
|
|
|
+ m_faceVerifyLayout->removeWidget(m_faceverifyWebView);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Clean up the web view
|
|
|
|
+ m_faceverifyWebView->setParent(nullptr);
|
|
|
|
+ m_faceverifyWebView->deleteLater();
|
|
|
|
+ m_faceverifyWebView = nullptr;
|
|
}
|
|
}
|
|
- if (layout) {
|
|
|
|
- delete layout;
|
|
|
|
- layout = nullptr;
|
|
|
|
|
|
+
|
|
|
|
+ if (m_faceVerifyLayout) {
|
|
|
|
+ // Clear all layout items properly
|
|
|
|
+ QLayoutItem *item;
|
|
|
|
+ while ((item = m_faceVerifyLayout->takeAt(0)) != nullptr) {
|
|
|
|
+ if (QWidget *widget = item->widget()) {
|
|
|
|
+ widget->setParent(nullptr);
|
|
|
|
+ }
|
|
|
|
+ delete item;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Delete layout
|
|
|
|
+ delete m_faceVerifyLayout;
|
|
|
|
+ m_faceVerifyLayout = nullptr;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -124,7 +187,6 @@ void BlastOpePage::closeWebViewAndRestoreUI() {
|
|
void BlastOpePage::onUrlChanged(const QUrl &newUrl) {
|
|
void BlastOpePage::onUrlChanged(const QUrl &newUrl) {
|
|
LoadingWidget::showLoading(this, "查询验证结果...");
|
|
LoadingWidget::showLoading(this, "查询验证结果...");
|
|
if (newUrl.host() == "www.integrateblaster.com") {
|
|
if (newUrl.host() == "www.integrateblaster.com") {
|
|
- closeWebViewAndRestoreUI();
|
|
|
|
QNetworkAccessManager manager;
|
|
QNetworkAccessManager manager;
|
|
QUrl requestUrl(apiBackendUrl.resolved(QUrl(QString("h-face-verify/certifyId/%1").arg(certifyId))));
|
|
QUrl requestUrl(apiBackendUrl.resolved(QUrl(QString("h-face-verify/certifyId/%1").arg(certifyId))));
|
|
QNetworkRequest request(requestUrl);
|
|
QNetworkRequest request(requestUrl);
|
|
@@ -145,19 +207,25 @@ void BlastOpePage::onUrlChanged(const QUrl &newUrl) {
|
|
Logger::getInstance().error(QString("获取认证初始化数据失败. message: %1.").arg(message));
|
|
Logger::getInstance().error(QString("获取认证初始化数据失败. message: %1.").arg(message));
|
|
int ret = QMessageBox::information(nullptr, "认证失败", message + " ,请重新认证!");
|
|
int ret = QMessageBox::information(nullptr, "认证失败", message + " ,请重新认证!");
|
|
if (ret == QMessageBox::Ok) {
|
|
if (ret == QMessageBox::Ok) {
|
|
|
|
+ LoadingWidget::hideLoading();
|
|
InitFace();
|
|
InitFace();
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
QString passed = resultObj["Passed"].toString();
|
|
QString passed = resultObj["Passed"].toString();
|
|
if (passed == "T") {
|
|
if (passed == "T") {
|
|
|
|
+ closeWebViewAndRestoreUI(); // Clean up web view first
|
|
ui->setupUi(this);
|
|
ui->setupUi(this);
|
|
initPagination();
|
|
initPagination();
|
|
Logger::getInstance().info(QString("进入认证界面"));
|
|
Logger::getInstance().info(QString("进入认证界面"));
|
|
LoadingWidget::hideLoading();
|
|
LoadingWidget::hideLoading();
|
|
|
|
+ return; // Early return to avoid duplicate cleanup
|
|
} else if (passed == "F") {
|
|
} else if (passed == "F") {
|
|
int ret = QMessageBox::critical(nullptr, "提示", "操作失败,请重新认证!");
|
|
int ret = QMessageBox::critical(nullptr, "提示", "操作失败,请重新认证!");
|
|
if (ret == QMessageBox::Ok) {
|
|
if (ret == QMessageBox::Ok) {
|
|
|
|
+ LoadingWidget::hideLoading();
|
|
InitFace();
|
|
InitFace();
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -171,18 +239,16 @@ void BlastOpePage::onUrlChanged(const QUrl &newUrl) {
|
|
reply->deleteLater();
|
|
reply->deleteLater();
|
|
LoadingWidget::hideLoading();
|
|
LoadingWidget::hideLoading();
|
|
}
|
|
}
|
|
|
|
+ closeWebViewAndRestoreUI();
|
|
LoadingWidget::hideLoading();
|
|
LoadingWidget::hideLoading();
|
|
}
|
|
}
|
|
|
|
|
|
BlastOpePage::~BlastOpePage() {
|
|
BlastOpePage::~BlastOpePage() {
|
|
- delete ui;
|
|
|
|
|
|
+ // Clean up web resources first
|
|
|
|
+ closeWebViewAndRestoreUI();
|
|
|
|
|
|
- if (view) {
|
|
|
|
- delete view;
|
|
|
|
- }
|
|
|
|
- if (layout) {
|
|
|
|
- delete layout;
|
|
|
|
- }
|
|
|
|
|
|
+ // Clean up other resources
|
|
|
|
+ delete ui;
|
|
}
|
|
}
|
|
|
|
|
|
QJsonObject BlastOpePage::sendPostRequest(const QUrl &url, const QJsonObject &data) {
|
|
QJsonObject BlastOpePage::sendPostRequest(const QUrl &url, const QJsonObject &data) {
|