【Test】消息信息核心类的编写,处理内部逻辑

文章目录

      • 1. 项目核心的数据结构
      • 2. 关于项目的命名空间
      • 3. 核心类的编写
        • 3.1 用户信息
        • 3.2 会话信息
        • 3.3 消息信息

1. 项目核心的数据结构

  • ① 用户信息

  • ② 会话信息
    会话一 : AB进行通话;
    会话二: AC进行通话;
    会话三:如果此时ABC三者进行通话,那么此时就是一个群聊会话;
    会话持续的周期是非常长的,一直到把对方好友删除或者退出群聊当前会话才会销毁。

  • ③ 消息信息
    a.文本消息;b.图片消息;c.文件消息;d.语音消息;

2. 关于项目的命名空间

  • 如果代码所在的文件就是项目的顶层目录中,此时直接使用全局的命名空间(不需要手动指定)。

  • 如果代码所在的文件在某个子目录中,此时,就指定一个和目录名字相同的命名空间。

    使代码中命名空间的结构和文件在目录中的结构一致。

3. 核心类的编写

3.1 用户信息
  • 为什么用户编号不用整形而用QString?
    因为MySQL数据库是支持自增主键的,如果是单个节点的mysql,这种自增的方式是没有问题的;但是如果是多个节点的分布式mysql,无法使用整数自增主键了,因为可能出现主键重复的情况。

  • 后续可直接通过uuid或者雪花算法来获得唯一的userId
    【Test】消息信息核心类的编写,处理内部逻辑_第1张图片

3.2 会话信息
  • 会话信息的userId是提供谁的呢?
    1)如果会话是单聊会话,则userId表示” 对方 “的用户userId
    2)如果会话是群聊会话,此时userId设为"",后续通过其他的方式来把完整的用户userId列表拿到;
    基于以上两点特征,我们就可以用会话信息的userId来区分是单聊还是群聊

【Test】消息信息核心类的编写,处理内部逻辑_第2张图片

【Test】消息信息核心类的编写,处理内部逻辑_第3张图片
【Test】消息信息核心类的编写,处理内部逻辑_第4张图片

3.3 消息信息
  • ”会话“ 与”消息“ 的关系
    1)会话与消息是属于一对多的关系,一个会话可能会有多个消息。
    2)我们通过这个chatSessionId可以找到消息所属会话的编号。

【Test】消息信息核心类的编写,处理内部逻辑_第5张图片


  • 消息正文内容的类型为什么是QByteArray呢?
    1)图片、文件、语音消息的正文是一个二进制的序列,表示二进制数据必须使用QByteArray
    2)不同的编码方式,一个 char(字符)对应的字节不同。

    对于英文ASCII来说,一个字符就是一个字节

    对于中文gbk编码来说,一个字符是两个字节

    对于中文utf-8编码来说,一个字符是三个字节


  • QString fileId的作用?

1)因为文件、图片、语言这些占用的存储空间是比较大的,一旦聊天会话中包含了多个上述这样的消息,就会使从服务器获取消息列表的操作变得非常低效。

2)针对上述问题如何解决呢? — 是先 ”获取消息列表“,只是拿到文件、图片、语音 消息的fileId,等到客户端得到消息列表之后,再根据拿到的fileId给服务器发送额外的请求,获取文件的内容。

结果:提高客户端访问服务器的并发程度,本来是阻塞式的把所有结果都给客户端,现在是拆成多个部分,哪些先给我返回了,就先显示哪些,灵活调整,按需加载。

你可能感兴趣的:(Qt,项目实战)