SpringBoot整合Redis实现点赞、收藏功能
前言
点赞、收藏功能作为常见的社交功能,是众多Web应用中必不可少的功能之一。而redis作为一个基于内存的高性能key-value存储数据库,可以用来实现这些功能。
本文将介绍如何使用spring boot整合redis实现点赞、收藏功能,并提供前后端页面的编写代码。
准备工作
在开始之前,您需要进行以下准备工作:
- 安装JDK
- 安装Redis,并启动Redis服务
- 安装Node.js和Vue.js,以便我们能够开发前端页面
后端实现
在后端中,我们需要使用spring boot来整合redis,并进行相关的接口设计和实现。下面是实现点赞和收藏的核心代码。
相关依赖
首先,在pom.xml
文件中添加redis相关依赖。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.10.0</version>
</dependency>
Redis配置
接下来,我们需要配置Redis连接信息,可以在application.yml
中进行配置。
spring:redis:host: localhostport: 6379
点赞功能实现
下面是点赞功能的接口实现代码。
@RestController
@RequestMapping("/like")
public class LikeController {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@PostMapping("/add")public String addLike(@RequestParam String userId, @RequestParam String objectId) {String key = "like:" + objectId;long result = redisTemplate.opsForSet().add(key, userId);return result > 0 ? "点赞成功" : "不能重复点赞";}@PostMapping("/delete")public String deleteLike(@RequestParam String userId, @RequestParam String objectId) {String key = "like:" + objectId;long result = redisTemplate.opsForSet().remove(key, userId);return result > 0 ? "取消点赞" : "未进行点赞";}@GetMapping("/count")public long countLike(@RequestParam String objectId) {String key = "like:" + objectId;return redisTemplate.opsForSet().size(key);}
}
收藏功能实现
下面是收藏功能的接口实现代码。
@RestController
@RequestMapping("/favorite")
public class FavoriteController {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@PostMapping("/add")public String addFavorite(@RequestParam String userId, @RequestParam String objectId) {String key = "favorite:" + userId;long result = redisTemplate.opsForSet().add(key, objectId);return result > 0 ? "收藏成功" : "不能重复收藏";}@PostMapping("/delete")public String deleteFavorite(@RequestParam String userId, @RequestParam String objectId) {String key = "favorite:" + userId;long result = redisTemplate.opsForSet().remove(key, objectId);return result > 0 ? "取消收藏" : "未进行收藏";}@GetMapping("/count")public long countFavorite(@RequestParam String userId) {String key = "favorite:" + userId;return redisTemplate.opsForSet().size(key);}@GetMapping("/list")public Set<String> listFavorite(@RequestParam String userId) {String key = "favorite:" + userId;return redisTemplate.opsForSet().members(key);}
}
前端实现
在前端中,我们使用Vue.js来编写页面,并调用后端提供的接口。下面是点赞、收藏功能的页面实现代码。
点赞
点赞功能页面代码
<template><div><button @click="addLike">点赞</button><button @click="deleteLike">取消点赞</button><span>点赞数:{{likeCount}}</span></div>
</template><script>
import axios from 'axios'export default {name: 'Like',data () {return {userId: '123', // 用户id, 从登录状态中取得objectId: '1', // 对象id, 从url参数中取得likeCount: 0 // 点赞数}},methods: {addLike () {axios.post('/like/add', {userId: this.userId,objectId: this.objectId}).then(response => {alert(response.data)if (response.data === '点赞成功') {this.likeCount++}}).catch(error => {console.log(error)})},deleteLike () {axios.post('/like/delete', {userId: this.userId,objectId: this.objectId}).then(response => {alert(response.data)if (response.data === '取消点赞') {this.likeCount--}}).catch(error => {console.log(error)})},countLike () {axios.get('/like/count', {params: {objectId: this.objectId}}).then(response => {this.likeCount = response.data}).catch(error => {console.log(error)})}},mounted () {this.countLike()}
}
</script>
收藏
收藏功能页面代码
<template><div><button @click="addFavorite">收藏</button><button @click="deleteFavorite">取消收藏</button><span>收藏数:{{favoriteCount}}</span><ul><li v-for="item in favoriteList" :key="item">{{item}}</li></ul></div>
</template><script>
import axios from 'axios'export default {name: 'Favorite',data () {return {userId: '123', // 用户id, 从登录状态中取得objectId: '1', // 对象id, 从url参数中取得favoriteCount: 0, // 收藏数favoriteList: [] // 收藏列表}},methods: {addFavorite () {axios.post('/favorite/add', {userId: this.userId,objectId: this.objectId}).then(response => {alert(response.data)if (response.data === '收藏成功') {this.favoriteCount++}}).catch(error => {console.log(error)})},deleteFavorite () {axios.post('/favorite/delete', {userId: this.userId,objectId: this.objectId}).then(response => {alert(response.data)if (response.data === '取消收藏') {this.favoriteCount--this.favoriteList = this.favoriteList.filter(item => item !== this.objectId)}}).catch(error => {console.log(error)})},countFavorite () {axios.get('/favorite/count', {params: {userId: this.userId}}).then(response => {this.favoriteCount = response.data}).catch(error => {console.log(error)})},listFavorite () {axios.get('/favorite/list', {params: {userId: this.userId}}).then(response => {this.favoriteList = response.data}).catch(error => {console.log(error)})}},mounted () {this.countFavorite()this.listFavorite()}
}
</script>
总结
本文介绍了如何使用spring boot整合redis实现点赞、收藏功能,并提供了相关的前后端页面代码示例,希望能对您有所帮助。如果您有任何问题或建议,请在评论中留言,谢谢!
相关文章:
SpringBoot整合Redis实现点赞、收藏功能
前言 点赞、收藏功能作为常见的社交功能,是众多Web应用中必不可少的功能之一。而redis作为一个基于内存的高性能key-value存储数据库,可以用来实现这些功能。 本文将介绍如何使用spring boot整合redis实现点赞、收藏功能,并提供前后端页面的…...

【Java入门合集】第一章Java概述
【Java入门合集】第一章Java概述 博主:命运之光 专栏:JAVA入门 学习目标 1.理解JVM、JRE、JDK的概念; 2.掌握Java开发环境的搭建,环境变量的配置; 3.掌握Java程序的编写、编译和运行; 4.学会编写第一个Java程序&#x…...
Android无线调试操作说明
1.首先通过手机机蓝牙将jackpal.androidterm-1.0.70.apk(终端模拟器)传的设备上安装 链接: https://pan.baidu.com/s/151SzEgsX0b_VTWowzfUrsA?pwdrn75 提取码: rn75 复制这段内容后打开百度网盘手机App,操作更方便哦 2.打开这个终端模拟器,输入以下命…...
什么是 Python ?聊一聊Python程序员找工作的六大技巧
最近我一直在思考换工作的事情。因此,这段时间我会看一些题目,看一些与面试相关的内容,以便更好地准备面试。我认为无论你处于什么阶段,面试中都会有技术面试环节。无论是初级职位还是高级职位,都需要通过技术面试来检…...

RabbitMQ 01 概述
什么是消息队列 进行大量的远程调用时,传统的Http方式容易造成阻塞,所以引入了消息队列的概念,即让消息排队,按照队列进行消费。 它能够将发送方发送的信息放入队列中,当新的消息入队时,会通知接收方进行处…...
面经|曹操出行供需策略运营
1.自我介绍 面试官表示看了简历之后,表示对专业能力比较放心。想了解下对于专业能力之外,关于其他方面的介绍。 2.策略运营,除了工具之外,还有哪些能力是需要具备的 回答:主要是从做项目的维度逻辑先去回答的。 分析思…...

【Python】selenium工具
目录 1. 安装 2. 测试 3. 无头浏览器 4. 元素定位 5. 页面滑动 6. 按键、填写登录表单 7. 页面切换 Selenium是Web的自动化测试工具,为网站自动化测试而开发,Selenium可以直接运行在浏览器上,它支持所有主流的浏览器,可以接…...

实验六~Web事件处理与过滤器
1. 创建一个名为exp06的Web项目,编写、部署、测试一个ServletContext事件监听器。 BookBean代码 package org.example.beans;import java.io.Serializable;/*** Created with IntelliJ IDEA.* Description:* User: Li_yizYa* Date: 2023—04—29* Time: 18:39*/ Su…...

刷题4.28
1、 开闭原则软件实体(模块,类,方法等)应该对扩展开放,对修改关闭,即在设计一个软件系统模块(类,方法)的时候,应该可以在不修改原有的模块(修改关…...

做了一年csgo搬砖项目,还清所有债务:会赚钱的人都在做这件事 !
前段時间,在网上看到一句话:有什么事情,比窮更可怕? 有人回答说:“又忙又窮。” 很扎心,却是绝大多数人的真实写照。 每天拼死拼活的996,你有算过你的時间值多少钱? 我们来算一笔…...

线性回归模型(7大模型)
线性回归模型(7大模型) 线性回归是人工智能领域中最常用的统计学方法之一。在许多不同的应用领域中,线性回归都是非常有用的,例如金融、医疗、社交网络、推荐系统等等。 在机器学习中,线性回归是最基本的模型之一&am…...
VP记录:Codeforces Round 868 (Div. 2) A~D
传送门:CF A题:A-characteristic 构造一个只有 1 , − 1 1,-1 1,−1的数组,满足乘积为 1 1 1的数对的个数为 k k k. 发现 n n n的范围很小,考虑直接暴力枚举数组中 1 1 1的个数,记为 i i i,那么对于1的所有数对来说,我们有 i ∗ ( i − 1 ) / 2 i*(i-1)/2 i∗(i−1)/2个,然后…...
【VQ-VAE-2论文精读】Generating Diverse High-Fidelity Images with VQ-VAE-2
【VQ-VAE-2论文精读】Generating Diverse High-Fidelity Images with VQ-VAE-2 0、前言Abstract1 Introduction2 Background2.1 Vector Quantized Variational AutoEncoder3 Method3.1 Stage 1: Learning Hierarchical Latent Codes3.2 Stage 2: Learning Priors over Latent C…...

并发编程基石:管程
大家好,我是易安! 如果有人问我学习并发并发编程,最核心的技术点是什么,我一定会告诉他,管程技术。Java语言在1.5之前,提供的唯一的并发原语就是管程,而且1.5之后提供的SDK并发包,也…...

电路中噪声来源
电路包括不同的部件和芯片,所有都有可能成为噪声的来源。例如,电阻会带来热噪声,这个噪声为宽频噪声,几乎涵盖所有频率范围;运算放大器其芯片内部会产生噪声;而 ADC产生的量化噪声相较于其他器件࿰…...

JAVASE的全面总结
(未完待续) 五、子类与继承 5.1 子类与父类 继承是一种由已有的类创建新类的机制。利用继承,我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类,新类继承一般类的状态和行为,并…...

关于repeater录制的流量子调用的identity中带有~S的情况
前段时间同事问我,我们录制的流量中,尤其是dubbo的子调用显示经常他的末尾会带上一个小尾巴这个是什么意思呢,其实之前我没有太在意这个事情,只是同事这么疑问了,确实激起了好奇心,所以就差了下 到底是什么…...
Java面试题队列
Java中的队列都有哪些,有什么区别 1. ArrayDeque, (数组双端队列) 2. PriorityQueue, (优先级队列) 3. ConcurrentLinkedQueue, (基于链表的并发队列) 4. DelayQueue, (延期…...

大型Saas系统的权限体系设计(二)
X0 上期回顾 上文《大型Saas系统的权限体系设计(一)》提到2B的Saas系统的多层次权限体系设计的难题,即平台、平台的客户、客户的客户,乃至客户的客户的客户如何授权,这个可以通过“权限-角色-岗位”三级结构来实现。 但这个只是功能权限&am…...

HTML(四) -- 多媒体设计
目录 1. 视频标签 2. 音频标签 3. 资源标签(定义媒介资源 ) 1. 视频标签 属性值描述autoplayautoplay如果出现该属性,则视频在就绪后马上播放。controlscontrols表示添加标准的视频控制界面,包括播放、暂停、快进、音量等…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...