diff --git a/TreasureFinder.pro b/TreasureFinder.pro index 3616233..d63fcd5 100644 --- a/TreasureFinder.pro +++ b/TreasureFinder.pro @@ -1,4 +1,4 @@ -QT += core gui +QT += core gui network QT += sql greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -10,21 +10,31 @@ CONFIG += c++11 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ + basedatamanager.cpp \ db/xsqlexcute.cpp \ main.cpp \ mainwindow.cpp \ model/tradetablemodel.cpp \ - widget/addtradedialog.cpp + ruoyi/ruoyidatamanager.cpp \ + userdata.cpp \ + widget/addtradedialog.cpp \ + widget/logindialog.cpp HEADERS += \ + basedatamanager.h \ db/xsqlexcute.h \ mainwindow.h \ model/tradetablemodel.h \ - widget/addtradedialog.h + ruoyi/ruoyidatamanager.h \ + structs.h \ + userdata.h \ + widget/addtradedialog.h \ + widget/logindialog.h FORMS += \ mainwindow.ui \ - widget/addtradedialog.ui + widget/addtradedialog.ui \ + widget/logindialog.ui win32-msvc2010 { SPEC = win32-msvc2010 diff --git a/basedatamanager.cpp b/basedatamanager.cpp new file mode 100644 index 0000000..0a84a1a --- /dev/null +++ b/basedatamanager.cpp @@ -0,0 +1,24 @@ +/** + * 数据获取基础类;衍生类可以使用server后台、mysql直连、无 +*/ +#include "basedatamanager.h" + +BaseDataManager::BaseDataManager() +{ + +} + +BaseDataManager::~BaseDataManager() +{ + +} + +QPixmap BaseDataManager::GetVerificationCode() +{ + return QPixmap(); +} + +UserInfo BaseDataManager::Login(const QString &userName, const QString &password, const QString &code) +{ + return UserInfo(); +} diff --git a/basedatamanager.h b/basedatamanager.h new file mode 100644 index 0000000..f12e8d4 --- /dev/null +++ b/basedatamanager.h @@ -0,0 +1,26 @@ +#ifndef BASEDATAMANAGER_H +#define BASEDATAMANAGER_H + +#include +#include +#include "structs.h" + +class BaseDataManager : public QObject +{ + Q_OBJECT +public: + BaseDataManager(); + virtual ~BaseDataManager(); + + virtual QPixmap GetVerificationCode(); + virtual UserInfo Login(const QString& userName,const QString& password,const QString& code); + +signals: + //请求结束 ret 返回值 0成功 非0失败 + void Finished(int ret); + +protected: + UserInfo m_userInfo; +}; + +#endif // BASEDATAMANAGER_H diff --git a/main.cpp b/main.cpp index bb21a2f..d5f3419 100644 --- a/main.cpp +++ b/main.cpp @@ -2,6 +2,7 @@ #include #include +#include "widget/logindialog.h" int main(int argc, char *argv[]) { @@ -15,7 +16,12 @@ int main(int argc, char *argv[]) { app.installTranslator(&translator); } - MainWindow w; - w.show(); - return app.exec(); + LoginDialog login; + if(login.exec() == QDialog::Accepted) + { + MainWindow w; + w.show(); + return app.exec(); + } + return 0; } diff --git a/ruoyi/ruoyidatamanager.cpp b/ruoyi/ruoyidatamanager.cpp new file mode 100644 index 0000000..96b7a00 --- /dev/null +++ b/ruoyi/ruoyidatamanager.cpp @@ -0,0 +1,160 @@ +#include "ruoyidatamanager.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +RuoyiDataManager::RuoyiDataManager() +{ + m_pNetworkManager = new QNetworkAccessManager; + //服务器地址 + m_sUrl = "http://top.365rise.top"; +} + +RuoyiDataManager::~RuoyiDataManager() +{ + if(m_pNetworkManager) + { + m_pNetworkManager->deleteLater(); + m_pNetworkManager = nullptr; + } +} + +QPixmap RuoyiDataManager::GetVerificationCode() +{ + QNetworkRequest request; + QString urlStr(m_sUrl + "/prod-api/captchaImage"); + QUrl url = QUrl(urlStr); + request.setUrl(url); + QNetworkReply *reply = m_pNetworkManager->get(request); + reply->setProperty("msgType",QVariant(int(GETVERIFICATIONCODE))); + connect(reply,&QNetworkReply::finished,this,&RuoyiDataManager::RequestFinished); + + QEventLoop loop; + connect(this, SIGNAL(ParseReplyFinished()), &loop, SLOT(quit())); + loop.exec(); + + return m_userInfo.codePix; +} + +UserInfo RuoyiDataManager::Login(const QString &userName, const QString &password, const QString &code) +{ + m_userInfo.userName = userName; + + QNetworkRequest request; + QString urlStr(m_sUrl + "/prod-api/login"); + + QJsonDocument doc; + QJsonObject rootObject; + rootObject.insert("username",userName); + rootObject.insert("password",password); + rootObject.insert("code",code); + rootObject.insert("uuid",m_userInfo.uuid); + doc.setObject(rootObject); + qDebug() << __FUNCTION__ << " login json: " << doc.toJson(); + + QUrl url = QUrl(urlStr); + request.setUrl(url); + request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json;charset=UTF-8"); + QNetworkReply *reply = m_pNetworkManager->post(request,doc.toJson()); + reply->setProperty("msgType",QVariant(int(LOGIN))); + connect(reply,&QNetworkReply::finished,this,&RuoyiDataManager::RequestFinished); + + QEventLoop loop; + connect(this, SIGNAL(ParseReplyFinished()), &loop, SLOT(quit())); + loop.exec(); + + return m_userInfo; +} + +void RuoyiDataManager::RequestFinished() +{ + QNetworkReply *reply = dynamic_cast< QNetworkReply* >(sender()); + MsgType type =(MsgType) reply->property("msgType").toInt(); + if(type == GETVERIFICATIONCODE) + { + ParseVerificationCode(reply); + } + else if(type == LOGIN) + { + ParseLogin(reply); + } + emit ParseReplyFinished(); +} + +void RuoyiDataManager::ParseVerificationCode(QNetworkReply *reply) +{ + QByteArray readAllArray; + QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); + if(statusCode.isValid()) + { + qDebug() << "status code=" << statusCode.toInt(); + } + + QNetworkReply::NetworkError err = reply->error(); + if(err != QNetworkReply::NoError) + { + qDebug() << "Failed: " << reply->errorString(); + } + else + { + readAllArray = reply->readAll(); + QJsonParseError jsonError; + QJsonDocument document = QJsonDocument::fromJson(readAllArray,&jsonError); + if(jsonError.error == QJsonParseError::NoError && !document.isNull()) + { + QJsonObject root = document.object(); + if(root.contains("img")) + { + QPixmap pix; + bool ret = pix.loadFromData(QByteArray::fromBase64(root["img"].toString().toUtf8())); + m_userInfo.codePix = pix; + } + m_userInfo.uuid = root["uuid"].toString(); + } + else + { + qDebug() << __FUNCTION__ << __LINE__ << jsonError.errorString(); + } + } +} + +void RuoyiDataManager::ParseLogin(QNetworkReply *reply) +{ + QByteArray readAllArray; + QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); + if(statusCode.isValid()) + { + qDebug() << "status code=" << statusCode.toInt(); + } + + QNetworkReply::NetworkError err = reply->error(); + if(err != QNetworkReply::NoError) + { + qDebug() << "Failed: " << reply->errorString(); + } + else + { + readAllArray = reply->readAll(); + QJsonParseError jsonError; + QJsonDocument document = QJsonDocument::fromJson(readAllArray,&jsonError); + if(jsonError.error == QJsonParseError::NoError && !document.isNull()) + { + QJsonObject root = document.object(); + if(root.contains("token") && root["code"].toInt() == 200) + { + m_userInfo.token = root["token"].toString(); + } + } + else + { + qDebug() << __FUNCTION__ << __LINE__ << jsonError.errorString(); + } + } +} + diff --git a/ruoyi/ruoyidatamanager.h b/ruoyi/ruoyidatamanager.h new file mode 100644 index 0000000..efb159d --- /dev/null +++ b/ruoyi/ruoyidatamanager.h @@ -0,0 +1,38 @@ +#ifndef RUOYIDATAMANAGER_H +#define RUOYIDATAMANAGER_H +#include "basedatamanager.h" + +class QNetworkAccessManager; +class QNetworkReply; +class RuoyiDataManager : public BaseDataManager +{ + Q_OBJECT + + enum MsgType + { + GETVERIFICATIONCODE = 0, + LOGIN + }; + +public: + RuoyiDataManager(); + ~RuoyiDataManager(); + + QPixmap GetVerificationCode() override; + UserInfo Login(const QString& userName,const QString& password,const QString& code) override; + +public slots: + void RequestFinished(); + +signals: + void ParseReplyFinished(); +private: + void ParseVerificationCode(QNetworkReply* reply); + void ParseLogin(QNetworkReply* reply); + +private: + QNetworkAccessManager* m_pNetworkManager; + QString m_sUrl; +}; + +#endif // RUOYIDATAMANAGER_H diff --git a/structs.h b/structs.h new file mode 100644 index 0000000..ee09904 --- /dev/null +++ b/structs.h @@ -0,0 +1,22 @@ +#ifndef STRUCTS_H +#define STRUCTS_H +#include +#include + +enum ManagerType +{ + None = 0, + Ruoyi, + MySql +}; + +//用户基本信心 +typedef struct tagUserInfo +{ + QString userName; // 用户名 + QString uuid;// 验证码uuid + QString token;// 登录token + QPixmap codePix; +}UserInfo; + +#endif // STRUCTS_H diff --git a/userdata.cpp b/userdata.cpp new file mode 100644 index 0000000..3ee71f5 --- /dev/null +++ b/userdata.cpp @@ -0,0 +1,44 @@ +#include "userdata.h" +#include "ruoyi/ruoyidatamanager.h" + +UserData::UserData() +{ + m_pDataManager = nullptr; +} + +UserData::~UserData() +{ + if(m_pDataManager) + { + delete m_pDataManager; + m_pDataManager = nullptr; + } +} + +void UserData::SetManagerType(ManagerType type) +{ + if(type == None) + { + m_pDataManager = new BaseDataManager; + } + else if(type == Ruoyi) + { + m_pDataManager = new RuoyiDataManager; + } +} + +QPixmap UserData::GetVerificationCode() +{ + if(m_pDataManager == nullptr) + return QPixmap(); + else + return m_pDataManager->GetVerificationCode(); +} + +UserInfo UserData::Login(const QString &userName, const QString &password, const QString &code) +{ + if(m_pDataManager == nullptr) + return UserInfo(); + else + return m_pDataManager->Login(userName,password,code); +} diff --git a/userdata.h b/userdata.h new file mode 100644 index 0000000..90f1670 --- /dev/null +++ b/userdata.h @@ -0,0 +1,25 @@ +#ifndef USERDATA_H +#define USERDATA_H +#include +#include +#include +#include "basedatamanager.h" +#include "structs.h" + +class UserData : public QObject +{ + Q_OBJECT +public: + UserData(); + ~UserData(); + void SetManagerType(ManagerType type); + //获取验证码图片;可选 + QPixmap GetVerificationCode(); + //登录 获取用户信息,同步等待 + UserInfo Login(const QString& userName,const QString& password,const QString& code); + +private: + BaseDataManager* m_pDataManager; +}; + +#endif // USERDATA_H diff --git a/widget/logindialog.cpp b/widget/logindialog.cpp new file mode 100644 index 0000000..06594ce --- /dev/null +++ b/widget/logindialog.cpp @@ -0,0 +1,41 @@ +#include "logindialog.h" +#include "ui_logindialog.h" +#include +#include +#include +#include +#include +#include +#include + +LoginDialog::LoginDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::LoginDialog) +{ + ui->setupUi(this); + m_UserData.SetManagerType(ManagerType::Ruoyi); + GetVerificationCode(); +} + +LoginDialog::~LoginDialog() +{ + delete ui; +} + +void LoginDialog::on_pushButton_cancle_clicked() +{ + this->reject(); +} + +void LoginDialog::GetVerificationCode() +{ + QPixmap pix = m_UserData.GetVerificationCode(); + ui->label_code->setPixmap(pix.scaledToHeight(34)); +} + +void LoginDialog::on_pushButton_login_clicked() +{ + m_UserInfo = m_UserData.Login(ui->username->text(),ui->password->text(),ui->code->text()); + qDebug() << __FUNCTION__ << " login finished: "<< m_UserInfo.userName << m_UserInfo.token << m_UserInfo.uuid; +} + diff --git a/widget/logindialog.h b/widget/logindialog.h new file mode 100644 index 0000000..6ec312f --- /dev/null +++ b/widget/logindialog.h @@ -0,0 +1,35 @@ +#ifndef LOGINDIALOG_H +#define LOGINDIALOG_H + +#include +#include "userdata.h" +#include "structs.h" + +namespace Ui { +class LoginDialog; +} + +class QNetworkReply; +class LoginDialog : public QDialog +{ + Q_OBJECT + +public: + explicit LoginDialog(QWidget *parent = nullptr); + ~LoginDialog(); + +private: + //加载验证码 + void GetVerificationCode(); + +private slots: + void on_pushButton_cancle_clicked(); + void on_pushButton_login_clicked(); + +private: + Ui::LoginDialog *ui; + UserData m_UserData; + UserInfo m_UserInfo; +}; + +#endif // LOGINDIALOG_H diff --git a/widget/logindialog.ui b/widget/logindialog.ui new file mode 100644 index 0000000..0116a7b --- /dev/null +++ b/widget/logindialog.ui @@ -0,0 +1,133 @@ + + + LoginDialog + + + + 0 + 0 + 707 + 459 + + + + Dialog + + + + + 150 + 150 + 440 + 126 + + + + + + + Verification code + + + + + + + + 0 + 36 + + + + + + + + + 96 + 36 + + + + + 96 + 36 + + + + + + + + + + + Password + + + + + + + UserName + + + + + + + + 128 + 36 + + + + admin + + + + + + + + 0 + 36 + + + + 1qazse42W3 + + + + + + + + + 270 + 310 + 169 + 26 + + + + + + + Login + + + + + + + Cancel + + + + + + + + +