Mysql+SSM框架实现点赞功能的数据存储

数据库

一、表设计

我个人设置的是帖子类的点赞功能,拿帖子类的功能举例,我首先实现的是表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,防止出现负点赞数的情况,其他就是根据对应条件增删点赞数据,这就是我帖子点赞功能的实现。
希望对大家有所帮助

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值