#pragma once #include #include namespace geopro::net { class ApiClient; class CaptchaLoad; class LoginLoad; // 登录编排:复刻已实测通过的 getImageCode -> verifyCodeCheck -> RSA -> login2 流程。 // 依赖外部注入的 ApiClient(单实例、共享会话);RSA 公钥 PEM 由调用方读取后传入。 // 异步:fetchCaptchaAsync/loginAsync 立即返回自管理句柄(net 层 CaptchaLoad/LoginLoad), // 不阻塞 UI;句柄 done/failed 后自 deleteLater。AuthService 自身只创建句柄,无需是 QObject。 class AuthService { public: AuthService(ApiClient& api, std::string rsaPublicKeyPem); // 验证码:服务端返回 data.id + data.image(base64 PNG 图,用户照图输入);data.code 已不返回。 struct Captcha { QString codeId; QString code; // 旧字段(后端已不返回明文,保留兼容) QString image; // data URL base64 PNG(后端 getImageCode 实际返回的验证码图) }; // 异步拉验证码:GET getImageCode;返回句柄,连 CaptchaLoad::done(Captcha)/failed(QString)。 CaptchaLoad* fetchCaptchaAsync(); // 异步登录:verifyCodeCheck -> RSA 加密密码 -> login2(依赖链)。 // 返回句柄,连 LoginLoad::done(token)/failed(QString)。 LoginLoad* loginAsync(const QString& username, const QString& password, const QString& code, const QString& codeId); private: ApiClient& api_; std::string rsaPublicKeyPem_; }; } // namespace geopro::net #include Q_DECLARE_METATYPE(geopro::net::AuthService::Captcha)