项目持续更新中:
目录
视频页点赞总数
在我们的点赞下面会有一个数字,代表点赞总数。我们需要从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<String,Object> map = new HashMap<>();
map.put("userId",usedId);
List<IndexVlogVO> 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<String,Object> map = new HashMap<>();
map.put("myId",myId);
List<IndexVlogVO> 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<String,Object> map = new HashMap<>();
map.put("myId",myId);
List<IndexVlogVO> 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<String,Object> map = new HashMap<>();
map.put("vlogId",vlogId);
List<IndexVlogVO> 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);
}
我们重启,测试:
这里关注和点赞都实现了。
以上就完成了我们所有粉丝业务模块的开发。