有个不必现错误,预览初步完成

This commit is contained in:
2025-03-25 18:35:28 +08:00
parent c84b88a422
commit d86f80982d
25 changed files with 967 additions and 393 deletions

View File

@@ -4,3 +4,6 @@ include($$PWD/fileconfigdecode/fileconfigdecode.pri)
INCLUDEPATH += $$PWD/tchttpservice
include($$PWD/tchttpservice/tchttpservice.pri)
INCLUDEPATH += $$PWD/urldatabase
include($$PWD/urldatabase/urldatabase.pri)

View File

@@ -32,18 +32,31 @@ void TCHttpService::apiLogin()
QNetworkReply* reply = nullptr;
QNetworkRequest request(url);
QNetworkRequest request(url);
for (auto ite = headers.constBegin(); ite != headers.constEnd(); ite++){
request.setRawHeader(ite.key().toUtf8(), ite.value().toUtf8());
}
reply = m_manager.post(request, jsonData);
reply = m_manager.post(request, jsonData);
QObject::connect(reply, &QNetworkReply::finished, [this, reply]() {
QObject::connect(reply, &QNetworkReply::finished, [this, reply]() {
QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll());
if (jsonDoc.isEmpty())
return;
QJsonObject jsonObj = jsonDoc.object();
int code = jsonObj["code"].toInt();
if (code == 0) {
this->m_token = jsonObj["token"].toString();
qDebug() << this->m_token;
m_isOnline = true;
emit signal_loginSuc();
}
});
emit requestFinished(reply, "login");
});
}
#if 0
void TCHttpService::apiMyfileCount()
{
@@ -155,7 +168,7 @@ void TCHttpService::apiMd5(const QString& filePath)
emit requestFinished(reply, "md5");
});
}
#endif
void TCHttpService::apiUpload(const QString &filePath)
{
@@ -229,10 +242,14 @@ void TCHttpService::apiUpload(const QString &filePath)
connect(reply, &QNetworkReply::finished, this, [=]() {
if (reply->error() == QNetworkReply::NoError) {
qDebug() << "上传成功:";
apiMyfileCount();
QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll());
QJsonObject jsonObj = jsonDoc.object();
QString fileUrl = jsonObj["url"].toString();
emit signal_uploadFileSec(fileUrl);
} else {
qDebug() << "上传失败:" << reply->errorString();
}
reply->deleteLater();
multiPart->deleteLater();
});
@@ -272,6 +289,7 @@ void TCHttpService::setConfiguration(QString userName, QString firstPwd, QString
this->m_domain = domain;
this->m_userName = userName;
this->m_firstPwd = firstPwd;
#if 0
connect(this, &TCHttpService::requestFinished, [this](QNetworkReply* reply, QString api){
QByteArray rawData = reply->readAll();
if (api == "login") {
@@ -284,11 +302,13 @@ void TCHttpService::setConfiguration(QString userName, QString firstPwd, QString
if (code == 0) {
this->m_token = jsonObj["token"].toString();
qDebug() << this->m_token;
apiMyfileCount();
m_isOnline = true;
emit signal_loginSuc();
// apiMyfileCount();
}
}
#if 0
if (api == "myfilecount") {
QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
if (jsonDoc.isEmpty())
@@ -309,6 +329,7 @@ void TCHttpService::setConfiguration(QString userName, QString firstPwd, QString
}
}
if (api == "myfilenormal") {
static int loginCnt = 0;
@@ -356,14 +377,14 @@ void TCHttpService::setConfiguration(QString userName, QString firstPwd, QString
qDebug() << "fileMap size:" << m_fileMap.size();
#endif
}
if (!m_isOnline) {
loginCnt++;
qDebug() << "loginCnt:" << loginCnt;
if (loginCnt == m_total/10+1) {
m_isOnline = true;
qDebug() << "login success";
}
}
// if (!m_isOnline) {
// loginCnt++;
// qDebug() << "loginCnt:" << loginCnt;
// if (loginCnt == m_total/10+1) {
// m_isOnline = true;
// qDebug() << "login success";
// }
// }
}
// if (api == "upload") {
@@ -376,8 +397,10 @@ void TCHttpService::setConfiguration(QString userName, QString firstPwd, QString
// if (code == 0)
// this->apiMyfileCount();
// }
#endif
reply->deleteLater();
});
#endif
apiLogin();
}
@@ -396,6 +419,33 @@ void TCHttpService::setUploadNum(int nb)
this->m_uploadNum = nb;
}
void TCHttpService::downloadImage(const QString &requestId, const QUrl &imageUrl)
{
QNetworkRequest request(imageUrl);
QNetworkReply* reply = m_manager.get(request);
connect(reply, &QNetworkReply::finished, [this, reply](){
QString requestId = m_pendingRequests.take(reply);
if (reply->error() != QNetworkReply::NoError) {
emit signal_downloadFailed(requestId, reply->errorString());
}
else {
QPixmap pixmap;
if (pixmap.loadFromData(reply->readAll())) {
emit signal_imageDownloaded(requestId, pixmap);
}
else {
emit signal_downloadFailed(requestId, "Failed to load image data");
}
}
reply->deleteLater();
});
m_pendingRequests[reply] = requestId;
}
QUrl TCHttpService::encodeUrl(QString urlStr, QMap<QString, QString> params)
{
QUrlQuery query;
@@ -409,20 +459,27 @@ QUrl TCHttpService::encodeUrl(QString urlStr, QMap<QString, QString> params)
return url;
}
void TCHttpService::updateFileMap(QJsonObject jsonObj)
{
// QString fileMD5 = jsonObj["md5"].toString();
// QString fileUrl = jsonObj["http"].toString();
// QMap<QString, file_info_t>::iterator ite = m_fileMap.begin();
// if (ite != m_fileMap.end())
// return;
// m_fileMap.insert(fileMD5, fileUrl);
}
TCHttpService::TCHttpService(QObject *parent) : QObject(parent)
{
}
void TCHttpService::slot_downloadFinished(QNetworkReply *reply)
{
QString requestId = m_pendingRequests.take(reply);
if (reply->error() != QNetworkReply::NoError) {
emit signal_downloadFailed(requestId, reply->errorString());
}
else {
QPixmap pixmap;
if (pixmap.loadFromData(reply->readAll())) {
emit signal_imageDownloaded(requestId, pixmap);
}
else {
emit signal_downloadFailed(requestId, "Failed to load image data");
}
}
reply->deleteLater();
}

View File

@@ -14,9 +14,11 @@
#include <QJsonArray>
#include <QFile>
#include <QFileInfo>
#include <QPixmap>
#include <QHttpMultiPart>
#include <QHttpPart>
#include <QHttpMultiPart>
#include <QHash>
class TCHttpService : public QObject
{
@@ -34,9 +36,11 @@ public:
static TCHttpService* getInstance();
void apiLogin();
#if 0
void apiMyfileCount();
void apiMyfileNormal(int start, int count);
void apiMd5(const QString& filePath);
#endif
void apiUpload(const QString& filePath);
void apiSharePicShare(const QString& fileName, const QString& md5);
void setConfiguration(QString userName, QString firstPwd, QString domain);
@@ -44,16 +48,20 @@ public:
bool getOnlineState();
void setUploadNum(int nb);
void downloadImage(const QString& requestId, const QUrl& imageUrl);
private:
QUrl encodeUrl(QString url, QMap<QString, QString> params);
void updateFileMap(QJsonObject jsonObj);
signals:
void signal_loginSuc();
void signal_uploadSuc();
void signal_shareSuc();
void signal_uploadFileSec(QString url);
void requestFinished(QNetworkReply* reply, QString api);
void signal_imageDownloaded(const QString& requestId, const QPixmap& pixmap);
void signal_downloadFailed(const QString& requestId, const QString& error);
private:
explicit TCHttpService(QObject *parent = nullptr);
@@ -72,6 +80,10 @@ private:
bool m_uploadNum = 0;
QHash<QNetworkReply*, QString> m_pendingRequests;
private slots:
void slot_downloadFinished(QNetworkReply* reply);
};
#endif // TCHTTPSERVICE_H

View File

@@ -0,0 +1,217 @@
#include "urldatabase.h"
ImageUrlDatabase::ImageUrlDatabase(QObject *parent) : QObject(parent)
{
}
ImageUrlDatabase::~ImageUrlDatabase()
{
if (m_db.isOpen()) {
m_db.close();
}
}
bool ImageUrlDatabase::openDatabase(const QString &path)
{
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(path);
if (!m_db.open()) {
qWarning() << "Failed to open database:" << m_db.lastError().text();
return false;
}
// 创建表结构
QSqlQuery query;
// 创建用户表
if (!query.exec("CREATE TABLE IF NOT EXISTS users ("
"user_id INTEGER PRIMARY KEY AUTOINCREMENT, "
"username TEXT NOT NULL UNIQUE, "
"created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)")) {
qWarning() << "Failed to create users table:" << query.lastError().text();
return false;
}
// 创建服务器表
if (!query.exec("CREATE TABLE IF NOT EXISTS servers ("
"server_id INTEGER PRIMARY KEY AUTOINCREMENT, "
"domain TEXT NOT NULL UNIQUE, "
"created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)")) {
qWarning() << "Failed to create servers table:" << query.lastError().text();
return false;
}
// 创建图片URL表
if (!query.exec("CREATE TABLE IF NOT EXISTS image_urls ("
"url_id INTEGER PRIMARY KEY AUTOINCREMENT, "
"user_id INTEGER NOT NULL, "
"server_id INTEGER NOT NULL, "
"image_url TEXT NOT NULL, "
"last_accessed TIMESTAMP, "
"created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, "
"FOREIGN KEY (user_id) REFERENCES users(user_id), "
"FOREIGN KEY (server_id) REFERENCES servers(server_id), "
"UNIQUE(user_id, server_id, image_url))")) {
qWarning() << "Failed to create image_urls table:" << query.lastError().text();
return false;
}
// 创建索引
query.exec("CREATE INDEX IF NOT EXISTS idx_image_user ON image_urls(user_id)");
query.exec("CREATE INDEX IF NOT EXISTS idx_image_server ON image_urls(server_id)");
return true;
}
int ImageUrlDatabase::addUser(const QString &username)
{
QSqlQuery query;
query.prepare("INSERT OR IGNORE INTO users (username) VALUES (?)");
query.addBindValue(username);
if (!query.exec()) {
qWarning() << "Failed to add user:" << query.lastError().text();
return -1;
}
// 获取用户ID
return getUserId(username);
}
int ImageUrlDatabase::getUserId(const QString &username)
{
QSqlQuery query;
query.prepare("SELECT user_id FROM users WHERE username = ?");
query.addBindValue(username);
if (!query.exec() || !query.next()) {
return -1;
}
return query.value(0).toInt();
}
int ImageUrlDatabase::addServer(const QString &domain)
{
QSqlQuery query;
query.prepare("INSERT OR IGNORE INTO servers (domain) VALUES (?)");
query.addBindValue(domain);
if (!query.exec()) {
qWarning() << "Failed to add server:" << query.lastError().text();
return -1;
}
// 获取服务器ID
return getServerId(domain);
}
int ImageUrlDatabase::getServerId(const QString &domain)
{
QSqlQuery query;
query.prepare("SELECT server_id FROM servers WHERE domain = ?");
query.addBindValue(domain);
if (!query.exec() || !query.next()) {
return -1;
}
return query.value(0).toInt();
}
bool ImageUrlDatabase::addImageUrl(const QString &username, const QString &domain, const QString &imageUrl)
{
int userId = addUser(username);
if (userId == -1) return false;
int serverId = addServer(domain);
if (serverId == -1) return false;
QSqlQuery query;
query.prepare("INSERT OR REPLACE INTO image_urls (user_id, server_id, image_url, last_accessed) "
"VALUES (?, ?, ?, datetime('now'))");
query.addBindValue(userId);
query.addBindValue(serverId);
query.addBindValue(imageUrl);
if (!query.exec()) {
qWarning() << "Failed to add image URL:" << query.lastError().text();
return false;
}
return true;
}
QList<QString> ImageUrlDatabase::getUserImages(const QString &username)
{
QList<QString> result;
int userId = getUserId(username);
if (userId == -1) return result;
QSqlQuery query;
query.prepare("SELECT i.image_url FROM image_urls i "
"WHERE i.user_id = ? "
"ORDER BY i.last_accessed DESC");
query.addBindValue(userId);
if (!query.exec()) {
qWarning() << "Failed to get user images:" << query.lastError().text();
return result;
}
while (query.next()) {
result.append(query.value(0).toString());
}
return result;
}
QList<QString> ImageUrlDatabase::getServerImages(const QString &domain)
{
QList<QString> result;
int serverId = getServerId(domain);
if (serverId == -1) return result;
QSqlQuery query;
query.prepare("SELECT i.image_url FROM image_urls i "
"WHERE i.server_id = ? "
"ORDER BY i.last_accessed DESC");
query.addBindValue(serverId);
if (!query.exec()) {
qWarning() << "Failed to get server images:" << query.lastError().text();
return result;
}
while (query.next()) {
result.append(query.value(0).toString());
}
return result;
}
bool ImageUrlDatabase::updateLastAccessed(const QString &username, const QString &domain, const QString &imageUrl)
{
int userId = getUserId(username);
if (userId == -1) return false;
int serverId = getServerId(domain);
if (serverId == -1) return false;
QSqlQuery query;
query.prepare("UPDATE image_urls SET last_accessed = datetime('now') "
"WHERE user_id = ? AND server_id = ? AND image_url = ?");
query.addBindValue(userId);
query.addBindValue(serverId);
query.addBindValue(imageUrl);
if (!query.exec()) {
qWarning() << "Failed to update last accessed time:" << query.lastError().text();
return false;
}
return query.numRowsAffected() > 0;
}

View File

@@ -0,0 +1,39 @@
#ifndef URLDATABASE_H
#define URLDATABASE_H
#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDateTime>
class ImageUrlDatabase : public QObject
{
Q_OBJECT
public:
explicit ImageUrlDatabase(QObject *parent = nullptr);
~ImageUrlDatabase();
bool openDatabase(const QString &path);
// 用户操作
int addUser(const QString &username);
// 服务器操作
int addServer(const QString &domain);
// 图片URL操作
bool addImageUrl(const QString &username, const QString &domain, const QString &imageUrl);
QList<QString> getUserImages(const QString &username);
QList<QString> getServerImages(const QString &domain);
bool updateLastAccessed(const QString &username, const QString &domain, const QString &imageUrl);
private:
QSqlDatabase m_db;
// 内部辅助方法
int getUserId(const QString &username);
int getServerId(const QString &domain);
};
#endif // URLDATABASE_H

View File

@@ -0,0 +1,5 @@
HEADERS += \
$$PWD/urldatabase.h
SOURCES += \
$$PWD/urldatabase.cpp