这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
个人主页
查询主页
需求
获取登录用户的 id、用户名,同时需要返回关注数、粉丝数、作品数,喜欢的作品数等。
-
基本流程
-
- 在用户成功登录后、已登录用户点击个人主页查看个人信息以及在视频页面点击作者头像进入其他人个人主页查看用户信息这三种情况下,前端将个人页面http请求发送到后端。
- 客户端接收请求,首先验证Token是否有效,并从Token中解析源用户 ID,并对源用户ID和目标用户 ID进行校验。若不合法,则返回 ID 不合法提示信息。
- 若合法,则先在数据库中根据目标用 ID 查询目标用户是否存在。若不存在,则返回目标用户不存在提示信息。
- 若存在,则在数据库和缓存中查询目标用户的关注数和粉丝数,并查询当前用户和目标用户的关注关系。然后查询用户的作品数,喜欢作品数以及获得赞作品数。
- 后端返回包含id、用户名、关注数、粉丝数、作品数,喜欢的作品数等信息的响应至前端。
- 客户端接收响应,在个人主页展示用户信息。
业务流程图
核心代码
func (s *GetUserService) GetUser(req *douyinuser.GetUserRequest) (*douyinuser.User, error) {
modelUser, err := db.GetUser(s.ctx, req.ToUserId)
if err != nil {
return nil, err
}
relationInfo, err := rpc.GetRelationInfo(s.ctx, &douyinrelation.GetRelationInfoRequest{
UserId: req.UserId,
ToUserIds: []int64{req.ToUserId},
})
if err != nil {
return nil, err
}
favoriteCount, err := rpc.FavoriteCount(s.ctx, &douyinfavorite.DouyinFavoriteCountUserRequest{
UserId: req.ToUserId,
})
if err != nil {
return nil, err
}
workCount, totalFavorite, err := rpc.WorkAndFavoriteCount(s.ctx, &douyinvideo.Douyin_Work_And_Favorite_CountRequest{
UserId: req.ToUserId,
})
if err != nil {
return nil, err
}
return pack.User(modelUser, relationInfo[0], favoriteCount, workCount, totalFavorite), nil
}
个人主页展示模块实际上需要调用其余rpc服务来组装信息,以达到最终拼接完整所需信息的目的。
namespace go douyinuser
struct User {
1: i64 user_id
2: string username
3: i64 follow_count
4: i64 follower_count
5: bool is_follow
6: string avatar
7: i64 total_favorited
8: i64 work_count
9: i64 favorite_count
}
service UserService {
CreateUserResponse CreateUser(1: CreateUserRequest req)
CheckUserResponse CheckUser(1: CheckUserRequest req)
GetUserResponse GetUser(1: GetUserRequest req)
MGetUserNameResponse MGetUserName(1: MGetUserNameRequest req)
}
其中total_favorited需要rpc调用FavoriteService,work_count需要rpc调用VideoService, Favorite_count需要rpc调用FavoriteService