项目持续更新中:
目录
在我们的点赞下面会有一个数字,代表点赞总数。我们需要从redis获取数据进行展示
在service的实现类中添加一个在redis中获取点赞数的方法:
- private Integer getVlogBeLikedCounts(String vlogId){
- String countsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS+":"+vlogId);
- if(StringUtils.isNotBlank(countsStr) ){
- countsStr = "0";
- }
- return Integer.valueOf(countsStr);
- }
其实我们还需要完成点赞过后数值的一个刷新,重新把数量进行一个。
我们重启,测试,下拉刷新。
此时的获赞数变为1:
但是我们打开一个有过记录,点赞过的视频,这里的数值仍为0,因为我们这里没有做一个视频的查询
我们打开前端, 这是一个新的controller:
在后端:
- @PostMapping("totalLikedCounts")
- public GraceJSONResult totalLikedCounts(@RequestParam String vlogId) {
- vlogService.getVlogBeLikedCounts(vlogId);
- return GraceJSONResult.ok();
- }
service接口:
service 方法实现:
- @Override
- public Integer getVlogBeLikedCounts(String vlogId){
- String countsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS+":"+vlogId);
- if(StringUtils.isNotBlank(countsStr) ){
- countsStr = "0";
- }
- return Integer.valueOf(countsStr);
- }
接着重启,测试:
此时不管是点赞还是取消关注,点赞数都会随着改变。
这里就已经落实到了数据库和redis。
前面我们完成了作品和私密的展示
还有一个赞过的视频列表,那么这些都是要和数据库关联查询的,这里涉及到一张表
我们这里需要借助于以下三个表进行查询
首先我们先在Mapper中写一个接口定义:
接着来写我们的自定义sql查询:
- <select id="getMyLikedVlogList" parameterType="map" resultType="com.imooc.vo.IndexVlogVO">
- SELECT
- v.id as vlogId,
- v.vloger_id as vlogerId,
- -- u.face as vlogerFace,
- -- u.nickname as vlogerName,
- v.title as content,
- v.url as url,
- v.cover as cover,
- v.width as width,
- v.height as height,
- v.like_counts as likeCounts,
- v.comments_counts as commentsCounts,
- v.is_private as isPrivate
- FROM
- vlog v
- LEFT JOIN
- my_liked_vlog mlv
- ON
- v.id = mlv.vlog_id
- LEFT JOIN
- users u
- on
- mlv.user_id = u.id
- WHERE
- u.id = #{paramMap.userId}
- AND
- v.is_private = 0
- ORDER BY
- v.created_time
- ASC
-
- </select>
再service里面也要添加一个:
service中实现:
- @Override
- public PagedGridResult getMyVlogList(String usedId, Integer page, Integer pageSize) {
- PageHelper.startPage(page,pageSize);
- Map
map = new HashMap<>(); - map.put("userId",usedId);
- List
list = vlogMapperCustom.getMyLikedVlogList(map); - return setterPagedGrid(list,page);
- }
打开前端查看:
我们后端和前端保持一致,放在同一个代码区域:
- @GetMapping("myLikedList")
- public GraceJSONResult myLikedList(@RequestParam String userId,
- @RequestParam Integer page,
- @RequestParam Integer pageSize) {
- if (page == null) {
- page = COMMON_START_PAGE;
- }
- if (pageSize == null) {
- pageSize = COMMON_PAGE_SIZE;
- }
- PagedGridResult gridResult = vlogService.getMyVlogList(userId, page, pageSize);
-
- return GraceJSONResult.ok(gridResult);
- }
我们重启,测试:
这里就实现了我们赞过的视频的一个展示。
在之前我们完成的都是视频推荐,
我们这里可以右滑:
在关注里面,只要是我关注的博主,它们的发布的视频都会在关注的页面进行展示。
这里也是需要通过我们的sql进行多表关联:
通过这三张表进行的一个查询
我们在xml文件中编写sql语句:
- <select id="getMyFollowList" parameterType="map" resultType="com.imooc.vo.IndexVlogVO">
- SELECT
- v.id as vlogId,
- v.vloger_id as vlogerId,
- u.face as vlogerFace,
- u.nickname as vlogerName,
- v.title as content,
- v.url as url,
- v.cover as cover,
- v.width as width,
- v.height as height,
- v.like_counts as likeCounts,
- v.comments_counts as commentsCounts,
- v.is_private as isPrivate
- FROM
- vlog v
- LEFT JOIN
- fans f
- ON
- v.vloge_Id = u.id
- LEFT JOIN
- users u
- on
- f.vloger_id = u.id
- WHERE
- v.is_private = 0
- AND
- f.fan_id=#{paramMap.myId}
- ORDER BY
- v.created_time
- DESC
-
- </select>
mapper接口:
接着在service中:
实现:
- @Override
- public PagedGridResult getMyFollowVlogList(String myId, Integer page, Integer pageSize) {
- PageHelper.startPage(page,pageSize);
- Map
map = new HashMap<>(); - map.put("myId",myId);
- List
list = vlogMapperCustom.getMyFollowVlogList(map); - for(IndexVlogVO v : list){
- String vlogerId = v.getVlogerId();
- String vlogId = v.getVlogId();
-
- if(StringUtils.isNotBlank(myId)){
- //用户必定关注过该博主
- v.setDoILikeThisVlog(true);
- //判断当前用户是否点赞
- v.setDoILikeThisVlog(doILikeVlog(myId,vlogId));
- }
- //获得当前视频的点过赞的总数
- v.setLikeCounts(getVlogBeLikedCounts(vlogId));
- }
-
-
- return setterPagedGrid(list,page);
- }
在这里我们需要对之前的查询操作进行一个补充:
这里需要判断用户是否关注过博主
- //用户是否关注该博主
- boolean doIFollowVloger = fansService.queryDoIFollowVloger(userId,vlogerId);
- v.setDoIFollowVloger(doIFollowVloger);
在写controller之前,我们先打开前端:
在后端我们来编写:
- @GetMapping("followList")
- public GraceJSONResult followList(@RequestParam String myId,
- @RequestParam Integer page,
- @RequestParam Integer pageSize) {
- if (page == null) {
- page = COMMON_START_PAGE;
- }
- if (pageSize == null) {
- pageSize = COMMON_PAGE_SIZE;
- }
- PagedGridResult gridResult = vlogService.getMyFollowVlogList(myId, page, pageSize);
-
- return GraceJSONResult.ok(gridResult);
- }
随后重启,测试:
这里就是我关注的博主的视频列表了
这里下来大家可以取关博主,关注博主来进行一些测试。
我们在主页底部切换的时候,这里有一个互粉互关的用户发布的视频列表,
这里sql语句的编写其实和我们上面差不多,只是添加了一个额外的判断条件
这里如果是1,说明互相关注
随后在我们的Mapper接口去实现:
- <select id="getMyFriendVlogList" parameterType="map" resultType="com.imooc.vo.IndexVlogVO">
- SELECT
- v.id as vlogId,
- v.vloger_id as vlogerId,
- u.face as vlogerFace,
- u.nickname as vlogerName,
- v.title as content,
- v.url as url,
- v.cover as cover,
- v.width as width,
- v.height as height,
- v.like_counts as likeCounts,
- v.comments_counts as commentsCounts,
- v.is_private as isPrivate
- FROM
- vlog v
- LEFT JOIN
- fans f
- ON
- v.vloge_Id = f.fan_id
- LEFT JOIN
- users u
- on
- f.fan_id = u.id
- WHERE
- v.is_private = 0
- AND
- f.vloger_id=#{paramMap.myId}
- AND
- f.is_fan_friend_of_mine = 1
- ORDER BY
- v.created_time
- DESC
-
- </select>
接着构建我们的service:
- @Override
- public PagedGridResult getMyFriendVlogList(String myId, Integer page, Integer pageSize) {
- PageHelper.startPage(page,pageSize);
- Map
map = new HashMap<>(); - map.put("myId",myId);
- List
list = vlogMapperCustom.getMyFriendVlogList(map); - for(IndexVlogVO v : list){
- String vlogerId = v.getVlogerId();
- String vlogId = v.getVlogId();
-
- if(StringUtils.isNotBlank(myId)){
- //用户必定关注过该博主
- v.setDoILikeThisVlog(true);
- //判断当前用户是否点赞
- v.setDoILikeThisVlog(doILikeVlog(myId,vlogId));
- }
- //获得当前视频的点过赞的总数
- v.setLikeCounts(getVlogBeLikedCounts(vlogId));
- }
- return setterPagedGrid(list,page);
- }
这里可以合并getMyFollowVlogList,getMyFriendVlogList两种方法,会更加优雅和美观。
我们查看前端:
编写我们的后端controller:
- @GetMapping("friendList")
- public GraceJSONResult friendList(@RequestParam String myId,
- @RequestParam Integer page,
- @RequestParam Integer pageSize) {
- if (page == null) {
- page = COMMON_START_PAGE;
- }
- if (pageSize == null) {
- pageSize = COMMON_PAGE_SIZE;
- }
- PagedGridResult gridResult = vlogService.getMyFriendVlogList(myId, page, pageSize);
-
- return GraceJSONResult.ok(gridResult);
- }
最后重启,测试:
这里是一个瀑布流,列表内容多一些才会有下滑分页。
如果我们在主页进行关注和点赞,我们会发现它抛异常,这是因为我们在做详情查询时,没有做相应的设置。
联合主键重复
这是detail出现的问题,我们做一个修复
因为这里很多重复这样的操作,我们把它单独拿出来
- private IndexVlogVO setterVO(IndexVlogVO v, String userId){
- String vlogerId = v.getVlogerId();
- String vlogId = v.getVlogId();
- if(StringUtils.isNotBlank(userId)){
- //用户必定关注过该博主
- v.setDoILikeThisVlog(true);
- //判断当前用户是否点赞
- v.setDoILikeThisVlog(doILikeVlog(userId,vlogId));
- }
- //获得当前视频的点过赞的总数
- v.setLikeCounts(getVlogBeLikedCounts(vlogId));
- return v;
- }
在servce中写方法实现:
- @Override
- public IndexVlogVO getVlogDetailById(String userId,String vlogId) {
- Map
map = new HashMap<>(); - map.put("vlogId",vlogId);
- List
list= vlogMapperCustom.getIndexVlogList(map); - if(list!= null && list.size()>0 && !list.isEmpty()){
- IndexVlogVO vlogVO=list.get(0);
- setterVO(vlogVO,userId);
- return setterVO(vlogVO,userId);
- }
- return null;
- }
在controller中:
- @GetMapping("friendList")
- public GraceJSONResult friendList(@RequestParam String myId,
- @RequestParam Integer page,
- @RequestParam Integer pageSize) {
- if (page == null) {
- page = COMMON_START_PAGE;
- }
- if (pageSize == null) {
- pageSize = COMMON_PAGE_SIZE;
- }
- PagedGridResult gridResult = vlogService.getMyFriendVlogList(myId, page, pageSize);
-
- return GraceJSONResult.ok(gridResult);
- }
我们重启,测试:
这里关注和点赞都实现了。
以上就完成了我们所有粉丝业务模块的开发。