抖音大项目视频模块介绍(3)| 青训营笔记

119 阅读2分钟

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

视频发布列表

需求

展示用户发布过的全部视频,以发布时间为基准倒序排列。

  • 基本流程
    1. 用户申请主页展示,后端接收请求开始业务逻辑。
    2. rpc调用VideoService,根据user_id(当前用户)进入video表中检索相关video信息,再根据每一条视频信息对应的user_id(视频作者)rpc调用UserService,获取到视频作者的相关信息(比如粉丝数、点赞数等等)
    3. 将Video信息与Video对应的User信息进行组装,后端回复前端。
业务流程图

image.png

核心代码

采用单例模式作为设计模式,在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

}

互动方向

赞操作
需求

登录用户可以对视频进行点赞和取消点赞

  • 基本流程
    1. 前端发出点赞/取消点赞请求,后端收到请求,开始业务流程。
    2. rpc调用FavoriteService,首先根据传输来的video_id进行判别,检测video_id是否真实存在于数据库中,如果不存在本次操作无效,后端通知客户端。
    3. 如有有效,则根据action_type是点赞/取消点赞,对favorite表进行user_id & video_id &pub_time表项的增加或删除。
    4. Action_type是点赞时,会判断用户是否已经对该视频点赞过,没点赞过则对favorite表进行user_id & video_id &pub_time(记录点赞时间)表项的增加,并且video表中对应视频的点赞数量+1;已点赞过则此次操作无效。
    5. Action_type是取消点赞时,则会判断user_id & video_id &pub_time表项是否存在于favorite表中,存在则删除,并且video表中对应视频的点赞数量-1;不存在此次操作无效。
    6. 流程结束,后端回复前端。
业务流程图

image.png

/*
    /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
}