vlog/book-service/src/main/java/com/imooc/service/impl/FansServiceImpl.java

175 lines
5.9 KiB
Java
Raw Normal View History

2025-03-10 15:40:51 +08:00
package com.imooc.service.impl;
import com.github.pagehelper.PageHelper;
import com.imooc.base.BaseInfoProperties;
import com.imooc.base.RabbitMQConfig;
import com.imooc.enums.MessageEnum;
import com.imooc.enums.YesOrNo;
import com.imooc.mapper.FansMapper;
import com.imooc.mapper.FansMapperCustom;
import com.imooc.mo.MessageMO;
import com.imooc.pojo.Fans;
import com.imooc.service.FansService;
import com.imooc.service.MsgService;
import com.imooc.utils.JsonUtils;
import com.imooc.utils.PagedGridResult;
import com.imooc.vo.FansVO;
import com.imooc.vo.VlogerVO;
import org.apache.commons.lang3.StringUtils;
import org.n3r.idworker.Sid;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
2025-03-11 12:08:01 +08:00
import java.util.Date;
2025-03-10 15:40:51 +08:00
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class FansServiceImpl extends BaseInfoProperties implements FansService {
@Autowired
private FansMapper fansMapper;
@Autowired
private FansMapperCustom fansMapperCustom;
//
@Autowired
private MsgService msgService;
@Autowired
public RabbitTemplate rabbitTemplate;
//
@Autowired
private Sid sid;
//
@Transactional
@Override
public void doFollow(String myId, String vlogerId) {
String fid = sid.nextShort();
Fans fans = new Fans();
fans.setId(fid);
fans.setFanId(myId);
fans.setVlogerId(vlogerId);
2025-03-11 12:08:01 +08:00
fans.setCreatedTime(new Date());
2025-03-10 15:40:51 +08:00
// 判断对方是否关注我,如果关注我,那么双方都要互为朋友关系
Fans vloger = queryFansRelationship(vlogerId, myId);
if (vloger != null) {
fans.setIsFanFriendOfMine(YesOrNo.YES.type);
vloger.setIsFanFriendOfMine(YesOrNo.YES.type);
fansMapper.updateByPrimaryKeySelective(vloger);
} else {
fans.setIsFanFriendOfMine(YesOrNo.NO.type);
}
fansMapper.insert(fans);
// 系统消息:关注
// msgService.createMsg(myId, vlogerId, MessageEnum.FOLLOW_YOU.type, null);
//优化使用mQEXCHANGE_MSG
MessageMO messageMO = new MessageMO();
messageMO.setFromUserId(myId);
messageMO.setToUserId(vlogerId);
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_MSG, "sys.msg."+ MessageEnum.FOLLOW_YOU.enValue, JsonUtils.objectToJson(messageMO));
}
public Fans queryFansRelationship(String fanId, String vlogerId) {
Example example = new Example(Fans.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("vlogerId", vlogerId);
criteria.andEqualTo("fanId", fanId);
List list = fansMapper.selectByExample(example);
Fans fan = null;
if (list != null && list.size() > 0 && !list.isEmpty()) {
fan = (Fans)list.get(0);
}
return fan;
}
@Transactional
@Override
public void doCancel(String myId, String vlogerId) {
// 判断我们是否朋友关系,如果是,则需要取消双方的关系
Fans fan = queryFansRelationship(myId, vlogerId);
if (fan != null && fan.getIsFanFriendOfMine() == YesOrNo.YES.type) {
// 抹除双方的朋友关系,自己的关系删除即可
Fans pendingFan = queryFansRelationship(vlogerId, myId);
pendingFan.setIsFanFriendOfMine(YesOrNo.NO.type);
fansMapper.updateByPrimaryKeySelective(pendingFan);
}
// 删除自己的关注关联表记录
fansMapper.delete(fan);
}
@Override
public boolean queryDoIFollowVloger(String myId, String vlogerId) {
Fans vloger = queryFansRelationship(myId, vlogerId);
return vloger != null;
}
@Override
public PagedGridResult queryMyFollows(String myId,
Integer page,
Integer pageSize) {
Map<String, Object> map = new HashMap<>();
map.put("myId", myId);
PageHelper.startPage(page, pageSize);
List<VlogerVO> list = fansMapperCustom.queryMyFollows(map);
return setterPagedGrid(list, page);
}
@Override
public PagedGridResult queryMyFans(String myId,
Integer page,
Integer pageSize) {
/**
* <判断粉丝是否是我的朋友互粉互关>
* 普通做法
* 多表关联+嵌套关联查询这样会违反多表关联的规范不可取高并发下回出现性能问题
*
* 常规做法
* 1. 避免过多的表关联查询先查询我的粉丝列表获得fansList
* 2. 判断粉丝关注我并且我也关注粉丝 -> 循环fansList获得每一个粉丝再去数据库查询我是否关注他
* 3. 如果我也关注他粉丝说明我俩互为朋友关系互关互粉则标记flag为true否则false
*
* 高端做法
* 1. 关注/取关的时候关联关系保存在redis中不要依赖数据库
* 2. 数据库查询后直接循环查询redis避免第二次循环查询数据库的尴尬局面
*/
Map<String, Object> map = new HashMap<>();
map.put("myId", myId);
PageHelper.startPage(page, pageSize);
List<FansVO> list = fansMapperCustom.queryMyFans(map);
for (FansVO f : list) {
String relationship = redis.get(REDIS_FANS_AND_VLOGGER_RELATIONSHIP + ":" + myId + ":" + f.getFanId());
if (StringUtils.isNotBlank(relationship) && relationship.equalsIgnoreCase("1")) {
f.setFriend(true);
}
}
return setterPagedGrid(list, page);
}
}