1.关注/取消关注功能实现
1.需求分析
对于用户关注和取消关注的相逻辑和点赞和取消点赞的逻辑都是一致,就不做详细说明了
2.代码实现
dao层
public interface UsersFansDao extends JpaRepository<UsersFans,String>,JpaSpecificationExecutor<UsersFans> {
}
service层
/**
* 用户关注他人
* @param id
* @param fansId
*/
@Override
@Transactional
public void follow(String id, String fansId) {
//保存用户和粉丝关系表
UsersFans usersFans =new UsersFans();
usersFans.setId(IdUtils.getId());
usersFans.setUserId(id);
usersFans.setFanId(fansId);
usersFansDao.save(usersFans);
//添加该用户的粉丝数
Users one = usersDao.findOne(id);
one.setFansCounts(one.getFansCounts()+1);
usersDao.save(one);
//添加登陆者的关注数
Users daoOne = usersDao.findOne(fansId);
daoOne.setFollowCounts(daoOne.getFansCounts()+1);
usersDao.save(daoOne);
}
/**
* 取消关注
* @param id
* @param fansId
*/
@Override
public void unfollow(String id, String fansId) {
List<UsersFans> usersFansList = findByUserIdAndFansId(id, fansId);
UsersFans usersFans = usersFansList.get(0);
usersFansDao.delete(usersFans.getId());
Users one = usersDao.findOne(id);
one.setFansCounts(one.getFansCounts()-1);
usersDao.save(one);
Users daoOne = usersDao.findOne(fansId);
daoOne.setFollowCounts(daoOne.getFansCounts()-1);
usersDao.save(daoOne);
}
/**
* 查询用户是否被关注
* @param id
* @param fansId
* @return
*/
@Override
public Boolean findIsFollowed(String id, String fansId) {
List<UsersFans> usersFansList = findByUserIdAndFansId(id, fansId);
if (usersFansList.size()==0){
return false;
}else {
return true;
}
}
/**
* 根基用户id个粉丝id精确查询用户和粉丝关系
* @param id
* @param fansId
* @return
*/
@Transactional
List<UsersFans> findByUserIdAndFansId(final String id, final String fansId){
return usersFansDao.findAll(new Specification<UsersFans>() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) {
Predicate p1 = cb.equal(root.get("userId").as(String.class), id);
Predicate p2 = cb.equal(root.get("fanId").as(String.class), fansId);
Predicate[] predicate = new Predicate[]{p1, p2};
return cb.and(predicate);
}
});
}
controller 查看用户是否被登录者关注的逻辑应该放到个人信息查找的逻辑中执行,所以在原来的个人信息查询接口中进行扩展,前端多传入一个参数也就是我们登录者的id命名为fansId,查询个人信息接口中定义一个你默认为false的值,如果fansId不不为空就调用findIsFollowed查看登陆者与该用户是否存在关注的关系,如果有就将定义的值赋值为true,我们需要在返回的userVO中在新添加一个布尔值得followed字段。
@ApiOperation(value = "用户信息查询", notes = "用户信息查询的接口")
@PostMapping("/findUserInfo")
public LexJSONResult findUserInfo(String id,String fansId){
Boolean followed=false;
if (!StringUtils.isEmpty(fansId)){
followed = userService.findIsFollowed(id, fansId);
}
Users users= userService.findUserInfo(id);
UsersVo usersVo=new UsersVo();
BeanUtils.copyProperties(users,usersVo);
usersVo.setFollowed(followed);
return LexJSONResult.ok(usersVo);
}
2.查询视频发布者信息接口
1.需求分析
用户在视频列表首页点击某个视频的时候会调用到该接口,我们需要前端传3个参数,分别为当前登陆者的id,该视频的id,视频发布者的id,根据传入的登陆者id和视频的id去调用之前编写好的查询是否点赞的方法,返回一个布尔值,通过视频发布者的id去查询users表中查询该用户得相关信息,创建一个新的vo类将user实体类和一个布尔值代表该视频是否被点赞封装起来,返回给前端。
2.代码实现
封装的vo包装类
@Data
public class PublishVo {
private Users users;
private Boolean isLike;
}
controller代码
@ApiOperation(value = "查询视频发布者信息", notes = "查询视频发布者信息")
@PostMapping("/findPublish")
public LexJSONResult findPublish(String id,String videoId,String publishId){
//查询视频发布者的信息
Users userInfo = userService.findUserInfo(publishId);
userInfo.setPassword("");
//查询该用户是否给该视频点赞
Boolean b = userService.findUserIsLike(id, videoId);
PublishVo publishVo =new PublishVo();
publishVo.setUsers(userInfo);
publishVo.setIsLike(b);
return LexJSONResult.ok(publishVo);
}