[fix]修改关注和粉丝
This commit is contained in:
parent
4ee40f0bdb
commit
6ed0f56462
@ -1,5 +1,6 @@
|
||||
package org.dromara.app;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.wzj.soopin.member.business.IMemberBusiness;
|
||||
import com.wzj.soopin.member.convert.AccountBillConvert;
|
||||
@ -50,6 +51,7 @@ import org.dromara.common.ratelimiter.annotation.RateLimiter;
|
||||
import org.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.dromara.common.social.config.properties.SocialProperties;
|
||||
import org.dromara.common.social.utils.SocialUtils;
|
||||
import org.springframework.data.annotation.LastModifiedDate;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
@ -139,8 +141,10 @@ public class AppMemberController {
|
||||
if (memberAccount == null) {
|
||||
throw new ServiceException("用户未绑定账户");
|
||||
}
|
||||
bo.setAccountId(memberAccount.getId());
|
||||
Page<AccountBill> memberPage = accountBillService.page(page, bo.toWrapper());
|
||||
LambdaQueryWrapper<AccountBill> queryWrapper = bo.toWrapper();
|
||||
queryWrapper.eq(AccountBill::getAccountId, memberAccount.getId());
|
||||
queryWrapper.orderByDesc(AccountBill::getCreateTime);
|
||||
Page<AccountBill> memberPage = accountBillService.page(page, queryWrapper);
|
||||
return R.ok(accountBillConvert.toVO(memberPage));
|
||||
}
|
||||
|
||||
|
@ -76,6 +76,22 @@ public interface GlobalConstants {
|
||||
|
||||
String GLOBAL_MEMBER_FANS_COUNT="global:member:myfans:count:";
|
||||
|
||||
/**
|
||||
* 我关注的视频数量 redis key
|
||||
*/
|
||||
String GLOBAL_MEMBER_FOLLOW_COUNT="global:member:myfollow:count:";
|
||||
|
||||
|
||||
/**
|
||||
* 我关注的视频数量 redis key
|
||||
*/
|
||||
String GLOBAL_MEMBER_FRIENDS_COUNT="global:member:myfriends:count:";
|
||||
|
||||
String GLOBAL_MEMBER_DOIFOLLOW="global:member:doifollow:";
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ import java.nio.file.Path;
|
||||
@RequiredArgsConstructor
|
||||
@RocketMQMessageListener(
|
||||
topic = RocketMQConfig.VLOG_UPLOAD_TOPIC,
|
||||
consumerGroup = "VLOG_UPLOAD_GROUP_LOCAL",
|
||||
consumerGroup = RocketMQConfig.VLOG_UPLOAD_GROUP,
|
||||
selectorExpression = RocketMQConfig.VLOG_UPLOAD_TAG
|
||||
)
|
||||
public class VlogUploadMessageConsumer implements RocketMQListener<MessageExt> {
|
||||
|
@ -25,10 +25,12 @@ public class MyLikedVlog extends BaseAudit {
|
||||
/**
|
||||
* 喜欢的短视频id
|
||||
*/
|
||||
@TableField("vlog_id")
|
||||
private String vlogId;
|
||||
|
||||
|
||||
private Long vloggerId;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -10,7 +10,7 @@ public interface IMyLikeVlogService extends IService<MyLikedVlog> {
|
||||
* @param vlogId 短视频id
|
||||
* @return 是否喜欢成功
|
||||
*/
|
||||
boolean like(String vlogId,Long memberId);
|
||||
boolean like(String vlogId,Long vloggerId,Long memberId);
|
||||
|
||||
/**
|
||||
* 取消喜欢短视频
|
||||
|
@ -20,10 +20,11 @@ public class MyLikeVlogServiceImpl extends ServiceImpl<MyLikedVlogMapper, MyLike
|
||||
|
||||
@Override
|
||||
@Cacheable(cacheNames = GlobalConstants.GLOBAL_VLOG_LIKED, key = "#vlogId + '_' + #memberId")
|
||||
public boolean like(String vlogId, Long memberId) {
|
||||
public boolean like(String vlogId, Long vloggerId,Long memberId) {
|
||||
MyLikedVlog myLikedVlog = new MyLikedVlog();
|
||||
myLikedVlog.setMemberId(memberId);
|
||||
myLikedVlog.setVlogId(vlogId.toString());
|
||||
myLikedVlog.setVloggerId(vloggerId);
|
||||
return this.save(myLikedVlog);
|
||||
}
|
||||
|
||||
@ -36,10 +37,10 @@ public class MyLikeVlogServiceImpl extends ServiceImpl<MyLikedVlogMapper, MyLike
|
||||
}
|
||||
|
||||
@Cacheable(cacheNames = GlobalConstants.GLOBAL_VLOG_MY_LIKED_LIST, key = "#memberId")
|
||||
public List<Long> myLikeVlog(Long memberId) {
|
||||
public List<String> myLikeVlog(Long memberId) {
|
||||
return this.baseMapper.selectList(new LambdaQueryWrapper<MyLikedVlog>()
|
||||
.eq(MyLikedVlog::getMemberId, memberId.toString()))
|
||||
.stream().map(MyLikedVlog::getVlogId).map(Long::valueOf).collect(Collectors.toList());
|
||||
.eq(MyLikedVlog::getMemberId, memberId))
|
||||
.stream().map(MyLikedVlog::getVlogId).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Cacheable(cacheNames = GlobalConstants.GLOBAL_VLOG_LIKED_COUNT, key = "#vlogId")
|
||||
@ -51,7 +52,7 @@ public class MyLikeVlogServiceImpl extends ServiceImpl<MyLikedVlogMapper, MyLike
|
||||
@Cacheable(cacheNames = GlobalConstants.GLOBAL_VLOG_ALL_LIKED_COUNT, key = "#memberId")
|
||||
public Integer getMyVlogLikeCount(Long memberId) {
|
||||
return this.baseMapper.selectCount(new LambdaQueryWrapper<MyLikedVlog>()
|
||||
.eq(MyLikedVlog::getMemberId, memberId.toString())).intValue();
|
||||
.eq(MyLikedVlog::getVloggerId, memberId.toString())).intValue();
|
||||
}
|
||||
|
||||
|
||||
|
@ -69,7 +69,9 @@ public class VlogPullServiceImpl implements IVlogPullService {
|
||||
List<IndexVlogVO> vlogVOList = vlogService.getIndexVlogList(vlogBO);
|
||||
|
||||
//标记已读
|
||||
saveMyReadVlog(vlogVOList, loginUser.getUserId());
|
||||
if(loginUser!=null){
|
||||
saveMyReadVlog(vlogVOList, loginUser.getUserId());
|
||||
}
|
||||
return page.setRecords(vlogVOList);
|
||||
} else {
|
||||
if (loginUser != null) {
|
||||
@ -82,7 +84,9 @@ public class VlogPullServiceImpl implements IVlogPullService {
|
||||
//先临时取10条数据
|
||||
Page<IndexVlogVO> indexVlogVOPage = vlogService.getIndexVlogList(null, page);
|
||||
//标记已读
|
||||
saveMyReadVlog(indexVlogVOPage.getRecords(), loginUser.getUserId());
|
||||
if(loginUser!=null){
|
||||
saveMyReadVlog(indexVlogVOPage.getRecords(), loginUser.getUserId());
|
||||
}
|
||||
//直接获取数据库数据,并要求push类推送数据
|
||||
return indexVlogVOPage;
|
||||
}
|
||||
|
@ -47,7 +47,6 @@ import org.dromara.common.mq.utils.MqUtil;
|
||||
import org.dromara.common.redis.redis.RedisCache;
|
||||
import org.dromara.common.redis.utils.RedisUtils;
|
||||
import org.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@ -126,7 +125,7 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
|
||||
vlog.setStatus(VlogStatusEnum.AUDITING.type);
|
||||
vlog.setIsPrivate(YesOrNo.NO.type);
|
||||
|
||||
vlog.setMemberId(loginUser.getUserId()+"");
|
||||
vlog.setMemberId(loginUser.getUserId() + "");
|
||||
vlog.setUrl("#");
|
||||
vlogMapper.insert(vlog);
|
||||
|
||||
@ -140,7 +139,7 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
|
||||
.tag("upload")
|
||||
.sendTime(LocalDateTime.now())
|
||||
.build();
|
||||
MqUtil.sendMessage(RocketMQConfig.VLOG_UPLOAD_TOPIC+":"+"upload", message);
|
||||
MqUtil.sendMessage(RocketMQConfig.VLOG_UPLOAD_TOPIC + ":" + "upload", message);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -154,8 +153,8 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
|
||||
try {
|
||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
||||
if (loginUser != null) {
|
||||
vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(loginUser.getUserId() + "", vlog.getMemberId()));
|
||||
vo.setDoILikeThisVlog(myLikeVlogService.doILikeVlog(vlogId,loginUser.getUserId() ));
|
||||
vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(loginUser.getUserId(), Long.valueOf(vlog.getMemberId())));
|
||||
vo.setDoILikeThisVlog(myLikeVlogService.doILikeVlog(vlogId, loginUser.getUserId()));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage());
|
||||
@ -215,8 +214,8 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
|
||||
uid = user != null ? String.valueOf(user.getUserId()) : null;
|
||||
}
|
||||
if (StringUtils.isNotBlank(uid)) {
|
||||
vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(uid, vlog.getMemberId()));
|
||||
vo.setDoILikeThisVlog(myLikeVlogService.doILikeVlog( vlog.getId(),Long.valueOf(uid)));
|
||||
vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(Long.valueOf(uid), Long.valueOf(vlog.getMemberId())));
|
||||
vo.setDoILikeThisVlog(myLikeVlogService.doILikeVlog(vlog.getId(), Long.valueOf(uid)));
|
||||
}
|
||||
vo.setLikeCounts(myLikeVlogService.getVLogLikeCount(vlog.getId()));
|
||||
vo.setCommentsCounts(commentService.getCommentCount(vlog.getId()));
|
||||
@ -248,25 +247,25 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
|
||||
throw new ServiceException("视频不存在");
|
||||
}
|
||||
//先检查是否已经点过赞了
|
||||
if (myLikeVlogService.doILikeVlog(vlogId,Long.valueOf(userId))) {
|
||||
if (myLikeVlogService.doILikeVlog(vlogId, Long.valueOf(userId))) {
|
||||
throw new ServiceException("您已经点过赞了");
|
||||
}
|
||||
// 我点赞的视频,关联关系保存到数据库
|
||||
myLikeVlogService.like( vlogId,Long.valueOf(userId));
|
||||
clearMemberVlogCache(vlogId,userId);
|
||||
myLikeVlogService.like(vlogId, Long.valueOf(vlog.getMemberId()), Long.valueOf(userId));
|
||||
clearMemberVlogCache(vlogId, userId);
|
||||
//发送消息
|
||||
MqUtil.sendIMMessage(buildMessage(vlog));
|
||||
}
|
||||
|
||||
private MQMessage buildMessage(Vlog vlog){
|
||||
private MQMessage buildMessage(Vlog vlog) {
|
||||
|
||||
Map<String,Object> params=new HashMap<>();
|
||||
LoginUser loginUser=LoginHelper.getLoginUser();
|
||||
Map<String, Object> params = new HashMap<>();
|
||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
||||
params.put("userID", loginUser.getUserId());
|
||||
params.put("nickName", loginUser.getNickname() == null ? "" : loginUser.getNickname());
|
||||
params.put("faceUrl", loginUser.getAvatar() );
|
||||
params.put("vlogId",vlog.getId());
|
||||
params.put("firstFrameImg",vlog.getFirstFrameImg());
|
||||
params.put("faceUrl", loginUser.getAvatar());
|
||||
params.put("vlogId", vlog.getId());
|
||||
params.put("firstFrameImg", vlog.getFirstFrameImg());
|
||||
MQMessage mqMessage = new MQMessage();
|
||||
mqMessage.setMessageType(MQMessageType.IM.name());
|
||||
mqMessage.setTag(MessageActionEnum.INTERACTION_LIKE.name());
|
||||
@ -300,15 +299,16 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
|
||||
}
|
||||
|
||||
// 我取消点赞的视频,关联关系删除
|
||||
myLikeVlogService.unLike(vlogId,Long.valueOf(userId));
|
||||
clearMemberVlogCache(vlogId,userId);
|
||||
myLikeVlogService.unLike(vlogId, Long.valueOf(userId));
|
||||
clearMemberVlogCache(vlogId, userId);
|
||||
}
|
||||
|
||||
private void clearMemberVlogCache(String vlogId,String userId) {
|
||||
private void clearMemberVlogCache(String vlogId, String userId) {
|
||||
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, userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<IndexVlogVO> getMyLikedVlogList(Page page) {
|
||||
|
||||
@ -379,7 +379,7 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
|
||||
// 这里不再统计,避免重复计算
|
||||
|
||||
// 获取粉丝数量:优先 Redis,无则 MySQL
|
||||
Long fansCounts = fansService.countFansByVloggerId(Long.valueOf(vlog.getMemberId()));
|
||||
int fansCounts = fansService.myFansCount(Long.valueOf(vlog.getMemberId()));
|
||||
result.put("fansCounts", fansCounts);
|
||||
} else {
|
||||
result.put("vlogId", null);
|
||||
@ -410,7 +410,7 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
|
||||
result.put("comments", comments);
|
||||
|
||||
// 从Redis获取点赞数
|
||||
Integer likeCounts = myLikeVlogService.getVLogLikeCount(vlog.getId());
|
||||
Integer likeCounts = myLikeVlogService.getVLogLikeCount(vlog.getId());
|
||||
|
||||
result.put("likeCounts", likeCounts);
|
||||
result.put("vlogId", vlog.getId());
|
||||
@ -576,8 +576,8 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
|
||||
LoginUser user = LoginHelper.getLoginUser();
|
||||
vlogList.parallelStream().forEach(vlog -> {
|
||||
if (user != null) {
|
||||
vlog.setDoIFollowVloger(fansService.queryDoIFollowVloger(user.getUserId() + "", vlog.getMemberId()));
|
||||
vlog.setDoILikeThisVlog(myLikeVlogService.doILikeVlog( vlog.getId(),user.getUserId()));
|
||||
vlog.setDoIFollowVloger(fansService.queryDoIFollowVloger(user.getUserId(), Long.valueOf(vlog.getMemberId())));
|
||||
vlog.setDoILikeThisVlog(myLikeVlogService.doILikeVlog(vlog.getId(), user.getUserId()));
|
||||
}
|
||||
vlog.setLikeCounts(myLikeVlogService.getVLogLikeCount(vlog.getId()));
|
||||
vlog.setCommentsCounts(commentService.getCommentCount(vlog.getId()));
|
||||
@ -651,8 +651,8 @@ public class VlogServiceImpl extends ServiceImpl<VlogMapper, Vlog> implements Vl
|
||||
List<IndexVlogVO> 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(myLikeVlogService.doILikeVlog(v.getId(),Long.valueOf(userId)));
|
||||
vo.setDoIFollowVloger(fansService.queryDoIFollowVloger(Long.valueOf(userId), Long.valueOf(v.getMemberId())));
|
||||
vo.setDoILikeThisVlog(myLikeVlogService.doILikeVlog(v.getId(), Long.valueOf(userId)));
|
||||
}
|
||||
vo.setLikeCounts(myLikeVlogService.getVLogLikeCount(v.getId()));
|
||||
vo.setCommentsCounts(commentService.getCommentCount(v.getId()));
|
||||
|
@ -21,8 +21,7 @@ import org.springframework.stereotype.Component;
|
||||
@RequiredArgsConstructor
|
||||
@RocketMQMessageListener(
|
||||
topic = RocketMQConfig.TOPIC_IM_MSG,
|
||||
// consumerGroup = RocketMQConfig.CONSUMER_GROUP_SYS_MSG,
|
||||
consumerGroup = "cosumer1",
|
||||
consumerGroup = RocketMQConfig.CONSUMER_GROUP_SYS_MSG,
|
||||
selectorExpression = "*"
|
||||
// ackMode = AckMode.MANUAL
|
||||
)
|
||||
|
@ -10,9 +10,11 @@ import com.wzj.soopin.member.service.IFansService;
|
||||
import com.wzj.soopin.member.service.IMemberService;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
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.redis.redis.RedisCache;
|
||||
import org.dromara.common.redis.utils.RedisUtils;
|
||||
import org.dromara.common.satoken.utils.LoginHelper;
|
||||
import org.dromara.common.web.core.BusinessImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
@ -83,12 +85,20 @@ public class MemberBusinessImpl extends BusinessImpl<IMemberService, MemberConve
|
||||
@Override
|
||||
public MemberVO info(Serializable id) {
|
||||
MemberVO vo= super.info(id);
|
||||
Double score = cache.zSetScore(REDIS_VLOGER_BE_LIKED_COUNTS, String.valueOf(id));
|
||||
vo.setVlogLikeCount(score != null ? score.intValue() : 0);
|
||||
Double myFansCount= cache.zSetScore(REDIS_MY_FANS_COUNTS, String.valueOf(id));
|
||||
vo.setFansCount(myFansCount != null ? myFansCount.intValue() : 0);
|
||||
Double myFollowCount= cache.zSetScore(REDIS_MY_FOLLOWS_COUNTS, String.valueOf(id));
|
||||
vo.setFollowCount(myFollowCount != null ? myFollowCount.intValue() : 0);
|
||||
Integer score = service.getMyVlogLikeCount(Long.valueOf(id.toString()));
|
||||
vo.setVlogLikeCount(score);
|
||||
Integer myFansCount= fansService.myFansCount(Long.valueOf(id.toString()));
|
||||
vo.setFansCount(myFansCount != null ? myFansCount : 0);
|
||||
Integer myFollowCount= fansService.myFollowCount(Long.valueOf(id.toString()));
|
||||
vo.setFollowCount(myFollowCount != null ? myFollowCount : 0);
|
||||
Integer myFriendsCount= fansService.myFriendsCount(Long.valueOf(id.toString()));
|
||||
vo.setFriendsCount(myFriendsCount != null ? myFriendsCount : 0);
|
||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
||||
if (loginUser != null) {
|
||||
boolean doIFollowVlogger = fansService.queryDoIFollowVloger(loginUser.getUserId() ,Long.valueOf(id.toString()));
|
||||
vo.setDoIFollowVloger(doIFollowVlogger);
|
||||
}
|
||||
|
||||
return vo;
|
||||
}
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ public class FansController {
|
||||
}
|
||||
|
||||
// 拉黑前只删除"我关注对方"的关系
|
||||
service.removeFansRelationship(myId, vloggerId);
|
||||
// service.removeFansRelationship(myId, vloggerId);
|
||||
|
||||
//检查是否已在黑名单中
|
||||
boolean hasblock = memberBlockService.hasBlocked(myId, vloggerId);
|
||||
|
@ -13,6 +13,7 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@ -67,4 +68,14 @@ public interface MemberMapper extends BaseMapper<Member> {
|
||||
" WHERE um.id = #{spreadUid} ")
|
||||
String getReferenceTenantIdBySpreadUid(@Param("spreadUid") Long spreadUid);
|
||||
|
||||
@Select("SELECT " +
|
||||
" count(1)" +
|
||||
"FROM " +
|
||||
" cont_my_liked_vlog um " +
|
||||
" " +
|
||||
" WHERE um.vlogger_id = #{memberId} ")
|
||||
Integer selectMyVlogLikeCount(@Param("memberId") Long memberId);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -11,30 +11,36 @@ public interface IFansService extends IService<Fans> {
|
||||
/**
|
||||
* 关注
|
||||
*/
|
||||
public boolean doFollow(Long myId, Long vloggerId);
|
||||
boolean doFollow(Long myId, Long vloggerId);
|
||||
|
||||
/**
|
||||
* 取关
|
||||
*/
|
||||
public boolean doCancel(Long myId, Long vloggerId);
|
||||
boolean doCancel(Long myId, Long vloggerId);
|
||||
|
||||
/**
|
||||
* 查询用户是否关注博主
|
||||
*/
|
||||
public boolean queryDoIFollowVloger(Long myId, Long vloggerId);
|
||||
|
||||
public boolean queryDoIFollowVloger(String myId, String vloggerId);
|
||||
boolean queryDoIFollowVloger(Long myId, Long vloggerId);
|
||||
|
||||
/**
|
||||
* 查询我的粉丝列表
|
||||
*/
|
||||
public IPage<FansVO> queryMyFans(Long myId,
|
||||
Integer page,
|
||||
Integer pageSize);
|
||||
IPage<FansVO> queryMyFans(Long myId,
|
||||
Integer page,
|
||||
Integer pageSize);
|
||||
|
||||
|
||||
Long countFansByVloggerId(Long vloggerId);
|
||||
Integer myFansCount(Long vloggerId);
|
||||
|
||||
/**
|
||||
* 查询我的关注列表
|
||||
*/
|
||||
Integer myFollowCount(Long fanId);
|
||||
|
||||
/**
|
||||
* 查询我的关注列表
|
||||
*/
|
||||
Integer myFriendsCount(Long fanId);
|
||||
|
||||
// 拉黑前只删除“我关注对方”的关系
|
||||
void removeFansRelationship(Long myId, Long vloggerId);
|
||||
}
|
||||
|
@ -106,4 +106,7 @@ public interface IMemberService extends IService<Member> {
|
||||
* @param smsCode 短信验证码
|
||||
*/
|
||||
void revoked(String smsCode);
|
||||
|
||||
|
||||
Integer getMyVlogLikeCount(Long memberId);
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
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.wzj.soopin.member.domain.po.Fans;
|
||||
@ -48,7 +49,7 @@ public class FansServiceImpl extends ServiceImpl<FansMapper, Fans> implements IF
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Override
|
||||
@CacheEvict(value = GlobalConstants.GLOBAL_MEMBER_FANS_COUNT, key = "#vloggerId")
|
||||
@Cacheable(value = GlobalConstants.GLOBAL_MEMBER_DOIFOLLOW, key = "#vloggerId" + "-" + "#myId")
|
||||
public boolean doFollow(Long myId, Long vloggerId) {
|
||||
// 幂等性校验:已存在则不再插入
|
||||
|
||||
@ -74,6 +75,7 @@ public class FansServiceImpl extends ServiceImpl<FansMapper, Fans> implements IF
|
||||
}
|
||||
baseMapper.insert(fans);
|
||||
|
||||
clearMemberFansCache(vloggerId, myId);
|
||||
MqUtil.sendIMMessage(buildMessage(fans));
|
||||
return true;
|
||||
}
|
||||
@ -87,7 +89,7 @@ public class FansServiceImpl extends ServiceImpl<FansMapper, Fans> implements IF
|
||||
Map<String, Object> params = new HashMap<>();
|
||||
params.put("userId", follower.getId());
|
||||
params.put("nickname", follower.getNickname() == null ? "" : follower.getNickname());
|
||||
params.put("faceUrl", vlogger.getAvatar() );
|
||||
params.put("faceUrl", vlogger.getAvatar());
|
||||
MQMessage message = MQMessage.builder()
|
||||
.messageType(MQMessageType.IM.name())
|
||||
.data(params)
|
||||
@ -112,7 +114,7 @@ public class FansServiceImpl extends ServiceImpl<FansMapper, Fans> implements IF
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@Override
|
||||
@CacheEvict(value = GlobalConstants.GLOBAL_MEMBER_FANS_COUNT, key = "#vloggerId")
|
||||
@CacheEvict(value = GlobalConstants.GLOBAL_MEMBER_DOIFOLLOW, key = "#vloggerId" + "-" + "#myId")
|
||||
public boolean doCancel(Long myId, Long vloggerId) {
|
||||
// 判断我们是否朋友关系,如果是,则需要取消双方的关系
|
||||
Fans fan = queryFansRelationship(myId, vloggerId);
|
||||
@ -135,75 +137,66 @@ public class FansServiceImpl extends ServiceImpl<FansMapper, Fans> implements IF
|
||||
log.warn("取消关注时未找到自己的粉丝关系,myId={}, vloggerId={}", myId, vloggerId);
|
||||
return true;
|
||||
}
|
||||
// 博主的粉丝-1,我的关注-1
|
||||
RedisUtils.decrAtomicValue(CacheConstants.MEMBER_FANS + ":" + vloggerId);
|
||||
RedisUtils.decrAtomicValue(CacheConstants.MEMBER_FOLLOW + ":" + myId);
|
||||
clearMemberFansCache(vloggerId, myId);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean queryDoIFollowVloger(Long myId, Long vloggerId) {
|
||||
Fans vlogger = queryFansRelationship(myId, vloggerId);
|
||||
return vlogger != null;
|
||||
|
||||
Boolean result = RedisUtils.getCacheMapValue(GlobalConstants.GLOBAL_MEMBER_DOIFOLLOW, vloggerId + "-" + myId);
|
||||
if (result == null) {
|
||||
result = baseMapper.selectCount(new LambdaQueryWrapper<Fans>().eq(Fans::getFanId, myId).eq(Fans::getVloggerId, vloggerId)) > 0;
|
||||
RedisUtils.setCacheMapValue(GlobalConstants.GLOBAL_MEMBER_DOIFOLLOW, vloggerId + "-" + myId, result);
|
||||
}
|
||||
|
||||
return result != null ? result : false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean queryDoIFollowVloger(String myId, String vloggerId) {
|
||||
try {
|
||||
// Try to convert string IDs to Long if they are numeric
|
||||
if (myId != null && vloggerId != null &&
|
||||
myId.matches("\\d+") && vloggerId.matches("\\d+")) {
|
||||
Fans vlogger = queryFansRelationship(Long.valueOf(myId), Long.valueOf(vloggerId));
|
||||
return vlogger != null;
|
||||
} else {
|
||||
// If IDs contain non-numeric characters, return false for now
|
||||
// This prevents the NumberFormatException
|
||||
log.warn("Cannot convert string IDs to Long: myId={}, vloggerId={}", myId, vloggerId);
|
||||
return false;
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
log.warn("Failed to convert string IDs to Long: myId={}, vloggerId={}", myId, vloggerId, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<FansVO> queryMyFans(Long myId, Integer pageNo, Integer pageSize) {
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
map.put("myId", myId);
|
||||
// 查询粉丝列表
|
||||
Page<FansVO> page = new Page<>();
|
||||
Page<Fans> page = new Page<>();
|
||||
page.setCurrent(pageNo);
|
||||
page.setSize(pageSize);
|
||||
for (FansVO f : page.getRecords()) {
|
||||
String relationship = redisCache.getCacheObject(
|
||||
CacheConstants.MEMBER_FANS + ":" + myId + ":" + f.getFan().getId());
|
||||
if (StringUtils.isNotBlank(relationship) && relationship.equalsIgnoreCase("1")) {
|
||||
LambdaQueryWrapper<Fans> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(Fans::getVloggerId, myId);
|
||||
IPage<Fans> fansPage = baseMapper.selectPage(page, queryWrapper);
|
||||
for (Fans f : page.getRecords()) {
|
||||
//看看他是否也关注了我
|
||||
Boolean doesHeFollowMe = queryDoIFollowVloger(f.getFanId(), myId);
|
||||
if (doesHeFollowMe) {
|
||||
f.setFriendFlag(YesOrNo.YES.type);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
private void clearMemberFansCache(Long vloggerId, Long userId) {
|
||||
RedisUtils.delCacheMapValue(GlobalConstants.GLOBAL_MEMBER_FANS_COUNT, vloggerId + "");
|
||||
RedisUtils.delCacheMapValue(GlobalConstants.GLOBAL_MEMBER_FOLLOW_COUNT, userId + "");
|
||||
RedisUtils.delCacheMapValue(GlobalConstants.GLOBAL_MEMBER_FRIENDS_COUNT, userId + "");
|
||||
}
|
||||
|
||||
@Override
|
||||
@Cacheable(value = GlobalConstants.GLOBAL_MEMBER_FANS_COUNT, key = "#vloggerId")
|
||||
public Long countFansByVloggerId(Long vloggerId) {
|
||||
return baseMapper.selectCount(new LambdaQueryWrapper<Fans>().eq(Fans::getVloggerId, vloggerId));
|
||||
public Integer myFansCount(Long vloggerId) {
|
||||
return baseMapper.selectCount(new LambdaQueryWrapper<Fans>().eq(Fans::getVloggerId, vloggerId)).intValue();
|
||||
}
|
||||
|
||||
// 拉黑前只删除“我关注对方”的关系
|
||||
@Override
|
||||
@CacheEvict(value = GlobalConstants.GLOBAL_MEMBER_FANS_COUNT, key = "#vloggerId")
|
||||
public void removeFansRelationship(Long myId, Long vloggerId) {
|
||||
Fans fan = queryFansRelationship(myId, vloggerId);
|
||||
if (fan != null) {
|
||||
baseMapper.deleteById(fan.getId());
|
||||
}
|
||||
@Cacheable(value = GlobalConstants.GLOBAL_MEMBER_FOLLOW_COUNT, key = "#fanId")
|
||||
public Integer myFollowCount(Long fanId) {
|
||||
return baseMapper.selectCount(new LambdaQueryWrapper<Fans>().eq(Fans::getFanId, fanId)).intValue();
|
||||
}
|
||||
|
||||
|
||||
//从缓存中获取我的关注列表
|
||||
|
||||
@Override
|
||||
@Cacheable(value = GlobalConstants.GLOBAL_MEMBER_FRIENDS_COUNT, key = "#fanId")
|
||||
public Integer myFriendsCount(Long fanId) {
|
||||
return baseMapper.selectCount(new LambdaQueryWrapper<Fans>().eq(Fans::getFanId, fanId).eq(Fans::getFriendFlag, YesOrNo.YES.type)).intValue();
|
||||
}
|
||||
}
|
||||
|
@ -413,4 +413,9 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper,Member> implemen
|
||||
public boolean updateById(Member entity) {
|
||||
return super.updateById(entity);
|
||||
}
|
||||
|
||||
@Cacheable(cacheNames = GlobalConstants.GLOBAL_VLOG_ALL_LIKED_COUNT, key = "#memberId")
|
||||
public Integer getMyVlogLikeCount(Long memberId) {
|
||||
return baseMapper.selectMyVlogLikeCount(memberId);
|
||||
}
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ public class AccountBillServiceImpl extends
|
||||
}
|
||||
|
||||
BigDecimal balance = memberAccount.getWallet();
|
||||
BigDecimal newBalance = balance.add(money);
|
||||
BigDecimal newBalance = (balance==null?BigDecimal.ZERO:balance).add(money);
|
||||
//锁定用户余额
|
||||
memberAccountService.updateById(memberAccount.toBuilder().wallet(newBalance).build());
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user