diff --git a/Client/mainwindow.cpp b/Client/mainwindow.cpp index d823044cf87f8335b68e58d7a534292765426bab..3a307e34d9d57943ce2c25a42cd15bf9bbf32c51 100644 --- a/Client/mainwindow.cpp +++ b/Client/mainwindow.cpp @@ -37,6 +37,8 @@ void MainWindow::dealMessage(Message *messageW, QListWidgetItem *item, QString t item->setSizeHint(size); //设置item基本规格 同widget messageW->setTextContent(text, time, size, type); //设置message基本内容 ui->listWidget->setItemWidget(item, messageW); //将message的内容 在给定的 item中显示 + + ui->listWidget->setCurrentRow(ui->listWidget->count()-1); } void MainWindow::dealMessageTime(QString curMsgTime) diff --git a/Server/databaseoperation.cpp b/Server/databaseoperation.cpp index eca5f3aa7d721912600bb0c5dbbf8a72d4b53a84..abc493de6896a9bd6165f2c41c92f838b2b14a89 100644 --- a/Server/databaseoperation.cpp +++ b/Server/databaseoperation.cpp @@ -116,7 +116,7 @@ QList DatabaseOperation::findAllSessions() { QList DatabaseOperation::findAllMessages() { QList ret; QSqlQuery query; - if (!query.exec("SELECT SessionID, MessageID, senderUsername, MessageText, Profile FROM messages")) { + if (query.exec("SELECT SessionID, MessageID, senderUsername, MessageText, Profile FROM Message")) { while (query.next()) { int sessionID = query.value(0).toInt(); int msgId = query.value(1).toInt(); @@ -239,6 +239,23 @@ QList DatabaseOperation::querySessionsByMember(const char * username){ return member_List; } +//查询会话的所有历史消息 +QList DatabaseOperation::queryMessageBySession(int sessionID) { + QList ret; + QSqlQuery query; + QString sql = "SELECT MessageID FROM Message WHERE SessionID = (?)"; + query.prepare(sql); query.addBindValue(sessionID); + if (!query.exec()) { + qDebug() << "queryMessageBySession: " << query.lastError(); + return ret; + } + while (query.next()) { + ret.append(query.value(0).toInt()); + } + return ret; +} + + bool DatabaseOperation::attemptLogIn(QString username, QString password) const { //用户名检测 QSqlQuery query(database); @@ -314,7 +331,7 @@ OnlineUserModel & ServerDataCenter::getUser(QString username) { } OnlineMessage & ServerDataCenter::getMessage(int SessionId, int MessageId) { - if (_getMessage(SessionId, MessageId)) throw "Not exist"; + if (_getMessage(SessionId, MessageId) == nullptr) throw "Not exist"; return *messages[{SessionId, MessageId}]; } @@ -336,9 +353,10 @@ OnlineSession* ServerDataCenter::_getSession(int SessionId) { } OnlineMessage* ServerDataCenter::_getMessage(int SessionId, int MessageId) { - if (messages.contains({SessionId, MessageId})) - return messages[{SessionId, MessageId}]; - return nullptr; + OnlineMessage * ret = nullptr; + if (messages.contains(QPair({SessionId, MessageId}))) + ret = messages[QPair({SessionId, MessageId})]; + return ret; } OnlineUserModel * DatabaseOperation::findUser(QString username) { diff --git a/Server/databaseoperation.h b/Server/databaseoperation.h index 9b90e3e7ed79780bca3e995b3a505dc29b7015cd..36d03f95e32ff53a0e5e27db432043c33ac20f49 100644 --- a/Server/databaseoperation.h +++ b/Server/databaseoperation.h @@ -42,6 +42,7 @@ public: QList queryMembersBySession(int sessionID); QList querySessionsByMember(const char * username); + QList queryMessageBySession(int sessionID); QList getMessageListBySessionID(int SessionId) const; OnlineMessage * findMessage(int sessionId, int MessageId); diff --git a/Server/messagemodel.cpp b/Server/messagemodel.cpp index 33bacfeb864817ef15e5a434c863e95ddf88f44e..9472682771279ff255412481e46e040896d58645 100644 --- a/Server/messagemodel.cpp +++ b/Server/messagemodel.cpp @@ -48,3 +48,12 @@ OnlineMessage::OnlineMessage(int MessageID, int SessionID, QString sender, QStri profile = Profile; this->setParent(parent); } + +QJsonObject OnlineMessage::generateJsonOutput() const { + QJsonObject ret = {{ "MsgType", "SessionMessage" }}; + ret["SessionID"] = sessionID; + ret["MessageID"] = messageID; + ret["SenderName"] = senderUsername; + ret["Body"] = QJsonObject({{"Text", text}, {"Profile", QJsonObject()}}); + return ret; +} diff --git a/Server/messagemodel.h b/Server/messagemodel.h index 9b68c6276d3263c83067731efce6f9289e66a955..d7559ab63f08948b1606ff9502b890a5b59234a1 100644 --- a/Server/messagemodel.h +++ b/Server/messagemodel.h @@ -24,7 +24,6 @@ public: enum class Type { Offline, Online }; virtual Type getType() const { return Type::Offline; } - QJsonObject generateJsonOutput() const; signals: @@ -44,6 +43,7 @@ public: explicit OnlineMessage(QJsonObject json, MessageModel * parent = nullptr); explicit OnlineMessage(int MessageID, int SessionID, QString sender, QString text, QJsonObject Profile, MessageModel * parent = nullptr); int getMessageID() const override { return messageID; } + QJsonObject generateJsonOutput() const; private: int messageID; }; diff --git a/Server/operations.cpp b/Server/operations.cpp index 48d16fbbf149b14a0555b8cd240a68777604c629..533e1a61d34b6c17d19c418eac480934ab631121 100644 --- a/Server/operations.cpp +++ b/Server/operations.cpp @@ -30,16 +30,21 @@ resp Operations::loginResponse(QJsonObject json) { auto sessionlist = db.querySessionsByMember(username.toUtf8().data()); for (int i = 0; i < sessionlist.size(); i++) { - auto userlist = db.queryMembersBySession(sessionlist.at(i)); + int ssid = sessionlist.at(i); + auto userlist = db.queryMembersBySession(ssid); for (int j = 0; j < userlist.size(); j++) { auto cur = userlist.at(j); if (cur == username) continue; auto & curuser = dcenter.getUser(cur); ret.append(curuser.generateUserModelJson()); + + } + ret.append(dcenter.getSession(ssid).generateJsonFromData()); + auto msglist = db.queryMessageBySession(sessionlist.at(i)); + for (int j = 0; j < msglist.size(); j++) { + ret.append(dcenter.getMessage(ssid, msglist[j]).generateJsonOutput()); } - ret.append(dcenter.getSession(sessionlist.at(i)).generateJsonFromData()); -// auto messageList = } return ret; } diff --git a/Server/serverdatacenter.cpp b/Server/serverdatacenter.cpp index 20076d6374fb164e63a52abd7556a96592a8e36c..358360b71bfc131908eb38d7538e5f839ec5b16a 100644 --- a/Server/serverdatacenter.cpp +++ b/Server/serverdatacenter.cpp @@ -28,7 +28,6 @@ void ServerDataCenter::registerMessage(OnlineMessage *msg) { messages[{msg->getSessionID(), msg->getMessageID()}] = msg; msg->setParent(this); registeredObjects.append(msg); - qDebug() << "### ServerDataCenter Down"; }