From 24179fa46465e42a693c4535130cff637bb74c76 Mon Sep 17 00:00:00 2001 From: www-git-cn <102035872+www-git-cn@users.noreply.github.com> Date: Sun, 3 Mar 2024 23:55:56 +0800 Subject: [PATCH] first commit --- app.pro | 42 +++++ app.pro.user | 488 ++++++++++++++++++++++++++++++++++++++++++++++++ datamanager.cpp | 220 ++++++++++++++++++++++ datamanager.h | 62 ++++++ imgs/icon.png | Bin 0 -> 96751 bytes imgs/icon.qrc | 5 + login.cpp | 232 +++++++++++++++++++++++ login.h | 67 +++++++ login.ui | 155 +++++++++++++++ main.cpp | 12 ++ protocol.cpp | 148 +++++++++++++++ protocol.h | 59 ++++++ signup.cpp | 92 +++++++++ signup.h | 44 +++++ signup.ui | 198 ++++++++++++++++++++ tcpclient.cpp | 106 +++++++++++ tcpclient.h | 41 ++++ widget.cpp | 136 ++++++++++++++ widget.h | 50 +++++ widget.ui | 159 ++++++++++++++++ 20 files changed, 2316 insertions(+) create mode 100644 app.pro create mode 100644 app.pro.user create mode 100644 datamanager.cpp create mode 100644 datamanager.h create mode 100644 imgs/icon.png create mode 100644 imgs/icon.qrc create mode 100644 login.cpp create mode 100644 login.h create mode 100644 login.ui create mode 100644 main.cpp create mode 100644 protocol.cpp create mode 100644 protocol.h create mode 100644 signup.cpp create mode 100644 signup.h create mode 100644 signup.ui create mode 100644 tcpclient.cpp create mode 100644 tcpclient.h create mode 100644 widget.cpp create mode 100644 widget.h create mode 100644 widget.ui diff --git a/app.pro b/app.pro new file mode 100644 index 0000000..491b0ab --- /dev/null +++ b/app.pro @@ -0,0 +1,42 @@ +QT += core gui network + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets mqtt + +CONFIG += c++11 +ICON = icon.icns +TARGET = IoTCar + +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + datamanager.cpp \ + login.cpp \ + main.cpp \ + protocol.cpp \ + signup.cpp \ + tcpclient.cpp \ + widget.cpp + +HEADERS += \ + datamanager.h \ + login.h \ + protocol.h \ + signup.h \ + tcpclient.h \ + widget.h + +FORMS += \ + login.ui \ + signup.ui \ + widget.ui + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +RESOURCES += \ + imgs/icon.qrc + diff --git a/app.pro.user b/app.pro.user new file mode 100644 index 0000000..fe40358 --- /dev/null +++ b/app.pro.user @@ -0,0 +1,488 @@ + + + + + + EnvironmentId + {d3fed20c-1c94-44fc-8f6a-4dbf39b54775} + + + ProjectExplorer.Project.ActiveTarget + 1 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + 0 + false + true + false + 0 + true + true + 0 + 8 + true + false + 1 + true + true + true + *.md, *.MD, Makefile + false + true + true + + + + ProjectExplorer.Project.PluginSettings + + + true + false + true + true + true + true + + + 0 + true + + true + true + Builtin.DefaultTidyAndClazy + 4 + true + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop + Desktop Qt 6.5.3 MinGW 64-bit + Desktop Qt 6.5.3 MinGW 64-bit + qt.qt6.653.win64_mingw_kit + 0 + 0 + 0 + + 0 + C:\Users\25761\Desktop\build-app-Desktop_Qt_6_5_3_MinGW_64_bit-Debug + C:/Users/25761/Desktop/build-app-Desktop_Qt_6_5_3_MinGW_64_bit-Debug + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + 构建 + 构建 + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + 清除 + 清除 + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + C:\Users\25761\Desktop\build-app-Desktop_Qt_6_5_3_MinGW_64_bit-Release + C:/Users/25761/Desktop/build-app-Desktop_Qt_6_5_3_MinGW_64_bit-Release + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + 构建 + 构建 + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + 清除 + 清除 + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + + + 0 + C:\Users\25761\Desktop\build-app-Desktop_Qt_6_5_3_MinGW_64_bit-Profile + C:/Users/25761/Desktop/build-app-Desktop_Qt_6_5_3_MinGW_64_bit-Profile + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + 2 + 构建 + 构建 + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + 清除 + 清除 + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 0 + + 3 + + + 0 + 部署 + 部署 + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + true + true + 0 + true + + 2 + + false + + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/25761/Desktop/app/app.pro + C:/Users/25761/Desktop/app/app.pro + false + true + true + true + C:/Users/25761/Desktop/build-app-Desktop_Qt_6_5_3_MinGW_64_bit-Debug + + 1 + + + + ProjectExplorer.Project.Target.1 + + Android.Device.Type + 安卓 Qt 6.5.3 Clang arm64-v8a + 安卓 Qt 6.5.3 Clang arm64-v8a + {7c520419-6b2e-4709-ae24-2a8e3b2ab41b} + 0 + 0 + 0 + + 0 + C:\Users\25761\Desktop\build-app-Qt_6_5_3_Clang_arm64_v8a-Debug + C:/Users/25761/Desktop/build-app-Qt_6_5_3_Clang_arm64_v8a-Debug + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + + true + 复制应用程序的数据 + Qt4ProjectManager.AndroidPackageInstallationStep + + + android-33 + + + true + 构建安卓 APK + QmakeProjectManager.AndroidBuildApkStep + + 4 + 构建 + 构建 + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + 清除 + 清除 + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + + + C:\Users\25761\Desktop\build-app-Qt_6_5_3_Clang_arm64_v8a-Release + C:/Users/25761/Desktop/build-app-Qt_6_5_3_Clang_arm64_v8a-Release + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + + true + 复制应用程序的数据 + Qt4ProjectManager.AndroidPackageInstallationStep + + + android-33 + + + true + 构建安卓 APK + QmakeProjectManager.AndroidBuildApkStep + + 4 + 构建 + 构建 + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + 清除 + 清除 + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + + + 0 + C:\Users\25761\Desktop\build-app-Qt_6_5_3_Clang_arm64_v8a-Profile + C:/Users/25761/Desktop/build-app-Qt_6_5_3_Clang_arm64_v8a-Profile + + + true + QtProjectManager.QMakeBuildStep + false + + + + true + Qt4ProjectManager.MakeStep + + + true + 复制应用程序的数据 + Qt4ProjectManager.AndroidPackageInstallationStep + + + android-33 + + + true + 构建安卓 APK + QmakeProjectManager.AndroidBuildApkStep + + 4 + 构建 + 构建 + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + clean + + 1 + 清除 + 清除 + ProjectExplorer.BuildSteps.Clean + + 2 + false + + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + + 3 + + + + true + Qt4ProjectManager.AndroidDeployQtStep + + 1 + 部署 + 部署 + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + Qt4ProjectManager.AndroidDeployConfiguration2 + + 1 + + + arm64-v8a + armeabi-v7a + armeabi + + d03ac6da + 33 + + + true + true + 0 + true + + + + + + + + 0 + + false + app + Qt4ProjectManager.AndroidRunConfiguration:C:/Users/25761/Desktop/app/app.pro + C:/Users/25761/Desktop/app/app.pro + false + true + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 2 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/datamanager.cpp b/datamanager.cpp new file mode 100644 index 0000000..696f4bd --- /dev/null +++ b/datamanager.cpp @@ -0,0 +1,220 @@ +#include "datamanager.h" +// DataManager* DataManager::p_this; +DataManager::DataManager(QObject *parent) + : QObject{parent} +{ + qDebug() << "进入DataManager的构造函数"; + tcpclient = TCPClient::getInstance(); + connect(tcpclient, &TCPClient::TCPClientConnected, this, &DataManager::TCPClientConnected); + connect(tcpclient, &TCPClient::TCPClientDisconnected, this, &DataManager::TCPClientDisconnected); + connect(tcpclient, &TCPClient::recv_data, this, &DataManager::recv_from_server); + tcpclient->setServer("ourdocs.cn",35137); + tcpclient->setTimeOut(500); + tcpclient->configAndrun(); + // tcpclient->setCallBack(recv_from_server); + protocol = Protocol::getInstance(); + // p_this = this; +} + +DataManager *DataManager::getInstance() +{ + static DataManager datamanager_instance; + return &datamanager_instance; +} + +void DataManager::TCPClientConnected() +{ + connect_flag = true; + qDebug() << "emit connect_to_server successfully"; + emit connect_to_server(); +} + +void DataManager::TCPClientDisconnected() +{ + connect_flag = false; + qDebug() << "emit disconnect_from_server successfully"; + // emit p_this->disconnect_from_server(); + emit disconnect_from_server(); +} + + +void DataManager::Register(QString username, QString password) +{ + QByteArray data, data_encrypt; + data = protocol->data_maker(Protocol::REQUEST, QString("register"), QList{"user", username, "password", password}); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); + qDebug() << "发送注册信息" << data; +} + +void DataManager::signin_request(QString username, QString password) +{ + QByteArray data, data_encrypt; + data = protocol->data_maker(Protocol::REQUEST, QString("signin"), QList{"user", username, "password", password}); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); + qDebug() << "发送登录信息" << data; +} + +void DataManager::account_cancellation(QString username) +{ + QByteArray data, data_encrypt; + data = protocol->data_maker(Protocol::REQUEST, QString("cancellation"), QList{"name",username}); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); + qDebug() << "发送注销信息" << data; +} + +void DataManager::update_namelist(QString username) +{ + QByteArray data, data_encrypt; + data = protocol->data_maker(Protocol::REQUEST, QString("update_namelist"),QList{"name",username}); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); + qDebug() << "发送更新在线用户列表信息" << data; +} + +void DataManager::parking() +{ + QByteArray data, data_encrypt; + data = protocol->data_maker(Protocol::CODE, QString("park"), QString("parking_request")); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); + qDebug() << "发送存车信息" << data; +} + +void DataManager::pick_up(QString code) +{ + QByteArray data, data_encrypt; + data = protocol->data_maker(Protocol::CODE, QString("pick"), code); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); + qDebug() << "发送取车信息" << data; +} + + +void DataManager::recv_from_server(QByteArray data) +{ + QByteArray data_decrypt; + data_decrypt = protocol->data_decrypt(data); + QList list = data_decrypt.split('\n'); + for (int i = 0; i < list.count(); i++) + { + QJsonDocument json_data = QJsonDocument::fromJson(list[i]); + if (json_data["type"] == "message") + { + emit new_message(); + QString data, sendname; + sendname = json_data["action"].toString(); + data = json_data["data"].toString(); + emit update_text(sendname, data); + //接收到行车路线类型的消息 + } + if(json_data["type"] == "code") + { + QString data, sendname; + sendname = json_data["action"].toString(); + if(sendname == "pick") + { + data = json_data["data"].toString(); + //取车时向服务端发送,不会接受该类信息 + } + else if (sendname == "park") + { + data = json_data["data"].toString(); + emit update_code(data); + //停车时服务端反馈的随机码 + } + + } + else if (json_data["type"] == "online_users") + { + int count; + QList online_users; + count = json_data["count"].toInt(); + online_users = json_data["users"].toVariant().toStringList(); + emit update_users(count, online_users); + qDebug() << "收到更新在线用户列表的信息" << online_users; + } + else if (json_data["type"] == "response") + { + if (json_data["action"] == "register") + { + bool register_flag; + QJsonObject json = json_data["content"].toObject(); + QString result = json["result"].toString(); + if(result == "true") + { + register_flag = true; + } + else + { + register_flag = false; + } + emit signup_response(register_flag); + qDebug() << "收到服务器响应的注册信息" << register_flag; + } + else if (json_data["action"] == "signin") + { + bool signin_flag; + QJsonObject json = json_data["content"].toObject(); + QString result = json["result"].toString(); + if(result == "true") + { + signin_flag = true; + } + else + { + signin_flag = false; + } + emit signin_response(signin_flag); + qDebug() << "收到服务器响应的登录信息" << signin_flag; + } + } + else + { + qDebug() << "收到未知类型的数据" << list[i]; + return; + } + } +} + + +/* +void DataManager::send_text(QString sendname, QString text) +{ + QByteArray data, data_encrypt; + data = protocol->data_maker(Protocol::MESSAGE, sendname, text); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); + qDebug() << "群发文本信息" << data; +} + +void DataManager::send_to_user(QString sendname, QString to_user, QString text) +{ + QByteArray data, data_encrypt; + data = protocol->data_maker(Protocol::MESSAGE, sendname, to_user, text); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); + qDebug() << "私发文本信息" << data; +} + +void DataManager::send_file_to_all(QString sendname, QString filename, QByteArray file) +{ + QByteArray data, data_encrypt; + data = protocol->data_maker(Protocol::FILE, sendname, filename, QString(file.toHex())); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); + qDebug() << "群发文件"; +} + +void DataManager::send_file_private(QString sendname, QString filename, QByteArray file, QString name) +{ + QByteArray data, data_encrypt; + data = protocol->data_maker(Protocol::FILE, name, sendname, filename, QString(file.toHex())); + data_encrypt = protocol->data_encrypt(data); + tcpclient->sendToserver(data_encrypt); + qDebug() << "私发文件"; +} +*/ + diff --git a/datamanager.h b/datamanager.h new file mode 100644 index 0000000..0ff313f --- /dev/null +++ b/datamanager.h @@ -0,0 +1,62 @@ +#ifndef DATAMANAGER_H +#define DATAMANAGER_H + +#include +#include +#include + +#include "protocol.h" +#include "tcpclient.h" + +class DataManager : public QObject +{ + Q_OBJECT +public: + static DataManager* getInstance(); + +private: + explicit DataManager(QObject *parent = nullptr); + //static void recv_from_server(QString &peerAddress,quint16 peerPort,QByteArray &data); + //static Protocol *protocol; + //static DataManager *p_this; + Protocol *protocol; + TCPClient *tcpclient; + bool connect_flag = false; + +signals: + void connect_to_server(); + void disconnect_from_server(); + void new_message(); + void update_code(QString code); + void signin_response(bool result); + void signup_response(bool result); + void update_text(QString sendname,QString data); + void update_file(QString sendname,QString filename,QString file_data); + void update_file_private(QString sendname,QString filename,QString file_data); + void update_users(int count,QListonline_users); + + +public slots: + /*******ui界面********/ + void Register(QString username,QString password); + void signin_request(QString username,QString password); + + /******WIDGET*****/ + //void send_text(QString sendname,QString text); + //void send_to_user(QString sendname,QString to_user,QString text); + //void send_file_to_all(QString sendname,QString filename,QByteArray file); + //void send_file_private(QString sendname,QString filename,QByteArray file,QString name); + void update_namelist(QString username); + void account_cancellation(QString username); + void pick_up(QString code); + void parking(); + + /******TCPClient******/ + void TCPClientConnected(); + void TCPClientDisconnected(); + void recv_from_server(QByteArray data); + +}; + +#endif // DATAMANAGER_H + diff --git a/imgs/icon.png b/imgs/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..65872312bd57ce3a4c239e3c46fe73aa458c63d8 GIT binary patch literal 96751 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 + + icon.png + + diff --git a/login.cpp b/login.cpp new file mode 100644 index 0000000..13c63d0 --- /dev/null +++ b/login.cpp @@ -0,0 +1,232 @@ +#include "login.h" +#include "ui_login.h" + +Login::Login(QWidget *parent) : + QWidget(parent), + ui(new Ui::Login) +{ + ui->setupUi(this); + this->setWindowIcon(QIcon(":/icon.png")); + this->setTabOrder(ui->lineEdit_username,ui->lineEdit_password); + this->setTabOrder(ui->lineEdit_password,ui->btn_signin); + //this->setWindowFlags(Qt::FramelessWindowHint); //无边框 + //this->setAttribute(Qt::WA_TranslucentBackground); + ui->btn_signin->installEventFilter(this); + + /********datamanager********/ + datamanager = DataManager::getInstance(); + connect(datamanager,&DataManager::signin_response,this,&Login::signin_response); + connect(datamanager,&DataManager::signup_response,this,&Login::signup_response); + connect(datamanager,&DataManager::connect_to_server,this,&Login::connected); + connect(datamanager,&DataManager::disconnect_from_server,this,&Login::disconnected); + connect(this,&Login::signin_request,datamanager,&DataManager::signin_request); + connect(this,&Login::Register,datamanager,&DataManager::Register); + + +} + +Login::~Login() +{ +} + +/***************************************SLOTS************************************/ +void Login::on_btn_signin_clicked() +{ + this->zoom_down(ui->btn_signin); + this->zoom_up(ui->btn_signin); + if(connect_flag == true) + { + user = ui->lineEdit_username->text(); + passwd = ui->lineEdit_password->text(); + if(user.isEmpty() || passwd.isEmpty()) + { + QMessageBox::warning(this,tr("错误"),tr("用户名和密码不能为空!")); + return; + } + emit signin_request(user,passwd); + } + else + { + QMessageBox::warning(this, "登录失败", "尚未连接服务器!"); + return; + } +} + +void Login::on_btn_signup_clicked() +{ + this->zoom_down(ui->btn_signup); + this->zoom_up(ui->btn_signup); + signup = new Signup(); + connect(signup,&Signup::show_login_ui,this,&Login::show_login_ui); + connect(signup,&Signup::Register,this,&Login::slot_Register); + this->hide(); + signup->show(); +} + +void Login::on_close_btn_clicked() +{ + this->close(); +} + +void Login::show_login_ui() +{ + this->show(); +} + +//等待服务器验证登陆数据 +void Login::signin_response(bool result) +{ + if(result == true) + { + mainwidget = new Widget(); + + connect(mainwidget,&Widget::account_cancellation,datamanager,&DataManager::account_cancellation); + connect(datamanager,&DataManager::disconnect_from_server,mainwidget,&Widget::disconnect_form_server); + connect(mainwidget,&Widget::exit_client,this,&Login::exit_client); + connect(mainwidget, &Widget::parking, datamanager, &DataManager::); + connect(mainwidget, &Widget::pick_up, datamanager, &DataManager::); + + this->hide(); + mainwidget->show(); + } + else + { + QMessageBox::warning(this,tr("登录失败"),tr("用户名或密码错误!")); + } +} + +//等待服务器注册数据 +void Login::signup_response(bool result) +{ + if(result == true) + { + QString information = QString("请妥善保存您的用户名和密码!"); + QMessageBox::information(signup,tr("注册成功"),information); + signup->close(); + this->show(); + + } + else + { + QMessageBox::warning(signup,tr("错误"),tr("注册失败,请重试!")); + } +} + +//注册界面按下注册按键 +void Login::slot_Register(QString username,QString password) +{ + if(connect_flag == false) + { + QMessageBox::warning(signup, "注册失败", "尚未连接服务器!请连接服务器后重试"); + return; + } + emit Register(username,password); +} + +//连接上服务器 +void Login::connected() +{ + qDebug() << "connect to server"; + connect_flag = true; +} + +//未连上服务器或服务器断开 +void Login::disconnected() +{ + qDebug() << "disconnect from server"; + connect_flag = false; +} + +void Login::exit_client() +{ + this->close(); +} + + +/*****************************Others******************************/ +void Login::zoom_down(QPushButton* btn) +{ + QScopedPointer animalton(new QPropertyAnimation(btn,"geometry")); + //设置间隔时间 + animalton->setDuration(200); + //设置起始位置 + animalton->setStartValue(QRect(btn->x(),btn->y(),btn->width(),btn->height())); + //设置结束位置 + animalton->setEndValue(QRect(btn->x(),btn->y()+5,btn->width(),btn->height())); + //设置动画曲线 + animalton->setEasingCurve(QEasingCurve::OutBounce); + animalton->start(); + +} + +void Login::zoom_up(QPushButton* btn) +{ + QScopedPointeranimalton(new QPropertyAnimation(btn,"geometry")); + animalton->setDuration(200); + animalton->setStartValue(QRect(btn->x(),btn->y()+5,btn->width(),btn->height())); + animalton->setEndValue(QRect(btn->x(),btn->y(),btn->width(),btn->height())); + animalton->setEasingCurve(QEasingCurve::OutBounce); + animalton->start(); +} + +void Login::new_closebutton(QPushButton* btn, QString position,QSize size) +{ + QPixmap pixmap; + pixmap.load(position); + btn->setIconSize(size); + btn->setStyleSheet("QPushButton{border-width: 1px;border-style: solid;border-radius:15px;background-color: rgb(64, 145, 252);}" + "QPushButton:hover{background-color:#999999;}"); + //设置图标 + btn->setIcon(pixmap); +} + +bool Login::eventFilter(QObject *target, QEvent *event) +{ + if(target == ui->btn_signin) //可替换 + { + if(event->type() == QEvent::KeyPress)//回车键 + { + QKeyEvent *k = static_cast(event); + + if(k->key() == Qt::Key_Return || k->key() == Qt::Key_Enter) + { + on_btn_signin_clicked(); //替换为需要响应的函数事件,以这里的按钮为例 + return true; + } + } + } + return QWidget::eventFilter(target,event); +} + +void Login::mousePressEvent(QMouseEvent *event) +{ + if (event->buttons() == Qt::LeftButton) + { + point = event->pos(); + } +} + +void Login::mouseMoveEvent(QMouseEvent *event) +{ + if (event->buttons() == Qt::LeftButton) + { + //当窗口最大化或最小化时也不进行触发 + if (Login::isMaximized() || Login::isMinimized()) + { + return; + } + else + { + //当在按钮之类需要鼠标操作的地方不进行触发(防误触) + if (ui->btn_signin->underMouse() || ui->btn_signup->underMouse()) + { + return; + } + else + { + Login::move(Login::mapToGlobal(event->pos() - point)); + } + } + } + event->accept(); +} diff --git a/login.h b/login.h new file mode 100644 index 0000000..6d865ec --- /dev/null +++ b/login.h @@ -0,0 +1,67 @@ +#ifndef LOGIN_H +#define LOGIN_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "datamanager.h" +#include "signup.h" +#include "widget.h" + +namespace Ui {class Login;} + +class Login : public QWidget +{ + Q_OBJECT + +public: + explicit Login(QWidget *parent = nullptr); + ~Login(); + void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + +signals: + void signin_request(QString username,QString password); + void Register(QString username,QString password); + +private slots: + void on_btn_signin_clicked(); + void on_btn_signup_clicked(); + void on_close_btn_clicked(); + + void signin_response(bool result); + void signup_response(bool result); + void show_login_ui(); + void slot_Register(QString username,QString password); + void connected(); + void disconnected(); + void exit_client(); + +private: + Ui::Login *ui; + QPoint point; + QString user,passwd; + static Login login_instance; + QPointer login; + QPointer signup; + QPointer mainwidget; + QPointer datamanager; + bool connect_flag = false; + + void new_closebutton(QPushButton* btn, QString position,QSize size); + void zoom_up(QPushButton* btn); + void zoom_down(QPushButton* btn); + bool eventFilter(QObject *target, QEvent *event); +}; + +#endif // LOGIN_H diff --git a/login.ui b/login.ui new file mode 100644 index 0000000..f03a0d7 --- /dev/null +++ b/login.ui @@ -0,0 +1,155 @@ + + + Login + + + + 0 + 0 + 438 + 609 + + + + Form + + + + + 250 + 370 + 79 + 40 + + + + + 50 + 40 + + + + QPushButton +{background-color:qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, +stop:1 rgba(64, 145, 252, 255), +stop:0 rgba(220, 255, 255, 255)); +color: rgb(255, 255, 255); +border:0px groove gray; +border-radius:7px; +padding:2px 4px; +font: 14pt "Candara";} + +QPushButton:pressed +{background-color:#999999;} + + + Sign up + + + + + + 70 + 230 + 289 + 45 + + + + + 0 + 45 + + + + background-color: rgb(247, 247, 247); +border:1px groove gray;border-radius: +7px;padding:2px 4px; +font: 12pt "Candara"; + + + Please input your ID + + + + + + 120 + 160 + 191 + 51 + + + + font: 87 20pt "Arial Black"; +background:transparent; + + + Login Now + + + + + + 100 + 370 + 71 + 40 + + + + + 50 + 40 + + + + QPushButton +{background-color:qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, +stop:1 rgba(64, 145, 252, 255), +stop:0 rgba(220, 255, 255, 255)); +color: rgb(255, 255, 255); +border:0px groove gray; +border-radius:7px; +padding:2px 4px; +font: 14pt "Candara";} + +QPushButton:pressed +{background-color:#999999;} + + + Sign in + + + + + + 70 + 290 + 289 + 45 + + + + + 0 + 45 + + + + background-color: rgb(247, 247, 247); +border:1px groove gray;border-radius: +7px;padding:2px 4px; +font: 12pt "Candara"; + + + QLineEdit::Password + + + Please input your password + + + + + + diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..efab257 --- /dev/null +++ b/main.cpp @@ -0,0 +1,12 @@ +#include "login.h" + +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true); + QApplication a(argc, argv); + Login w; + w.show(); + return a.exec(); +} diff --git a/protocol.cpp b/protocol.cpp new file mode 100644 index 0000000..7cad303 --- /dev/null +++ b/protocol.cpp @@ -0,0 +1,148 @@ +#include "protocol.h" +#include +#include + +Protocol Protocol::protocol_instance; +Protocol::Protocol(QObject *parent) + : QObject{parent} +{ + +} + +Protocol::~Protocol() +{ + +} + +Protocol* Protocol::getInstance() +{ + return &protocol_instance; +} + +QByteArray Protocol::data_builder(QList &args) +{ + QJsonObject data; + switch(args[0].get_data_types()) + { + case MESSAGE: + { + data.insert("type","message"); + data.insert("sendname",args[1].get_string()); + data.insert("data",args[2].get_string()); + break; + } + case CODE: + { + data.insert("type","code"); + data.insert("action",args[1].get_string()); + data.insert("data",args[2].get_string()); + } + case REQUEST: + { + data.insert("type","request"); + data.insert("action",args[1].get_string()); + QList content = args[2].get_list(); + QJsonObject json_content; + for (int i=0; i users = args[2].get_list(); + QJsonArray json_users; + for (auto &user:users) + json_users.append(user); + data.insert("users",json_users); + break; + } + case RESPONSE: + { + data.insert("type","response"); + data.insert("action",args[1].get_string()); + QList content = args[2].get_list(); + QJsonObject json_content; + for (int i=0; i Protocol::data_parser(QByteArray data) +{ + QJsonDocument json_data = QJsonDocument::fromJson(data); + if (json_data["type"] == "message") + return qMakePair(MESSAGE,json_data.object()); + else if (json_data["type"] == "line") + return qMakePair(CODE,json_data.object()); + else if (json_data["type"] == "request") + return qMakePair(REQUEST,json_data.object()); + else if (json_data["type"] == "online_users") + return qMakePair(ONLINEUSERS,json_data.object()); + else if (json_data["type"] == "response") + return qMakePair(RESPONSE,json_data.object()); + else + return qMakePair(RESPONSE,json_data.object()); +} + + +/******************************加解密部分************************************/ +QByteArray Protocol::XOR_En_Decrypt(QByteArray src) +{ + QByteArray result; + for(auto &i:src) + result.append(i ^ cipher_word); + return result; +} + +QByteArray Protocol::Upper_Lower_En_Decrypt(QString src) +{ + QByteArray result; + for(auto &i:src) + { + if(i.isUpper()) + { + QChar word = i.toLower(); + result.append(word.toLatin1()); + } + else if (i.isLower()) + { + QChar word = i.toUpper(); + result.append(word.toLatin1()); + } + else + result.append(i.toLatin1()); + } + return result; +} + +QByteArray Protocol::data_encrypt(QByteArray src) +{ + QByteArray en_base64 = src.toBase64(); + QByteArray result = Upper_Lower_En_Decrypt(en_base64); + return XOR_En_Decrypt(result); +} + +QByteArray Protocol::data_decrypt(QByteArray src) +{ + QByteArray result = XOR_En_Decrypt(src); + //qDebug() << result; + result = Upper_Lower_En_Decrypt(result); + //qDebug() << result; + return QByteArray::fromBase64(result); +} + +void Protocol::set_data_cipher_word(char word) +{ + cipher_word = word; +} + diff --git a/protocol.h b/protocol.h new file mode 100644 index 0000000..8932cd5 --- /dev/null +++ b/protocol.h @@ -0,0 +1,59 @@ +#ifndef PROTOCOL_H +#define PROTOCOL_H + +#include +#include + +class Protocol : public QObject +{ + Q_OBJECT +public: + static Protocol* getInstance(); + template + QByteArray data_maker(Type type, Args ...args) + { + QList args_list; + args_list.append(any_types(type)); + (void)std::initializer_list {(args_list.append(any_types(args)),0)...}; + return data_builder(args_list); + }; + enum data_types {MESSAGE,CODE,REQUEST,ONLINEUSERS,RESPONSE}; + QPair data_parser(QByteArray data); + QByteArray data_encrypt(QByteArray src); + void set_data_cipher_word(char word); + QByteArray data_decrypt(QByteArray src); +private: + char cipher_word = 'G'; + struct any_types { + enum type {String, Bool, Int, Data_types, List}; + any_types(int e) { m_data.INT = e; m_type = Int;} + any_types(QString e) { m_data.STRING = e; m_type = String;} + any_types(QList e) { m_data.LIST = e; m_type = List;} + any_types(bool e) { m_data.BOOL = e; m_type = Bool;} + any_types(data_types e) { m_data.DATA_TYPES = e; m_type = Data_types;} + type get_type() const { return m_type; } + int get_int() const { return m_data.INT; } + bool get_bool() const { return m_data.BOOL; } + data_types get_data_types() const { return m_data.DATA_TYPES; } + QString get_string() const { return m_data.STRING; } + QList get_list() const { return m_data.LIST; } + private: + type m_type; + struct { + int INT; + bool BOOL; + QString STRING; + QList LIST; + data_types DATA_TYPES; + } m_data; + }; + static Protocol protocol_instance; + explicit Protocol(QObject *parent = nullptr); + ~Protocol(); + QByteArray data_builder(QList &args); + QByteArray XOR_En_Decrypt(QByteArray src); + QByteArray Upper_Lower_En_Decrypt(QString src); +signals: + +}; +#endif // PROTOCOL_H diff --git a/signup.cpp b/signup.cpp new file mode 100644 index 0000000..689d89f --- /dev/null +++ b/signup.cpp @@ -0,0 +1,92 @@ +#include "signup.h" +#include "ui_signup.h" +#include + +Signup::Signup(QWidget *parent) : QWidget(parent), + ui(new Ui::Signup) +{ + ui->setupUi(this); + +} + +Signup::~Signup() +{ + delete ui; +} + +//返回登录按钮 +void Signup::on_btn_return_clicked() +{ + this->close(); + emit show_login_ui(); +} + +//注册按钮 +void Signup::on_btn_sure_clicked() +{ + QString username = ui->lineEdit_username->text(); + QString password = ui->lineEdit_passwd->text(); + QString surepass = ui->lineEdit_surepasswd->text(); + if (username.isEmpty() || password.isEmpty() || surepass.isEmpty()) + { + QMessageBox::warning(this, "注册失败", "输入不能为空!"); + } + + else + { + if (password == surepass) + { + emit Register(username,password); + } + else + { + QMessageBox::information(this, "用户注册", "两次密码输入不一致!"); + } + } +} + +void Signup::paintEvent(QPaintEvent *event) +{ + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); // 反锯齿; + + painter.setPen(Qt::transparent); + QRect rect = this->rect(); // rect为绘制大小 + rect.setWidth(rect.width() - 1); + rect.setHeight(rect.height() - 1); + painter.drawRoundedRect(rect, 10, 10); // 10为圆角角度 +} + +void Signup::mousePressEvent(QMouseEvent *event) +{ + if (event->buttons() == Qt::LeftButton) + { + point = event->pos(); + } +} + +void Signup::mouseMoveEvent(QMouseEvent *event) +{ + if (event->buttons() == Qt::LeftButton) + { + //当窗口最大化或最小化时也不进行触发 + if (Signup::isMaximized() || Signup::isMinimized()) + { + return; + } + else + { + //当在按钮之类需要鼠标操作的地方不进行触发(防误触) + if (ui->btn_sure->underMouse() || ui->btn_return->underMouse()) + { + return; + } + else + { + Signup::move(Signup::mapToGlobal(event->pos() - point)); //移动 + } + } + } + event->accept(); +} + diff --git a/signup.h b/signup.h new file mode 100644 index 0000000..d5d8147 --- /dev/null +++ b/signup.h @@ -0,0 +1,44 @@ +#ifndef SIGNUP_H +#define SIGNUP_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Ui { +class Signup; +} + +class Signup : public QWidget +{ + Q_OBJECT + +public: + explicit Signup(QWidget *parent = nullptr); + ~Signup(); + void paintEvent(QPaintEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void mousePressEvent(QMouseEvent *event); + +signals: + void Register(QString username,QString password); + void show_login_ui(); + +private slots: + void on_btn_sure_clicked(); + void on_btn_return_clicked(); + +private: + Ui::Signup *ui; + QPoint point; +}; + +#endif // SIGNUP_H diff --git a/signup.ui b/signup.ui new file mode 100644 index 0000000..9a9c94c --- /dev/null +++ b/signup.ui @@ -0,0 +1,198 @@ + + + Signup + + + + 0 + 0 + 438 + 609 + + + + Form + + + + + 80 + 90 + 161 + 31 + + + + font: 87 20pt "Arial Black"; + + + Hello + + + + + + 80 + 190 + 271 + 344 + + + + + + + font: 10.5pt "Arial"; + + + Username + + + + + + + + 0 + 40 + + + + font: 12pt "Arial"; + + + + + + + font: 11pt "Arial"; + + + Password + + + + + + + + 0 + 40 + + + + font: 12pt "Arial"; + + + + + + + font: 10.5pt "Arial"; + + + Ensure your password: + + + + + + + + 0 + 40 + + + + font: 12pt "Arial"; + + + + + + + + + Qt::Vertical + + + + 20 + 20 + + + + + + + + + 0 + 40 + + + + background-color: rgb(29, 123, 255); +color: rgb(255, 255, 255); +font: 26 10pt "Bahnschrift Light"; + + + Sure + + + + + + + + 0 + 40 + + + + background-color: rgb(29, 123, 255); +color: rgb(255, 255, 255); +font: 26 10pt "Bahnschrift Light"; + + + Return login + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + 80 + 120 + 301 + 51 + + + + font: 87 20pt "Arial Black"; + + + Welcome to us! + + + + + + diff --git a/tcpclient.cpp b/tcpclient.cpp new file mode 100644 index 0000000..e688c2e --- /dev/null +++ b/tcpclient.cpp @@ -0,0 +1,106 @@ +#include "tcpclient.h" +#include +#include +#include + +using namespace std; +TCPClient TCPClient::tcpclient_instance; +QTcpSocket TCPClient::socket; + +TCPClient::TCPClient(QObject *parent) + : QObject{parent} +{ + +} + +TCPClient::~TCPClient() +{ + +} + +TCPClient* TCPClient::getInstance() +{ + return &tcpclient_instance; +} + +void TCPClient::configAndrun() +{ + qDebug() << "进入configandrun"; + socket.setSocketOption(QAbstractSocket::KeepAliveOption,1); + socket.connectToHost(server_ip, server_port); + connect(&socket,&QTcpSocket::connected,this,&TCPClient::connected); + connect(&socket,&QTcpSocket::disconnected,this,&TCPClient::disconnected); + connect(&socket,&QTcpSocket::readyRead,this,&TCPClient::readSocket); +} + +void TCPClient::sendToserver(QByteArray &data) +{ + if (socket.isOpen()) + { + socket.write(data); + socket.waitForBytesWritten(2000); + } +} + +void TCPClient::setServer(QString IP, quint16 port) +{ + server_ip = IP; + server_port = port; +} + +void TCPClient::connected() +{ + emit TCPClientConnected(); + qDebug() << "emit TCPClientConnected successfully"; + QString addr_t = socket.peerAddress().toString(); + QByteArray addr = addr_t.toLocal8Bit(); + printf("Connected to server at %.*s:%d.\n",addr.size(),addr.data(),socket.peerPort()); +} + +void TCPClient::disconnected() +{ + emit TCPClientDisconnected(); + qDebug() << "emit TCPClientDisconnected successfully"; + printf("Disconnected from server.\n"); +} + +void TCPClient::readSocket() +{ + QByteArray recv; + while(socket.bytesAvailable())//循环接收 + { + recv += socket.readAll(); + if (!socket.waitForReadyRead(_timeout))//超时停止接收 + { + /*QString error = sock->errorString(); + string error_t = error.toStdString(); + log_w("error:%d: %.*s", sock->error(),error_t.length(), error_t.data());*/ + break; + } + } + QString ip = socket.peerAddress().toString(); + string ip_t = ip.toStdString(); + printf("TCPC: Recvd from %.*s:%d\n", ip_t.length(), ip_t.data(), socket.peerPort()); + printf("TCPC Message:%.*s\n",recv.size(),(char *)recv.data()); + if (_callback != nullptr) + _callback(ip, socket.peerPort(),recv); + emit recv_data(recv); +} + +void TCPClient::setTimeOut(int timeout) +{ + _timeout = timeout; +} + + +void TCPClient::setCallBack(void (*callback)(QString &mac, quint16 port, QByteArray &data)) +{ + _callback = callback; +} + +void TCPClient::_sleep(int msec) +{ + QTime dieTime = QTime::currentTime().addMSecs(msec); + while( QTime::currentTime() < dieTime ) + QCoreApplication::processEvents(QEventLoop::AllEvents, 100); +} diff --git a/tcpclient.h b/tcpclient.h new file mode 100644 index 0000000..4ca087f --- /dev/null +++ b/tcpclient.h @@ -0,0 +1,41 @@ +#ifndef TCPCLIENT_H +#define TCPCLIENT_H + +#include +#include +#include + +class TCPClient : public QObject +{ + Q_OBJECT +public: + static TCPClient* getInstance(); + static void sendToserver(QByteArray &data); + void configAndrun(); + void setCallBack(void (*callback)(QString &ip, quint16 port,QByteArray &data)); + void setServer(QString IP, quint16 port); + void setTimeOut(int timeout); +private slots: + void readSocket(); + void connected(); + void disconnected(); +private: + explicit TCPClient(QObject *parent = nullptr); + ~TCPClient(); + static void _sleep(int msec); + static QTcpSocket socket; + static TCPClient tcpclient_instance; + int _timeout = 20; + QString server_ip = "127.0.0.1"; + quint16 server_port = 7890; + bool has_found = false; + void (*_callback) (QString &ip, quint16 port,QByteArray &data)=nullptr; +signals: + void TCPClientConnected(); + void TCPClientDisconnected(); + void recv_data(QByteArray data); + +}; + +#endif // TCPCLIENT_H + diff --git a/widget.cpp b/widget.cpp new file mode 100644 index 0000000..95cfb3c --- /dev/null +++ b/widget.cpp @@ -0,0 +1,136 @@ +#include "widget.h" +#include "ui_widget.h" + + +Widget::Widget(QWidget *parent) + : QWidget(parent) + , ui(new Ui::Widget) +{ + ui->setupUi(this); + ui->log->setEnabled(false); + + //连接mqtt服务器,端口1883 + mqtt_client = new QMqttClient(this); + mqtt_client->setHostname(QHostAddress(QHostAddress::LocalHost).toString()); + mqtt_client->setPort(port); + mqtt_client->setClientId("mobile"); + mqtt_client->setUsername("Phone"); + mqtt_client->setPassword("Phone"); + mqtt_client->connectToHost(); + connect(mqtt_client, &QMqttClient::disconnected, this, &Widget::disconnected_handler); + connect(mqtt_client, &QMqttClient::messageReceived, this, &Widget::received_handler); + connect(mqtt_client, &QMqttClient::pingResponseReceived, this, &Widget::pingresp_handler); + connect(mqtt_client, &QMqttClient::connected, this, &Widget::connected_handler); + connect(mqtt_client, &QMqttClient::errorChanged, this, &Widget::error_handler); + connect(mqtt_client, &QMqttClient::stateChanged, this, &Widget::state_handler); + + connect(ui->pushButton, &QPushButton::clicked, [=]() { + ui->stackedWidget->setCurrentIndex(0); + }); + + connect(ui->pushButton_2, &QPushButton::clicked, [=]() { + ui->stackedWidget->setCurrentIndex(1); + }); + +} + + + +Widget::~Widget() +{ + delete ui; +} + + +//点击存车按钮 +void Widget::on_pushButton_3_clicked() +{ + emit parking(); +} + +//点击取车按钮 +void Widget::on_pushButton_4_clicked() +{ + emit pick_up(ui->code->toPlainText()); +} + +void Widget::connected_handler() +{ + const QString content = QDateTime::currentDateTime().toString() + +"\n" + +"MQTT服务器已连接上\n"; + ui->log->insertPlainText(content); + sub = mqtt_client->subscribe(topic,1); + if (sub) + { + const QString content = QDateTime::currentDateTime().toString() + +"\n" + +"Topic: "+ topic + QLatin1Char('\n') + +"Qos: "+QLatin1Char(sub->qos()+'0')+QLatin1Char('\n')+ + "已订阅\n"; + ui->log->insertPlainText(content); + } + else + { + const QString content = QDateTime::currentDateTime().toString() + +"\n" + +"Topic: "+ topic + QLatin1Char('\n') + +"Qos: "+QLatin1Char(sub->qos()+'0')+QLatin1Char('\n')+ + "订阅失败,请检查网络情况\n"; + ui->log->insertPlainText(content); + } + +} + +void Widget::disconnected_handler() +{ + const QString content = QDateTime::currentDateTime().toString() + +"\n" + +"MQTT服务器已断开\n"; + ui->log->insertPlainText(content); + +} + +void Widget::received_handler(const QByteArray &message, const QMqttTopicName &topic) +{ + const QString content = QDateTime::currentDateTime().toString() + +"\n" + +"Topic: "+topic.name()+ QLatin1Char('\n') + +"Message: "+message+ QLatin1Char('\n')+ + +"Qos: "+QLatin1Char(sub->qos()+'0')+QLatin1Char('\n'); + ui->log->insertPlainText(content); +} + +void Widget::pingresp_handler() +{ + const QString content = QDateTime::currentDateTime().toString() + + QLatin1Char('\n') + + QLatin1String("MQTT Pong!") + + QLatin1Char('\n'); + ui->log->insertPlainText(content); +} + +void Widget::state_handler() +{ + const QString content = QDateTime::currentDateTime().toString() + + QLatin1Char('\n') + + ":MQTT Client State Change" + + QString::number(mqtt_client->state()) + + u'\n'; + ui->log->insertPlainText(content); +} + +void Widget::error_handler(const QMqttClient::ClientError error) +{ + const QString content = QDateTime::currentDateTime().toString() + +"\n" + +"Error: "+ QString::number(static_cast(error)); + ui->log->insertPlainText(content); +} + + +void Widget::disconnect_form_server() +{ + QMessageBox::critical(this,"连接超时","请检查您的网络连接!"); + qApp->quit(); +} diff --git a/widget.h b/widget.h new file mode 100644 index 0000000..65b8c25 --- /dev/null +++ b/widget.h @@ -0,0 +1,50 @@ +#ifndef WIDGET_H +#define WIDGET_H + +#include +#include +#include +#include +#include "datamanager.h" + +QT_BEGIN_NAMESPACE +namespace Ui { class Widget; } +QT_END_NAMESPACE + +class Widget : public QWidget +{ + Q_OBJECT + +public: + Widget(QWidget *parent = nullptr); + ~Widget(); + + void connected_handler(); + void disconnected_handler(); + void received_handler(const QByteArray &message, const QMqttTopicName &topic); + void pingresp_handler(); + void state_handler(); + void error_handler(const QMqttClient::ClientError error); + + +signals: + void account_cancellation(QString username); + void exit_client(); + void parking(); + void pick_up(QString code); + +public slots: + void on_pushButton_3_clicked(); + + void on_pushButton_4_clicked(); + + void disconnect_form_server(); + +private: + Ui::Widget *ui; + QMqttClient *mqtt_client; + QMqttSubscription* sub = nullptr; + QString topic = "/car"; + quint16 port = 1883; +}; +#endif // WIDGET_H diff --git a/widget.ui b/widget.ui new file mode 100644 index 0000000..409f3b9 --- /dev/null +++ b/widget.ui @@ -0,0 +1,159 @@ + + + Widget + + + + 0 + 0 + 489 + 718 + + + + Widget + + + + + 0 + 0 + 501 + 661 + + + + + + + 40 + 50 + 251 + 71 + + + + + 20 + + + + 欢迎来到停车场 + + + + + + 50 + 150 + 311 + 71 + + + + + 15 + + + + 放置驱车码 + + + + + + 90 + 390 + 93 + 28 + + + + 存车 + + + + + + 280 + 390 + 93 + 28 + + + + 取车 + + + + + + 90 + 266 + 281 + 51 + + + + + + + + + 60 + 60 + 241 + 31 + + + + + 18 + + + + 尊敬的用户您好 + + + + + + 60 + 140 + 341 + 381 + + + + + + + + + 70 + 660 + 93 + 28 + + + + 主页 + + + + + + 310 + 660 + 93 + 28 + + + + 用户 + + + + + +