简易博客点赞系统实现

简易博客点赞系统

好久没写 Java 了,整个简单的项目进行康复训练。
基于 Spring Boot + SSM + MySQL + Mybatis-Plus + Knife4j + Swagger 的一个简易博客点赞系统

开源地址:https://github.com/FangMoyu/simple-thumb

功能

  • 登录
  • 获取当前登录用户
  • 获取博客
  • 展示所有博客
  • 点赞
  • 取消点赞

亮点

  • 基于编程式事务实现点赞和取消点赞功能
  • 为避免用户重复点赞,使用本地锁对用户 id 进行加锁,防止接口短时间重复调用
  • 提供了通用返回类、全局异常处理器、自定义错误码等

部分代码实现

点赞功能

	@Overridepublic Boolean doThumb(DoThumbRequest doThumbRequest, HttpServletRequest request) {// 参数校验ThrowUtils.throwIf(doThumbRequest == null || doThumbRequest.getBlogId() == null,ErrorCode.PARAMS_ERROR, "参数错误");User loginUser = userService.getLoginUser(request);// 加锁,避免用户短时间多次点赞synchronized (loginUser.getId().toString().intern()) {// 编程式事务return transactionTemplate.execute(status -> {// 获取当前当前进行点赞的博客idLong blogId = doThumbRequest.getBlogId();// 判断当前用户是否已经点赞过该博客boolean exists = this.lambdaQuery().eq(Thumb::getBlogId, blogId).eq(Thumb::getUserId, loginUser.getId()).exists();// 如果已经点赞过,抛出异常ThrowUtils.throwIf(exists, ErrorCode.OPERATION_ERROR, "已经点赞过");// 更新博客点赞数 + 1boolean update = blogService.lambdaUpdate().eq(Blog::getId, blogId).setSql("thumbCount = thumbCount + 1").update();// 保存点赞记录Thumb thumb = new Thumb();thumb.setBlogId(blogId);thumb.setUserId(loginUser.getId());return update && this.save(thumb);});}}

取消点赞

    @Overridepublic Boolean undoThumb(DoThumbRequest doThumbRequest, HttpServletRequest request) {// 参数校验ThrowUtils.throwIf(doThumbRequest == null || doThumbRequest.getBlogId() == null, ErrorCode.PARAMS_ERROR, "参数错误");User loginUser = userService.getLoginUser(request);// 加锁,避免用户短时间多次取消点赞synchronized (loginUser.getId().toString().intern()) {// 编程式事务return transactionTemplate.execute(status -> {// 获取当前当前进行点赞的博客idLong blogId = doThumbRequest.getBlogId();// 判断当前用户是否已经点赞过该博客Thumb thumb = this.lambdaQuery().eq(Thumb::getBlogId, blogId).eq(Thumb::getUserId, loginUser.getId()).one();// 如果没有点赞过,抛出异常ThrowUtils.throwIf(thumb == null, ErrorCode.OPERATION_ERROR, "未点赞过");// 更新博客点赞数 - 1boolean update = blogService.lambdaUpdate().eq(Blog::getId, blogId).setSql("thumbCount = thumbCount - 1").update();// 删除点赞记录return update && this.removeById(thumb.getId());});}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/80132.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个既简单又诡异的问题

public class DaYaoGuai {static String s;public static void main(String[] args) {Thread t1 new Thread(){Overridepublic void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}s"深圳";}};t1.start();Thre…

使用docker在manjaro linux系统上运行windows和ubuntu

因为最近项目必须要使用指定版本的solidworks和maxwell(都只能在win系统上使用), 且目前的ubuntu容器是没有桌面的,导致我运行不了一些带图形的ros2功能。无奈之下,决定使用docker-compose写一下配置文件,彻底解决问题…

Elasticsearch中的_source字段讲解

_source 在 Elasticsearch 查询中用于限制返回的字段,类似于 SQL 中的 SELECT 指定列。 代码示例: esSearchResults = es_service.search_documents({"query": {"terms": {"file_id":

【论文阅读20】-CNN-Attention-BiGRU-滑坡预测(2025-03)

这篇论文主要探讨了基于深度学习的滑坡位移预测模型,结合了MT-InSAR(多时相合成孔径雷达干涉测量)观测数据,提出了一种具有可解释性的滑坡位移预测方法。 [1] Zhou C, Ye M, Xia Z, et al. An interpretable attention-based deep…

C++ 的 IO 流

💬 :如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区畅所欲言!我们一起学习、共同成长~! 👍 :如果你觉得这篇文章还不错,不妨顺手点个赞、加入收藏,并…

spring cloud gateway前面是否必须要有个nginx

在 **"客户端 → Nginx (前置限流) → Spring Cloud Gateway → 微服务(Sentinel 熔断限流)"** 的架构中,**Spring Cloud Gateway 前面并不强制要求必须有 Nginx**,是否需要取决于具体场景。以下是详细分析: 一、必须使用 Nginx 的…

Spark和Hadoop之间的对比和联系

(一)Spark概述 Spark是一种基于内存的快速、通用、可拓展的大数据分析计算引擎。Hadoop是一个分布式系统基础架构。 1)官网地址:Apache Spark™ - Unified Engine for large-scale data analytics 2)文档查看地址&…

多线程进阶(Java)

注:此博文为本人学习过程中的笔记 1.常见的锁策略 当我们需要自己实现一把锁时,需要关注锁策略。Java提供的synchronized已经非常好用了,覆盖了绝大多数的使用场景。此处的锁策略并不是和Java强相关的,只要涉及到并发编程&#…

c++STL——stack、queue、priority_queue的模拟实现

文章目录 stack、queue、priority_queue的模拟实现使用部分模拟实现容器适配器deque的介绍原理真实结构deque的迭代器deque的操作deque的优缺点 stack的模拟实现按需实例化queue的模拟实现priority_queue的模拟实现为何引入仿函数代码实现 stack、queue、priority_queue的模拟实…

【深度学习—李宏毅教程笔记】Transformer

目录 一、序列到序列(Seq2Seq)模型 1、Seq2Seq基本原理 2、Seq2Seq模型的应用 3、Seq2Seq模型还能做什么? 二、Encoder 三、Decoder 1、Decoder 的输入与输出 2、Decoder 的结构 3、Non-autoregressive Decoder 四、Encoder 和 De…

C++镌刻数据密码的树之铭文:二叉搜索树

文章目录 1.二叉搜索树的概念2.二叉搜索树的实现2.1 二叉搜索树的结构2.2 二叉搜索树的节点寻找2.2.1 非递归2.2.2 递归 2.3 二叉搜索树的插入2.3.1 非递归2.3.2 递归 2.4 二叉搜索树的删除2.4.1 非递归2.4.2 递归 2.5 二叉搜索树的拷贝 3.二叉树的应用希望读者们多多三连支持小…

系统架构设计师:流水线技术相关知识点、记忆卡片、多同类型练习题、答案与解析

流水线记忆要点‌ ‌公式 总时间 (n k - 1)Δt 吞吐率 TP n / 总时间 → 1/Δt(max) 加速比 S nk / (n k - 1) | 效率 E n / (n k - 1) 关键概念 周期:最长段Δt 冲突‌: ‌数据冲突(RAW) → 旁路/…

强制重装及验证onnxruntime-gpu是否正确工作

#工作记录 我们经常会遇到明明安装了onnxruntime-gpu或onnxruntime后,无法正常使用的情况。 一、强制重新安装 onnxruntime-gpu 及其依赖 # 强制重新安装 onnxruntime-gpu 及其依赖 pip install --force-reinstall --no-cache-dir onnxruntime-gpu1.18.0 --extra…

桌面我的电脑图标不见了怎么恢复 恢复方法指南

在Windows操作系统中,“我的电脑”或在较新版本中称为“此电脑”的图标,是访问硬盘驱动器、外部存储设备和系统文件的重要入口。然而,有些用户可能会发现桌面上缺少了这个图标,这可能是由于误操作、系统设置更改或是不小心删除造成…

2025.04.20【Lollipop】| Lollipop图绘制命令简介

Customize markers See the different options allowing to customize the marker on top of the stem. Customize stems See the different options allowing to customize the stems. 文章目录 Customize markersCustomize stems Lollipop图简介R语言中的Lollipop图使用ggp…

docker-compose搭建kafka

1、单节点docker-compose.yml version: 3 services:zookeeper:image: zookeeper:3.8container_name: zookeeperports:- "2181:2181"volumes:- ./data/zookeeper:/dataenvironment:ZOO_MY_ID: 1ZOO_MAX_CLIENT_CNXNS: 100kafka:image: bitnami/kafka:3.7container_na…

【问题】一招解决vscode输出和终端不一致的困扰

背景(闲话Trae) Trae是挺好,用了几天,发现它时不时检查文件,一检测就转悠半天,为此我把当前环境清空,就留一个正在调的程序,结果还照样检测,虽然没影响什么,…

Git,本地上传项目到github

一、Git的安装和下载 https://git-scm.com/ 进入官网,选择合适的版本下载 二、Github仓库创建 点击右上角New新建一个即可 三、本地项目上传 1、进入 要上传的项目目录,右键,选择Git Bash Here,进入终端Git 2、初始化临时仓库…

从零开始配置spark-local模式

1. 环境准备 操作系统:推荐使用 Linux 或 macOS,Windows 也可以,但可能会有一些额外的配置问题。 Java 环境:Spark 需要 Java 环境。确保安装了 JDK 1.8 或更高版本。 检查 Java 版本: bash 复制 java -version 如果…

前端~地图(openlayers)绘制车辆运动轨迹(仿高德)

绘制轨迹路线轨迹路线描边增加起点终点图标绘制仿高德方向箭头模仿车辆动态运动动画 车辆运行轨迹 车辆轨迹经纬度坐标 const linePoints [new Point([123.676031, 43.653421]),new Point([123.824347, 43.697124]),new Point([124.197882, 43.946811]),new Point([124.104498…