在线视频项目学习笔记(五)—前台视频相关

一、用户上传视频接口

包含两部分重要内容:

1.上传到阿里云oss存储空间。需要根据当前的时间来生成文件名称,这样处理主要是为了防止文件名重复,上传成功返回存储路径(路径组成为bucket+endpoint+文件在oss中路径),并且在路径上的基础上可以设置封面。

2.在video表中插入一条视频数据。将第一步得到的视频地址和封面信息放入Video对象,后台数据库插入。

3.这个过程涉及到了远程调用的相关知识,一开始调用的是user模块,在user模块中上传到oss中以后,然后远程调用video模块完成数据库中一条video信息的插入。

 OSS工具类代码如下:

最后再单独分析一下截取视频帧封面技术单独作为封面。

如果之前的视频URL为:

https://waibi.oss-cn-chengdu.aliyuncs.com/picGo/rabbit.mp4

那么我们加上参数就会变成一张图片

https://waibi.oss-cn-chengdu.aliyuncs.com/picGo/rabbit.mp4?x-oss-process=video/snapshot,t_10000,f_jpg

参数说明如下:

 

 具体的示例在官网上还有很多。

二、首页视频推荐接口

1.其实没有用推荐算法,就是分页查询,前台把当前页数以及每页有多少数据传过来,然后后台在数据库用limit查询相关数据。

2.在这个过程中有远程调用,因为要在首页显示该视频的分类名称以及上传者名称,我们需要根据分类id以及用户id查询出对应的名称。

三、搜索接口

这里搜索接口使用了es,但是我们也可以直接做简单的模糊查询。

四、用户上传的视频

1.即查询出当前用户上传的所有视频的列表,传过来token(如果之前写了有关token的注解,皆可以直接在request中获取注解了),然后再redis中查询出用户信息,德奥用户信息的Id,接下来根据用户id查询出所有视频信息即可。

2.注意这里也是个服务调用,因为现在是在user模块查询的,而video的增删改查都需要放在video模块。

下边这个图主要展示openFeign的调用过程:

 

 注意:对于返回数据的处理,之前也提到过,返回的video对象只有uid以及类别id,最后需要把对应名称查询出来,我们可以专门创建一个对应的VideoVO实体类,里边包含需要返回的数据(包括各种名称而不是id),然后进行实体类转换,最后返回转换后的实体类。

五、根据分类类别查询视频列表

插眼:重点可以讲一下存储登录信息(session、redis)、用户上传视频接口(使用阿里云oss服务)、点赞收藏之类(使用了redis)、自己手写了一个注解、关于微服务之间的验证(能不能每次访问带着token,然后判断存在token就正常使用,然后更新token时间,不存在就跳转到登录页)

就是个加了几个限制条件的简单查询:

 

六、视频详情接口

1.这个比较复杂,除了返回视频基本信息(id、名称、链接、封面、创建时间等),还需要返回当前视频播放量、点赞数(这两个在redis中用string形式存储),是否点赞过、不喜欢过、收藏过这个视频(这几个在redis中使用set存储,key为用户编号,set中存储的是视频id)

2.在判断是否点赞过、不喜欢过、收藏过这个视频之前,需要先判断用户是否登陆过(就是看看redis中有没有session),只有登陆过才查询是否点赞过、收藏过;否则默认没有点赞过和收藏过。

注意:前台和后台不一样,前台没有登录也可以访问这些对应信息,但是后台每次访问请求都需要验证是否登录。

 

 

 

 这里思考一个问题:收藏信息能够既存在redis中又存储在mysql中,还是说只需要存储在mysql中呢。

七、视频播放接口

1.首先token不是必传的,因为用户没登录也可以看视频,所以如果传到后台的token为空,那么就只需要在Redis中的浏览次数自增;如果token不为空,还需要在播放历史表(played)中增加一条播放记录。

2.但是在插入播放记录的时候也有个问题,就是如果用户浏览这个视频两遍,应该是只生成一条播放记录。所以在插入记录的时候需要按照(uid,videoid)来查询数据库中是否有记录,没有记录直接插入,有记录则更新浏览时间。

3.这里redis存储浏览次数和点赞次数的时候每个视频都会单独占用一个key,然后使用redisTemplate.opsForValue().increase("VIDEO_PLAYED_COUNT"+videoId);

现在我们可以改成用Hash来做,这样感觉结构更加清楚,使用redisTemplate.opsForHash().incerese("VIDEO_PLAYED_COUNT","VIDEO_PLAYED_COUNT"+videoId);

注意:“VIDEO_PLAYED_COUNT”这种是肯定要定义成常量的,我们不可能每次都重写,也不利于修改。我们可以把这些常量放在common模块中(同样实体类也最好放在common模块中),代码如下:

 

 

 

 八、视频点赞与取消点赞

1.注意:点赞与取消点赞看似是完全相反的逻辑,但是点赞还是比不喜欢多了一个步骤的,因为点赞的时候如果之前点过不喜欢,需要在不喜欢表中删除对应的视频id。

2.除了上边多加的这个判断,剩下的两步都是完全相反着来的。点赞需要:点赞数自增+用户点赞set中添加视频id+如果不喜欢set中有这个id,则删除。

取消点赞需要:点赞数自减+用户点赞set中删除视频id。

视频点赞代码:

视频取消点赞代码:

 

 九、视频不喜欢与取消不喜欢

点击喜欢代码

 

点击取消不喜欢代码

 

 

 十、视频收藏与取消收藏接口

其实就是最简单的在数据库中收藏表中进行增加和删除,因为收藏数据是存储在mysq中的。但是有一个注意的点,需要判断之前在数据库中是否已经收藏过这个数据了,收藏过就不要再收藏了。

收藏视频代码:

 

 取消收藏视频代码:

 

 这里明确一件事:controller的各个类是和模块一一对应的,但是service类是和dao和entty一一对应的。例如favourite是收藏表,然后会有favouriteService,但是不会有favouriteController。

十一、播放历史接口

1.播放历史和收藏历史的接口是一样的,区别就是两个差的表不同,但是两个都需要先查played或者favourite表,然后根据查出来的视频id去视频表里查询,但是注意这个过程不能使用表关联查询,因为视频的增删改查在视频模块,favourite表或者played表在用户模块,需要服务调用实现,而不能仅仅关联查询。

2.注意,尽量不要在for循环中进行服务调用,因为会进行多次网络通信,可以先用list把所有视频id去出来,然后在服务提供者那一端操作。

 

十二、收藏历史接口(同上)

十三、视频评论列表

 

 十四、发表评论

 

posted @ 2023-01-02 23:34  一直学习的程序小白  阅读(102)  评论(0编辑  收藏  举报