一、用户上传视频接口
包含两部分重要内容:
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。
十一、播放历史接口
标签:视频,redis,在线视频,笔记,收藏,前台,点赞,查询,id From: https://www.cnblogs.com/worthmove/p/17020061.html