下面是关于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技术站