From 9e1c30a81c81dbd11280c866a8f0b21f08c4f632 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 3 Jun 2025 09:02:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E7=97=85=E4=BE=8B?= =?UTF-8?q?=E4=BA=A4=E6=B5=812?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CaseExchangeController.java | 239 ++++++++++++++++- .../example/caseData/dao/CaseExchangeDao.java | 22 ++ .../caseData/dao/StatsCaseExchangeDao.java | 8 +- .../dao/StatsCaseExchangeUserDao.java | 10 +- .../addCaseExchangeComment.java | 25 ++ .../getCaseExchangeCommentPage.java | 43 +++ .../caseData/service/CaseExchangeService.java | 249 ++++++++++++++++++ 7 files changed, 585 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/example/caseData/request/caseExchangeRequest/addCaseExchangeComment.java create mode 100644 src/main/java/com/example/caseData/request/caseExchangeRequest/getCaseExchangeCommentPage.java diff --git a/src/main/java/com/example/caseData/controller/CaseExchangeController.java b/src/main/java/com/example/caseData/controller/CaseExchangeController.java index 9dd9fb9..fcfb69d 100644 --- a/src/main/java/com/example/caseData/controller/CaseExchangeController.java +++ b/src/main/java/com/example/caseData/controller/CaseExchangeController.java @@ -6,14 +6,14 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.caseData.common.Response; import com.example.caseData.dao.*; import com.example.caseData.dto.T; -import com.example.caseData.dto.caseClinicalArticle.CaseClinicalArticleDto; import com.example.caseData.dto.caseExchange.CaseExchangeDto; import com.example.caseData.dto.caseExchangeVote.CaseExchangeVoteDto; import com.example.caseData.dto.caseExchangeVoteOption.CaseExchangeVoteOptionDto; import com.example.caseData.exception.BusinessException; import com.example.caseData.model.*; -import com.example.caseData.request.CaseClinicalArticleRequest.addClinicalArticleComment; import com.example.caseData.request.caseExchangeRequest.addCaseExchange; +import com.example.caseData.request.caseExchangeRequest.addCaseExchangeComment; +import com.example.caseData.request.caseExchangeRequest.getCaseExchangeCommentPage; import com.example.caseData.request.caseExchangeRequest.getCaseExchangeSearchPage; import com.example.caseData.service.CaseExchangeService; import com.example.caseData.utils.Replace; @@ -26,6 +26,7 @@ import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; @RestController @RequestMapping("/api") @@ -345,4 +346,238 @@ public class CaseExchangeController { return Response.success(); } + + /** + * 病例交流-收藏 + */ + @PostMapping("/exchange/collect/{exchange_id}") + public Response AddCaseExchangeCollect( + @PathVariable("exchange_id") String exchangeId + ) { + + String userId = (String) httpServletRequest.getAttribute("userId"); + + if (userId == null) { + return Response.error("操作失败"); + } + + boolean res = caseExchangeService.AddCaseExchangeCollect(exchangeId,userId); + if (!res){ + return Response.error("操作失败"); + } + + return Response.success(); + } + + /** + * 病例交流-取消收藏 + */ + @DeleteMapping("/exchange/collect/{exchange_id}") + public Response DeleteCaseExchangeCollect( + @PathVariable("exchange_id") String exchangeId + ) { + + String userId = (String) httpServletRequest.getAttribute("userId"); + + if (userId == null) { + return Response.error("操作失败"); + } + + boolean res = caseExchangeService.DeleteCaseExchangeCollect(exchangeId,userId); + if (!res){ + return Response.error("操作失败"); + } + + return Response.success(); + } + + /** + * 病例交流-新增评论 + */ + @PostMapping("/exchange/comment/{exchange_id}") + public Response AddCaseExchangeComment( + @PathVariable("exchange_id") String exchangeId, + @Validated() + @RequestBody addCaseExchangeComment request + ) { + + String userId = (String) httpServletRequest.getAttribute("userId"); + + if (userId == null) { + return Response.error("操作失败"); + } + + try { + boolean res = caseExchangeService.AddCaseExchangeComment(exchangeId,userId,request); + if (!res){ + return Response.error("操作失败"); + } + } catch (BusinessException e) { + return Response.error(e.getMessage()); + } + + return Response.success(); + } + + /** + * 病例交流-评论-删除 + */ + @DeleteMapping("/exchange/comment/{comment_id}") + public Response DeleteCaseExchangeComment( + @PathVariable("comment_id") String commentId + ) { + + String userId = (String) httpServletRequest.getAttribute("userId"); + + if (userId == null) { + return Response.error("操作失败"); + } + + try { + boolean res = caseExchangeService.DeleteCaseExchangeComment(commentId,userId); + if (!res){ + return Response.error("操作失败"); + } + } catch (BusinessException e) { + return Response.error(e.getMessage()); + } + + return Response.success(); + } + + /** + * 病例交流-评论-置顶 + */ + @PutMapping("/exchange/comment/top/{comment_id}") + public Response AddTopCaseExchangeComment( + @PathVariable("comment_id") String commentId + ) { + + String userId = (String) httpServletRequest.getAttribute("userId"); + + if (userId == null) { + return Response.error("操作失败"); + } + + try { + boolean res = caseExchangeService.AddTopCaseExchangeComment(commentId,userId); + if (!res){ + return Response.error("操作失败"); + } + } catch (BusinessException e) { + return Response.error(e.getMessage()); + } + + return Response.success(); + } + + /** + * 病例交流-评论-取消置顶 + */ + @DeleteMapping("/exchange/comment/top/{comment_id}") + public Response deleteTopCaseExchangeComment( + @PathVariable("comment_id") String commentId + ) { + + String userId = (String) httpServletRequest.getAttribute("userId"); + + if (userId == null) { + return Response.error("操作失败"); + } + + try { + boolean res = caseExchangeService.deleteTopCaseExchangeComment(commentId,userId); + if (!res){ + return Response.error("操作失败"); + } + } catch (BusinessException e) { + return Response.error(e.getMessage()); + } + + return Response.success(); + } + +// /** +// * 病例交流-评论-列表 +// */ +// @PostMapping("/exchange/comment/page") +// public Response> getCaseExchangeCommentPage( +// @Validated() +// @RequestBody getCaseExchangeCommentPage request +// ) { +// String userId = (String) httpServletRequest.getAttribute("userId"); +// +// // 获取当前登录用户数据 +// UserModel user = userDao.selectById(Long.valueOf(userId)); +// if (user == null) { +// return Response.error(); +// } +// +// request.validateForPage(); +// +// Map resultMap = new HashMap<>(); +// +// Page page = new Page<>(request.getPage(), request.getPageSize()); +// +// // 获取文章评论数据 +// IPage resultPage = userCommentCaseExchangeDao.getCaseExchangeCommentPage( +// page, +// request.getArticleId(), +// request.getRootId() +// ); +// +// // 获取文章数据 +// CaseCaseExchangeModel article = caseExchangeDao.selectById(request.getArticleId()); +// if (article == null) { +// return Response.error(); +// } +// +// if (article.getArticleStatus() != 1){ +// return Response.error(); +// } +// +// // 获取文章作者数据 +// LambdaQueryWrapper authorQueryWrapper = new LambdaQueryWrapper<>(); +// authorQueryWrapper.eq(CaseCaseExchangeAuthorModel::getArticleId, request.getArticleId()); +// List caseExchangeAuthors = caseExchangeAuthorDao.selectList(authorQueryWrapper); +// for (CaseCaseExchangeAuthorModel author : caseExchangeAuthors) { +// // 查询医生 +// CaseClinicalDoctorModel caseClinicalDoctor = caseClinicalDoctorDao.selectById(author.getDoctorId()); +// if (caseClinicalDoctor == null) { +// return Response.error(); +// } +// +// // 处理是否本人评论 +// for (UserCommentCaseExchangeDto dto : resultPage.getRecords()) { +// if (Objects.equals(dto.getUserIden(), caseClinicalDoctor.getDoctorIden())){ +// dto.setIsAuthor(1); +// } +// } +// } +// +// // 处理返回值 +// for (UserCommentCaseExchangeDto dto : resultPage.getRecords()) { +// // 去除用户唯一标识 +// dto.setUserIden(null); +// +// // 获取次级评论 +// if (request.getIsHaveSubComment() == 1){ +// if (dto.getRootId() == null){ +// List subComments = userCommentCaseExchangeDao.getCaseExchangeCommentList( +// dto.getArticleId(), +// dto.getCommentId(), +// 5 +// ); +// +// dto.setSubComment(subComments); +// } +// } +// } +// +// resultMap.put("page", resultPage.getCurrent()); +// resultMap.put("pageSize", resultPage.getSize()); +// resultMap.put("total", resultPage.getTotal()); +// resultMap.put("data", resultPage.getRecords()); +// return Response.success(resultMap); +// } } diff --git a/src/main/java/com/example/caseData/dao/CaseExchangeDao.java b/src/main/java/com/example/caseData/dao/CaseExchangeDao.java index 08097b8..518347b 100644 --- a/src/main/java/com/example/caseData/dao/CaseExchangeDao.java +++ b/src/main/java/com/example/caseData/dao/CaseExchangeDao.java @@ -9,6 +9,7 @@ import com.example.caseData.model.CaseClinicalArticleModel; import com.example.caseData.model.CaseExchangeModel; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; import java.util.Map; @@ -27,4 +28,25 @@ public interface CaseExchangeDao extends BaseMapper { @Param("userId") String userId, @Param("order") Map order ); + + /** + * Inc 自增 + * @param exchangeId 文章 ID + * @param field 字段名称 + * @param numeral 增加的数值 + * @return 更新的行数 + */ + @Update("UPDATE case_exchange SET ${field} = ${field} + #{numeral} WHERE exchange_id = #{exchangeId}") + int inc(@Param("exchangeId") Long exchangeId, @Param("field") String field, @Param("numeral") int numeral); + + /** + * Dec 自减 + * + * @param exchangeId 文章 ID + * @param field 字段名称 + * @param numeral 减少的数值 + * @return 更新的行数 + */ + @Update("UPDATE case_exchange SET ${field} = ${field} - #{numeral} WHERE exchange_id = #{exchangeId}") + int dec(@Param("exchangeId") Long exchangeId, @Param("field") String field, @Param("numeral") int numeral); } diff --git a/src/main/java/com/example/caseData/dao/StatsCaseExchangeDao.java b/src/main/java/com/example/caseData/dao/StatsCaseExchangeDao.java index b984f18..14739a5 100644 --- a/src/main/java/com/example/caseData/dao/StatsCaseExchangeDao.java +++ b/src/main/java/com/example/caseData/dao/StatsCaseExchangeDao.java @@ -9,22 +9,22 @@ import org.apache.ibatis.annotations.Update; public interface StatsCaseExchangeDao extends BaseMapper { /** * Inc 自增 - * @param articleId 文章 ID + * @param statsId 文章 ID * @param field 字段名称 * @param numeral 增加的数值 * @return 更新的行数 */ @Update("UPDATE stats_case_exchange SET ${field} = ${field} + #{numeral} WHERE stats_id = #{statsId}") - int inc(@Param("statsId") Long articleId, @Param("field") String field, @Param("numeral") int numeral); + int inc(@Param("statsId") Long statsId, @Param("field") String field, @Param("numeral") int numeral); /** * Dec 自减 * - * @param articleId 文章 ID + * @param statsId 文章 ID * @param field 字段名称 * @param numeral 减少的数值 * @return 更新的行数 */ @Update("UPDATE stats_case_exchange SET ${field} = ${field} - #{numeral} WHERE stats_id = #{statsId}") - int dec(@Param("statsId") Long articleId, @Param("field") String field, @Param("numeral") int numeral); + int dec(@Param("statsId") Long statsId, @Param("field") String field, @Param("numeral") int numeral); } \ No newline at end of file diff --git a/src/main/java/com/example/caseData/dao/StatsCaseExchangeUserDao.java b/src/main/java/com/example/caseData/dao/StatsCaseExchangeUserDao.java index ad76908..b6b0971 100644 --- a/src/main/java/com/example/caseData/dao/StatsCaseExchangeUserDao.java +++ b/src/main/java/com/example/caseData/dao/StatsCaseExchangeUserDao.java @@ -16,22 +16,22 @@ import java.util.Map; public interface StatsCaseExchangeUserDao extends BaseMapper { /** * Inc 自增 - * @param articleId 文章 ID + * @param userId 文章 ID * @param field 字段名称 * @param numeral 增加的数值 * @return 更新的行数 */ - @Update("UPDATE stats_case_exchange_user SET ${field} = ${field} + #{numeral} WHERE stats_id = #{statsId}") - int inc(@Param("statsId") Long articleId, @Param("field") String field, @Param("numeral") int numeral); + @Update("UPDATE stats_case_exchange_user SET ${field} = ${field} + #{numeral} WHERE user_id = #{userId}") + int inc(@Param("userId") Long userId, @Param("field") String field, @Param("numeral") int numeral); /** * Dec 自减 * - * @param articleId 文章 ID + * @param userId 文章 ID * @param field 字段名称 * @param numeral 减少的数值 * @return 更新的行数 */ @Update("UPDATE stats_case_exchange_user SET ${field} = ${field} - #{numeral} WHERE stats_id = #{statsId}") - int dec(@Param("statsId") Long articleId, @Param("field") String field, @Param("numeral") int numeral); + int dec(@Param("userId") Long userId, @Param("field") String field, @Param("numeral") int numeral); } diff --git a/src/main/java/com/example/caseData/request/caseExchangeRequest/addCaseExchangeComment.java b/src/main/java/com/example/caseData/request/caseExchangeRequest/addCaseExchangeComment.java new file mode 100644 index 0000000..5b89730 --- /dev/null +++ b/src/main/java/com/example/caseData/request/caseExchangeRequest/addCaseExchangeComment.java @@ -0,0 +1,25 @@ +package com.example.caseData.request.caseExchangeRequest; + +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +@Data +public class addCaseExchangeComment { + // 父级 次级评论此字段必须存在 + @JsonProperty("parent_id") + private String parentId; + + // 根评论标识 次级评论此字段必须存在 + @JsonProperty("root_id") + private String rootId; + + // 评论内容 + @JsonProperty("content") + @NotEmpty(message = "请输入评论内容") + private String content; + + // 评论图片 + @JsonProperty("comment_image") + private String commentImage; +} diff --git a/src/main/java/com/example/caseData/request/caseExchangeRequest/getCaseExchangeCommentPage.java b/src/main/java/com/example/caseData/request/caseExchangeRequest/getCaseExchangeCommentPage.java new file mode 100644 index 0000000..bce8cdb --- /dev/null +++ b/src/main/java/com/example/caseData/request/caseExchangeRequest/getCaseExchangeCommentPage.java @@ -0,0 +1,43 @@ +package com.example.caseData.request.caseExchangeRequest; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +@Data +public class getCaseExchangeCommentPage { + // ✅ 分页参数 + @Min(value = 1,message = "页码最小为 1") + private Integer page = 1; + + @JsonProperty("page_size") + @Min(value = 1, message = "每页个数最小为 1") + private Integer pageSize = 20; + + // 文章id + @NotEmpty(message = "错误") + @JsonProperty("exchange_id") + private String exchangeId; + + // 根评论id + @JsonProperty("root_id") + private String rootId; + + // 是否需要子评论(0:否 1:是) + @JsonProperty("is_have_sub_comment") + private Integer isHaveSubComment; + + // ✅ 校验分页参数 + public void validateForPage() { + // 如果 page 为空,设为默认值 1 + if (page == null) { + page = 1; + } + + if (pageSize == null) { + pageSize = 20; + } + } +} diff --git a/src/main/java/com/example/caseData/service/CaseExchangeService.java b/src/main/java/com/example/caseData/service/CaseExchangeService.java index 5a1ab95..a6ccfa9 100644 --- a/src/main/java/com/example/caseData/service/CaseExchangeService.java +++ b/src/main/java/com/example/caseData/service/CaseExchangeService.java @@ -5,14 +5,17 @@ import com.example.caseData.dao.*; import com.example.caseData.exception.BusinessException; import com.example.caseData.model.*; import com.example.caseData.request.caseExchangeRequest.addCaseExchange; +import com.example.caseData.request.caseExchangeRequest.addCaseExchangeComment; import com.example.caseData.utils.Replace; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.time.LocalDateTime; import java.util.Date; import java.util.List; +import java.util.Objects; @Service public class CaseExchangeService { @@ -41,6 +44,12 @@ public class CaseExchangeService { @Resource private StatsCaseExchangeUserDao statsCaseExchangeUserDao; + @Resource + private UserCommentExchangeDao userCommentExchangeDao; + + @Resource + private UserDao userDao; + /** * 新增-病例交流 * @param userId 用户id @@ -165,6 +174,246 @@ public class CaseExchangeService { return true; } + /** + * 新增收藏-病例交流 + * @param exchangeId 病例交流id + * @param userId 用户id + * @return bool + */ + @Transactional + public boolean AddCaseExchangeCollect(String exchangeId,String userId){ + // 获取病例交流数据 + CaseExchangeModel article = caseExchangeDao.selectById(exchangeId); + if (article == null) { + return false; + } + + // 检测用户是否已收藏过 + UserCollectExchangeModel userCollectExchange = getUserCollectExchangeStatus(exchangeId,userId); + if (userCollectExchange != null) { + return true; + } + + // 新增收藏 + UserCollectExchangeModel userCollectExchangeData = new UserCollectExchangeModel(); + userCollectExchangeData.setUserId(Long.valueOf(userId)); + userCollectExchangeData.setExchangeId(Long.valueOf(exchangeId)); + int res = userCollectExchangeDao.insert(userCollectExchangeData); + if (res <= 0){ + return false; + } + + // 增加病例交流收藏数 + caseExchangeDao.inc(Long.valueOf(exchangeId),"collect_num",1); + + // 增加病例交流总收藏数 + statsCaseExchangeDao.inc(1L,"exchange_collect_num",1); + + // 增加用户交流收藏数 + statsCaseExchangeUserDao.inc(Long.valueOf(userId),"exchange_collect_num",1); + + return true; + } + + /** + * 取消收藏-病例交流 + * @param exchangeId 病例交流id + * @param userId 用户id + * @return bool + */ + @Transactional + public boolean DeleteCaseExchangeCollect(String exchangeId,String userId){ + // 检测用户是否已收藏过 + UserCollectExchangeModel userCollectExchange = getUserCollectExchangeStatus(exchangeId,userId); + if (userCollectExchange == null) { + return true; + } + + // 删除收藏 + int res = userCollectExchangeDao.deleteById(userCollectExchange.getCollectId()); + if (res <= 0){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return false; + } + + // 减少病例交流收藏数 + caseExchangeDao.dec(Long.valueOf(exchangeId),"collect_num",1); + + // 减少病例交流总收藏数 + statsCaseExchangeDao.dec(1L,"exchange_collect_num",1); + + // 减少用户交流收藏数 + statsCaseExchangeUserDao.dec(Long.valueOf(userId),"exchange_collect_num",1); + + return true; + } + + /** + * 新增评论-病例交流 + * @param exchangeId 病例交流id + * @param userId 用户id + * @return bool + */ + @Transactional + public boolean AddCaseExchangeComment(String exchangeId, String userId, addCaseExchangeComment request){ + // 获取病例交流数据 + CaseExchangeModel article = caseExchangeDao.selectById(exchangeId); + if (article == null) { + throw new BusinessException("非法病例交流"); + } + + if (article.getExchangeStatus() != 1){ + throw new BusinessException("非法病例交流"); + } + + // 处理评论内容 + BasicSensitiveWordService.FilterResult result = basicSensitiveWordService.filter(request.getContent()); + if (result.hasSensitive == 1){ + throw new BusinessException("存在敏感词,请修改后提交"); + } + + // 新增评论 + UserCommentExchangeModel userCommentExchangeData = new UserCommentExchangeModel(); + userCommentExchangeData.setUserId(Long.valueOf(userId)); + userCommentExchangeData.setExchangeId(Long.valueOf(exchangeId)); + userCommentExchangeData.setStatus(1); + userCommentExchangeData.setIsSensitive(0); + userCommentExchangeData.setContent(request.getContent()); + userCommentExchangeData.setCommentImage(Replace.addOssDomain(request.getCommentImage())); + + // 评论根id + if (request.getRootId() != null) { + userCommentExchangeData.setRootId(Long.valueOf(request.getRootId())); + } + + // 评论父级id + if (request.getParentId() != null) { + userCommentExchangeData.setParentId(Long.valueOf(request.getParentId())); + } + + int res = userCommentExchangeDao.insert(userCommentExchangeData); + return res > 0; + } + + /** + * 删除评论-病例交流 + * @param commentId 评论id + * @param userId 用户id + * @return bool + */ + @Transactional + public boolean DeleteCaseExchangeComment(String commentId, String userId){ + // 获取评论数据 + UserCommentExchangeModel comment = userCommentExchangeDao.selectById(commentId); + if (comment == null) { + return false; + } + + // 获取病例交流数据 + CaseExchangeModel article = caseExchangeDao.selectById(comment.getExchangeId()); + if (article == null) { + return false; + } + + if (article.getExchangeStatus() != 1){ + return false; + } + + // 检测用户是否病例交流作者 + if (!Objects.equals(comment.getUserId(), Long.valueOf(userId))){ + return false; + } + + // 删除评论 + int res = userCommentExchangeDao.deleteById(comment.getCommentId()); + if (res <= 0){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return false; + } + + return true; + } + + /** + * 置顶评论-病例交流 + * @param commentId 评论id + * @param userId 用户id + * @return bool + */ + @Transactional + public boolean AddTopCaseExchangeComment(String commentId, String userId){ + // 获取评论数据 + UserCommentExchangeModel comment = userCommentExchangeDao.selectById(commentId); + if (comment == null) { + return false; + } + + // 获取病例交流数据 + CaseExchangeModel article = caseExchangeDao.selectById(comment.getExchangeId()); + if (article == null) { + return false; + } + + if (article.getExchangeStatus() != 1){ + return false; + } + + // 检测用户是否病例交流作者 + if (!Objects.equals(comment.getUserId(), Long.valueOf(userId))){ + return false; + } + + if (comment.getIsTop() == 1){ + return true; + } + + // 置顶评论 + comment.setIsTop(1); + userCommentExchangeDao.updateById(comment); + + return true; + } + + /** + * 取消置顶评论-病例交流 + * @param commentId 评论id + * @param userId 用户id + * @return bool + */ + @Transactional + public boolean deleteTopCaseExchangeComment(String commentId, String userId){ + // 获取评论数据 + UserCommentExchangeModel comment = userCommentExchangeDao.selectById(commentId); + if (comment == null) { + return false; + } + + // 获取病例交流数据 + CaseExchangeModel article = caseExchangeDao.selectById(comment.getExchangeId()); + if (article == null) { + return false; + } + + if (article.getExchangeStatus() != 1){ + return false; + } + + // 检测用户是否病例交流作者 + if (!Objects.equals(comment.getUserId(), Long.valueOf(userId))){ + return false; + } + + // 取消置顶评论 + if (comment.getIsTop() == 0){ + return true; + } + + // 置顶评论 + comment.setIsTop(0); + userCommentExchangeDao.updateById(comment); + + return true; + } /** * 获取用户收藏数据