这是我参与「第五届青训营 」伴学笔记创作活动的第 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这个值后,如何显示消息记录的总结。