这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
视频发布列表
需求
展示用户发布过的全部视频,以发布时间为基准倒序排列。
-
基本流程
-
- 用户申请主页展示,后端接收请求开始业务逻辑。
- rpc调用VideoService,根据user_id(当前用户)进入video表中检索相关video信息,再根据每一条视频信息对应的user_id(视频作者)rpc调用UserService,获取到视频作者的相关信息(比如粉丝数、点赞数等等)
- 将Video信息与Video对应的User信息进行组装,后端回复前端。
业务流程图
核心代码
采用单例模式作为设计模式,在rpcService中的handler进行实例化。
/*
/cmd/video/service/publish_list_video.go
*/
type PublishListVideoService struct {
ctx context.Context
}
func NewPublishListVideoService(ctx context.Context) *PublishListVideoService {
return &PublishListVideoService{ctx: ctx}
}
func (p *PublishListVideoService) PublishListVideo(req *douyinvideo.DouyinPublishListRequest) ([]*douyinvideo.Video, error) {
/*
1.根据user_id对video进行查询
2.进行相关rpc调用,组装需要的信息。
*/
res, err := db.QueryListVideo(p.ctx, int(req.UserId))
if err != nil {
log.Print(err)
return nil, err
}
//获取全部视频的user_id
userList := GetUserListFromVideoDb(res)
//rpc调用获取user相关信息
douyinvideoUserList, err := GetUserListForVideo(userList, req.UserId)
//将video和user进行组装
newVideo := pack.VideoDbToVideoService(res, douyinvideoUserList, req.UserId)
return newVideo, nil
}
互动方向
赞操作
需求
登录用户可以对视频进行点赞和取消点赞
-
基本流程
-
- 前端发出点赞/取消点赞请求,后端收到请求,开始业务流程。
- rpc调用FavoriteService,首先根据传输来的video_id进行判别,检测video_id是否真实存在于数据库中,如果不存在本次操作无效,后端通知客户端。
- 如有有效,则根据action_type是点赞/取消点赞,对favorite表进行user_id & video_id &pub_time表项的增加或删除。
- Action_type是点赞时,会判断用户是否已经对该视频点赞过,没点赞过则对favorite表进行user_id & video_id &pub_time(记录点赞时间)表项的增加,并且video表中对应视频的点赞数量+1;已点赞过则此次操作无效。
- Action_type是取消点赞时,则会判断user_id & video_id &pub_time表项是否存在于favorite表中,存在则删除,并且video表中对应视频的点赞数量-1;不存在此次操作无效。
- 流程结束,后端回复前端。
业务流程图
/*
/cmd/favorite/service/favorite_action.go
*/
type FavouriteActionService struct {
ctx context.Context
}
func NewFavouriteActionService(ctx context.Context) *FavouriteActionService {
return &FavouriteActionService{ctx: ctx}
}
func (f *FavouriteActionService) FavouriteAction(req *douyinfavorite.DouyinFavoriteActionRequest) (bool, error) {
/*
1.根据user_id、video_id、action_typr进行点赞关系的insert/update
2.在db.UpdateFavourite()中进行数据项的更新及边界情况判断
*/
userid, err := strconv.ParseInt(req.Token, 10, 64)
if err != nil {
log.Print(err)
return false, err
}
success, err := db.UpdateFavourite(f.ctx, req, userid)
if err != nil {
log.Print(err)
return false, err
}
return success, nil
}