parking_lot_server/datamanager.cpp

249 lines
10 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}