大项目总结(6) | 青训营笔记

97 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

这篇笔记是大项目的第六次总结。这次总结了极简版抖音在消息页面更新了pre_msg_time这个值后,获取消息和接收消息可以不使用消息服务器,简单地完成消息页面的后端获取消息函数的方法。

首先,我们知道,大项目的消息页面是每隔一秒不断调用chat()函数来更新消息页面的,如果不使用消息服务器,我们就要思考两点:

(1) :如何只更新最新的消息。

(2) :如何判断用户已经退出消息页面,使用户退出后再次点进消息记录时不会出现更新不到消息的情况。

pre_msg_time这个值,即最新接收消息的时间,是根据chat()函数发送到前端的值,然后再返回给后端的,因此,他返回的就是我们传到前端的最新接收消息的时间。那么我们只要在获取消息记录时,只获取pre_msg_time之后的消息,即可解决(1)和(2)中的问题。对于(2)来说,当用户退出消息页面后,前端的页面被清空,pre_msg_time也会重新归零,那后端就会重新调用全部消息记录。

需要注意的是,pre_msg_time是一个时间戳,因此在数据库中的时间值和pre_msg_time比较时要转换成时间戳进行比较。

具体获取消息记录的代码如下:

func GetMessages(userIdA model.UserId, UserIdB model.UserId, preTime string) ([]model.Msg, error) {
   rows := make([]model.Msg, 0)  //暂存结果
   res := make([]model.Msg, 0)  //返回结果
   err := DB.Transaction(func(tx *gorm.DB) error {
      err := tx.Debug().Table("messages").
         Where("to_user_id IN (?) AND from_user_id IN (?)", []int64{userIdA, UserIdB}, []int64{userIdA, UserIdB}).
         Order("create_time").Find(&rows)
      if err != nil {
         return err.Error
      }
      return nil
   })
   for _, row := range rows {
      //转换为UNIX时间戳
      if createTime_unix, err := TimeToUnix(row.CreateTime); err != nil {  //这个函数在之前的总结里有写
         return nil, err
      } else {
         createTime, _ := strconv.Atoi(createTime_unix) //go中,将string型转换为int型的函数
         preMsgTime, _ := strconv.Atoi(preTime)
         //只获取数据库的最新消息,即创建时间比preMsgTime更大,才会返回
         if createTime > preMsgTime {
            r := model.Msg{
               Id:         row.Id,
               ToUserId:   row.ToUserId,
               FromUserId: row.FromUserId,
               Content:    row.Content,
               CreateTime: createTime_unix,
            }
            res = append(res, r)
         }
      }
   }
   return res, err
}

以上就是我对前端更新pre_msg_time这个值后,如何显示消息记录的总结。