#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() << "删除之前的数据" <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 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{"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{"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 <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{"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{"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; }