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类装载机制?

    Java类装载机制指的是JVM如何加载和查找类的过程。在Java程序运行过程中,JVM需要定位并加载需要使用的类文件,Java类装载机制便是完成这个过程的。 Java 类装载有五个过程:加载、验证、准备、解析和初始化。以下是Java类装载的详细使用攻略。 1. 加载 加载是指将类的字节码数据加载到内存中,并为之创建一个 java.lang.Class 对象。…

    Java 2023年5月11日
    00
  • Java使用utf8格式保存文本文件的方法

    要在Java中使用UTF-8格式保存文本文件,需要执行以下步骤: 1. 设置文件编码 首先,需要在你的Java程序中明确地设置文件编码为UTF-8,这可以通过以下步骤实现: import java.nio.charset.StandardCharsets; import java.io.BufferedWriter; import java.io.FileW…

    Java 2023年5月19日
    00
  • Spring Native项目实战(体验79毫秒启动springboot应用)

    Spring Native是Spring Boot的一个扩展,它可以将Spring Boot应用程序编译成本地可执行文件,从而提高应用程序的启动速度和性能。在本攻略中,我们将详细介绍如何使用Spring Native,并提供两个示例来说明其用法。 以下是两个示例,介绍如何使用Spring Native: 示例一:使用Spring Native编译Spring…

    Java 2023年5月15日
    00
  • java中如何使用HttpClient调用接口

    下面是关于如何在Java中使用HttpClient调用接口的完整攻略。 简介 HttpClient是一个开源的Java HTTP客户端库,它适用于处理HTTP请求和响应,并支持多种协议,如HTTP、HTTPS、FTP、UDP等。使用HttpClient可以方便、可靠地进行网络通信,是Java程序员进行HTTP请求的绝佳工具。 添加依赖 为了使用HttpCli…

    Java 2023年5月26日
    00
  • Java Http接口加签、验签操作方法

    关于Java Http接口加签、验签操作方法的完整攻略,可以分为以下几个部分: 什么是接口加签、验签? 在网络通信中,为了防止数据伪造、篡改等安全问题,需要使用加密、签名等方式来保护数据安全。接口加签、验签是其中的一种方式。简单来说,就是在数据通信的过程中,在数据中加入签名信息,用于识别数据的真实性。接口加签指的是计算签名,并将签名在请求头或请求参数中传输。…

    Java 2023年5月26日
    00
  • SpringBoot 项目瘦身maven/gradle详解

    SpringBoot 项目瘦身 maven/gradle 详解 简介 对于使用 Maven 和 Gradle 构建的 Spring Boot 项目,在打包成 jar 或 war 文件时可能会比较大,占用过多的磁盘空间和运行内存。因此,我们需要对项目进行瘦身,减少不必要的依赖和文件。 本篇文章旨在介绍 Maven 和 Gradle 的瘦身方法,并提供两个示例以…

    Java 2023年6月2日
    00
  • Java中的Valid和Validated的比较内容

    当我们进行Java Bean校验时,通常会使用Hibernate提供的校验框架。Valid和Validated是该框架中最常用的两种表单验证注解,它们都是用于指定校验组,在校验时都可以用来限制哪些校验组中的校验规则生效。但是,它们有一些区别。下面我将详细讲解Java中Valid和Validated的比较内容,帮助读者理解它们的使用方法。 Valid注解 @V…

    Java 2023年5月20日
    00
  • Java多线程案例之阻塞队列详解

    Java多线程案例之阻塞队列详解 什么是阻塞队列? 阻塞队列(Blocking Queue)是一个支持在队列的两端进行插入与删除的队列。常用的阻塞队列有ArrayBlockingQueue、LinkedBlockingQueue等。阻塞队列在多线程的场景下常被使用,因为当队列为空或达到容量上限时,线程往往会被阻塞。在队列空的情况下,从队列中获取元素的操作将会…

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