From 0ce96c310492840204da2ac0db3fa6b306595128 Mon Sep 17 00:00:00 2001 From: KilLze Date: Fri, 19 Dec 2025 20:21:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=A1=E6=A0=B8=EF=BC=8C?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E6=9C=AA=E9=80=9A=E8=BF=87=E4=BE=9D=E6=97=A7?= =?UTF-8?q?=E4=BC=9A=E5=8A=A0=E5=85=A5=E6=95=B0=E6=8D=AE=E5=BA=93=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E5=B0=86=E5=8A=A8=E6=80=81=E7=8A=B6=E6=80=81=E6=94=B9?= =?UTF-8?q?=E4=B8=BA2=EF=BC=88=E6=9C=AA=E9=80=9A=E8=BF=87=EF=BC=89?= =?UTF-8?q?=EF=BC=8C=E8=8B=A5=E6=9C=89=E5=AB=8C=E7=96=91=E5=88=99=E6=94=B9?= =?UTF-8?q?=E4=B8=BA1=E8=BF=9B=E8=A1=8C=E4=BA=BA=E5=B7=A5=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=EF=BC=8C=E9=80=9A=E8=BF=87=E5=88=99=E4=B8=BA0=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=A8=E6=80=81=E4=BF=AE=E6=94=B9=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E5=8F=AF=E4=BB=A5=E4=BF=AE=E6=94=B9=E6=96=87?= =?UTF-8?q?=E6=9C=AC=EF=BC=8C=E5=9B=BE=E7=89=87=EF=BC=8C=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=86=85=E5=AE=B9=E8=8B=A5=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E6=9C=AA=E9=80=9A=E8=BF=87=E5=88=99=E5=B0=86=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=94=B9=E4=B8=BA2=EF=BC=8C=E8=8B=A5=E6=9C=89?= =?UTF-8?q?=E5=AB=8C=E7=96=91=E5=88=99=E6=94=B9=E4=B8=BA1=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E4=BA=BA=E5=B7=A5=E5=AE=A1=E6=A0=B8=EF=BC=8C=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=88=99=E6=94=B9=E4=B8=BA0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bao/dating/controller/PostController.java | 33 +++- .../com/bao/dating/mapper/PostMapper.java | 27 ++- .../bao/dating/pojo/dto/PostRequestDTO.java | 7 +- .../com/bao/dating/pojo/vo/PostEditVO.java | 19 ++ .../com/bao/dating/service/PostService.java | 22 ++- .../dating/service/impl/PostServiceImpl.java | 164 ++++++++++++++---- .../com/bao/dating/mapper/PostMapper.xml | 52 +++++- 7 files changed, 276 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/bao/dating/pojo/vo/PostEditVO.java diff --git a/src/main/java/com/bao/dating/controller/PostController.java b/src/main/java/com/bao/dating/controller/PostController.java index 526a2ae..2db3b33 100644 --- a/src/main/java/com/bao/dating/controller/PostController.java +++ b/src/main/java/com/bao/dating/controller/PostController.java @@ -5,6 +5,7 @@ import com.bao.dating.common.Result; import com.bao.dating.common.ResultCode; import com.bao.dating.pojo.dto.PostRequestDTO; import com.bao.dating.pojo.entity.Post; +import com.bao.dating.pojo.vo.PostEditVO; import com.bao.dating.service.PostService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -32,13 +33,14 @@ public class PostController { /** * 发布动态接口 - JSON格式请求 - * @param postRequestDTO 动态信息 + * @param postDTO 动态信息 + * @param userId 用户ID * @return 发布的动态对象 */ @PostMapping(consumes = "application/json") - public Result createPostJson(@RequestBody PostRequestDTO postRequestDTO) { + public Result createPostJson(@RequestBody PostRequestDTO postDTO, @RequestParam Long userId) { // 调用 Service 层处理发布动态业务逻辑 - Post result = postService.createPost(postRequestDTO); + Post result = postService.createPost(userId, postDTO); return Result.success(ResultCode.SUCCESS_REVIEW, "动态发布成功,等待审核。", result); } @@ -49,8 +51,31 @@ public class PostController { * @return 删除结果 */ @DeleteMapping("/{postId}") - public Result deleteById(@PathVariable Integer postId){ + public Result deleteById(@PathVariable Long postId){ postService.deletePostById(postId); return Result.success(ResultCode.SUCCESS_DELETE, "动态删除成功", null); } + + /** + * 根据ID查询动态接口 + * @param postId 动态ID + * @return 动态对象 + */ + @GetMapping("/{postId}") + public Result getPostById(@PathVariable Long postId) { + PostEditVO postEditVO = postService.getPostForEdit(postId); + return Result.success(ResultCode.SUCCESS,"查询成功", postEditVO); + } + + /** + * 更新动态接口 + * @param postId 动态ID + * @param postRequestDTO 动态信息 + * @return 更新后的动态对象 + */ + @PutMapping("/{postId}") + public Result updatePost(@PathVariable Long postId, @RequestBody PostRequestDTO postRequestDTO) { + PostEditVO result = postService.updatePost(postId, postRequestDTO); + return Result.success(ResultCode.SUCCESS_REVIEW, "动态更新成功", result); + } } \ No newline at end of file diff --git a/src/main/java/com/bao/dating/mapper/PostMapper.java b/src/main/java/com/bao/dating/mapper/PostMapper.java index 4e31426..d4bd5b2 100644 --- a/src/main/java/com/bao/dating/mapper/PostMapper.java +++ b/src/main/java/com/bao/dating/mapper/PostMapper.java @@ -2,24 +2,39 @@ package com.bao.dating.mapper; import com.bao.dating.pojo.entity.Post; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; @Mapper public interface PostMapper { /** * 插入动态 * - * @param post 动态对象 - * @return 插入的行数 + * @param post */ - int insert(Post post); + void insert(Post post); /** * 根据ID删除动态 * * @param postId 动态ID - * @return 删除的行数 */ - int deletePostById(Integer postId); + void deletePostById(@Param("postId") Long postId); + + /** + * 根据ID查询动态 + * + * @param postId + * @return + */ + Post selectById(@Param("postId") Long postId); + + /** + * 根据ID更新动态 + * + * @param post + * @return + */ + void updateById(Post post); /** * 查询点赞数 @@ -44,4 +59,4 @@ public interface PostMapper { * @return 影响行数 */ int decreaseLikeCount(Long postId); -} +} \ No newline at end of file diff --git a/src/main/java/com/bao/dating/pojo/dto/PostRequestDTO.java b/src/main/java/com/bao/dating/pojo/dto/PostRequestDTO.java index fde914d..27b23b9 100644 --- a/src/main/java/com/bao/dating/pojo/dto/PostRequestDTO.java +++ b/src/main/java/com/bao/dating/pojo/dto/PostRequestDTO.java @@ -1,14 +1,15 @@ package com.bao.dating.pojo.dto; import lombok.Data; -import org.springframework.web.multipart.MultipartFile; import java.util.List; +/** + * 动态数据传输对象 + */ @Data public class PostRequestDTO { - private Long userId; private String content; + private List mediaOssKeys; private List tags; - private List mediaUrls; } \ No newline at end of file diff --git a/src/main/java/com/bao/dating/pojo/vo/PostEditVO.java b/src/main/java/com/bao/dating/pojo/vo/PostEditVO.java new file mode 100644 index 0000000..87e6bdd --- /dev/null +++ b/src/main/java/com/bao/dating/pojo/vo/PostEditVO.java @@ -0,0 +1,19 @@ +package com.bao.dating.pojo.vo; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 修改内容查询返回数据 + */ +@Data +public class PostEditVO { + private Long postId; + private String content; + private List mediaOssKeys; + private List tags; + private Integer isPublic; + private LocalDateTime updatedAt; +} \ No newline at end of file diff --git a/src/main/java/com/bao/dating/service/PostService.java b/src/main/java/com/bao/dating/service/PostService.java index a60fff8..975e78a 100644 --- a/src/main/java/com/bao/dating/service/PostService.java +++ b/src/main/java/com/bao/dating/service/PostService.java @@ -2,6 +2,7 @@ package com.bao.dating.service; import com.bao.dating.pojo.dto.PostRequestDTO; import com.bao.dating.pojo.entity.Post; +import com.bao.dating.pojo.vo.PostEditVO; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -16,15 +17,30 @@ public interface PostService { /** * 创建动态 - * @param postRequestDTO 动态请求数据传输对象 + * @param userId 用户ID + * @param postRequestDTO 动态数据传输对象 * @return 创建的动态对象 */ - Post createPost(PostRequestDTO postRequestDTO); + Post createPost(Long userId, PostRequestDTO postRequestDTO); /** * 删除动态 * @param postId 动态ID * @return 删除的动态对象 */ - void deletePostById(Integer postId); + void deletePostById(Long postId); + + /** + * 查询动态详情(用于编辑) + * @param postId 动态ID + */ + PostEditVO getPostForEdit(Long postId); + + /** + * 修改动态 + * @param postId 动态ID + * @param postRequestDTO 修改的动态数据传输对象 + * @return 修改后的动态对象 + */ + PostEditVO updatePost(Long postId, PostRequestDTO postRequestDTO); } \ No newline at end of file diff --git a/src/main/java/com/bao/dating/service/impl/PostServiceImpl.java b/src/main/java/com/bao/dating/service/impl/PostServiceImpl.java index 96d802d..76abdff 100644 --- a/src/main/java/com/bao/dating/service/impl/PostServiceImpl.java +++ b/src/main/java/com/bao/dating/service/impl/PostServiceImpl.java @@ -5,9 +5,11 @@ import com.bao.dating.common.aliyun.GreenTextScan; import com.bao.dating.mapper.PostMapper; import com.bao.dating.pojo.dto.PostRequestDTO; import com.bao.dating.pojo.entity.Post; +import com.bao.dating.pojo.vo.PostEditVO; import com.bao.dating.service.PostService; import com.bao.dating.util.AliOssUtil; import com.bao.dating.util.FileUtil; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -77,11 +79,23 @@ public class PostServiceImpl implements PostService { /** * 创建动态 * - * @param postRequestDTO 动态请求数据传输对象 + * @param userId 用户ID + * @param postRequestDTO 动态数据传输对象 * @return 创建的动态对象 */ @Override - public Post createPost(PostRequestDTO postRequestDTO) { + public Post createPost(Long userId, PostRequestDTO postRequestDTO) { + + // 创建动态对象 + Post post = new Post(); + post.setUserId(userId); + post.setContent(postRequestDTO.getContent()); + post.setTags(postRequestDTO.getTags()); + post.setMediaOssKeys(new ArrayList<>()); + // 如果有传入的媒体链接,则使用它们 + if (postRequestDTO.getMediaOssKeys() != null && !postRequestDTO.getMediaOssKeys().isEmpty()) { + post.setMediaOssKeys(postRequestDTO.getMediaOssKeys()); + } // 1. 文本内容审核 Map textResult; @@ -90,45 +104,45 @@ public class PostServiceImpl implements PostService { } catch (Exception e) { throw new RuntimeException("文本审核失败"); } - + // 文本审核结果 String textSuggestion = (String) textResult.get("suggestion"); - if ("block".equals(textSuggestion)) { - throw new RuntimeException("动态内容违规,禁止发布"); - } // 2. 图片审核(如果有) - if (postRequestDTO.getMediaUrls() != null && !postRequestDTO.getMediaUrls().isEmpty()) { + if (postRequestDTO.getMediaOssKeys() != null && !postRequestDTO.getMediaOssKeys().isEmpty()) { Map imageResult; try { - imageResult = greenImageScan.imageScan(postRequestDTO.getMediaUrls()); + imageResult = greenImageScan.imageScan(postRequestDTO.getMediaOssKeys()); } catch (Exception e) { throw new RuntimeException(e); } - - if ("block".equals(imageResult.get("suggestion"))) { - throw new RuntimeException("图片内容违规,禁止发布"); + // 图片审核结果 + String imageSuggestion = (String) imageResult.get("suggestion"); + + // 根据审核结果设置状态 + if ("block".equals(textSuggestion) || "block".equals(imageSuggestion)) { + // 审核未通过,允许用户修改 + post.setIsPublic(2); + } else if ("review".equals(textSuggestion) || "review".equals(imageSuggestion)) { + // 待审核,需人工审核 + post.setIsPublic(1); + } else { + // 审核通过 + post.setIsPublic(0); + } + } else { + // 只有文本内容的情况 + if ("block".equals(textSuggestion)) { + // 审核未通过,允许用户修改 + post.setIsPublic(2); + } else if ("review".equals(textSuggestion)) { + // 待审核,需人工审核 + post.setIsPublic(1); + } else { + // 审核通过 + post.setIsPublic(0); } } - - Post post = new Post(); - post.setUserId(Long.valueOf(postRequestDTO.getUserId())); - post.setContent(postRequestDTO.getContent()); - post.setTags(postRequestDTO.getTags()); - post.setMediaOssKeys(new ArrayList<>()); - // 如果有传入的媒体链接,则使用它们 - if (postRequestDTO.getMediaUrls() != null && !postRequestDTO.getMediaUrls().isEmpty()) { - post.setMediaOssKeys(postRequestDTO.getMediaUrls()); - } - - // 4. 根据审核结果设置状态 - if ("review".equals(textSuggestion)) { - // 待审核,需人工审核 - post.setIsPublic(0); - } else { - // 审核通过 - post.setIsPublic(1); - } post.setUpdatedAt(LocalDateTime.now()); post.setCreatedAt(LocalDateTime.now()); @@ -144,7 +158,95 @@ public class PostServiceImpl implements PostService { * @return 删除的动态对象 */ @Override - public void deletePostById(Integer postId) { + public void deletePostById(Long postId) { postMapper.deletePostById(postId); } + + @Override + public PostEditVO getPostForEdit(Long postId) { + + Post post = postMapper.selectById(postId); + if (post == null) { + throw new RuntimeException("动态不存在"); + } + PostEditVO postEditVO = new PostEditVO(); + BeanUtils.copyProperties(post, postEditVO); + return postEditVO; + } + + /** + * 修改动态 + * @param postId 动态ID + * @param postRequestDTO 修改的动态数据传输对象 + * @return + */ + @Override + public PostEditVO updatePost(Long postId, PostRequestDTO postRequestDTO) { + // 查询动态 + Post post = postMapper.selectById(postId); + if (post == null) { + throw new RuntimeException("动态不存在"); + } + post.setContent(postRequestDTO.getContent()); + if (postRequestDTO.getMediaOssKeys() != null && !postRequestDTO.getMediaOssKeys().isEmpty()) { + post.setMediaOssKeys(postRequestDTO.getMediaOssKeys()); + } + + // 1. 文本内容审核 + Map textResult; + try { + textResult = greenTextScan.greeTextScan(postRequestDTO.getContent()); + } catch (Exception e) { + throw new RuntimeException("文本审核失败"); + } + // 文本审核结果 + String textSuggestion = (String) textResult.get("suggestion"); + + // 2. 图片审核(如果有) + if (postRequestDTO.getMediaOssKeys() != null && !postRequestDTO.getMediaOssKeys().isEmpty()) { + Map imageResult; + try { + imageResult = greenImageScan.imageScan(postRequestDTO.getMediaOssKeys()); + } catch (Exception e) { + throw new RuntimeException(e); + } + // 图片审核结果 + String imageSuggestion = (String) imageResult.get("suggestion"); + + // 根据审核结果设置状态 + if ("block".equals(textSuggestion) || "block".equals(imageSuggestion)) { + // 审核未通过,允许用户修改 + post.setIsPublic(2); + } else if ("review".equals(textSuggestion) || "review".equals(imageSuggestion)) { + // 待审核,需人工审核 + post.setIsPublic(1); + } else { + // 审核通过 + post.setIsPublic(0); + } + } else { + // 只有文本内容的情况 + if ("block".equals(textSuggestion)) { + // 审核未通过,允许用户修改 + post.setIsPublic(2); + } else if ("review".equals(textSuggestion)) { + // 待审核,需人工审核 + post.setIsPublic(1); + } else { + // 审核通过 + post.setIsPublic(0); + } + } + post.setTags(postRequestDTO.getTags()); + post.setUpdatedAt(LocalDateTime.now()); + + // 更新动态 + postMapper.updateById(post); + + // 返回动态详情 + PostEditVO postEditVO = new PostEditVO(); + BeanUtils.copyProperties(post, postEditVO); + return postEditVO; + } + } \ 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 fcb9c1d..c0dd465 100644 --- a/src/main/resources/com/bao/dating/mapper/PostMapper.xml +++ b/src/main/resources/com/bao/dating/mapper/PostMapper.xml @@ -29,10 +29,60 @@ - + DELETE FROM post WHERE post_id = #{postId} + + + + + + + + + + + + + + + + + + + UPDATE post + + + content = #{content}, + + + tags = #{tags, typeHandler=com.bao.dating.handler.ListToVarcharTypeHandler}, + + + media_oss_keys = + #{mediaOssKeys, typeHandler=com.bao.dating.handler.ListToVarcharTypeHandler}, + + is_public = #{isPublic}, + updated_at = #{updatedAt} + + WHERE post_id = #{postId} + + update dating.post set like_count = like_count + 1 where post.post_id = #{postId}