这是我参与「第五届青训营 」伴学笔记创作活动的第13天。
今天主要是实现用户的关注列表,粉丝列表以及发布列表。
一、发布列表
根据官方文档中的接口介绍,/douyin/publish/list/能够列出用户所有投稿过的视频,发送的get请求参数为token和user_id。这里我就不展示/douyin/favorite/list/接口介绍了,大致是差不多的。
启动项目,点击下方列表的“我”。此时客户端会向服务端发送两条GET请求,这里我们可以在编译器看到这两条请求信息。
这里是官方案例中,服务端回应/douyin/publish/list/接口的请求。这里由于该方法并没有对收到的请求参数做出回应,这里我们无论点击哪个用户,发布列表都是展示所有视频。
func PublishList(c *gin.Context){
c.JSON(http.StatusOK, VideoListResponse{
Response: Response{
StatusCode: 0,
},
VideoList: DemoVideos,
})
}
因此这里我们先获取user_id的参数,通过该参数去数据库中查询该用户id相应的用户信息。再通过该用户的信息去数据库中的视频数据表查询作者id为该用户的视频,将这些视频数据存储为video类型的数组DemoPublishs。然后在回应请求中把VideoList的参数改为DemoPubllishs。这样我们能够获取用户的视频发布列表。
下列两张图是两个用户的视频发布列表。
喜欢列表同理,只需要再建一张数据表,直接访问该数据表查询该用户id喜欢的视频id,然后
但是有一些比较大的问题。我如果在视频流中点击作者头像,它是会直接访问该作者的用户信息。但是问题是此时服务端并没有发送publish和favorite相关的视频列表请求,导致客户端点击别人的头像,其视频发布和喜欢列表都没有对数据进行刷新。
二、关注和粉丝列表
有了前面视频发布的例子,实现关注列表和粉丝列表就很简单了。 这里倒是在用户详情信息中点击关注和粉丝都会分别从/douyin/relation/follow/和/douyin/relation/follower/接口发送请求,获取相应用户的关注列表和粉丝列表。下图是我在视频流中点击两个不同用户的头像,在他们用户详情中点击关注列表后发送的请求信息。
这里由于token是用户登录信息,我们将通过user_id来查询该用户的关注列表。这里我又新建一张数据表,记录用户关注信息,其中记载着follow_id和follower_id。如果用户A关注了用户B,该数据表会新建一条记录。这里follow_id是用户B的id,也就是被关注者,follower_id是用户A的id,也就是粉丝。
type fan struct {
Id int64 `json:"id,omitempty"`
FollowId int64 `json:"follow_id,omitempty"`
FollowerId int64 `json:"follower_id,omitempty"`
}
这样我无论是查询用户A的粉丝列表还是关注列表,只需要直接查询所有follow_id为用户A的记录为粉丝列表,查询所有follower_id为用户A的记录为关注列表。
总结
这里我最后才发现,当我退出登录以后,视频流中每次刷到新的视频就会在/douyin/publish/list/和/douyin/favorite/list/接口发送一次新的请求,并且该请求中user_id的参数为该视频的作者。也就是说我前面获取发布列表应该是获取user_id的参数,通过该user_id来获取该用户的所有发布列表和喜欢列表。