diff --git a/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java b/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java index 25eb62228..cdbea6448 100644 --- a/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java +++ b/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java @@ -18,6 +18,7 @@ import com.wzj.soopin.member.domain.vo.AccountBillVO; import com.wzj.soopin.member.domain.vo.MemberAccountVO; import com.wzj.soopin.member.domain.vo.MemberBankVO; import com.wzj.soopin.member.domain.vo.MemberVO; +import com.wzj.soopin.member.service.IFansService; import com.wzj.soopin.member.service.IMemberAccountService; import com.wzj.soopin.member.service.IMemberBankService; import com.wzj.soopin.member.service.IMemberService; @@ -86,6 +87,8 @@ public class AppMemberController { private final WxAuthService wxAuthService; + private final IFansService fansService; + @Operation(summary = "获取会员账户信息详细信息") @GetMapping(value = "/info") public R getInfo(Long memberId) { @@ -239,4 +242,30 @@ public class AppMemberController { return R.ok(); } + + + @Operation(summary = "用户注销") + @Log(title = "用户注销 ", businessType = BusinessType.UPDATE) + @PostMapping("/follow") + public R follow(@RequestParam Long vloggerId) { + LoginUser loginUser= LoginHelper.getLoginUser(); + if (loginUser == null) { + throw new ServiceException("用户未登录"); + } + fansService.doFollow(loginUser.getUserId(), vloggerId); + return R.ok(); + } + @Operation(summary = "用户注销") + @Log(title = "用户注销 ", businessType = BusinessType.UPDATE) + @PostMapping("/cancel") + public R cancelFollow(@RequestParam Long vloggerId) { + LoginUser loginUser= LoginHelper.getLoginUser(); + if (loginUser == null) { + throw new ServiceException("用户未登录"); + } + fansService.doCancel(loginUser.getUserId(), vloggerId); + return R.ok(); + } + + } diff --git a/ruoyi-admin/src/main/resources/application-local.yml b/ruoyi-admin/src/main/resources/application-local.yml index 72b2cd64d..f669a7ad8 100644 --- a/ruoyi-admin/src/main/resources/application-local.yml +++ b/ruoyi-admin/src/main/resources/application-local.yml @@ -156,7 +156,7 @@ rocketmq: # 消费者组 (系统模块) group: wzj_prod # 是否启动消费者 - enabled: true + enabled: false --- # mail 邮件发送 mail: enabled: false diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java index 5db5409c6..7bc4ca701 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java @@ -60,8 +60,8 @@ public interface GlobalConstants { /** * 我喜欢的视频 redis key */ - String GLOBAL_VLOG_LIKED= "global:vlog:member:"; - String GLOBAL_VLOG_MY_LIKED_LIST= "global:vlog:myliked:list"; + String GLOBAL_VLOG_DOILIKE = "global:vlog:doilike:"; + String GLOBAL_VLOG_MY_LIKED_LIST= "global:vlog:myliked:list:"; /** * 我喜欢的视频数量 redis key */ diff --git a/ruoyi-common/ruoyi-common-mq/src/main/java/org/dromara/common/mq/config/RocketMQConfig.java b/ruoyi-common/ruoyi-common-mq/src/main/java/org/dromara/common/mq/config/RocketMQConfig.java index 370f65978..d26b6f94a 100644 --- a/ruoyi-common/ruoyi-common-mq/src/main/java/org/dromara/common/mq/config/RocketMQConfig.java +++ b/ruoyi-common/ruoyi-common-mq/src/main/java/org/dromara/common/mq/config/RocketMQConfig.java @@ -47,6 +47,21 @@ public class RocketMQConfig { */ public static final String TOPIC_VLOG_MSG = "TOPIC_VLOG_MSG"; + /** + * 视频上传主题 + */ + public static final String TOPIC_VLOG_UPLOAD = "TOPIC_VLOG_UPLOAD"; + + /** + * 视频上传主题 + */ + public static final String GROUP_VLOG_UPLOAD = "GROUP_VLOG_UPLOAD"; + + /** + * 视频上传主题 + */ + public static final String TAG_VLOG_UPLOAD = "VLOG_UPLOAD"; + /** * 视频上传消费者组 */ diff --git a/ruoyi-common/ruoyi-common-mq/src/main/java/org/dromara/common/mq/utils/UserRocketMQConsumerManager.java b/ruoyi-common/ruoyi-common-mq/src/main/java/org/dromara/common/mq/utils/UserRocketMQConsumerManager.java index c321c36a8..87b4a3f38 100644 --- a/ruoyi-common/ruoyi-common-mq/src/main/java/org/dromara/common/mq/utils/UserRocketMQConsumerManager.java +++ b/ruoyi-common/ruoyi-common-mq/src/main/java/org/dromara/common/mq/utils/UserRocketMQConsumerManager.java @@ -119,10 +119,14 @@ public class UserRocketMQConsumerManager { // 拉取所有队列的消息 for (MessageQueue mq : mqs) { PullResult result = pullSingleQueueMessage(userId, context.consumer, mq , batchSize-current); + Double offset = getUserQueueOffset(userId, mq); + if(offset!=null&&offset>=result.getMaxOffset()){ + redisCache.zSetAdd(GlobalConstants.GLOBAL_OFFSET+userId,mq.getQueueId()+"",result.getNextBeginOffset()); + } + if (result.getPullStatus() == PullStatus.FOUND) { allMessages.addAll(result.getMsgFoundList()); // 更新用户的偏移量 - updateUserOffset(userId, mq, result.getNextBeginOffset()); redisCache.zSetAdd(GlobalConstants.GLOBAL_OFFSET+userId,mq.getQueueId()+"",result.getNextBeginOffset()); current+=result.getMsgFoundList().size(); if(current==batchSize){ @@ -178,6 +182,7 @@ public class UserRocketMQConsumerManager { * 更新用户在指定队列的消费偏移量 */ private void updateUserOffset(String userId, MessageQueue mq, long offset) { + redisCache.zSetAdd(GlobalConstants.GLOBAL_OFFSET+userId,mq.getQueueId()+"",offset); } /** diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/consumer/VlogUploadMessageConsumer.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/consumer/VlogUploadMessageConsumer.java index 8947ca845..7e1b4b3e2 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/consumer/VlogUploadMessageConsumer.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/consumer/VlogUploadMessageConsumer.java @@ -35,9 +35,9 @@ import java.nio.file.Path; @Component @RequiredArgsConstructor @RocketMQMessageListener( - topic = RocketMQConfig.TOPIC_VLOG_MSG, - consumerGroup = RocketMQConfig.GROUP_VLOG_MSG, - selectorExpression = RocketMQConfig.TAG_VLOG_MSG + topic = RocketMQConfig.TOPIC_VLOG_UPLOAD, + consumerGroup = RocketMQConfig.GROUP_VLOG_UPLOAD, + selectorExpression = RocketMQConfig.TAG_VLOG_UPLOAD ) public class VlogUploadMessageConsumer implements RocketMQListener { private final QcCloud qcCloud; diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/MyLikeVlogServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/MyLikeVlogServiceImpl.java index c388fe60c..cfd0fdb82 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/MyLikeVlogServiceImpl.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/MyLikeVlogServiceImpl.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.wzj.soopin.content.domain.po.MyLikedVlog; import com.wzj.soopin.content.mapper.MyLikedVlogMapper; import com.wzj.soopin.content.service.IMyLikeVlogService; +import com.wzj.soopin.member.domain.po.Fans; import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.redis.utils.RedisUtils; import org.springframework.cache.annotation.CacheEvict; @@ -19,7 +20,6 @@ public class MyLikeVlogServiceImpl extends ServiceImpl() .eq(MyLikedVlog::getMemberId, memberId.toString()) @@ -56,9 +54,11 @@ public class MyLikeVlogServiceImpl extends ServiceImpl() + .eq(MyLikedVlog::getMemberId, memberId.toString()) + .eq(MyLikedVlog::getVlogId, vlogId.toString())) > 0; } } diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogPullServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogPullServiceImpl.java index b93b5b97b..74e87b879 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogPullServiceImpl.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogPullServiceImpl.java @@ -83,6 +83,7 @@ public class VlogPullServiceImpl implements IVlogPullService { //发出事件 //先临时取10条数据 Page indexVlogVOPage = vlogService.getIndexVlogList(null, page); + Collections.shuffle(indexVlogVOPage.getRecords()); //标记已读 if(loginUser!=null){ saveMyReadVlog(indexVlogVOPage.getRecords(), loginUser.getUserId()); diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogPushServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogPushServiceImpl.java index 5a8e96435..48cf64e5a 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogPushServiceImpl.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogPushServiceImpl.java @@ -90,6 +90,8 @@ public class VlogPushServiceImpl implements IVlogPushService { if(CollectionUtils.isEmpty(vlogPage.getRecords())){ return false; } + // 4. 使用 Collections.shuffle 打乱 List 的顺序 + Collections.shuffle(vlogPage.getRecords()); vlogPage.getRecords().stream().forEach(vlogId -> { //将数据发送的mq的热点数据队列 MQMessage message = MQMessage.builder() 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 675a3a43e..aa034a5aa 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 @@ -136,11 +136,11 @@ public class VlogServiceImpl extends ServiceImpl implements Vl .messageType(MQMessageType.VLOG.name()) .data(vlog.getId()) .source("app") - .topic("VLOG_UPLOAD_TOPIC") - .tag("upload") + .topic(RocketMQConfig.TOPIC_VLOG_UPLOAD) + .tag(RocketMQConfig.TAG_VLOG_UPLOAD) .sendTime(LocalDateTime.now()) .build(); - MqUtil.sendMessage(RocketMQConfig.TOPIC_VLOG_MSG + ":" + RocketMQConfig.TAG_VLOG_MSG, message); + MqUtil.sendMessage(RocketMQConfig.TOPIC_VLOG_UPLOAD + ":" + RocketMQConfig.TAG_VLOG_UPLOAD, message); } @Override @@ -309,6 +309,7 @@ public class VlogServiceImpl extends ServiceImpl implements Vl RedisUtils.delCacheMapValue(GlobalConstants.GLOBAL_VLOG_MY_LIKED_LIST, userId); RedisUtils.delCacheMapValue(GlobalConstants.GLOBAL_VLOG_LIKED_COUNT, vlogId); RedisUtils.delCacheMapValue(GlobalConstants.GLOBAL_VLOG_ALL_LIKED_COUNT, vloggerId); + RedisUtils.delCacheMapValue(GlobalConstants.GLOBAL_VLOG_DOILIKE, userId + "_" + vlogId); } @Override diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/FansServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/FansServiceImpl.java index 744c16094..42aee5fa7 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/FansServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/FansServiceImpl.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.protobuf.ServiceException; import com.wzj.soopin.member.domain.po.Fans; import com.wzj.soopin.member.domain.po.Member; import com.wzj.soopin.member.domain.vo.FansVO; @@ -45,9 +46,20 @@ public class FansServiceImpl extends ServiceImpl implements IF @Transactional(rollbackFor = Exception.class) @Override - @Cacheable(value = GlobalConstants.GLOBAL_MEMBER_DOIFOLLOW, key = "#vloggerId" + "-" + "#myId") public boolean doFollow(Long myId, Long vloggerId) { // 幂等性校验:已存在则不再插入 + Member member = memberMapper.selectById(myId); + if (member == null) { + log.error("用户不存在"); + return false; + } + + Member vlogger = memberMapper.selectById(vloggerId); + if (vlogger == null) { + log.error("视频主不存在"); + return false; + } + Fans existing = queryFansRelationship(myId, vloggerId); if (existing != null) { @@ -67,7 +79,7 @@ public class FansServiceImpl extends ServiceImpl implements IF vloger.setBothFriend(YesOrNo.YES.type); baseMapper.updateById(vloger); } else { - fans.setFriendFlag(YesOrNo.YES.type); + fans.setFriendFlag(YesOrNo.NO.type); } baseMapper.insert(fans); @@ -110,7 +122,6 @@ public class FansServiceImpl extends ServiceImpl implements IF @Transactional(rollbackFor = Exception.class) @Override - @CacheEvict(value = GlobalConstants.GLOBAL_MEMBER_DOIFOLLOW, key = "#vloggerId" + "-" + "#myId") public boolean doCancel(Long myId, Long vloggerId) { // 判断我们是否朋友关系,如果是,则需要取消双方的关系 Fans fan = queryFansRelationship(myId, vloggerId); @@ -138,15 +149,9 @@ public class FansServiceImpl extends ServiceImpl implements IF } @Override + @Cacheable(cacheNames = GlobalConstants.GLOBAL_MEMBER_DOIFOLLOW, key = "#myId" + "-" + "#vloggerId") public boolean queryDoIFollowVloger(Long myId, Long vloggerId) { - - Boolean result = RedisUtils.getCacheMapValue(GlobalConstants.GLOBAL_MEMBER_DOIFOLLOW, vloggerId + "-" + myId); - if (result == null) { - result = baseMapper.selectCount(new LambdaQueryWrapper().eq(Fans::getFanId, myId).eq(Fans::getVloggerId, vloggerId)) > 0; - RedisUtils.setCacheMapValue(GlobalConstants.GLOBAL_MEMBER_DOIFOLLOW, vloggerId + "-" + myId, result); - } - - return result != null ? result : false; + return baseMapper.selectCount(new LambdaQueryWrapper().eq(Fans::getFanId, myId).eq(Fans::getVloggerId, vloggerId)) > 0; } @@ -175,6 +180,7 @@ public class FansServiceImpl extends ServiceImpl implements IF RedisUtils.delCacheMapValue(GlobalConstants.GLOBAL_MEMBER_FANS_COUNT, vloggerId + ""); RedisUtils.delCacheMapValue(GlobalConstants.GLOBAL_MEMBER_FOLLOW_COUNT, userId + ""); RedisUtils.delCacheMapValue(GlobalConstants.GLOBAL_MEMBER_FRIENDS_COUNT, userId + ""); + RedisUtils.delCacheMapValue(GlobalConstants.GLOBAL_MEMBER_DOIFOLLOW, userId + "-" + vloggerId); } @Override diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java index c458854c3..462c7e4c1 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java @@ -319,6 +319,8 @@ public class MemberServiceImpl extends ServiceImpl implemen for (MemberVO memberVO : records) { memberVO.setDoIFollowVloger(fansService.queryDoIFollowVloger(tokenUser.getUserId(), memberVO.getId())); + memberVO.setFansCount(fansService.myFansCount(memberVO.getId())); + } }