SpringBoot实现物品点赞功能

下面是关于SpringBoot实现物品点赞功能的完整攻略:

前言

物品点赞功能是很常见的网站功能之一。Spring Boot 给我们提供了很好的实现方式,通过本文,你可以学习到 Spring Boot 如何实现物品点赞功能。

实现过程

创建数据库

首先我们需要创建一个数据库来储存点赞信息。数据库需要包含以下两个表:

  • item 表:储存物品信息,包括物品 ID,名称等。
  • like 表:储存点赞信息,包括点赞 ID,点赞时间等,并且需要关联到物品表。

SQL 建表语句如下:

CREATE TABLE `item` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `like` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `item_id` int(11) NOT NULL,
  `like_time` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `item_id` (`item_id`),
  CONSTRAINT `like_item_id` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`)
);

创建Spring Boot项目

使用Spring Initializr创建一个Spring Boot项目,添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

创建实体类

根据我们的数据库建表语句,我们需要创建两个实体:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Item {
    private Integer id;
    private String name;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ItemLike {
    private Integer id;
    private Integer itemId;
    private LocalDateTime likeTime;
}

创建 Repository

接下来,我们需要为我们的实体创建 Repository。使用 @Repository 注解标注我们的 Repository。

@Repository
public interface ItemRepository extends CrudRepository<Item, Integer> {
}

@Repository
public interface ItemLikeRepository extends CrudRepository<ItemLike, Integer> {

    Integer countByItemId(Integer itemId);

    Optional<ItemLike> findByItemIdAndLikeTime(Integer itemId, LocalDateTime likeTime);
}

这两个 Repository 会通过 CrudRepository 提供一些基本的 CRUD 方法。

创建 Controller

现在,我们创建一个Controller来处理HTTP请求。

@Controller
public class ItemController {

    private ItemRepository itemRepository;
    private ItemLikeRepository itemLikeRepository;

    public ItemController(ItemRepository itemRepository,
                          ItemLikeRepository itemLikeRepository) {
        this.itemRepository = itemRepository;
        this.itemLikeRepository = itemLikeRepository;
    }

    @GetMapping("/")
    public String items(Model model) {
        Iterable<Item> items = itemRepository.findAll();
        items.forEach(item -> item.setLikes(itemLikeRepository.countByItemId(item.getId())));
        model.addAttribute("items", items);
        return "items";
    }

    @PostMapping("/{itemId}/like")
    @ResponseBody
    public String like(@PathVariable Integer itemId) {
        Optional<ItemLike> itemLike = itemLikeRepository.findByItemIdAndLikeTime(itemId, LocalDateTime.now());
        if (itemLike.isPresent()) {
            itemLikeRepository.deleteById(itemLike.get().getId());
            return "dislike";
        } else {
            itemLikeRepository.save(new ItemLike(null, itemId, LocalDateTime.now()));
            return "like";
        }
    }
}

我们的Controller包含以下两个方法:

  • items:从数据库中获取所有物品的信息,并将物品的点赞数量添加到 Item 实体中。将 Iterable<Item> 对象添加到 Model 中,并将模版名字设置为 items
  • like:处理HTTP POST请求,如果点赞已经存在就删除点赞,否则就创建点赞记录。

创建 HTML 模板

最后,我们需要创建 HTML 模板来展示物品列表。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Items</title>
</head>
<body>

<table>
    <thead>
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Likes</th>
        <th>Like</th>
    </tr>
    </thead>
    <tbody>
    <tr th:each="item : ${items}">
        <td th:text="${item.getId()}"></td>
        <td th:text="${item.getName()}"></td>
        <td th:text="${item.getLikes()}"></td>
        <td>
            <form th:action="@{/}+${item.getId()}/like" method="post" th:inline="javascript">
                <input type="hidden" name="_csrf" th:value="${_csrf.token}" />
                <button id="like{{$index}}" onclick="like(this, [[${item.getId()}]])" type="button"
                        th:text="${!'><'} + (item.isLiked ? 'dislike' : 'like')"/>
            </form>
            <script th:inline="javascript">
                var like = function (button, itemId) {
                    button.disabled = true;
                    var liked = !(button.innerText === 'dislike');
                    $.post('/' + itemId + '/like')
                        .fail(function (err) {
                            button.disabled = false;
                            alert('Failed to like! Please try later...');
                            console.error(err.responseText);
                        }).done(function () {
                            button.innerText = (liked ? 'dislike' : 'like');
                            button.disabled = false;
                        });
                };
            </script>
        </td>
    </tr>
    </tbody>
</table>

</body>
</html>

这个模板将会渲染物品列表并在每个物品后面展示点赞按钮。

示例说明

示例一

假设我们已经运行了 Spring Boot 应用程序,我们可以使用以下命令来向某个物品点赞:

curl -X POST localhost:8080/1/like

这个命令会向 ID 为 1 的物品进行点赞或取消点赞。

示例二

假设我们已经在浏览器中访问了 Spring Boot 应用程序的主页,我们可以通过点击点赞按钮来进行点赞或取消点赞。页面将会重新加载,并显示更新后的点赞数量。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot实现物品点赞功能 - Python技术站

(1)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • java连接mysql数据库乱码的解决方法

    以下是讲解“java连接mysql数据库乱码的解决方法”的完整攻略。 问题描述 在使用Java连接MySQL数据库时,有时会出现中文乱码的问题。如何解决这个问题呢?下面将会给出详细的解决方法。 解决方法 步骤一:指定编码方式 在连接MySQL数据库之前,需要指定编码方式。可以在连接数据库的URL中添加以下参数: jdbc:mysql://localhost/…

    Java 2023年5月19日
    00
  • 12种最常用的网页编程语言简介(值得收藏)

    首先,我们需要了解网页编程语言的概念和作用。网页编程语言指的是网站开发者使用的语言,用于构建网站的前端和后端部分。网页编程语言可以分成前端语言和后端语言两种。前端语言用于网站的外观和用户交互,后端语言用于网站的数据处理和服务器与数据库等操作。本文将介绍12种最常用的网页编程语言,分别为HTML、CSS、JavaScript、PHP、Python、Ruby、J…

    Java 2023年6月15日
    00
  • 关于Java变量的声明、内存分配及初始化详解

    关于Java变量的声明、内存分配及初始化详解 变量的声明 在Java中,要使用一个变量之前,必须先对其进行声明。变量的声明包括变量类型和变量名。在声明变量时,可以同时对变量进行初始化(赋初值),也可以在后面的步骤中对变量进行赋值。 变量的声明语法格式如下: 变量类型 变量名; 在声明多个同类型的变量时可以使用逗号进行分隔: 变量类型 变量1, 变量2, ..…

    Java 2023年5月26日
    00
  • 使用java实现网络爬虫

    使用Java实现网络爬虫可以分为以下步骤: 1. 定义爬虫开始的入口URL 入口URL是爬虫开始爬取网页的地方,可以是指定的网页或是多个网页列表。定义入口URL的方式可以使用字符串形式,也可以使用类似Java URL类的URL对象。比如: String startUrl = "https://example.com"; URL url =…

    Java 2023年5月18日
    00
  • WEB应用脆弱性防止策略 常见的16种WEB攻击以及解决方案

    WEB应用脆弱性防止策略: 常见的16种WEB攻击以及解决方案 1. SQL注入攻击 SQL注入攻击:利用特殊的字符与代码注入技术,在后台窃取数据和控制后台操作。防范措施:使用参数化查询,避免直接拼接SQL语句;过滤掉用户的输入特殊字符,如单引号;使用ORM框架。 示例:在登录页面中,输入如下语句,可以绕过登录验证,进入后台管理界面 ‘ or ‘1’=’1 …

    Java 2023年6月15日
    00
  • 如何提高java代码的重用性

    当我们在编写Java代码时,通常需要考虑代码的可读性和可维护性,但同时也需要考虑代码的重用性,以避免编写冗余、重复的代码。下面是几个可以提高Java代码的重用性的技巧和建议: 1. 使用面向对象设计 Java是面向对象的编程语言,因此可以使用面向对象的设计模式来提高代码的重用性。通过设计好合适抽象类和接口,使得代码可以被继承或者实现,以实现代码的可复用性。例…

    Java 2023年5月30日
    00
  • 解决java maven项目找不到jconsole-1.8.0.jar和tools-1.8.0.jar包问题

    解决java maven项目找不到jconsole-1.8.0.jar和tools-1.8.0.jar包问题的完整攻略如下: 问题说明 当使用Maven构建Java项目时,有时候会出现找不到jconsole-1.8.0.jar和tools-1.8.0.jar包的问题。这是因为Java从JDK 9开始,已经将jconsole.jar、tools.jar等jar…

    Java 2023年5月20日
    00
  • Java效率提升神器jOOR

    下面是关于Java效率提升神器jOOR的详细攻略: 什么是jOOR jOOR(Java Object Oriented Reflection)是一组Java工具,它可以大大提高Java中对象的创建、操作和链式调用的效率。它通过简化反射API的使用,提供更灵活、更直观和更简单的方式来处理Java对象。jOOR扩展了Java语言,使它更容易地与其他流行的Java…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部