威海建设局官方网站长沙室内设计工作室

news/2025/10/4 17:14:04/文章来源:
威海建设局官方网站,长沙室内设计工作室,做网站图片太多怎么办,中信建设有限责任公司经济性质加载指定会话最近消息 前言 上一集我们就把三个标签页的加载列表的任务给完成啦#xff01;那么我们这一集就来完成加载指定绘画最近消息的任务。 需求分析 我们点击了某个会话之后#xff0c;我们就会去显示我们的会话的最近的N条消息。请看下图。 我们这里涉及到两个区…加载指定会话最近消息 前言 上一集我们就把三个标签页的加载列表的任务给完成啦那么我们这一集就来完成加载指定绘画最近消息的任务。 需求分析 我们点击了某个会话之后我们就会去显示我们的会话的最近的N条消息。请看下图。 我们这里涉及到两个区域一个是中间的区域一个是右边的消息展示区域。 当然这里我们只展示N条消息记录我们不多去展示不然影响我们的程序的效率和用户的体验感。这里和我们的返回历史消息记录查询是完全不同的东西 我们还是先来看一下我们的URL 再来看一眼我们的请求和响应的定义。 这就是我们这一集的任务要求 客户端 常规操作分两端这里是客户端的代码操作 loadRecentMessage SessionItem::active 我们要考虑这个加载指定会话的最近消息要在哪里进行调用 我们应该在这个会话被点击的时候就加载这个函数那么我们就应该把这个函数放到我们SessionItem的active这个成员函数当中。 由于又要涉及到我们主界面的消息展示区那么这个函数必须放置在我们的主界面的代码当中。 那么我们就要获取到MainWidget的实例之后调用这个函数。 void SessionItem::active() {LOG() 点击 SessionItem 触发的逻辑 chatSessionId chatSessionId;//加载会话历史消息会涉及到当前内存的数据操作又会涉及到网络通信还会涉及到界面的变更//使用到主窗口的方法进行调用MainWidget* mainWidget MainWidget::getInstance();mainWidget-loadRecentMessage(chatSessionId);} loadRecentMessage的具体实现 我们需要传入需要加载的会话id因为我们不是加载整个最近消息所以我们要去传入会话id。 那么我们还是分为了两个部分一个是从内存进行加载一个是从网络进行加载。 我们判定的是这个会话的最近消息列表而不是整个最近的消息列表所以我们应该去访问key为chatSessionId的最近消息列表。我们判定整个会话的最近消息列表是没有什么用的 getRecentMessageList QListMessage *DataCenter::getRecentMessageList(const QString chatSessionId) {if(!recentMessage-contains(chatSessionId)){return nullptr;}return (*recentMessage)[chatSessionId]; } 我们先完成这个判定的函数这里我们要先去访问这个哈希表是否存在这个chatSessionId的列表如果没有就直接返回一个nullptr即可如果有就返回这个列表的指针即可。 void MainWidget::loadRecentMessage(const QString chatSessionId) {//先判定本地是否存有数据DataCenter* dataCenter DataCenter::getInstance();//判定的是这个会话的最近消息列表不是整个最近消息列表if(dataCenter-getRecentMessageList(chatSessionId) ! nullptr){//本地数据加载updateRecentMessage(chatSessionId);}else{//网络数据加载connect(dataCenter, DataCenter::getRecentMessageListDone, this, MainWidget::updateRecentMessage, Qt::UniqueConnection);dataCenter-getRecentMessageListAsync(chatSessionId);}} 本地数据加载 updateRecentMessage 这个代码也是分为两个部分我们先讲这个本地数据加载的内容。 我们这里不要忘了这个内容是展示到我们的消息展示区的不是我们的好友列表上 我们先从DataCenter中获取这个列表之后清空我们整个消息展示区之后头插我们的消息内容。我们判定我们的消息是靠左还是靠右只需要去看这个消息的发送者的userId和我们DataCenter里面保存的Myself的userId即可。 之后我们要设置我们的会话标题再把我们当前选中的会话保存到我们的DataCenter当中。最后我们再来一个滚动条设置滑动到我们的消息的末尾即可。 void MainWidget::updateRecentMessage(const QString chatSessionId) {//获取最近的消息列表DataCenter* dataCenter DataCenter::getInstance();auto* recentMessageList dataCenter-getRecentMessageList(chatSessionId);//这里不要把内容添加到会话了这里是要添加到消息展示区上//清空原有界面上的消息列表messageShowArea-clear();//遍历//要先看到最近消息那就是用头插for(int i recentMessageList-size() - 1; i 0; --i){const Message message recentMessageList-at(i);bool isLeft message.sender.userId ! dataCenter-getMyself()-userId;//用这个消息的发送者的用户id和数据中心的自身信息的用户id对比即可messageShowArea-addFrontMessage(isLeft, message);}//设置会话标题ChatSessionInfo* chatSessionInfo dataCenter-findChatSessionById(chatSessionId);if(chatSessionInfo ! nullptr){//把会话的名称显示到界面上sessionTitleLabel-setText(chatSessionInfo-chatSessionName);}//保存当前选中的会话dataCenter-setCurrentChatSessionId(chatSessionId);//自动把滚动条滚动到末尾就可以先看到最近的第一条消息messageShowArea-scrollToEnd();} 这里我们还要去是完成获取会话消息保存当前选中会话以及自动滑动滚动条到末尾的三个重要函数。 findChatSessionById 我们通过chatSessionId从DataCenter当中寻找会话列表中的指定会话的信息。 ChatSessionInfo *DataCenter::findChatSessionById(const QString chatSessionId) {//判断会话列表是否为空if(chatSessionList nullptr){return nullptr;}for(auto info : *chatSessionList){if(info.chatSessionId chatSessionId){return info;}}//没找到return nullptr; } set/getCurrentChatSessionId void DataCenter::setCurrentChatSessionId(const QString chatSessionId) {this-currentChatSessionId chatSessionId; }const QString DataCenter::getCurrentChatSessionId() {return currentChatSessionId; }scrollToEnd void MessageShowArea::scrollToEnd() {//获取垂直滚动条//获取到最大值//延时操作QTimer* timer new QTimer();connect(timer, QTimer::timeout, this, [](){int maxValue this-verticalScrollBar()-maximum();this-verticalScrollBar()-setValue(maxValue);timer-stop();timer-deleteLater();});timer-start(500); } 使用延时操作等会话里的消息都加载到界面上我们再去获取到我们的具体滚动区域最大值之后滑动即可。 这样我们就可以通过本地数据进行加载我们指定会话的最近消息列表了 网络通信加载 getRecentMessageListAsync 我们不仅仅要传到NetClient的有loginSessionId我们还有指定的chatSessionId。 void DataCenter::getRecentMessageListAsync(const QString chatSessionId) {netClient.getRecentMessageList(loginSessionId, chatSessionId); }getRecentMessageList 我们还是老步骤啊构造请求body序列化之后发送请求到我们指定的URL之后处理我们的响应之后就是把我们的数据放置到我们的数据中心之后发送信号之后触发我们的信号槽从本地数据再获取数据即可 void NetClient::getRecentMessageList(const QString loginSessionId, const QString chatSessionId) {//构造请求bodybite_im::GetRecentMsgReq req;req.setRequestId(makeRequestId());req.setChatSessionId(chatSessionId);req.setMsgCount(50);//固定获取50条req.setSessionId(loginSessionId);//序列化QByteArray body req.serialize(serializer);LOG() [获取最近消息] 发送请求 requestId req.requestId() , loginSessionId loginSessionId;//发送http请求QNetworkReply* resp this-sendHttpRequest(/service/message_storage/get_recent, body);//处理响应connect(resp, QNetworkReply::finished, this, [](){//解析响应bool ok false;QString reason;auto pbResp this-handleHttpResponsebite_im::GetRecentMsgRsp(resp, ok, reason);//判定响应是否okif(!ok){LOG() [获取最近消息] 失败! requestId req.requestId() , reason reason;return;}//设置到DataCenter中dataCenter-resetRecentMessageList(chatSessionId, pbResp);//发送信号告知界面进行更新emit dataCenter-getRecentMessageListDone(chatSessionId);}); } resetRecentMessageList 这里我们不需要判定是否为空因为哈希的特性我们不存在就会直接创建我们记得清空一下这个指定会话的最近消息列表之后通过遍历我们把获得的数据设置到我们的recentMessage记住一定要用引用 void DataCenter::resetRecentMessageList(const QString chatSessionId, std::shared_ptrbite_im::GetRecentMsgRsp resp) {//哈希的特性存在就使用不存在就创建新的清空QListMessage messageList (*recentMessage)[chatSessionId];messageList.clear();//遍历for(auto m : resp-msgList()){Message message;message.load(m);messageList.push_back(message);} } 之后触发我们的信号就可以返回到我们的主界面那边了。 connect(dataCenter, DataCenter::getRecentMessageListDone, this, MainWidget::updateRecentMessage, Qt::UniqueConnection); 记得我们的第五个参数是为了防止一个信号触发我们多个这个槽函数。 到这里我们的客户端就完成了我们继续完成测试服务端 测试服务端 配置路由 httpServer.route(/service/message_storage/get_recent, [](const QHttpServerRequest req){return this-getRecent(req);}); 基本操作我们直接到getRecent函数当中 getRecent 也是基本操作我们构造了一堆假数据放置到我们的界面上。 QHttpServerResponse HttpServer::getRecent(const QHttpServerRequest req) {//解析请求bite_im::GetRecentMsgReq pbReq;pbReq.deserialize(serializer, req.body());LOG() [REQ 获取最近消息列表] requestId pbReq.requestId() , loginSessionId pbReq.sessionId();//构造响应bite_im::GetRecentMsgRsp pbResp;pbResp.setRequestId(pbReq.requestId());pbResp.setSuccess(true);pbResp.setErrmsg();QByteArray avatar loadFileToByteArray(:/resource/image/defaultAvatar.png);for(int i 0; i 20; i){bite_im::MessageInfo messageInfo makeTextMessageInfo(i, 2000, avatar);pbResp.msgList().push_back(messageInfo);}//序列化QByteArray body pbResp.serialize(serializer);//构造http响应对象QHttpServerResponse resp(body, QHttpServerResponse::StatusCode::Ok);resp.setHeader(Content-Type, application/x-protobuf);return resp; }这里我们就完成了整个加载指定会话最近消息的内容了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大连企业网站建设模板wordpress 设置语言

