249 lines
10 KiB
C++
249 lines
10 KiB
C++
#include "datamanager.h"
|
||
DataManager *DataManager::p_this;
|
||
DataManager::DataManager(QObject *parent)
|
||
: QObject{parent}
|
||
{
|
||
p_this = this;
|
||
database = DataBase::getInstance();
|
||
protocol = Protocol::getInstance();
|
||
linedb = Line::getInstance();
|
||
server = TCPServer::getInstance();
|
||
server->setTimeOut(500);
|
||
server->configAndrun();
|
||
server->setCallBack(disconnect_from_cln);
|
||
server->setCallBack(recv_from_cln);
|
||
}
|
||
|
||
void DataManager::disconnect_from_cln(QTcpSocket *sock)
|
||
{
|
||
qDebug() << "删除之前的数据" <<p_this->online_name_list;
|
||
for (int i = 0; i < p_this->online_socket_list.length(); i++)
|
||
{
|
||
if (p_this->online_socket_list.at(i) == sock)
|
||
{
|
||
p_this->online_name_list.removeAt(i);
|
||
p_this->online_socket_list.removeAt(i);
|
||
break;
|
||
}
|
||
}
|
||
qDebug() << "删除之后的数据" << p_this->online_name_list;
|
||
p_this->update_namelist(sock);
|
||
}
|
||
|
||
void DataManager::recv_from_cln(QByteArray &data, QTcpSocket *sock)
|
||
{
|
||
QByteArray data_decrypt = p_this->protocol->data_decrypt(data);
|
||
qDebug() << data_decrypt;
|
||
QList<QByteArray> list = data_decrypt.split('\n');
|
||
qDebug() << list;
|
||
for (int i = 0; i < list.count(); i++)
|
||
{
|
||
QJsonDocument json_data = QJsonDocument::fromJson(list[i]);
|
||
if (json_data["type"] == "message")
|
||
{
|
||
if (json_data["action"] == "count")
|
||
{
|
||
p_this->count = p_this->linedb->getCount();
|
||
p_this->update_count(sock,p_this->count);
|
||
}
|
||
}
|
||
else if (json_data["type"] == "code")
|
||
{
|
||
if (json_data["action"] == "pick") //取车消息
|
||
{
|
||
QString name = json_data["user"].toString();
|
||
QString code = json_data["data"].toString();
|
||
QString number = p_this->database->matchCode(name,code);
|
||
QString find_code = p_this->linedb->findCode(number);
|
||
qDebug() << "取车时的number和linecode:" << number << find_code;
|
||
p_this->linedb->resetState(number);
|
||
QByteArray data_build, data_encrypt;
|
||
data_build = p_this->protocol->data_maker(Protocol::CODE, QString("pick"), QString("server"),find_code);
|
||
qDebug() << data_build;
|
||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||
p_this->server->sendToclient(sock, data_encrypt);
|
||
p_this->count = p_this->linedb->getCount();
|
||
p_this->update_count(sock,p_this->count);
|
||
|
||
}
|
||
else if (json_data["action"] == "park") //存车消息
|
||
{
|
||
QString name = json_data["user"].toString();
|
||
QString find_code = p_this->database->findCode(name);
|
||
if(find_code == "000")
|
||
{
|
||
QString number = p_this->linedb->choose(); //获取一个可用的车位编号
|
||
qDebug() << "获取到的可用车位编号是" << number;
|
||
//随机生成取车码
|
||
QString code = p_this->getRandomString(8);
|
||
//更新取车码
|
||
qDebug() << name << code << number;
|
||
p_this->database->insertCode(name,code,number);
|
||
p_this->linedb->setState(number);
|
||
|
||
QByteArray data_build, data_encrypt;
|
||
data_build = p_this->protocol->data_maker(Protocol::CODE, QString("park"), QString("server"),code);
|
||
qDebug() << data_build;
|
||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||
p_this->server->sendToclient(sock, data_encrypt);
|
||
p_this->count -= 1;
|
||
p_this->update_count(sock,p_this->count);
|
||
}
|
||
else
|
||
{
|
||
QByteArray data_build, data_encrypt;
|
||
data_build = p_this->protocol->data_maker(Protocol::CODE, QString("park"), QString("server"), find_code);
|
||
qDebug() << data_build;
|
||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||
p_this->server->sendToclient(sock, data_encrypt);
|
||
}
|
||
|
||
}
|
||
else if(json_data["action"] == "update")
|
||
{
|
||
//登陆后自动获取取车码信息
|
||
QString name = json_data["user"].toString();
|
||
QString code = p_this->database->findCode(name);
|
||
QByteArray data_build, data_encrypt;
|
||
data_build = p_this->protocol->data_maker(Protocol::CODE, QString("update"), QString("server"),code);
|
||
qDebug() << data_build;
|
||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||
p_this->server->sendToclient(sock, data_encrypt);
|
||
}
|
||
}
|
||
else if (json_data["type"] == "request")
|
||
{
|
||
if (json_data["action"] == "register")
|
||
{
|
||
qDebug() << "收到注册类型的信息,将进行处理";
|
||
QString username, password;
|
||
QJsonObject json = json_data["content"].toObject();
|
||
username = json["user"].toString();
|
||
password = json["password"].toString();
|
||
bool result = p_this->database->insertUsr(username, password);
|
||
qDebug() << result;
|
||
if (result == true)
|
||
{
|
||
QByteArray data_build, data_encrypt;
|
||
data_build = p_this->protocol->data_maker(Protocol::RESPONSE, QString("register"), QList<QString>{"result", "true"});
|
||
qDebug() << data_build;
|
||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||
p_this->server->sendToclient(sock, data_encrypt);
|
||
}
|
||
else
|
||
{
|
||
QByteArray data_build, data_encrypt;
|
||
data_build = p_this->protocol->data_maker(Protocol::RESPONSE, QString("register"), QList<QString>{"result", "false"});
|
||
qDebug() << data_build;
|
||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||
p_this->server->sendToclient(sock, data_encrypt);
|
||
}
|
||
}
|
||
else if (json_data["action"] == "signin")
|
||
{
|
||
qDebug() << "收到登录类型的信息,将进行处理";
|
||
QString username, password;
|
||
QJsonObject json = json_data["content"].toObject();
|
||
username = json["user"].toString();
|
||
password = json["password"].toString();
|
||
qDebug() << username <<password;
|
||
bool result = p_this->database->match(username, password);
|
||
qDebug() << result;
|
||
if (result == true)
|
||
{
|
||
p_this->online_socket_list.append(sock);
|
||
p_this->online_name_list.append(username);
|
||
QByteArray data_build, data_encrypt;
|
||
data_build = p_this->protocol->data_maker(Protocol::RESPONSE, QString("signin"), QList<QString>{"result", "true"});
|
||
qDebug() << data_build;
|
||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||
p_this->server->sendToclient(sock, data_encrypt);
|
||
p_this->update_namelist(sock);
|
||
}
|
||
else
|
||
{
|
||
QByteArray data_build, data_encrypt;
|
||
data_build = p_this->protocol->data_maker(Protocol::RESPONSE, QString("signin"), QList<QString>{"result", "false"});
|
||
qDebug() << data_build;
|
||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||
p_this->server->sendToclient(sock, data_encrypt);
|
||
}
|
||
}
|
||
else if (json_data["action"] == "cancellation")
|
||
{
|
||
qDebug() << "收到注销类型的数据,将进行处理";
|
||
QJsonObject json = json_data["content"].toObject();
|
||
QString username = json["name"].toString();
|
||
qDebug() << username;
|
||
if (!p_this->database->Delete(username))
|
||
{
|
||
qDebug() << "用户注销失败";
|
||
return;
|
||
}
|
||
|
||
}
|
||
else if (json_data["action"] == "update_namelist")
|
||
{
|
||
qDebug() << "接收到更新用户列表的请求";
|
||
QJsonObject json = json_data["content"].toObject();
|
||
QString username = json["name"].toString();
|
||
for (int i = 0; i < p_this->online_name_list.length(); i++)
|
||
{
|
||
if (p_this->online_name_list.at(i) == username)
|
||
{
|
||
p_this->online_name_list.removeAt(i);
|
||
p_this->online_socket_list.removeAt(i);
|
||
break;
|
||
}
|
||
}
|
||
p_this->update_namelist(sock);
|
||
|
||
}
|
||
else
|
||
{
|
||
qDebug() << "服务端收到未知类型的数据" << list[i];
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void DataManager::update_namelist(QTcpSocket *sock)
|
||
{
|
||
qDebug() << "发送更新用户在线列表信息";
|
||
QByteArray data_build, data_encrypt;
|
||
data_build = protocol->data_maker(Protocol::ONLINEUSERS, 4, online_name_list);
|
||
qDebug() << online_name_list;
|
||
data_encrypt = protocol->data_encrypt(data_build);
|
||
for (auto &one_socket : online_socket_list)
|
||
{
|
||
server->sendToclient(one_socket, data_encrypt);
|
||
}
|
||
}
|
||
|
||
void DataManager::update_count(QTcpSocket *sock, int count)
|
||
{
|
||
QByteArray data_build, data_encrypt;
|
||
data_build = p_this->protocol->data_maker(Protocol::MESSAGE, QString("count"), QString::number(count));
|
||
qDebug() << data_build << "发送count信息";
|
||
data_encrypt = p_this->protocol->data_encrypt(data_build);
|
||
p_this->server->sendToclient(sock, data_encrypt);
|
||
}
|
||
|
||
QString DataManager::getRandomString(int nLen)
|
||
{
|
||
srand(QDateTime::currentMSecsSinceEpoch());
|
||
const char ch[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||
int size = sizeof(ch);
|
||
char* str = new char[nLen + 1];
|
||
int num = 0;
|
||
for (int nIndex = 0; nIndex < nLen; ++nIndex)
|
||
{
|
||
num = rand() % (size - 1);
|
||
str[nIndex] = ch[num];
|
||
}
|
||
str[nLen] = '\0';
|
||
QString res(str);
|
||
return res;
|
||
}
|