# Chatlite **Repository Path**: giteelz233/chatlite ## Basic Information - **Project Name**: Chatlite - **Description**: 用简短的语言不简单描述 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-07-10 - **Last Updated**: 2024-05-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Chatlite #### 介绍 ``` 0、消息漫游待优化 1、群聊存在bug,发送消息历史记录框添加了两条记录,数据库是正常的,收消息正常//ok 2、发送消息,当前已经打开的历史记录框,无论是否正确都会收到消息添加消息条//ok 3、详细信息切换页面功能的数据设置不正确//ok 4、通知闪动存在问题,第一次点击后并没有停止闪动,第二次点击才停止//ok 5、去发送时,新消息条为置顶态,应设置一般态 ``` ```cpp QNetworkReply* NetUtil::post() { QUrl url(m_url); if (!m_query.isEmpty()) url.setQuery(m_query); m_request.setUrl(url); QNetworkReply* reply = m_http->post(m_request, QJsonDocument(m_data).toJson(QJsonDocument::Compact)); connect(reply, &QNetworkReply::finished, this, [=]() { m_result = QJsonDocument::fromJson(reply->readAll()).object(); disconnect(reply, 0, this, 0); }); return reply; } QNetworkReply* NetUtil::get() { // 拼接url QUrl url(m_url); if (!m_query.isEmpty()) url.setQuery(m_query); //qDebug() << url; m_request.setUrl(url); QNetworkReply* reply = m_http->get(m_request); connect(reply, &QNetworkReply::finished, this, [=]() { m_result = QJsonDocument::fromJson(reply->readAll()).object(); disconnect(reply, 0, this, 0); }); return reply; } ``` 待执行 ``` 消息表待优化,只用messageid作为主键,按条漫游时会出现消息缺失问题(原因:两个人对话的消息id不连续,解决办法:把主键修改为组合(messageid,senderid,receiverid,relationtype)或新建字段(no)用于存储当前对话的消息序号,以这个序号作为基准按条漫游) ``` 单聊发消息 ``` 发送http请求add一条message表数据 再发送消息到websocket,让其转发消息到其他用户 客户端显示 ``` 单聊收消息 ``` websocket转发,客户端解析 ``` 群聊收发消息 ``` ``` ai接口 ``` ``` 加好友 ``` //将自己作为接收者的项初始化到通知信息窗口 点击添加好友按钮,打开搜索好友/群聊页面,根据页面填入的信息,查询用户/群聊是否存在 若存在则在下方显示用户/群聊信息条, 点击信息条的添加,将通知信息写入通知表,发送端通过websocket发送通知到服务端,服务端websocket转发通知, 接收端若在线,则接受websocket信息,对通知按处理闪动,用户点击则加载通知窗口 若不在线,则该用户登陆时,根据条件查通知表,若有记录,则初始化通知按钮闪动, 用户点击则将作为接收者的项初始化到通知窗口,等待接收方处理 (通过noticeId删) 接收者处理: 通过,则将双方信息(a to b,b to a)写入关系表,将通知表处理过的信息删除,写入通知表接受的信息(反馈给发送方),同时添加联系人item 拒绝,则直接删除通知表中的该信息,写入通知表拒绝的信息(反馈给发送方) 发送端接收,若在线且为则动图提示,联系人列表添加item显示, 若离线则该用户登陆时根据条件查通知表,动图提示,点击已读再删除信息,未点击则不处理 // noticeType = "adduser" "acceptuser" "rejectuser" ``` 建群 ``` 群成员表添加成员id 用户关系表用户单方面添加群id ``` #### 传输规范(Json) ```json // 统一返回 { "info":"",//提示信息 "code":"",//响应状态 "data":"",//响应数据 "size":"",//数据大小 "pass":"" //是否到达 } // auth的data参数 { "access_token":"", // "update_token":"", // "user":"" //user表对象数据 } // Connector的data参数说明 { } ``` ## 表的设计 #### 服务端: ```sql #用户表 #用户详细信息表 #聊天关系表 #消息表 #记录表(记录当前用户于其他用户的最新消息)一条消息有两条记录 a->b存的同时b->a也要存,记录表不区分谁发 #群聊信息表 #群聊成员辅助表 ``` #### 客户端: ## 软件架构 ##### 客户端界面 ```yaml out了,后期修改 mainwindow: guidebar: inforstack: searchwindow: searchedit: iconbutton chatbarlist: chatbar: chatwinstack: defaultwin chatwin: maxminutil: chatmodule: chatinforarea: QScrollArea>QWidget>ChatInforItem>ChatBubble showmsgwin: buttonwindow msgedit sendbutton ``` ### CS交互 ``` http请求 websocket ``` #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx # 中途出现的bug: 最大化窗口:(置顶同理) 多聊天窗口情况下,窗口状态未同步,在a窗口最大化,b窗口的状态还是常态 设置为静态成员变量还不行,还需要通知变图标 ``` 最大化窗口和聊天模块窗口分离开,但还有上次聊天模块窗口信息遗留的问题 ``` 最大化窗口还能拖动: ``` 在moveEvent中加一个最大化判断 ``` 写缩放窗口时: 1、缩到最小大小时出现鼠标推走窗口 2、缩到最小大小时,在中心区域释放鼠标出现鼠标样式未复原,导致不能拖拽窗口 # 技术讨论点: ##### 漫游消息方式: 消息漫游按时间节点处理 ``` 时间处理应该比按条处理更优吧 ``` ##### 气泡绘画缓慢: 性能需优化,采用多线程还是? ``` 为了获得更好的性能,建议您在使用 QPainter 时遵循以下准则: 避免每次调用 paintEvent 函数时重新创建 QPen 和 QBrush 对象。尽可能复用先前创建的对象。 使用 QPixmap 而不是 QImage,在窗口中绘制简单的图形时。因为 QPixmap 通常比 QImage 更高效地呈现到屏幕上。 避免在 paintEvent 中进行过多的计算(例如计算多边形路径或生成渐变)。如果必须要进行复杂的计算,请将预先计算的结果存储在成员变量或全局变量中,并在需要时重用它们。 ``` 心中有坐标,万物皆可画,可我心一片空白。。。 ##### 关于图片 图片的存储方式 ``` 数据库或文件 ``` ``` 存图片路径还是? 存储顺序:源》本地文件》服务器 ``` 图片和文字都可以画 ##### 气泡弹出 ``` 气泡弹出位置计算: 1、先取父控件的位置(谁的气泡) 2、计算父控件在祖宗控件(最外层窗口)的位置 3、设置气泡的大小和位置 边框阴影效果: 窗口切割出内容区域,在边框区域循环轨迹一圈一圈往外画,颜色越来越浅 消息气泡取屏幕右下角 ``` # 统一格式: ``` 图标颜色:#515151 图标大小:48*48 导航栏背景width(10+48+10) 主框架的边距10+图标固定宽48+导航栏的右边距10 中间的信息栏Width:370 右边的聊天窗:自拓展 ``` # 开工计划: 1、实现界面的基本框架,实现简单的网络对话功能;ok 2、美化ui界面,在界面框架上作进一步拓展,修复前一阶段留下的界面bug和优化时出现的界面bug;doing 3、进一步优化网络对话功能,拓展聊天文件传输,发送表情包,处理文字表情包穿插发送; 4、对逻辑功能的优化,提升一下软件性能 # 简记 ``` QWindowsContext processnativeevent qt5.14.2报错qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed ``` # 用到的网络协议 ### http ``` ``` ### websocket # 消息通知功能 取出本地数据库存储的最新消息,比对服务器存储的最新消息,若不一致则在客户端窗口提示有新消息