feat/vtk-3d-view #7
|
|
@ -240,7 +240,20 @@ void LoginWindow::refreshCaptcha()
|
||||||
if (l != captchaLoad_) return; // 身份比对:仅处理最新请求
|
if (l != captchaLoad_) return; // 身份比对:仅处理最新请求
|
||||||
captchaLoad_.clear();
|
captchaLoad_.clear();
|
||||||
codeId_ = cap.codeId;
|
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);
|
refreshBtn_->setEnabled(true);
|
||||||
});
|
});
|
||||||
connect(l, &geopro::net::CaptchaLoad::failed, this, [this, l](const QString& msg) {
|
connect(l, &geopro::net::CaptchaLoad::failed, this, [this, l](const QString& msg) {
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ CaptchaLoad::CaptchaLoad(IApiCall* call, QObject* parent) : QObject(parent), cal
|
||||||
AuthService::Captcha cap;
|
AuthService::Captcha cap;
|
||||||
cap.codeId = resp.data.value(QStringLiteral("id")).toString();
|
cap.codeId = resp.data.value(QStringLiteral("id")).toString();
|
||||||
cap.code = resp.data.value(QStringLiteral("code")).toString();
|
cap.code = resp.data.value(QStringLiteral("code")).toString();
|
||||||
|
cap.image = resp.data.value(QStringLiteral("image")).toString(); // 实际验证码图(base64 data URL)
|
||||||
aborted_ = true; // 终态置位:到达 done 终态后 abort() 早退
|
aborted_ = true; // 终态置位:到达 done 终态后 abort() 早退
|
||||||
emit done(cap);
|
emit done(cap);
|
||||||
deleteLater();
|
deleteLater();
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,11 @@ class AuthService {
|
||||||
public:
|
public:
|
||||||
AuthService(ApiClient& api, std::string rsaPublicKeyPem);
|
AuthService(ApiClient& api, std::string rsaPublicKeyPem);
|
||||||
|
|
||||||
// 验证码:服务端把答案明文回传(data.code),答案 + data.id 用于下一步校验。
|
// 验证码:服务端返回 data.id + data.image(base64 PNG 图,用户照图输入);data.code 已不返回。
|
||||||
struct Captcha {
|
struct Captcha {
|
||||||
QString codeId;
|
QString codeId;
|
||||||
QString code;
|
QString code; // 旧字段(后端已不返回明文,保留兼容)
|
||||||
|
QString image; // data URL base64 PNG(后端 getImageCode 实际返回的验证码图)
|
||||||
};
|
};
|
||||||
|
|
||||||
// 异步拉验证码:GET getImageCode;返回句柄,连 CaptchaLoad::done(Captcha)/failed(QString)。
|
// 异步拉验证码:GET getImageCode;返回句柄,连 CaptchaLoad::done(Captcha)/failed(QString)。
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue