项目持续更新中:
在我们的主页中,刷视频时是可以在头像下方进行一个关注

点击头像,进入对方的主页也是可以进行关注的。

我们在这里会涉及到一张新的表,叫做粉丝表:

这里有三个字段,博主id,粉丝id,是否为朋友。
如果点击关注,那么我的表里面就会新增一条数据。
我们先来编写service:

接着实现:
- @Service
- public class FansServiceImpl extends BaseInfoProperties implements FansService {
-
- @Resource
- private FansMapper fansMapper;
-
- @Autowired
- private Sid sid;
-
- @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);
- fans.setIsFanFriendOfMine(1);
-
- //判断对方是否关注我,如果关注我,那么双方都要互为朋友关注
- Fans vloger = queryFansRelationship(vlogerId,myId);
- if (vloger != null){
- fans.setIsFanFriendOfMine(YesOrNo.YES.type);
- vloger.setIsFanFriendOfMine(YesOrNo.YES.type);
- fansMapper.updateByPrimaryKey(fans);
- }else {
- fans.setIsFanFriendOfMine(YesOrNo.NO.type);
- }
- fansMapper.insert(fans);
- }
这里主要交换参数位置,来查询是否互为粉丝
- public Fans queryFansRelationship(String fanId,String vlogerId){
- Example example = new Example(Fans.class);
- Example.Criteria criteria = example.createCriteria();
- criteria.andEqualTo("vlogerId",fanId);
- criteria.andEqualTo("fanId",vlogerId);
-
- List list = fansMapper.selectByExample(example);
- Fans fan = null;
- if( list !=null && list.size() > 0 && !list.isEmpty()) {
- fan = (Fans) list.get(0);
- }
- return fan;
- }
接下来实现controller:
我们先打开前端查看:

这里是需要传入两个参数,一个是我的id,还有一个是博主的id。
我们在代码中:
- @Slf4j
- @Api(tags = "FansController 粉丝相关业务功能的接口" )
- @RequestMapping("fans")
- @RestController
- public class FansController extends BaseInfoProperties{
-
- @Autowired
- private FansService fansService;
-
- @Autowired
- private UserService userService;
-
- @PostMapping("follow")
- public GraceJSONResult follow(@RequestParam String myId,
- @RequestParam String vlogerId){
-
- if(StringUtils.isNotBlank(myId)&&StringUtils.isNotBlank(vlogerId)){
- return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR);
- }
- //判断当前用户,自己不能关注自己
- if(myId.equalsIgnoreCase(vlogerId)){
- return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR);
- }
- //判断两个id对应的用户是否存在
- Users vloger = userService.getUser(vlogerId);
- Users myInfo = userService.getUser(myId);
- if(myInfo == null || vloger == null){
- return GraceJSONResult.errorCustom(ResponseStatusEnum.SYSTEM_ERROR);
- }
- //保存粉丝关系到数据库
- fansService.doFollow(myId,vlogerId);
- return GraceJSONResult.ok();
- }
-
-
- }
我们可以思考一下,两个用户id的数据库查询后的判断,是分开好?还是合并判断好?
随后重启当前的服务,
这个是我们的主页,这里已经是做了判断,我们这里是没有关注按钮的

我们滑到另一个用户的视频,

点击关注,我们可以返回数据库查看一下:
这个是我们的账户,

随后在粉丝表中搜索,这多了一条记录。这里是粉丝id,博主的id我们也可以拷贝查看一下


现在我们登录到这个咩咩羊的账户,也关注演示账号。
然后我们回到数据库

发现字段还是0,没有发送更改,我们回到controller:

发现了两个小问题,进行了一下修改。所以说我们平常要仔细一点。
我们重启,测试:

这里已经成功了。
我们在这个页面还没有实现相应的查询功能,

如果我们这里退出,重新关注,是会报错的。
假设我们查询粉丝关注总数,我们普遍来讲是用counts,在数据库中查询,但是在目前的互联网情
况下,高并发等,如果粉丝数达到千万,那么会有性能的影响。我们不能把所有的请求压力给我们
的数据库。我们在这里选择redis,它有一个技术功能:
我们设定一个key:

我们会发现它的步长是1,而且是单线程的。随着数值的增长,我们通过get 就能获得数值:

所以我们在controller中:
- //博主的粉丝+1 ,我的关注+1;
- redis.increment(REDIS_MY_FOLLOWS_COUNTS+":" + myId,1);
- redis.increment(REDIS_MY_FANS_COUNTS+":"+ vlogerId,1);
-
- //我和博主的关联关系,依赖redis,不要存储数据库,避免db的性能瓶颈
- redis.set(REDIS_FANS_AND_VLOGGER_RELATIONSHIP+":"+myId+":"+":"+vlogerId,"1");
大家思考一下,我们的redis是放在controller处理好,还是service好。
现在我们重启,然后在redis中查看一下结果:

我们在这已经声明好了,后期如果有查询就可以使用redis。
我们这里做的基本都是和关注相反的操作。
在service层:

在service层实现:
- @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.updateByPrimaryKey(pendingFan);
- }
- //删除自己的关注关联表记录
- fansMapper.delete(fan);
- }
查看我们的前端:

我们回到controller:
- @PostMapping("cancel")
- public GraceJSONResult cancel(@RequestParam String myId,
- @RequestParam String vlogerId){
-
- //删除业务的执行
- fansService.doCancel(myId,vlogerId);
-
- //博主的粉丝-1 ,我的关注-1;
- redis.decrement(REDIS_MY_FOLLOWS_COUNTS+":" + myId,1);
- redis.decrement(REDIS_MY_FANS_COUNTS+":"+ vlogerId,1);
-
- //我和博主的关联关系,依赖redis,不要存储数据库,避免db的性能瓶颈
- redis.del(REDIS_FANS_AND_VLOGGER_RELATIONSHIP+":"+myId+":"+":"+vlogerId);
-
- return GraceJSONResult.ok();
- }
这里建议redis的操作放到service层完成。
我们重启,测试:
打开页面,点击取消关注


这里记录少了一条。我们再点击关注:

这里就实现了我们的关注和取关。