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)。