From 6c4ffb26e9eca2bb9d98031c0fb579113ee5304a Mon Sep 17 00:00:00 2001 From: wangqx Date: Thu, 28 Aug 2025 15:44:43 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=E4=BF=AE=E6=94=B9=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/controller/VlogController.java | 10 +- .../content/service/impl/VlogServiceImpl.java | 476 ++++++------------ 2 files changed, 166 insertions(+), 320 deletions(-) diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/VlogController.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/VlogController.java index e5963d13b..b73995c01 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/VlogController.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/VlogController.java @@ -49,7 +49,7 @@ public class VlogController extends BaseInfoProperties { @Autowired private IVlogPushService vlogPushService; - @PostMapping("vodCallBack") + @PostMapping("/vodCallBack") public R vodCallBack(@RequestBody Map callbackData) { try { // 解析回调事件类型 @@ -163,7 +163,7 @@ public class VlogController extends BaseInfoProperties { - @PostMapping("changeVlogStatus") + @PostMapping("/changeVlogStatus") public R changeVlogStatus(@RequestParam String userId, @RequestParam String vlogId, @RequestParam Integer status) { @@ -171,7 +171,7 @@ public class VlogController extends BaseInfoProperties { return R.ok(); } - @PostMapping("changeToPrivate") + @PostMapping("/changeToPrivate") public R changeToPrivate(@RequestParam String userId, @RequestParam String vlogId) { vlogService.changeToPrivateOrPublic(userId, @@ -180,7 +180,7 @@ public class VlogController extends BaseInfoProperties { return R.ok(); } - @PostMapping("changeToPublic") + @PostMapping("/changeToPublic") public R changeToPublic(@RequestParam String userId, @RequestParam String vlogId) { vlogService.changeToPrivateOrPublic(userId, @@ -193,7 +193,7 @@ public class VlogController extends BaseInfoProperties { - @PostMapping("totalLikedCounts") + @PostMapping("/totalLikedCounts") public R totalLikedCounts(@RequestParam String vlogId) { return R.ok(vlogService.getVlogBeLikedCounts(vlogId)); } diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java index e2be61c8d..37300427e 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -13,6 +14,7 @@ import com.wzj.soopin.content.domain.bo.*; import com.wzj.soopin.content.domain.po.MyLikedVlog; import com.wzj.soopin.content.domain.po.Vlog; import com.wzj.soopin.content.domain.po.Users; +import com.wzj.soopin.content.domain.vo.VlogerVO; import com.wzj.soopin.member.domain.po.Member; import com.wzj.soopin.content.domain.vo.IndexVlogVO; import com.wzj.soopin.content.enums.YesOrNo; @@ -32,12 +34,22 @@ import com.wzj.soopin.content.utils.TencentCloudUtil; import com.wzj.soopin.member.service.IFansService; import com.wzj.soopin.content.convert.VlogConvert; import com.wzj.soopin.member.service.IMemberService; +import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; +import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.mq.domain.MQMessage; +import org.dromara.common.mq.enums.MQMessageType; +import org.dromara.common.mq.enums.MessageActionEnum; +import org.dromara.common.mq.utils.MqUtil; +import org.dromara.common.mq.utils.UserRocketMQConsumerManager; +import org.dromara.common.redis.redis.RedisCache; import org.dromara.common.satoken.utils.LoginHelper; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.dromara.common.core.utils.MapstructUtils; @@ -49,36 +61,27 @@ import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import java.util.ArrayList; + import lombok.extern.slf4j.Slf4j; +import static com.wzj.soopin.content.domain.base.BaseInfoProperties.*; + @Slf4j @Service -public class VlogServiceImpl extends BaseInfoProperties implements VlogService { +@AllArgsConstructor +public class VlogServiceImpl extends ServiceImpl implements VlogService { + + private final VlogMapper vlogMapper; + private final VlogMapperCustom vlogMapperCustom; + private final MyLikedVlogMapper myLikedVlogMapper; + private final IFansService fansService; + private final MsgService msgService; + private final Sid sid; + private final CommentMapper commentMapper; + private final MemberMapper memberMapper; + private final RedisCache cache; + private final RedisCache redisCache; - @Autowired - private VlogMapper vlogMapper; - @Autowired - private VlogMapperCustom vlogMapperCustom; - @Autowired - private MyLikedVlogMapper myLikedVlogMapper; - @Autowired - private IFansService fansService; - @Autowired - private MsgService msgService; - @Autowired - private Sid sid; - @Autowired - private CommentMapper commentMapper; - @Autowired - private RedisOperator redis; - @Autowired - private TencentCloudUtil tencentCloudUtil; - @Autowired - private UsersMapper usersMapper; - @Autowired - private MemberMapper memberMapper; - @Autowired - private IMemberService memberService; @Transactional(rollbackFor = Exception.class) @Override public void updateVlogStatus(String fileId, Integer status, String reason) { @@ -138,157 +141,40 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { vlogMapper.insert(vlog); } - @Override - public Page getIndexVlogList(IndexListBO bo, Page page) { - String userId = bo.getMemberId(); - String search = bo.getSearch(); - String cityCode = bo.getCityCode(); - String status = bo.getStatus(); - int current = (int) page.getCurrent(); - int size = (int) page.getSize(); - Page pageParam = new Page<>(current, size); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (StringUtils.isNotBlank(search)) { - queryWrapper.like(Vlog::getTitle, search); - } - if (StringUtils.isNotBlank(cityCode)) { - queryWrapper.eq(Vlog::getCityCode, cityCode); - } - if (StringUtils.isNotBlank(status)) { - queryWrapper.eq(Vlog::getStatus, status); - } - // 去掉黑名单的视频 - if (StringUtils.isNotBlank(userId)) { - String redisKey = REDIS_VIDEO_BLOCK + ":" + userId; - if (redis.keyIsExist(redisKey)) { - List blockVdList = new ArrayList<>(); - ObjectMapper objectMapper = new ObjectMapper(); - List reports = redis.lrange(redisKey, 0, -1); - for (String report : reports) { - try { - Map reportMap = objectMapper.readValue(report, new TypeReference>() {}); - String vlogId = (String) reportMap.get("vlogId"); - blockVdList.add(vlogId); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - } - if (!blockVdList.isEmpty()) { - queryWrapper.notIn(Vlog::getId, blockVdList); - } - } - } - // 去掉黑名单的用户 - if (StringUtils.isNotBlank(userId)) { - String redisKey = REDIS_USER_BLOCK + ":" + userId; - if (redis.keyIsExist(redisKey)) { - List blockUserList = new ArrayList<>(); - ObjectMapper objectMapper = new ObjectMapper(); - List reports = redis.lrange(redisKey, 0, -1); - for (String report : reports) { - try { - Map reportMap = objectMapper.readValue(report, new TypeReference>() {}); - String memberId = (String) reportMap.get("MemberId"); - blockUserList.add(memberId); - } catch (JsonProcessingException e) { - log.error(e.getMessage()); - } - } - if (!blockUserList.isEmpty()) { - queryWrapper.notIn(Vlog::getMemberId, blockUserList); - } - } - } - // 去掉已读的视频 - if (StringUtils.isNotBlank(userId)) { - String redisKey = REDIS_USER_READ_VLOG + ":" + userId; - if (redis.keyIsExist(redisKey)) { - List readVlogList = new ArrayList<>(); - ObjectMapper objectMapper = new ObjectMapper(); - List reports = redis.lrange(redisKey, 0, -1); - for (String report : reports) { - try { - Map reportMap = objectMapper.readValue(report, new TypeReference>() {}); - String memberId = (String) reportMap.get("MemberId"); - readVlogList.add(memberId); - } catch (JsonProcessingException e) { - log.error(e.getMessage()); - } - } - if (!readVlogList.isEmpty()) { - queryWrapper.notIn(Vlog::getMemberId, readVlogList); - } - } - } - Page vlogPage = vlogMapper.selectPage(pageParam, queryWrapper); - List vlogList = vlogPage.getRecords(); - List voList = vlogList.stream().map(v -> { - IndexVlogVO vo = MapstructUtils.convert(v, IndexVlogVO.class); - if (StringUtils.isNotBlank(userId)) { - vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(userId, v.getMemberId())); - vo.setDoILikeThisVlog(doILikeVlog(userId, v.getId())); - } - vo.setLikeCounts(getVlogBeLikedCounts(v.getId())); - vo.setCommentsCounts(getVlogComment(v.getId())); - MemberVO m =memberService.getMemberInfo(vo.getMemberId()); - if (m != null) { - vo.setAvatar(m.getAvatar()); - vo.setNickname(m.getNickname()); - } - return vo; - }).collect(Collectors.toList()); - - - - // 封装分页结果 - Page gridResult = new Page(); - gridResult.setRecords(voList); // 当前页数据列表 - gridResult.setCurrent(current); // 当前页码 - gridResult.setTotal(vlogPage.getTotal()); // 总记录数 - gridResult.setSize(vlogPage.getPages()); // 总页数 - - - return gridResult; - - } @Override public Integer getVlogBeLikedCounts(String vlogId) { - String countsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId); - if (StringUtils.isBlank(countsStr)) { - countsStr = "0"; - } - return Integer.valueOf(countsStr); + Double count = cache.zSetScore(REDIS_VLOG_BE_LIKED_COUNTS, vlogId); + + return count==null?0:count.intValue(); } private Integer getVlogComment(String vlogId) { - String countsStr = redis.get(REDIS_VLOG_COMMENT_COUNTS + ":" + vlogId); - if (StringUtils.isBlank(countsStr)) { - countsStr = "0"; - } - return Integer.valueOf(countsStr); + Double count = cache.zSetScore(REDIS_VLOG_COMMENT_COUNTS, vlogId); + return count==null?0:count.intValue(); } - private boolean doILikeVlog(String myId, String vlogId) { - String doILike = redis.get(REDIS_USER_LIKE_VLOG + ":" + myId + ":" + vlogId); + private boolean doILikeVlog(String myId, String vlogId) { + String doILike = cache.getCacheObject(REDIS_USER_LIKE_VLOG + ":" + myId + ":" + vlogId); return StringUtils.isNotBlank(doILike) && doILike.equalsIgnoreCase("1"); } @Override - public IndexVlogVO getVlogDetailById( String vlogId) { + @Cacheable(cacheNames = GlobalConstants.VLOG_KEY, key = "#vlogId") + public IndexVlogVO getVlogDetailById(String vlogId) { Vlog vlog = vlogMapper.selectById(vlogId); if (vlog == null) { return null; } IndexVlogVO vo = MapstructUtils.convert(vlog, IndexVlogVO.class); //获取用户信息 - try{ + try { LoginUser loginUser = LoginHelper.getLoginUser(); if (loginUser != null) { - vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(loginUser.getUserId()+"", vlog.getMemberId())); - vo.setDoILikeThisVlog(doILikeVlog(loginUser.getUserId()+"", vlogId)); + vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(loginUser.getUserId() + "", vlog.getMemberId())); + vo.setDoILikeThisVlog(doILikeVlog(loginUser.getUserId() + "", vlogId)); } - }catch (Exception e){ + } catch (Exception e) { log.error(e.getMessage()); } @@ -307,6 +193,8 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { @Transactional(rollbackFor = Exception.class) @Override + + @CacheEvict(value = GlobalConstants.VLOG_KEY, key = "#vlogId") public void changeToPrivateOrPublic(String userId, String vlogId, Integer yesOrNo) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(Vlog::getId, vlogId) @@ -317,6 +205,7 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { @Transactional(rollbackFor = Exception.class) @Override + @CacheEvict(value = GlobalConstants.VLOG_KEY, key = "#vlogId") public void changeVlogStatus(String userId, String vlogId, Integer status) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(Vlog::getId, vlogId) @@ -332,17 +221,17 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { Page pageParam = new Page<>(current, size); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if(bo.getUserId()==null){ - LoginUser user= LoginHelper.getLoginUser(); - if(user==null){ + if (bo.getUserId() == null) { + LoginUser user = LoginHelper.getLoginUser(); + if (user == null) { throw new ServiceException("用户未登录"); } queryWrapper.eq(Vlog::getMemberId, user.getUserId()); - }else{ + } else { queryWrapper.eq(Vlog::getMemberId, bo.getUserId()); } - queryWrapper.eq(bo.getPrivateFlag()!=null,Vlog::getIsPrivate, bo.getPrivateFlag()); + queryWrapper.eq(bo.getPrivateFlag() != null, Vlog::getIsPrivate, bo.getPrivateFlag()); Page vlogPage = vlogMapper.selectPage(pageParam, queryWrapper); List vlogList = vlogPage.getRecords(); @@ -380,7 +269,15 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { @Transactional(rollbackFor = Exception.class) @Override + @CacheEvict(value = GlobalConstants.VLOG_KEY, key = "#vlogId") public void userLikeVlog(String userId, String vlogId) { + //获取vlog + Vlog vlog = this.getVlog(vlogId); + if (vlog == null) { + throw new ServiceException("视频不存在"); + } + // 我点赞的视频,关联关系保存到数据库 + String rid = sid.nextShort(); MyLikedVlog likedVlog = new MyLikedVlog(); likedVlog.setId(rid); @@ -388,36 +285,32 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { likedVlog.setUserId(userId); myLikedVlogMapper.insert(likedVlog); - // 我喜欢的视频总数累加 - redis.increment(REDIS_VLOGER_BE_LIKED_COUNTS + ":" + userId, 1); - // 视频被喜欢的总数累加 - redis.increment(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId, 1); - // 保存用户和视频的喜欢关系 - redis.set(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId, "1"); + // 点赞后,视频和视频发布者的获赞都会 +1 + cache.zSetIncrement(REDIS_VLOGER_BE_LIKED_COUNTS, vlog.getMemberId(), 1); + cache.zSetIncrement(REDIS_VLOG_BE_LIKED_COUNTS, vlogId, 1); - // 发送点赞通知 - Vlog vlog = vlogMapper.selectById(vlogId); - if (vlog != null) { - String vlogerId = vlog.getMemberId(); - if (!userId.equals(vlogerId)) { -// Long templateId = 1938491299175723009L; -// SysMessageTemplateVo template = templateService.selectTemplateById(templateId); -// if (template != null) { -// // 查询点赞用户昵称 -// Member liker = memberMapper.selectById(userId); -// String likerNickname = liker != null && liker.getNickname() != null ? liker.getNickname() : ""; -// -// String content = template.getTemplateContent() -// .replace("${videoTitle}", vlog.getTitle() == null ? "" : vlog.getTitle()) -// .replace("${liker}", userId) -// .replace("${likerNickname}", likerNickname); -// SysMessageBo messageBo = new SysMessageBo(); -// messageBo.setTitle(template.getTitle()); -// messageBo.setContent(content); -// messageBo.setSenderId(Long.valueOf(userId)); -// sysMessageService.sendMessageToUser(messageBo, Long.valueOf(vlogerId)); -// } - } + // 我点赞的视频,需要在redis中保存关联关系 + cache.setCacheObject(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId, "1"); + Double count = cache.zSetScore(REDIS_VLOG_BE_LIKED_COUNTS, vlogId); + if (count > 0) { + //更新数据库的点赞数 + this.flushCounts(vlogId, count.intValue()); + } + //发送消息 + if (userId != null && vlog.getMemberId() != null && !userId.equals(vlog.getMemberId())) { + // 新版:使用模板类型编号和参数 + Map params = new HashMap<>(); + params.put("userId", userId); + params.put("nickname", LoginHelper.getLoginUser().getNickname()); + params.put("action", MessageActionEnum.INTERACTION_LIKE.name()); + params.put("toUserId", vlog.getMemberId()); + MQMessage message = MQMessage.builder() + .messageType(MQMessageType.IM.name()) + .data(params) + .source("member") + .build(); + // 关注消息 + MqUtil.sendIMMessage(message); } } @@ -437,61 +330,71 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { @Transactional(rollbackFor = Exception.class) @Override + @CacheEvict(value = GlobalConstants.VLOG_KEY, key = "#vlogId") public void userUnLikeVlog(String userId, String vlogId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(MyLikedVlog::getUserId, userId) - .eq(MyLikedVlog::getVlogId, vlogId); - myLikedVlogMapper.delete(queryWrapper); - // 我喜欢的视频总数累减 - redis.decrement(REDIS_VLOGER_BE_LIKED_COUNTS + ":" + userId, 1); - // 视频被喜欢的总数累减 - redis.decrement(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId, 1); - // 删除用户和视频的喜欢关系 - redis.del(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId); + //获取vlog + Vlog vlog = this.getVlog(vlogId); + if (vlog == null) { + throw new ServiceException("视频不存在"); + } + + // 我取消点赞的视频,关联关系删除 + this.userUnLikeVlog(userId, vlogId); + + cache.zSetDecrement(REDIS_VLOGER_BE_LIKED_COUNTS, vlog.getMemberId(), 1); + cache.zSetDecrement(REDIS_VLOG_BE_LIKED_COUNTS, vlogId, 1); + cache.deleteObject(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId); + + + Double count = cache.zSetScore(REDIS_VLOG_BE_LIKED_COUNTS, vlogId); + if (count > 0) { + //更新数据库的点赞数 + this.flushCounts(vlogId, count.intValue()); + } } @Override - public Page getMyLikedVlogList( Page page) { + public Page getMyLikedVlogList(Page page) { - LoginUser user= LoginHelper.getLoginUser(); - if(user==null){ + LoginUser user = LoginHelper.getLoginUser(); + if (user == null) { throw new ServiceException("用户未登录"); } Map map = new HashMap<>(); map.put("myId", user.getUserId()); - Page likedPage = vlogMapperCustom.getMyLikedVlogList(map,page); + Page likedPage = vlogMapperCustom.getMyLikedVlogList(map, page); - likedPage.getRecords().stream().forEach( - liked -> { - liked.setDoIFollowVloger(true); - liked.setDoILikeThisVlog(true); + likedPage.getRecords().stream().forEach( + liked -> { + liked.setDoIFollowVloger(true); + liked.setDoILikeThisVlog(true); }); - return likedPage; + return likedPage; } @Override public Page getMyFollowVlogList(Page page) { - LoginUser user= LoginHelper.getLoginUser(); - if(user==null){ + LoginUser user = LoginHelper.getLoginUser(); + if (user == null) { throw new ServiceException("用户未登录"); } Map map = new HashMap<>(); map.put("myId", user.getUserId()); - Page voPage = vlogMapperCustom.getMyFollowVlogList(map,page); + Page voPage = vlogMapperCustom.getMyFollowVlogList(map, page); return voPage; } @Override - public Page getMyFriendVlogList( Page page) { - LoginUser user= LoginHelper.getLoginUser(); - if(user==null){ + public Page getMyFriendVlogList(Page page) { + LoginUser user = LoginHelper.getLoginUser(); + if (user == null) { throw new ServiceException("用户未登录"); } Map map = new HashMap<>(); map.put("myId", user.getUserId()); - Page voPage = vlogMapperCustom.getMyFriendVlogList(map,page); + Page voPage = vlogMapperCustom.getMyFriendVlogList(map, page); return voPage; } @@ -512,15 +415,15 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { if (vlog != null) { result.put("vlogId", vlog.getId()); result.put("title", vlog.getTitle()); - result.put("width",vlog.getWidth()); - result.put("height",vlog.getHeight()); - result.put("reason",vlog.getReason()); + result.put("width", vlog.getWidth()); + result.put("height", vlog.getHeight()); + result.put("reason", vlog.getReason()); // 注意:点赞数和评论数现在在控制器中直接从Redis获取 // 这里不再统计,避免重复计算 // 获取粉丝数量:优先 Redis,无则 MySQL - String fansCountsStr = redis.get(REDIS_MY_FANS_COUNTS + ":" + vlog.getMemberId()); + String fansCountsStr = cache.getCacheObject(REDIS_MY_FANS_COUNTS + ":" + vlog.getMemberId()); Integer fansCounts = 0; if (StringUtils.isNotBlank(fansCountsStr)) { fansCounts = Integer.valueOf(fansCountsStr); @@ -560,22 +463,14 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { result.put("comments", comments); // 从Redis获取点赞数 - String likeCountsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlog.getId()); - Integer likeCounts = 0; - if (StringUtils.isNotBlank(likeCountsStr)) { - try { - likeCounts = Integer.valueOf(likeCountsStr); - } catch (NumberFormatException e) { - log.warn("Redis中视频{}的点赞数格式错误: {}", vlog.getId(), likeCountsStr); - likeCounts = 0; - } - } + int likeCounts = getVlogBeLikedCounts(vlog.getId()); + result.put("likeCounts", likeCounts); result.put("vlogId", vlog.getId()); List> likedUsers = myLikedVlogMapper.selectLikedUsersByVlogId(vlog.getId()); result.put("likedUsers", likedUsers); - result.put("vlog",vo); + result.put("vlog", vo); // 添加粉丝列表 // Page fansPage = fansService.queryMyFans(vlog.getVlogerId(), 0, 10); @@ -608,20 +503,6 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { return myLikedVlogMapper.selectLikedUsersByVlogId(vlogId); } - @Override - public int getLikeCounts(String vlogId) { - // 从Redis获取点赞数 - String likeCountsStr = redis.get(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId); - if (StringUtils.isNotBlank(likeCountsStr)) { - try { - return Integer.valueOf(likeCountsStr); - } catch (NumberFormatException e) { - log.warn("Redis中视频{}的点赞数格式错误: {}", vlogId, likeCountsStr); - return 0; - } - } - return 0; - } @Override public Map getVlogUploaderInfo(String fileId) { @@ -699,77 +580,6 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { return vlogMapper.selectVlogListWithAggregatedData(page, vlogBO); } - @Override - public void cacheTopLikedVlogs(int limit) { - try { - log.info("开始查询点赞最多的{}条视频", limit); - - // 查询所有公开的视频列表 - List> allVlogs = vlogMapper.selectAllPublicVlogs(); - - if (allVlogs != null && !allVlogs.isEmpty()) { - // 从Redis获取每个视频的点赞数量 - List> vlogsWithLikeCounts = new ArrayList<>(); - - for (Map vlog : allVlogs) { - String vlogId = vlog.get("id").toString(); - String redisLikeKey = REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId; - String likeCountStr = redis.get(redisLikeKey); - - // 获取Redis中的点赞数,如果没有则使用数据库中的默认值 - int likeCount = 0; - if (likeCountStr != null && !likeCountStr.isEmpty()) { - try { - likeCount = Integer.parseInt(likeCountStr); - } catch (NumberFormatException e) { - log.warn("Redis中视频{}的点赞数格式错误: {}", vlogId, likeCountStr); - likeCount = 0; - } - } - - // 添加Redis中的点赞数到视频信息中 - vlog.put("redis_like_count", likeCount); - vlogsWithLikeCounts.add(vlog); - } - - // 先打乱顺序 - Collections.shuffle(vlogsWithLikeCounts); - - // 按Redis中的点赞数排序,获取前limit个 - vlogsWithLikeCounts.sort((v1, v2) -> { - int count1 = (Integer) v1.get("redis_like_count"); - int count2 = (Integer) v2.get("redis_like_count"); - return Integer.compare(count2, count1); // 降序排列 - }); - - // 取前limit个 - List> topLikedVlogs = vlogsWithLikeCounts.stream() - .limit(limit) - .collect(Collectors.toList()); - - if (!topLikedVlogs.isEmpty()) { - // 将结果存储到Redis中,使用JSON格式 - ObjectMapper objectMapper = new ObjectMapper(); - // 注册JavaTimeModule以支持LocalDateTime序列化 - objectMapper.registerModule(new com.fasterxml.jackson.datatype.jsr310.JavaTimeModule()); - objectMapper.disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - String jsonData = objectMapper.writeValueAsString(topLikedVlogs); - - // 存储到Redis,设置24小时过期时间 - String redisKey = "top_liked_vlogs:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - redis.set(redisKey, jsonData, 24 * 60 * 60); // 24小时过期 - - log.info("成功缓存{}条点赞最多的视频到Redis,key: {}", topLikedVlogs.size(), redisKey); - } else { - log.warn("未查询到点赞最多的视频数据"); - } - } else { - log.warn("未查询到公开的视频数据"); - } - } catch (Exception e) { - log.error("缓存点赞最多视频到Redis失败", e); - } - } @Override public List> getRandomVlogs(int limit) { @@ -783,4 +593,40 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { return new ArrayList<>(); } } + + @Override + public IPage getVlogForUser(Page page, Long memberId) { + return baseMapper.getVlogForUser(page, memberId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int readVlog(Long memberId, String vlogId) { + //加入已读缓存列表,数量为1 + if (!redisCache.zSetHasMember("vlog:read:" + memberId, vlogId)) { + redisCache.zSetAdd("vlog:read:" + memberId, vlogId, 1); + } else { + redisCache.zSetIncrement("vlog:read:" + memberId, vlogId, 1); + } + return baseMapper.readVlog(memberId, vlogId); + } + + @Override + public List getIndexVlogList(Map paramMap) { + List indexVlogVOPage = vlogMapperCustom.getIndexVlogList(paramMap); + fillRedisColumn(indexVlogVOPage ); + return indexVlogVOPage; + } + + private void fillRedisColumn(List vlogList) { + LoginUser user = LoginHelper.getLoginUser(); + vlogList.parallelStream().forEach(vlog -> { + if (user != null) { + vlog.setDoIFollowVloger(fansService.queryDoIFollowVloger(user.getUserId() + "", vlog.getMemberId())); + vlog.setDoILikeThisVlog(doILikeVlog(user.getUserId() + "", vlog.getId())); + } + vlog.setLikeCounts(getVlogBeLikedCounts(vlog.getId())); + vlog.setCommentsCounts(getVlogComment(vlog.getId())); + }); + } }