数据库
一、表设计
我个人设置的是帖子类的点赞功能,拿帖子类的功能举例,我首先实现的是表post帖子类表的创建,其中有关于点赞的字段是likes_count即点赞数量,而点赞的具体数据,考虑到点赞数据的数量可能较多,所以单独设计一个likebehavior表,表设计如下
这里可以把id设为主键,其中uid和pid分别代表点赞行为对应的用户和帖子id,这就是点赞行为设计到的两个表
二、表关系
在post表中,likes_count字段的大小一个是根据每个帖子的id在likebehavior表中去查询对应的行为有几个,根据数量来实时更新该字段的数值
后端
一、实体设计
首先我个人使用的是Mybatis-plus,然后,就是针对表中字段来设计对应的pojo类,在这里我没有特地去为了保证耦合度而使用Db而是直接在一个Controller中使用多个Service,那么在这里先展示一下对应的实体类:
@Data
@TableName("likebehavior")
public class Like {
//点赞数据的id
private Integer id;
//点赞用户的id
private Integer uid;
//点赞帖子的id
private Integer pid;
}
这里的TableName注解中的值对应的是大家数据库中的点赞表名称
然后就是对应的Mapper:
@Mapper
public interface LikeMapper extends BaseMapper<Like> {
}
对应的Service:
public interface LikeService extends IService<Like> {
}
以及对应的ServiceImpl:
@Service
public class LikeServiceImpl extends ServiceImpl<LikeMapper, Like> implements LikeService {
}
这就是在逻辑处理前的基本配置,其中的注解都是Mybatis-plus功能实现的关键,千万不能漏
二、逻辑处理
在进行逻辑处理之前,先必须明白的是前端传来的参数形式,在我的设计中,前端传来的数据可以利用一个pojo类来进行对应封装,
@Data
public class LikeQuery {
//帖子id
public Integer pid;
//帖子状态,1表示已经实现,0表示还没有
public Integer status;
//点赞的用户
public Integer uid;
}
这里的Status是用于判断当前操作的用户对于该帖子是否已经完成了点赞动作,如果是完成了该动作,那么接下来再次点击就应该是取消点赞,若是没有完成,则应该是点赞行为。在完成了pojo设计后就可以利用@RequestBody来接收前端参数进行处理,这里展示我的点赞功能实现
@Autowired
private PostService postService;
@Autowired
private LikeService likeService;
首先自动注入两个Service
//点赞方法
@PostMapping("/post/conjugator")
public R<String> conjugatorPost(@RequestBody LikeQuery likeQuery){
LambdaQueryWrapper<Post> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Post::getId,likeQuery.getPid());
Post res = postService.getOne(queryWrapper);
LambdaQueryWrapper<Like> likequerywrapper = new LambdaQueryWrapper<>();
likequerywrapper.eq(Like::getUid,likeQuery.getUid());
likequerywrapper.eq(Like::getPid,likeQuery.getPid());
//判断用户是否已经点过赞,不能出现多条重复数据
Like like1 = likeService.getOne(likequerywrapper);
if(likeQuery.getStatus()==1 && res.getLikesCount()!=0){
res.setLikesCount(res.getLikesCount()-1);
//根据对应的uid和pid删除点赞表中数据
likeService.remove(likequerywrapper);
}
else if(likeQuery.getStatus()==0 &&like1==null){
res.setLikesCount(res.getLikesCount() + 1);
Like like = new Like();
//根据对应的uid和pid来完成添加点赞表中的数据
like.setId(likeService.count()+1);
like.setPid(likeQuery.getPid());
like.setUid(likeQuery.getUid());
likeService.save(like);
}
LambdaQueryWrapper<Like> likequerywrapper1 = new LambdaQueryWrapper<>();
likequerywrapper1.eq(Like::getPid,likeQuery.getPid());
res.setLikesCount(likeService.count(likequerywrapper1));
postService.update(res,queryWrapper);
return R.success("点赞成功");
}
然后根据对应的LambdaQueryWrapper查询条件来完成逻辑处理,其中要注意的逻辑是要完成点赞功能首先前端传来的保证是Status为0表示未完成点赞行为,数据库的查询传来的必须是该用户没有点赞数据,在这里表现为查询出来的like1为null,才能实现点赞功能,而取消点赞则需要Status必须为1,并且数据post的点赞数不得为0,防止出现负点赞数的情况,其他就是根据对应条件增删点赞数据,这就是我帖子点赞功能的实现。
希望对大家有所帮助