90 lines
2.9 KiB
C++
90 lines
2.9 KiB
C++
#ifndef NETWORKAPIMANAGER_H
|
|
#define NETWORKAPIMANAGER_H
|
|
|
|
#include <QObject>
|
|
#include <QNetworkAccessManager>
|
|
#include <QNetworkReply>
|
|
#include <QVector>
|
|
#include "AttendanceRecord.h"
|
|
#include "TimeSlotConfig.h"
|
|
|
|
/**
|
|
* @brief 网络API管理类
|
|
*
|
|
* 负责与服务器端HTTP API通信(支持AES-128-CBC加密)
|
|
* API端点:http://server_ip:8082/api/
|
|
*/
|
|
class NetworkApiManager : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit NetworkApiManager(QObject *parent = nullptr);
|
|
~NetworkApiManager();
|
|
|
|
// 设置服务器地址
|
|
void setServerUrl(const QString &url);
|
|
QString getServerUrl() const { return m_serverUrl; }
|
|
|
|
// 设置是否启用加密通信
|
|
void setEncryptionEnabled(bool enabled) { m_encryptionEnabled = enabled; }
|
|
bool isEncryptionEnabled() const { return m_encryptionEnabled; }
|
|
|
|
// API调用
|
|
void fetchRecords(int limit = 100, int offset = 0);
|
|
void fetchStatistics();
|
|
void clearAllRecords();
|
|
void deleteRecord(const QString ×tamp, const QString &studentId);
|
|
void uploadTimeSlots(const QVector<TimeSlot> &timeSlots);
|
|
void checkHealth();
|
|
|
|
// 映射配置API
|
|
void uploadMappingConfig(const QMap<QString, QString> &studentNameMap,
|
|
const QMap<QString, QString> &classNameMap);
|
|
void fetchMappingConfig();
|
|
|
|
// 人脸照片管理API
|
|
void fetchFacePhotos();
|
|
void fetchFacePhoto(const QString &faceId);
|
|
void uploadFaceIdMapping(const QMap<QString, QString> &mapping);
|
|
void fetchFaceIdMapping();
|
|
|
|
signals:
|
|
// 响应信号
|
|
void recordsFetched(const QVector<AttendanceRecord> &records);
|
|
void statisticsFetched(int total, int today, const QString &serverTime);
|
|
void recordsCleared(bool success);
|
|
void recordDeleted(bool success);
|
|
void timeSlotsUploaded(bool success);
|
|
void healthChecked(bool healthy);
|
|
void errorOccurred(const QString &error);
|
|
|
|
// 映射配置信号
|
|
void mappingConfigUploaded(bool success);
|
|
void mappingConfigFetched(const QMap<QString, QString> &studentNameMap,
|
|
const QMap<QString, QString> &classNameMap);
|
|
|
|
// 人脸照片管理信号
|
|
void facePhotosFetched(const QJsonArray &photos);
|
|
void facePhotoFetched(const QString &faceId, const QByteArray &photoData);
|
|
void faceIdMappingUploaded(bool success);
|
|
void faceIdMappingFetched(const QMap<QString, QString> &mapping);
|
|
|
|
private slots:
|
|
void onReplyFinished(QNetworkReply *reply);
|
|
|
|
private:
|
|
QNetworkAccessManager *m_networkManager;
|
|
QString m_serverUrl;
|
|
bool m_encryptionEnabled; // 是否启用加密通信
|
|
|
|
QString buildApiUrl(const QString &endpoint, const QMap<QString, QString> ¶ms = QMap<QString, QString>());
|
|
QVector<AttendanceRecord> parseRecordsJson(const QByteArray &json);
|
|
|
|
// AES加密/解密功能
|
|
QByteArray aesDecrypt(const QByteArray &encryptedData);
|
|
QByteArray removePKCS7Padding(const QByteArray &data);
|
|
};
|
|
|
|
#endif // NETWORKAPIMANAGER_H
|