diff --git a/src/main/java/com/bao/dating/DatingApplication.java b/src/main/java/com/bao/dating/DatingApplication.java index c1e229b3..6295922b 100644 --- a/src/main/java/com/bao/dating/DatingApplication.java +++ b/src/main/java/com/bao/dating/DatingApplication.java @@ -1,9 +1,10 @@ package com.bao.dating; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; - +@MapperScan("com.bao.dating.mapper") @SpringBootApplication public class DatingApplication { public static void main(String[] args) { diff --git a/src/main/java/com/bao/dating/common/Result.java b/src/main/java/com/bao/dating/common/Result.java index 337e7ac6..f9dcc422 100644 --- a/src/main/java/com/bao/dating/common/Result.java +++ b/src/main/java/com/bao/dating/common/Result.java @@ -57,4 +57,5 @@ public class Result { public static Result error(ResultCode code, String msg) { return new Result<>(code.code(), msg, null); } + } \ No newline at end of file diff --git a/src/main/java/com/bao/dating/controller/PostLikeController.java b/src/main/java/com/bao/dating/controller/PostLikeController.java new file mode 100644 index 00000000..2c6fa170 --- /dev/null +++ b/src/main/java/com/bao/dating/controller/PostLikeController.java @@ -0,0 +1,36 @@ +package com.bao.dating.controller; + +import com.bao.dating.common.Result; +import com.bao.dating.common.ResultCode; +import com.bao.dating.mapper.PostLikeMapper; +import com.bao.dating.service.PostLikeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; +import java.util.Objects; + +@RestController +@RequestMapping("/posts") +public class PostLikeController { + + @Autowired + private PostLikeService postLikeService; + + @PostMapping("/{postId}/likes") + public Result likePost(@PathVariable Long postId, @RequestBody Map body){ + // 从请求体中取出 user_id + Long userId = body.get("user_id"); + if (userId ==null){ + return Result.error(ResultCode.PARAM_ERROR); + } + return postLikeService.likePost(postId,userId); + } + + @DeleteMapping("/{postId}/likes") + public void unlike(@PathVariable Long postId, @RequestBody Map body){ + // 从请求体中获取 user_id + Long userId = body.get("user_id"); + postLikeService.unlike(postId,userId); + } + } diff --git a/src/main/java/com/bao/dating/mapper/PostLikeMapper.java b/src/main/java/com/bao/dating/mapper/PostLikeMapper.java new file mode 100644 index 00000000..2de398e7 --- /dev/null +++ b/src/main/java/com/bao/dating/mapper/PostLikeMapper.java @@ -0,0 +1,16 @@ +package com.bao.dating.mapper; + +import com.bao.dating.pojo.entity.PostLike; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface PostLikeMapper { + //根据 postId 和 userId 查询点赞记录 用于判断是否已经点赞 + PostLike findByPostAndUser(@Param("postId") Long postId, @Param("userId") Long userId); + + int insert(PostLike postLike); + + // 根据 postId + userId 删除点赞 + int deleteByPostIdAndUserId(@Param("postId") Long postId, @Param("userId") Long userId); +} diff --git a/src/main/java/com/bao/dating/mapper/PostMapper.java b/src/main/java/com/bao/dating/mapper/PostMapper.java index 3eaf397a..2a2d08d6 100644 --- a/src/main/java/com/bao/dating/mapper/PostMapper.java +++ b/src/main/java/com/bao/dating/mapper/PostMapper.java @@ -5,16 +5,5 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface PostMapper { - /** - * 插入动态 - * @param post - * @return - */ int insert(Post post); - - /** - * 根据动态ID删除动态 - * @param postId - */ - void deletePostById(Integer postId); } diff --git a/src/main/java/com/bao/dating/pojo/entity/Post.java b/src/main/java/com/bao/dating/pojo/entity/Post.java index cc60bdf5..59fa5078 100644 --- a/src/main/java/com/bao/dating/pojo/entity/Post.java +++ b/src/main/java/com/bao/dating/pojo/entity/Post.java @@ -12,9 +12,9 @@ import java.util.List; @Data public class Post { - private Integer postId; + private Long postId; - private Integer userId; + private Long userId; private String content; @@ -33,4 +33,4 @@ public class Post { private LocalDateTime createdAt; private LocalDateTime updatedAt; -} \ No newline at end of file +} diff --git a/src/main/java/com/bao/dating/pojo/entity/PostFavorite.java b/src/main/java/com/bao/dating/pojo/entity/PostFavorite.java index abecc1ed..1e2d8443 100644 --- a/src/main/java/com/bao/dating/pojo/entity/PostFavorite.java +++ b/src/main/java/com/bao/dating/pojo/entity/PostFavorite.java @@ -11,11 +11,11 @@ import java.time.LocalDateTime; @Data public class PostFavorite { - private Integer favoriteId; + private Long favoriteId; - private Integer userId; + private Long userId; - private Integer postId; + private Long postId; private LocalDateTime createdAt; } diff --git a/src/main/java/com/bao/dating/pojo/entity/PostLike.java b/src/main/java/com/bao/dating/pojo/entity/PostLike.java index 20a373ce..074f26c8 100644 --- a/src/main/java/com/bao/dating/pojo/entity/PostLike.java +++ b/src/main/java/com/bao/dating/pojo/entity/PostLike.java @@ -10,11 +10,11 @@ import java.time.LocalDateTime; */ @Data public class PostLike { - private Integer likeId; + private Long likeId; - private Integer userId; + private Long userId; - private Integer postId; + private Long postId; private LocalDateTime createdAt; } diff --git a/src/main/java/com/bao/dating/pojo/entity/User.java b/src/main/java/com/bao/dating/pojo/entity/User.java index da3c843e..c4048535 100644 --- a/src/main/java/com/bao/dating/pojo/entity/User.java +++ b/src/main/java/com/bao/dating/pojo/entity/User.java @@ -12,7 +12,7 @@ import java.time.LocalDateTime; @Data public class User { - private Integer userId; + private Long userId; private String userName; diff --git a/src/main/java/com/bao/dating/service/PostLikeService.java b/src/main/java/com/bao/dating/service/PostLikeService.java new file mode 100644 index 00000000..0434e7e8 --- /dev/null +++ b/src/main/java/com/bao/dating/service/PostLikeService.java @@ -0,0 +1,16 @@ +package com.bao.dating.service; + +import com.bao.dating.common.Result; + +public interface PostLikeService { + /** + * 点赞指定的 post + * + * @param postId 帖子ID + * @param userId 用户ID + * @return 统一返回结果 + */ + Result likePost(Long postId, Long userId); + //取消点赞 + void unlike(Long postId, Long userId); +} diff --git a/src/main/java/com/bao/dating/service/impl/PostLikeServiceImpl.java b/src/main/java/com/bao/dating/service/impl/PostLikeServiceImpl.java new file mode 100644 index 00000000..b1564f21 --- /dev/null +++ b/src/main/java/com/bao/dating/service/impl/PostLikeServiceImpl.java @@ -0,0 +1,64 @@ +package com.bao.dating.service.impl; + +import com.bao.dating.common.Result; +import com.bao.dating.common.ResultCode; +import com.bao.dating.mapper.PostLikeMapper; +import com.bao.dating.mapper.PostMapper; +import com.bao.dating.pojo.entity.PostLike; +import com.bao.dating.service.PostLikeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.Map; + +@Service +public class PostLikeServiceImpl implements PostLikeService { + + @Autowired + private PostMapper postMapper; + + @Autowired + private PostLikeMapper postLikeMapper; + + + + @Override + @Transactional // 保证点赞 + 点赞数更新是一个事务 + public Result likePost(Long postId, Long userId) { + // 查询是否已经点过赞(防止重复点赞) + PostLike exist = postLikeMapper.findByPostAndUser(postId, userId); + if (exist != null){ + return Result.error(ResultCode.SUCCESS_REVIEW,"您已经点过赞了。"); + } + // 创建点赞对象 + PostLike postLike = new PostLike(); + postLike.setPostId(postId); + postLike.setUserId(userId); + //插入点赞记录 + postLikeMapper.insert(postLike); + //点赞数+1 + postMapper.increaseLikeCount(postId); + //查询最新的点赞数 + Integer i = postMapper.selectLikeCount(postId); + //封装返回数据 + Map data = new HashMap<>(); + data.put("like_id",postLike.getLikeId()); + data.put("post_id",postLike.getPostId()); + data.put("user_id",postLike.getUserId()); + data.put("like_count",i); + return Result.success(ResultCode.SUCCESS_REVIEW,"点赞成功",data); + } + + @Override + @Transactional + public void unlike(Long postId, Long userId) { + // 删除点赞记录 + int i = postLikeMapper.deleteByPostIdAndUserId(postId, userId); + // 如果确实删除成功,才减少点赞数 + if (i > 0){ + postMapper.decreaseLikeCount(postId); + } + } +} diff --git a/src/main/resources/com/bao/dating/mapper/PostLikeMapper.xml b/src/main/resources/com/bao/dating/mapper/PostLikeMapper.xml new file mode 100644 index 00000000..fe825365 --- /dev/null +++ b/src/main/resources/com/bao/dating/mapper/PostLikeMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + INSERT INTO dating.post_like (post_id, user_id,created_at) VALUES (#{postId}, #{userId},NOW()) + + + + delete from dating.post_like where post_id = #{postId} and user_id = #{userId} + + \ No newline at end of file diff --git a/src/main/resources/com/bao/dating/mapper/PostMapper.xml b/src/main/resources/com/bao/dating/mapper/PostMapper.xml index b5f74880..577ae034 100644 --- a/src/main/resources/com/bao/dating/mapper/PostMapper.xml +++ b/src/main/resources/com/bao/dating/mapper/PostMapper.xml @@ -26,6 +26,18 @@ #{isPublic}, 0, 0, #{createdAt}, #{updatedAt}) + + + update dating.post set like_count = like_count + 1 where post.post_id = #{postId} + + + update dating.post set like_count= like_count - 1 where post.post_id = #{postId} + + + + DELETE FROM post WHERE post_id = #{postId}