fix(login): 验证码改为显示后端 getImageCode 的 base64 图(data.image),客户端不再自画(后端已不回明文 code)

This commit is contained in:
gaozheng 2026-06-25 10:21:14 +08:00
parent 0a0d3ba017
commit 289b83cd35
3 changed files with 18 additions and 3 deletions

View File

@ -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) {

View File

@ -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();

View File

@ -17,10 +17,11 @@ class AuthService {
public:
AuthService(ApiClient& api, std::string rsaPublicKeyPem);
// 验证码:服务端把答案明文回传data.code答案 + data.id 用于下一步校验
// 验证码:服务端返回 data.id + data.imagebase64 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)。