From 289b83cd351a666d702114b12ac651a30fa3da17 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Thu, 25 Jun 2026 10:21:14 +0800 Subject: [PATCH] =?UTF-8?q?fix(login):=20=E9=AA=8C=E8=AF=81=E7=A0=81?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E6=98=BE=E7=A4=BA=E5=90=8E=E7=AB=AF=20getIma?= =?UTF-8?q?geCode=20=E7=9A=84=20base64=20=E5=9B=BE(data.image),=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E4=B8=8D=E5=86=8D=E8=87=AA=E7=94=BB(?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=E5=B7=B2=E4=B8=8D=E5=9B=9E=E6=98=8E=E6=96=87?= =?UTF-8?q?=20code)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/login/LoginWindow.cpp | 15 ++++++++++++++- src/net/AuthLoads.cpp | 1 + src/net/AuthService.hpp | 5 +++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/app/login/LoginWindow.cpp b/src/app/login/LoginWindow.cpp index f2294f3..8f2b076 100644 --- a/src/app/login/LoginWindow.cpp +++ b/src/app/login/LoginWindow.cpp @@ -240,7 +240,20 @@ void LoginWindow::refreshCaptcha() if (l != captchaLoad_) return; // 身份比对:仅处理最新请求 captchaLoad_.clear(); codeId_ = cap.codeId; - captchaLabel_->setPixmap(renderCaptchaPixmap(cap.code)); + // 后端 getImageCode 返回的是 base64 PNG 图(data.image),直接显示; + // 兼容旧明文 code(若后端仍回传则用客户端绘制兜底)。 + QPixmap pix; + if (!cap.image.isEmpty()) { + const int comma = cap.image.indexOf(QLatin1Char(',')); // 去 "data:image/png;base64," 前缀 + const QByteArray b64 = + (comma >= 0 ? cap.image.mid(comma + 1) : cap.image).toLatin1(); + pix.loadFromData(QByteArray::fromBase64(b64)); + } + if (pix.isNull() && !cap.code.isEmpty()) pix = renderCaptchaPixmap(cap.code); + captchaLabel_->setPixmap( + pix.isNull() ? pix + : pix.scaled(captchaLabel_->size(), Qt::KeepAspectRatio, + Qt::SmoothTransformation)); refreshBtn_->setEnabled(true); }); connect(l, &geopro::net::CaptchaLoad::failed, this, [this, l](const QString& msg) { diff --git a/src/net/AuthLoads.cpp b/src/net/AuthLoads.cpp index b92498e..07bd690 100644 --- a/src/net/AuthLoads.cpp +++ b/src/net/AuthLoads.cpp @@ -29,6 +29,7 @@ CaptchaLoad::CaptchaLoad(IApiCall* call, QObject* parent) : QObject(parent), cal AuthService::Captcha cap; cap.codeId = resp.data.value(QStringLiteral("id")).toString(); cap.code = resp.data.value(QStringLiteral("code")).toString(); + cap.image = resp.data.value(QStringLiteral("image")).toString(); // 实际验证码图(base64 data URL) aborted_ = true; // 终态置位:到达 done 终态后 abort() 早退 emit done(cap); deleteLater(); diff --git a/src/net/AuthService.hpp b/src/net/AuthService.hpp index fe1f5cd..f1b2c79 100644 --- a/src/net/AuthService.hpp +++ b/src/net/AuthService.hpp @@ -17,10 +17,11 @@ class AuthService { public: AuthService(ApiClient& api, std::string rsaPublicKeyPem); - // 验证码:服务端把答案明文回传(data.code),答案 + data.id 用于下一步校验。 + // 验证码:服务端返回 data.id + data.image(base64 PNG 图,用户照图输入);data.code 已不返回。 struct Captcha { QString codeId; - QString code; + QString code; // 旧字段(后端已不返回明文,保留兼容) + QString image; // data URL base64 PNG(后端 getImageCode 实际返回的验证码图) }; // 异步拉验证码:GET getImageCode;返回句柄,连 CaptchaLoad::done(Captcha)/failed(QString)。