diff --git a/src/main/java/com/bao/dating/util/AliOssUtil.java b/src/main/java/com/bao/dating/common/aliyun/AliOssUtil.java similarity index 89% rename from src/main/java/com/bao/dating/util/AliOssUtil.java rename to src/main/java/com/bao/dating/common/aliyun/AliOssUtil.java index f4035b34..f0f49fbe 100644 --- a/src/main/java/com/bao/dating/util/AliOssUtil.java +++ b/src/main/java/com/bao/dating/common/aliyun/AliOssUtil.java @@ -1,4 +1,4 @@ -package com.bao.dating.util; +package com.bao.dating.common.aliyun; import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; @@ -7,12 +7,15 @@ import com.aliyun.oss.OSSException; import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; @Data -@AllArgsConstructor @Slf4j +@Component +@ConfigurationProperties(prefix = "aliyun.oss") public class AliOssUtil { private String endpoint; diff --git a/src/main/java/com/bao/dating/common/aliyun/GreenImageScan.java b/src/main/java/com/bao/dating/common/aliyun/GreenImageScan.java index 75cacec5..cd6c7c22 100644 --- a/src/main/java/com/bao/dating/common/aliyun/GreenImageScan.java +++ b/src/main/java/com/bao/dating/common/aliyun/GreenImageScan.java @@ -61,19 +61,24 @@ public class GreenImageScan { if (scanImageResponse.getStatusCode() == 200) { - List subResults = scanImageResponse.body.data.results.get(0).getSubResults(); + List results = scanImageResponse.body.data.results; - ListIterator listIterator = subResults.listIterator(); - while (listIterator.hasNext()) { - ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResults item = listIterator.next(); - - if (!item.suggestion.equals("pass")) { - resultMap.put("suggestion", item.suggestion); - resultMap.put("label", item.label); - return resultMap; + // 遍历每一张图片的审核结果 + for (ScanImageResponseBody.ScanImageResponseBodyDataResults result : results) { + List subResults = result.getSubResults(); + + // 检查这张图片的所有子审核项 + for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResults subResult : subResults) { + // 如果有任何一项未通过审核,则整个审核不通过 + if (!subResult.suggestion.equals("pass")) { + resultMap.put("suggestion", subResult.suggestion); + resultMap.put("label", subResult.label); + return resultMap; + } } } - // 所有审核项都通过时,返回pass结果 + + // 所有图片的所有审核项都通过时,返回pass结果 resultMap.put("suggestion", "pass"); resultMap.put("label", "normal"); return resultMap; @@ -94,4 +99,4 @@ public class GreenImageScan { return null; } } -} +} \ No newline at end of file diff --git a/src/main/java/com/bao/dating/config/OssConfiguration.java b/src/main/java/com/bao/dating/config/OssConfiguration.java deleted file mode 100644 index 01189d1a..00000000 --- a/src/main/java/com/bao/dating/config/OssConfiguration.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.bao.dating.config; - - -import com.bao.dating.properties.AliOssProperties; -import com.bao.dating.util.AliOssUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * 配置类,用于创建AliOssUtil对象 - */ -@Configuration -@Slf4j -public class OssConfiguration { - @Bean - @ConditionalOnMissingBean - public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){ - log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties); - return new AliOssUtil(aliOssProperties.getEndpoint(), - aliOssProperties.getAccessKeyId(), - aliOssProperties.getAccessKeySecret(), - aliOssProperties.getBucketName()); - } -} diff --git a/src/main/java/com/bao/dating/controller/PostController.java b/src/main/java/com/bao/dating/controller/PostController.java index 4525669b..da5761c3 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 c4b47d54..668be550 100644 --- a/src/main/java/com/bao/dating/mapper/PostMapper.java +++ b/src/main/java/com/bao/dating/mapper/PostMapper.java @@ -9,18 +9,32 @@ 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); /** * 查询点赞数 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 fde914d9..27b23b9c 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 00000000..87e6bddd --- /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/properties/AliOssProperties.java b/src/main/java/com/bao/dating/properties/AliOssProperties.java deleted file mode 100644 index 77567543..00000000 --- a/src/main/java/com/bao/dating/properties/AliOssProperties.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.bao.dating.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@ConfigurationProperties(prefix = "aliyun.oss") -@Data -public class AliOssProperties { - private String endpoint; - private String accessKeyId; - private String accessKeySecret; - private String bucketName; -} diff --git a/src/main/java/com/bao/dating/service/PostService.java b/src/main/java/com/bao/dating/service/PostService.java index b74f9f64..1c69800b 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,17 +17,32 @@ 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); /** * 查询 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 5b7c3cb8..c897f196 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.common.aliyun.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,48 @@ 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); } + // 图片审核结果 + String imageSuggestion = (String) imageResult.get("suggestion"); - if ("block".equals(imageResult.get("suggestion"))) { - throw new RuntimeException("图片内容违规,禁止发布"); + // 根据审核结果设置状态 + 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,18 +161,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; + } + /** - * 查询用户id - * @param postId 动态id + * 修改动态 + * @param postId 动态ID + * @param postRequestDTO 修改的动态数据传输对象 * @return */ - @Override - public Long selectUserIdByPostId(Long postId) { - return postMapper.selectUserIdByPostId(postId); + 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 fb5630e4..54e49110 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}