tloginapi.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "tloginapi.h"
  2. #include <QJsonDocument>
  3. #include <QJsonObject>
  4. #include <QJsonValue>
  5. #include <QNetworkAccessManager>
  6. #include <optional>
  7. #include "appevent.h"
  8. namespace TC {
  9. std::optional<QJsonValue> sendRequest(QNetworkAccessManager::Operation op,
  10. const QString &url,
  11. const QByteArray &postData = QByteArray());
  12. static const QLatin1String scJwtToken("JwtToken");
  13. static const QLatin1String scAccessToken("token");
  14. static const QLatin1String scAccessExpire("access_expire");
  15. static const QLatin1String scRefreshAfter("refresh_after");
  16. Login::Login()
  17. : QObject()
  18. , url("/sys-api/user/login")
  19. {}
  20. Login::Login(const QString &_user, const QString &_password, const QString &_captchaId, const QString &_captcha)
  21. : QObject()
  22. , url("/sys-api/user/login")
  23. {
  24. QJsonObject json;
  25. json["username"] = _user;
  26. json["password"] = _password;
  27. // 添加验证码参数
  28. if (!_captchaId.isEmpty() && !_captcha.isEmpty()) {
  29. json["captchaId"] = _captchaId;
  30. json["captcha"] = _captcha;
  31. }
  32. QJsonDocument jsonData(json);
  33. postData = jsonData.toJson();
  34. }
  35. bool Login::post()
  36. {
  37. std::optional<QJsonValue> data = sendRequest(QNetworkAccessManager::PostOperation,
  38. url,
  39. postData);
  40. if (!data.has_value()) {
  41. return false;
  42. }
  43. const QJsonObject &object = data.value().toObject();
  44. Login::Data ret;
  45. ret.accessToken = object["token"].toString();
  46. ret.accessExpire = object["expire"].toVariant().toLongLong();
  47. ret.userID = object["userId"].toString();
  48. qDebug() << object;
  49. // 计算refreshAfter:当前时间 + (过期时间 - 当前时间) * 2/3
  50. qint64 currentTime = AppEvent::time();
  51. qint64 timeToExpire = ret.accessExpire - currentTime;
  52. ret.refreshAfter = currentTime + (timeToExpire * 2 / 3);
  53. //设置 token 到全局变量
  54. if (ret.accessExpire > AppEvent::time()) {
  55. AppEvent::instance()->setJwtToken(ret.accessToken);
  56. AppEvent::instance()->setRefreshTime(ret.refreshAfter);
  57. return true;
  58. }
  59. return false;
  60. }
  61. LoginOut::LoginOut()
  62. : QObject()
  63. , url("/api/v1/user/loginOut")
  64. {}
  65. bool LoginOut::post()
  66. {
  67. std::optional<QJsonValue> data = sendRequest(QNetworkAccessManager::PostOperation, url, {});
  68. if (!data.has_value()) {
  69. return false;
  70. }
  71. const QJsonObject &object = data.value().toObject();
  72. AppEvent::instance()->setJwtToken(QString());
  73. return true;
  74. }
  75. RefreshToken::RefreshToken()
  76. : QObject()
  77. , url("/api/v1/user/refresh_token")
  78. {}
  79. bool RefreshToken::get()
  80. {
  81. std::optional<QJsonValue> data = sendRequest(QNetworkAccessManager::GetOperation, url);
  82. if (!data.has_value()) {
  83. return false;
  84. }
  85. RefreshToken::Data ret;
  86. if (!data.has_value()) {
  87. return false;
  88. }
  89. const QJsonObject &object = data.value().toObject();
  90. ret.accessToken = object[scAccessToken].toString();
  91. ret.accessExpire = object[scAccessExpire].toVariant().toLongLong();
  92. ret.refreshAfter = object[scRefreshAfter].toVariant().toLongLong();
  93. //设置 token 到全局变量
  94. if (ret.accessExpire > AppEvent::time()) {
  95. AppEvent::instance()->setJwtToken(ret.accessToken);
  96. AppEvent::instance()->setRefreshTime(ret.refreshAfter);
  97. return true;
  98. }
  99. return false;
  100. }
  101. UserInfo::UserInfo()
  102. : QObject()
  103. , url("/api/v1/user/userInfo")
  104. {}
  105. UserInfo::Data UserInfo::get(bool *b)
  106. {
  107. if (b) {
  108. *b = false;
  109. }
  110. UserInfo::Data ret;
  111. std::optional<QJsonValue> data = sendRequest(QNetworkAccessManager::GetOperation, url);
  112. if (!data.has_value()) {
  113. return ret;
  114. }
  115. const QJsonObject &object = data.value().toObject();
  116. ret.username = object["username"].toString();
  117. ret.maxTime = object["maxTime"].toVariant().toLongLong();
  118. ret.checkinNumber = object["checkinNumber"].toString();
  119. if (b) {
  120. *b = true;
  121. }
  122. return ret;
  123. }
  124. // /sys-api/captcha
  125. TC::Captcha::Captcha()
  126. : QObject()
  127. , url("/sys-api/captcha")
  128. {}
  129. TC::Captcha::Data TC::Captcha::get(bool *b)
  130. {
  131. if (b) {
  132. *b = false;
  133. }
  134. Captcha::Data ret;
  135. std::optional<QJsonValue> data = sendRequest(QNetworkAccessManager::GetOperation, url);
  136. if (!data.has_value()) {
  137. return ret;
  138. }
  139. const QJsonObject &object = data.value().toObject();
  140. ret.captchaId = object["captchaId"].toString();
  141. ret.imgPath = object["imgPath"].toString();
  142. if (b) {
  143. *b = true;
  144. }
  145. return ret;
  146. }
  147. } // namespace TC