http://www.elecfans.com/article/89/92/2017/20170425510728.html转载于:https://www.cnblogs.com/jackn-crazy/p/7300228.html

数学 trick

基本不等式遇到 \(x=\dfrac{一次函数}{一次函数}\),考虑分离出一个常数: 例:(2024 浙江模拟)已知实数 \(x,y,x>3,xy+2x-3y=12,(x+y)_{\min}\)? 解:考虑分离 \(x,y\),由 \(xy+2x-3y=12\) 得到 \(x=\dfrac{12…

免费网站下载app软件免费重庆seo优

本文来自网易云社区作者:田亚楠须知本文主要是根据 createjs 中的 EaselJS 在 github 上的 tutorials 目录下的文章整理而来 (原文链接),同时也包含了很多本人的理解,如过有叙述不当的地方,请联系我 :-D 本…

Python 2025:异步革命与AI驱动下的开发新范式 - 详解

Python 2025:异步革命与AI驱动下的开发新范式 - 详解2025-10-04 16:56 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; di…

完整教程:精读C++20设计模式——行为型设计模式:解释器模式

完整教程:精读C++20设计模式——行为型设计模式:解释器模式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

js疑惑

textBox.addEventListener("keydown", function (event) { console.log(`You pressed "${event.key}".`);});这个函数接收的"keydown",到底是什么意思我还是没看懂为什么会这样写看着也…

使用 Git Submodule 管理微服务项目:从繁琐到高效 - 指南

使用 Git Submodule 管理微服务项目:从繁琐到高效 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

如何识别网页用什么网站做的女装关键词排名

一个网站,其实说白了就是某几个特定功能的组合,而更换用户头像就在这些功能之中。今天就来做个测试,针对不同的用户,实现头像上传功能。先给大家展示下成品效果图:思路针对不同的用户上传头像,我们要为每一…

邯郸专业做网站多少钱做印刷网站公司哪家好

一、接口自动化测试中,会用到测试账号,如何合理运用账号? 账号一般用于接口登录、接口用例传参、操作sql等,目前账号是写到yaml配置文件里,如果1个账户使用会出现资源冲突,可以配置多个账号使用&#xff0…

佛山专业建设网站平台兼职python做网站

STM32定时器定时及其应用 定时器概述☆定时器相关配置CubeMX工程配置及程序实现固件库程序设计及实现 定时器概述 1. 工作原理 使用精准的时基,通过硬件的方式,实现定时功能。定时器核心就是计数器 2. 定时器分类   基本定时器(TIM6~TIM7…

深入解析:单元测试学习+AI辅助单测

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

20251004国庆模拟4

对于 20251004 CSP-S 模拟的总结Part 1 题目 点击快速下载 有两道是洛谷的: T2: P5979 [PA2014] Druzyny T3: P2371 [国家集训队] 墨墨的等式 ⚠警告: P5979 和本场的 T3 并不完全一样。 Part 2 考试重要时间线 8:00…

珂朵莉树 ODT

能干什么/局限性 高效处理区间平推(区间赋值)的问题。 在随机数据下飞快。 如果没有区间平推,或者区间平推的操作数量可以被卡得很少甚至没有,就不适用。 前置知识set没了。 建点 每个点要维护一个区间,以及这个区…

2025多校CSP模拟赛2

2025多校CSP模拟赛2 狂写大树套树通过 \(T3\) 的救赎感。 T1 查询 第一眼感觉不好做。 首先直接找绝对没前途,考虑二分 \(v\)。 问题变成了统计 \(a_j+b_j\times c_i\le v\) 的数量,变换一下变成: \[c_i\le \frac{v…

网站查询访问界面设计模式读后感

如今人们对于住宅需求早已今非昔比,不但需要足够大的空间,而且对于住宅所处位置是否交通便利,环境如何,光照情况都有要求,但是最关注的问题还是住宅的安全问题。如今的社会科技发达,不法分子的手段也层出不…

io多路复用:reactor模型的封装及与上层简单业务的搭建(webserver)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:深入了解linux网络—— 基于UDP实现翻译和聊天功能

详细介绍:深入了解linux网络—— 基于UDP实现翻译和聊天功能pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

详细介绍:vLLM - GPUModelRunner

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Rewind: Codeforces Round 1055 (Div.1+Div.2)

E. Monotone Subsequence \(\text{time limit: 2000 ms}\\\text{memory limit: 1024 MB}\) 这是一道交互题 题意: 由 \(\text{Thm. Erdős–Szekeres}\) ,我们知道对任意长为 \(n^2+1\) 的排列必有一个长为 \(n+1\) …

10.4模拟赛总结

2025-2026 赛季 OIFHA 第三十四场 NOIP 模拟赛总结 一休尼(forever) 原题:CF5E Bindian Signalizing 长度为 \(n\) 的整数序列 \(a\) 。求整数对 \((i,j)\),\(i,j\in [1,n]\) 的个数,满足 \((i,j)\) 之间存在至少…