backendapimanager.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #include "backendapimanager.h"
  2. #include <QtCore/qlogging.h>
  3. #include <QEventLoop>
  4. #include <QUrlQuery>
  5. #include "logger.h"
  6. backendAPIManager *backendAPIManager::s_instance = nullptr;
  7. void backendAPIManager::initialize(const QString &backendUrl) {
  8. if (!s_instance) {
  9. s_instance = new backendAPIManager(backendUrl);
  10. }
  11. }
  12. void backendAPIManager::cleanup() {
  13. if (s_instance) {
  14. delete s_instance;
  15. s_instance = nullptr;
  16. }
  17. }
  18. void backendAPIManager::setAuthToken(const QString &token) {
  19. if (s_instance) {
  20. s_instance->authToken = token;
  21. }
  22. }
  23. backendAPIManager::backendAPIManager(const QString &backendUrl, QObject *parent)
  24. : QObject(parent), backendUrl(backendUrl), requestSuccess(false) {
  25. networkManager = new QNetworkAccessManager(this);
  26. }
  27. backendAPIManager::~backendAPIManager() {
  28. if (networkManager) {
  29. delete networkManager;
  30. networkManager = nullptr;
  31. }
  32. }
  33. void backendAPIManager::setupRequest(QNetworkRequest &request, const QString &endpoint) {
  34. request.setUrl(QUrl(backendUrl + endpoint));
  35. request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
  36. if (!s_instance->authToken.isEmpty()) {
  37. request.setRawHeader("Authorization", s_instance->authToken.toUtf8());
  38. }
  39. }
  40. QNetworkReply *backendAPIManager::sendRequest(const QString &endpoint, const QJsonObject &data, const QString &method) {
  41. QNetworkRequest request;
  42. setupRequest(request, endpoint);
  43. QJsonDocument doc(data);
  44. QByteArray jsonData = doc.toJson();
  45. QNetworkReply *reply = nullptr;
  46. if (method == "GET") {
  47. if (!data.isEmpty()) {
  48. QUrl url = request.url();
  49. QUrlQuery query;
  50. for (const QString &key : data.keys()) {
  51. QJsonValue value = data.value(key);
  52. if (value.isString()) {
  53. query.addQueryItem(key, value.toString());
  54. } else if (value.isDouble()) {
  55. query.addQueryItem(key, QString::number(value.toDouble()));
  56. } else if (value.isBool()) {
  57. query.addQueryItem(key, value.toBool() ? "true" : "false");
  58. } else if (value.isArray()) {
  59. // 处理数组参数,将数组元素作为多个同名参数
  60. QJsonArray array = value.toArray();
  61. for (const QJsonValue &arrayValue : array) {
  62. query.addQueryItem(key, arrayValue.toString());
  63. }
  64. } else {
  65. // 对于其他复杂类型,转换为JSON字符串
  66. QJsonDocument doc;
  67. if (value.isObject()) {
  68. doc.setObject(value.toObject());
  69. } else {
  70. doc.setArray(value.toArray());
  71. }
  72. query.addQueryItem(key, doc.toJson(QJsonDocument::Compact));
  73. }
  74. }
  75. url.setQuery(query);
  76. request.setUrl(url);
  77. qDebug() << "GET request URL:" << url.toString();
  78. }
  79. reply = networkManager->get(request);
  80. } else if (method == "POST") {
  81. reply = networkManager->post(request, jsonData);
  82. } else if (method == "PUT") {
  83. reply = networkManager->put(request, jsonData);
  84. } else if (method == "DELETE") {
  85. reply = networkManager->deleteResource(request);
  86. }
  87. return reply;
  88. }
  89. QJsonObject backendAPIManager::getSafetyInspect(QString dateStr) {
  90. if (!s_instance) return QJsonObject();
  91. s_instance->requestSuccess = false;
  92. QJsonObject params;
  93. params.insert("page", 1);
  94. params.insert("pageSize", 1);
  95. params.insert("dutyDate", dateStr);
  96. QNetworkReply *reply = s_instance->sendRequest("h-safety-inspect", params, "GET");
  97. QEventLoop loop;
  98. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  99. loop.exec();
  100. QJsonObject result;
  101. if (reply->error() == QNetworkReply::NoError) {
  102. QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
  103. if (response.object()["code"].toInt() != 200) {
  104. return QJsonObject();
  105. }
  106. result = response.object()["data"].toObject()["list"].toArray().first().toObject();
  107. }
  108. reply->deleteLater();
  109. return result;
  110. }
  111. QJsonObject backendAPIManager::getBlastRecords(int page, int pageSize, QJsonObject params) {
  112. if (!s_instance) return QJsonObject();
  113. s_instance->requestSuccess = false;
  114. params.insert("page", QString::number(page));
  115. params.insert("pageSize", QString::number(pageSize));
  116. QNetworkReply *reply = s_instance->sendRequest("blastrecord", params, "GET");
  117. QEventLoop loop;
  118. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  119. loop.exec();
  120. QJsonObject result;
  121. if (reply->error() == QNetworkReply::NoError) {
  122. QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
  123. result = response.object()["data"].toObject();
  124. }
  125. reply->deleteLater();
  126. return result;
  127. }
  128. QJsonObject backendAPIManager::getHProjects(int page, int pageSize, QJsonObject extParams) {
  129. if (!s_instance) return QJsonObject();
  130. QJsonObject params{
  131. {"page", page},
  132. {"pageSize", pageSize},
  133. {"createdAtOrder", "DESC"},
  134. };
  135. for (const QString &key : extParams.keys()) {
  136. params.insert(key, extParams.value(key));
  137. }
  138. QNetworkReply *reply = s_instance->sendRequest("h-project", params, "GET");
  139. QEventLoop loop;
  140. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  141. loop.exec();
  142. QJsonObject result;
  143. if (reply->error() == QNetworkReply::NoError) {
  144. QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
  145. result = response.object();
  146. }
  147. reply->deleteLater();
  148. return result;
  149. }
  150. QJsonArray backendAPIManager::getSysUsers() {
  151. if (!s_instance) return QJsonArray();
  152. QJsonObject params = QJsonObject();
  153. params.insert("page", "1");
  154. params.insert("pageSize", "200"); // Assuming a reasonable page size for initial
  155. QNetworkReply *reply = s_instance->sendRequest("sys-user", params, "GET");
  156. QEventLoop loop;
  157. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  158. loop.exec();
  159. QJsonArray result;
  160. if (reply->error() == QNetworkReply::NoError) {
  161. QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
  162. result = response.object()["data"].toObject()["list"].toArray();
  163. }
  164. reply->deleteLater();
  165. return result;
  166. }
  167. QJsonArray backendAPIManager::getDailyBlastedCount(int days) {
  168. if (!s_instance) return QJsonArray();
  169. QJsonObject params;
  170. params.insert("days", QString::number(days));
  171. QNetworkReply *reply = s_instance->sendRequest("blastrecord/daily_counts", params, "GET");
  172. QEventLoop loop;
  173. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  174. loop.exec();
  175. QJsonArray result;
  176. if (reply->error() == QNetworkReply::NoError) {
  177. QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
  178. result = response.object()["data"].toArray();
  179. } else {
  180. Logger::getInstance().error(
  181. QString("GetDailyBlastedCount request failed. error message: %1").arg(reply->errorString()));
  182. }
  183. reply->deleteLater();
  184. return result;
  185. }
  186. QJsonArray backendAPIManager::getHAddresses() {
  187. if (!s_instance) return QJsonArray();
  188. QNetworkReply *reply = s_instance->sendRequest("h-address/pc", QJsonObject(), "GET");
  189. QEventLoop loop;
  190. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  191. loop.exec();
  192. QJsonArray result;
  193. if (reply->error() == QNetworkReply::NoError) {
  194. QJsonDocument response = QJsonDocument::fromJson(reply->readAll());
  195. result = response.object()["data"].toArray();
  196. }
  197. reply->deleteLater();
  198. return result;
  199. }
  200. void backendAPIManager::handleResponseOKFinished(const QJsonDocument &response, const QUrl &url) {
  201. // Check response status
  202. if (response.object().contains("code")) {
  203. int code = response.object()["code"].toInt();
  204. requestSuccess = (code == 200);
  205. } else {
  206. requestSuccess = false;
  207. }
  208. emit uploadFinished(response);
  209. }
  210. void backendAPIManager::handleResponseError(const QString &error) {
  211. requestSuccess = false;
  212. emit uploadError(error);
  213. }