Java代码实现点赞功能

场景

个人搭建的一个美食教程网站,每个美食教程的详细页面有一个点赞按钮,每个用户可以通过点击按钮来点赞与取消点赞,并可以看见当前菜品有多少个赞。

实现思路

  1. 因为点赞与取消点赞是一个在页面上用户操作比较频繁的功能,而点赞数这个字段是存储在美食教程表里的,用户每点击一次按钮就要修改这个字段会产生很大的数据库开销,所以不考虑直接操作MySQL数据库,转而采用Redis进行存储。后面可采用Quartz框架进行定时的数据同步操作。

  1. 采用Redis存储就面临着该选择那一种数据结构来存储每一个教程的点赞数据。根据上面提到的场景可以做出分析:

  1. 一个教程可以有多个用户点赞;

  1. 一个用户只能给每一个教程点一次赞,再次点击就是取消点赞;

而Redis的集合刚好可以满足我们这一需求。因为集合成员是唯一的,集合中不能出现重复数据。

时序图

核心代码

前端点赞按钮:

 <div id="like" class="boxx-one" th:attr="dishId=${item.info.dishId}">
        <button th:if="${session.loginUser!=null}"></button>
</div>

<script type="text/javascript">
    var elementById1 = document.getElementById("like");
    elementById1.onclick = function () {
        var path = $("#like").attr("dishId")
        var p = document.getElementById("count")
        //发送ajax请求
        axios({
            //请求类型
            method: 'POST',
            //url
            url: 'http://item.meiwei.com/like',
            //设置请求体
            data: {
                dishId: path
            }
        }).then(function (res) {
            p.innerHTML = "已有" + res.data + "名用户点赞";
        })
    }
</script>

页面传给后端的Vo数据:

public class RequestVo {
    private String dishId;
    private String members;
}

后端核心代码:

    @ResponseBody
    @PostMapping("/like")
    public void like(@RequestBody RequestVo requestBody, HttpServletResponse response, HttpSession session) {

        String dishId = requestBody.getDishId();

        //获取用户信息
        MemberRespVo user = (MemberRespVo) session.getAttribute(AuthServerConstant.LOGIN_USER);
        String username = user.getUsername();
        String key = "like:" + dishId;

        //判断redis中是否存在,即判断是否已点赞
        Boolean ifAbsent = redisTemplate.opsForSet().isMember(key, username);
        if (!ifAbsent) {
            //如果不存在,则存入redis
            likeService.add(key, username);
        } else {
            //如果存在,则从redis删除
            likeService.delete(key, username);
        }
        //将点赞数回显
        Long size = likeService.getCount(key);
        try {
            response.getWriter().write(size.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
功能可以通过在Java后端实现,具体步骤如下: 1. 创建一个点表(比如`likes`表),其中需要包含以下字段: - 点ID(如`like_id`) - 点用户ID(如`user_id`) - 被点内容ID(如`content_id`) - 点时间(如`like_time`) 2. 在Java后端实现操作,可以编写一个`LikesService`服务类,在该类中定义以下方法: ```java // 点 public void like(int userId, int contentId) { // 判断用户是否已经点过 if (isLiked(userId, contentId)) { throw new RuntimeException("You have liked this content before."); } // 插入点记录 Likes like = new Likes(userId, contentId, new Date()); likesDao.insert(like); } // 取消点 public void unlike(int userId, int contentId) { likesDao.delete(userId, contentId); } // 判断用户是否已经点过 public boolean isLiked(int userId, int contentId) { Likes like = likesDao.select(userId, contentId); return like != null; } ``` 在上面的代码中,`likesDao`是一个`LikesDao`对象,用于操作点表。 3. 在前端页面中,通过调用后端API实现功能。比如,可以编写一个`like`函数,用于向后端发送点请求: ```javascript function like(userId, contentId) { $.ajax({ url: "/api/likes/like", method: "POST", data: {userId: userId, contentId: contentId}, success: function(data) { alert("You have liked this content."); }, error: function(jqXHR, textStatus, errorThrown) { alert(jqXHR.responseText); } }); } ``` 在上面的代码中,`/api/likes/like`是后端API的路径,`userId`和`contentId`是需要点的用户ID和内容ID。 4. 在前端页面中,通过调用后端API实现取消点功能。比如,可以编写一个`unlike`函数,用于向后端发送取消点请求: ```javascript function unlike(userId, contentId) { $.ajax({ url: "/api/likes/unlike", method: "POST", data: {userId: userId, contentId: contentId}, success: function(data) { alert("You have unliked this content."); }, error: function(jqXHR, textStatus, errorThrown) { alert(jqXHR.responseText); } }); } ``` 在上面的代码中,`/api/likes/unlike`是后端API的路径,`userId`和`contentId`是需要取消点的用户ID和内容ID。 以上就是Java实现功能的基本步骤,需要根据具体的项目需求进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值