From e679fd847e2c3b8e14952c1f67ea95b6f7795ab6 Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Wed, 12 Feb 2025 16:59:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(resource):=20=E8=B0=83=E6=95=B4=E8=AF=84?= =?UTF-8?q?=E8=AE=BA=E5=92=8C=E5=9B=9E=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resource/ModelCommentController.java | 22 +- .../resource/WorkFlowCommentController.java | 20 +- .../common/handler/MyMetaObjectHandler.java | 3 +- .../mcwl/resource/domain/ModelComment.java | 6 + .../resource/domain/ModelImageComment.java | 6 + .../mcwl/resource/domain/WorkFlowComment.java | 6 + .../resource/domain/dto/ModelCommentRes.java | 39 ++++ .../domain/dto/ModelImageCommentRes.java | 7 + .../domain/dto/WorkFlowCommentRes.java | 39 ++++ .../resource/domain/vo/ModelCommentVo.java | 6 + .../domain/vo/ModelImageCommentVo.java | 7 + .../resource/domain/vo/WorkFlowCommentVo.java | 6 + .../resource/service/ModelCommentService.java | 3 +- .../service/WorkFlowCommentService.java | 3 +- .../service/impl/ModelCommentServiceImpl.java | 154 +++++++++++-- .../impl/ModelImageCommentServiceImpl.java | 179 +++++++++------ .../impl/WorkFlowCommentServiceImpl.java | 203 +++++++++++------- 17 files changed, 522 insertions(+), 187 deletions(-) create mode 100644 mcwl-resource/src/main/java/com/mcwl/resource/domain/dto/ModelCommentRes.java create mode 100644 mcwl-resource/src/main/java/com/mcwl/resource/domain/dto/WorkFlowCommentRes.java diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/ModelCommentController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/ModelCommentController.java index 0d1f003..d04269c 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/ModelCommentController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/ModelCommentController.java @@ -3,6 +3,7 @@ package com.mcwl.web.controller.resource; import com.mcwl.common.annotation.RepeatSubmit; import com.mcwl.common.core.domain.AjaxResult; import com.mcwl.resource.domain.ModelComment; +import com.mcwl.resource.domain.dto.ModelCommentRes; import com.mcwl.resource.domain.vo.ModelCommentVo; import com.mcwl.resource.service.ModelCommentLikeService; import com.mcwl.resource.service.ModelCommentService; @@ -12,6 +13,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import javax.validation.constraints.NotNull; import java.util.List; @@ -42,8 +44,8 @@ public class ModelCommentController { */ @ApiOperation(value = "模型点赞/取消") @RepeatSubmit - @GetMapping("/modelLike/{modelId}") - public AjaxResult like(@PathVariable Long modelId) { + @GetMapping("/modelLike") + public AjaxResult like(@Valid @NotNull(message = "模型id不能为空") Long modelId) { modelLikeService.like(modelId); return AjaxResult.success(); } @@ -54,8 +56,8 @@ public class ModelCommentController { */ @ApiOperation(value = "模型评论发布") @PostMapping("/comment") - public AjaxResult comment(@RequestBody ModelComment modelComment) { - modelCommentService.comment(modelComment); + public AjaxResult comment(@Valid @RequestBody ModelCommentRes modelCommentRes) { + modelCommentService.comment(modelCommentRes); return AjaxResult.success(); } @@ -64,8 +66,8 @@ public class ModelCommentController { */ @ApiOperation(value = "模型评论点赞/取消") @RepeatSubmit - @GetMapping("/commentLike/{commentId}") - public AjaxResult commentLike(@PathVariable Long commentId) { + @GetMapping("/commentLike") + public AjaxResult commentLike(@Valid @NotNull(message = "评论id不能为空") Long commentId) { modelCommentLikeService.like(commentId); return AjaxResult.error(); } @@ -76,8 +78,8 @@ public class ModelCommentController { * 获取模型评论 */ @ApiOperation(value = "获取模型评论") - @GetMapping("/comment/{modelId}") - public AjaxResult getComment(@PathVariable @NotNull(message = "模型id不能为空") Long modelId) { + @GetMapping("/comment") + public AjaxResult getComment(@Valid @NotNull(message = "模型id不能为空") Long modelId) { List modelCommentList = modelCommentService.getComment(modelId); return AjaxResult.success(modelCommentList); } @@ -87,8 +89,8 @@ public class ModelCommentController { * 删除模型评论 */ @ApiOperation(value = "删除模型评论") - @GetMapping("/commentDelete/{commentId}") - public AjaxResult commentDelete(@PathVariable @NotNull(message = "评论id不能为空") Long commentId) { + @GetMapping("/commentDelete") + public AjaxResult commentDelete(@Valid @NotNull(message = "评论id不能为空") Long commentId) { modelCommentService.removeById(commentId); return AjaxResult.success(); } diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/WorkFlowCommentController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/WorkFlowCommentController.java index ef1ae63..61c0a06 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/WorkFlowCommentController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/resource/WorkFlowCommentController.java @@ -2,6 +2,7 @@ package com.mcwl.web.controller.resource; import com.mcwl.common.core.domain.AjaxResult; import com.mcwl.resource.domain.WorkFlowComment; +import com.mcwl.resource.domain.dto.WorkFlowCommentRes; import com.mcwl.resource.domain.vo.WorkFlowCommentVo; import com.mcwl.resource.service.WorkFlowCommentLikeService; import com.mcwl.resource.service.WorkFlowCommentService; @@ -11,6 +12,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import javax.validation.constraints.NotNull; import java.util.List; @@ -53,8 +55,8 @@ public class WorkFlowCommentController { */ @ApiOperation(value = "工作流评论发布") @PostMapping("/comment") - public AjaxResult comment(@RequestBody WorkFlowComment modelComment) { - workFlowCommentService.comment(modelComment); + public AjaxResult comment(@RequestBody WorkFlowCommentRes workFlowCommentRes) { + workFlowCommentService.comment(workFlowCommentRes); return AjaxResult.success(); } @@ -62,8 +64,8 @@ public class WorkFlowCommentController { * 工作流评论点赞/取消 */ @ApiOperation(value = "工作流评论点赞/取消") - @GetMapping("/commentLike/{commentId}") - public AjaxResult commentLike(@PathVariable Long commentId) { + @GetMapping("/commentLike") + public AjaxResult commentLike(@Valid @NotNull(message = "评论id不能为空") Long commentId) { workFlowCommentLikeService.like(commentId); return AjaxResult.error(); } @@ -74,9 +76,9 @@ public class WorkFlowCommentController { * 获取工作流评论 */ @ApiOperation(value = "获取工作流评论") - @GetMapping("/comment/{modelId}") - public AjaxResult getComment(@PathVariable @NotNull(message = "模型id不能为空") Long modelId) { - List modelCommentList = workFlowCommentService.getComment(modelId); + @GetMapping("/comment") + public AjaxResult getComment(@Valid @NotNull(message = "模型id不能为空") Long commentId) { + List modelCommentList = workFlowCommentService.getComment(commentId); return AjaxResult.success(modelCommentList); } @@ -85,8 +87,8 @@ public class WorkFlowCommentController { * 删除工作流评论 */ @ApiOperation(value = "删除工作流评论") - @GetMapping("/commentDelete/{commentId}") - public AjaxResult commentDelete(@PathVariable @NotNull(message = "评论id不能为空") Long commentId) { + @GetMapping("/commentDelete") + public AjaxResult commentDelete(@Valid @NotNull(message = "评论id不能为空") Long commentId) { workFlowCommentService.removeById(commentId); return AjaxResult.success(); } diff --git a/mcwl-common/src/main/java/com/mcwl/common/handler/MyMetaObjectHandler.java b/mcwl-common/src/main/java/com/mcwl/common/handler/MyMetaObjectHandler.java index 02160c5..c59718d 100644 --- a/mcwl-common/src/main/java/com/mcwl/common/handler/MyMetaObjectHandler.java +++ b/mcwl-common/src/main/java/com/mcwl/common/handler/MyMetaObjectHandler.java @@ -36,8 +36,7 @@ public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void updateFill(MetaObject metaObject) { try { - String username = SecurityUtils.getUsername(); - this.setFieldValByName("updateBy", username, metaObject); + this.setFieldValByName("updateBy", SecurityUtils.getUsername(), metaObject); } catch (Exception e) { this.setFieldValByName("updateBy", "", metaObject); } diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelComment.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelComment.java index bb97c70..70a3cfb 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelComment.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelComment.java @@ -48,6 +48,12 @@ public class ModelComment extends BaseEntity { @ApiModelProperty(value = "父评论id") private Long parentId; + /** + * 回复人 + */ + @ApiModelProperty(value = "回复人") + private Long replyUserId; + /** * 点赞数 */ diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelImageComment.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelImageComment.java index 2793c20..73ccb19 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelImageComment.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/ModelImageComment.java @@ -45,6 +45,12 @@ public class ModelImageComment extends BaseEntity { @ApiModelProperty(value = "父评论id") private Long parentId; + /** + * 回复人 + */ + @ApiModelProperty(value = "回复人") + private Long replyUserId; + /** * 点赞数 */ diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/domain/WorkFlowComment.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/WorkFlowComment.java index da790e0..5ea0396 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/domain/WorkFlowComment.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/WorkFlowComment.java @@ -47,6 +47,12 @@ public class WorkFlowComment extends BaseEntity { @ApiModelProperty ("父评论id") private Long parentId; + /** + * 回复人 + */ + @ApiModelProperty ("回复人") + private Long replyUserId; + /** * 点赞数 */ diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/domain/dto/ModelCommentRes.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/dto/ModelCommentRes.java new file mode 100644 index 0000000..d7d26c6 --- /dev/null +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/dto/ModelCommentRes.java @@ -0,0 +1,39 @@ +package com.mcwl.resource.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel(description = "模型评论请求参数") +@Data +public class ModelCommentRes { + /** + * 工作流id + */ + @ApiModelProperty(value = "模型id", required = true) + @NotNull(message = "模型id不能为空") + private Long workFlowId; + + /** + * 评论内容 + */ + @ApiModelProperty(value = "评论内容", required = true) + @NotBlank(message = "评论内容不能为空") + private String content; + + /** + * 父评论id + */ + @ApiModelProperty(value = "父评论id") + private Long parentId; + + /** + * 回复人 + */ + @ApiModelProperty(value = "回复人") + private Long replyUserId; + +} diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/domain/dto/ModelImageCommentRes.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/dto/ModelImageCommentRes.java index 8667a0f..6e16bfe 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/domain/dto/ModelImageCommentRes.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/dto/ModelImageCommentRes.java @@ -29,4 +29,11 @@ public class ModelImageCommentRes { @ApiModelProperty(value = "父评论id") private Long parentId; + /** + * 回复人 + */ + @ApiModelProperty(value = "回复人") + private Long replyUserId; + + } diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/domain/dto/WorkFlowCommentRes.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/dto/WorkFlowCommentRes.java new file mode 100644 index 0000000..0a879b1 --- /dev/null +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/dto/WorkFlowCommentRes.java @@ -0,0 +1,39 @@ +package com.mcwl.resource.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@ApiModel(description = "工作流评论请求参数") +@Data +public class WorkFlowCommentRes { + /** + * 工作流id + */ + @ApiModelProperty(value = "工作流id", required = true) + @NotNull(message = "工作流id不能为空") + private Long workFlowId; + + /** + * 评论内容 + */ + @ApiModelProperty(value = "评论内容", required = true) + @NotBlank(message = "评论内容不能为空") + private String content; + + /** + * 父评论id + */ + @ApiModelProperty(value = "父评论id") + private Long parentId; + + /** + * 回复人 + */ + @ApiModelProperty(value = "回复人") + private Long replyUserId; + +} diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelCommentVo.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelCommentVo.java index a4ce29f..04cc35f 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelCommentVo.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelCommentVo.java @@ -54,6 +54,12 @@ public class ModelCommentVo { @ApiModelProperty(value = "评论内容") private String content; + /** + * 回复人 + */ + @ApiModelProperty(value = "回复人") + private Long replyUserId; + /** * 子评论 */ diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelImageCommentVo.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelImageCommentVo.java index 4b06353..6920f7c 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelImageCommentVo.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/ModelImageCommentVo.java @@ -53,6 +53,13 @@ public class ModelImageCommentVo { @ApiModelProperty(value = "评论内容") private String content; + /** + * 回复人 + */ + @ApiModelProperty(value = "回复人") + private Long replyUserId; + + /** * 子评论 */ diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/WorkFlowCommentVo.java b/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/WorkFlowCommentVo.java index 988f231..2e65b5b 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/WorkFlowCommentVo.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/domain/vo/WorkFlowCommentVo.java @@ -54,6 +54,12 @@ public class WorkFlowCommentVo { @ApiModelProperty(value = "评论内容") private String content; + /** + * 回复人 + */ + @ApiModelProperty(value = "回复人") + private Long replyUserId; + /** * 子评论 */ diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/service/ModelCommentService.java b/mcwl-resource/src/main/java/com/mcwl/resource/service/ModelCommentService.java index ce8903a..dff6065 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/service/ModelCommentService.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/service/ModelCommentService.java @@ -2,6 +2,7 @@ package com.mcwl.resource.service; import com.baomidou.mybatisplus.extension.service.IService; import com.mcwl.resource.domain.ModelComment; +import com.mcwl.resource.domain.dto.ModelCommentRes; import com.mcwl.resource.domain.vo.ModelCommentVo; import com.mcwl.resource.domain.vo.ModelImageCommentVo; @@ -17,7 +18,7 @@ import java.util.List; * @Date:2025/1/12 11:58 */ public interface ModelCommentService extends IService { - void comment(ModelComment modelComment); + void comment(ModelCommentRes modelCommentRes); /** * 获取评论 diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/service/WorkFlowCommentService.java b/mcwl-resource/src/main/java/com/mcwl/resource/service/WorkFlowCommentService.java index 867005c..b99cc6f 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/service/WorkFlowCommentService.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/service/WorkFlowCommentService.java @@ -2,6 +2,7 @@ package com.mcwl.resource.service; import com.baomidou.mybatisplus.extension.service.IService; import com.mcwl.resource.domain.WorkFlowComment; +import com.mcwl.resource.domain.dto.WorkFlowCommentRes; import com.mcwl.resource.domain.vo.WorkFlowCommentVo; import java.util.List; @@ -16,7 +17,7 @@ import java.util.List; * @Date:2025/1/12 11:58 */ public interface WorkFlowCommentService extends IService { - void comment(WorkFlowComment modelComment); + void comment(WorkFlowCommentRes workFlowCommentRes); /** * 获取评论 diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelCommentServiceImpl.java b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelCommentServiceImpl.java index 1e1e8d8..056ea7e 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelCommentServiceImpl.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelCommentServiceImpl.java @@ -7,6 +7,7 @@ import com.mcwl.common.core.domain.entity.SysUser; import com.mcwl.common.utils.SecurityUtils; import com.mcwl.resource.domain.ModelComment; import com.mcwl.resource.domain.ModelImageComment; +import com.mcwl.resource.domain.dto.ModelCommentRes; import com.mcwl.resource.domain.dto.ModelImageCommentRes; import com.mcwl.resource.domain.vo.ModelCommentVo; import com.mcwl.resource.domain.vo.ModelImageCommentVo; @@ -19,10 +20,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.validation.constraints.NotNull; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 模型评论 @@ -39,8 +39,8 @@ public class ModelCommentServiceImpl extends ServiceImpl getComment(Long imageId) { - List modelCommentVoList = new ArrayList<>(); - // 查询所有父评论 - LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.eq(ModelComment::getModelId, imageId) - .isNull(ModelComment::getParentId) - .orderByDesc(ModelComment::getCreateTime); - // 添加父评论 - List modelCommentList = modelCommentMapper.selectList(lqw); - for (ModelComment modelComment : modelCommentList) { - ModelCommentVo modelCommentVo = getModelCommentVo(modelComment); - modelCommentVoList.add(modelCommentVo); + // 1. 查询所有父评论 + List parentComments = baseMapper.selectList( + new LambdaQueryWrapper() + .eq(ModelComment::getModelId, imageId) + .isNull(ModelComment::getParentId) + .orderByAsc(ModelComment::getCreateTime) + ); + + // 无评论直接返回空列表 + if (parentComments.isEmpty()) { + return new ArrayList<>(); } - return modelCommentVoList; + // 2. 收集所有用户ID(父评论+子评论) + List userIds = collectUserIds(parentComments); // 收集父评论用户ID + List childComments = getChildComments(parentComments); // 查询子评论 + for (ModelComment child : childComments) { + userIds.add(child.getUserId()); // 收集子评论用户ID + } + + // 3. 批量查询用户信息(避免N+1查询) + Map userMap = userIds.isEmpty() ? + new HashMap<>() : + sysUserService.listByIds(userIds).stream() + .collect(Collectors.toMap(SysUser::getUserId, Function.identity())); + + // 4. 构建评论树结构 + return buildCommentTree(parentComments, childComments, userMap); + } + + /** + * 收集父评论的用户ID + * + * @param parentComments 父评论列表 + * @return 用户ID集合 + */ + private List collectUserIds(List parentComments) { + List userIds = new ArrayList<>(); + for (ModelComment comment : parentComments) { + userIds.add(comment.getUserId()); + } + return userIds; + } + + /** + * 批量查询子评论 + * + * @param parentComments 父评论列表 + * @return 子评论列表 + */ + private List getChildComments(List parentComments) { + if (parentComments.isEmpty()) { + return new ArrayList<>(); + } + // 提取父评论ID集合 + List parentIds = parentComments.stream() + .map(ModelComment::getId) + .collect(Collectors.toList()); + + // 查询子评论 + return baseMapper.selectList( + new LambdaQueryWrapper() + .in(ModelComment::getParentId, parentIds) + .orderByAsc(ModelComment::getCreateTime) + ); + } + + /** + * 构建树形VO结构 + */ + private List buildCommentTree(List parentComments, + List childComments, + Map userMap) { + // 按父ID分组子评论 + Map> childMap = new HashMap<>(); + for (ModelComment child : childComments) { + Long parentId = child.getParentId(); + childMap.computeIfAbsent(parentId, k -> new ArrayList<>()).add(child); + } + + // 构建VO树 + List result = new ArrayList<>(); + for (ModelComment parent : parentComments) { + // 转换父评论VO + ModelCommentVo parentVo = convertToVo(parent, userMap); + // 获取子评论VO列表 + List children = childMap.getOrDefault(parent.getId(), new ArrayList<>()); + List childVos = new ArrayList<>(); + for (ModelComment child : children) { + childVos.add(convertToVo(child, userMap)); + } + parentVo.setContentList(childVos); + result.add(parentVo); + } + return result; + } + + /** + * 转换单个评论为VO对象 + */ + private ModelCommentVo convertToVo(ModelComment comment, Map userMap) { + SysUser user = userMap.get(comment.getUserId()); + if (user == null) { + user = createDefaultUser(); // 处理用户信息缺失 + } + + ModelCommentVo vo = new ModelCommentVo(); + vo.setUserId(comment.getUserId()); + vo.setUserName(user.getUserName()); + vo.setUserAvatar(user.getAvatar()); + vo.setCommentId(comment.getId()); + vo.setContent(comment.getContent()); + vo.setReplyUserId(comment.getReplyUserId()); + vo.setLikeNum(comment.getLikeNum()); + vo.setCreateTime(comment.getCreateTime()); + return vo; + } + + /** + * 创建默认用户(防止空指针) + */ + private SysUser createDefaultUser() { + SysUser defaultUser = new SysUser(); + defaultUser.setUserName("匿名用户"); + defaultUser.setAvatar("/default-avatar.png"); + return defaultUser; } diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelImageCommentServiceImpl.java b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelImageCommentServiceImpl.java index 7ce0fcc..8889b2b 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelImageCommentServiceImpl.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/ModelImageCommentServiceImpl.java @@ -18,9 +18,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import javax.validation.constraints.NotNull; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 图片评论实现 @@ -57,88 +57,133 @@ public class ModelImageCommentServiceImpl extends ServiceImpl getComment(Long imageId) { + // 1. 查询所有父评论 + List parentComments = baseMapper.selectList( + new LambdaQueryWrapper() + .eq(ModelImageComment::getModelImageId, imageId) + .isNull(ModelImageComment::getParentId) + .orderByAsc(ModelImageComment::getCreateTime) + ); - List modelImageCommentVoList = new ArrayList<>(); - - // 查询所有父评论 - LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.eq(ModelImageComment::getModelImageId, imageId) - .isNull(ModelImageComment::getParentId) - .orderByDesc(ModelImageComment::getCreateTime); - // 添加父评论 - List modelImageCommentList = baseMapper.selectList(lqw); - for (ModelImageComment modelImageComment : modelImageCommentList) { - ModelImageCommentVo modelImageCommentVo = getModelImageCommentVo(modelImageComment); - modelImageCommentVoList.add(modelImageCommentVo); + // 无评论直接返回空列表 + if (parentComments.isEmpty()) { + return new ArrayList<>(); } - return modelImageCommentVoList; - } + // 2. 收集所有用户ID(父评论+子评论) + List userIds = collectUserIds(parentComments); // 收集父评论用户ID + List childComments = getChildComments(parentComments); // 查询子评论 + for (ModelImageComment child : childComments) { + userIds.add(child.getUserId()); // 收集子评论用户ID + } + // 3. 批量查询用户信息(避免N+1查询) + Map userMap = userIds.isEmpty() ? + new HashMap<>() : + sysUserService.listByIds(userIds).stream() + .collect(Collectors.toMap(SysUser::getUserId, Function.identity())); + + // 4. 构建评论树结构 + return buildCommentTree(parentComments, childComments, userMap); + } /** - * 构建ModelImageCommentVo对象 + * 收集父评论的用户ID * - * @param modelImageComment 父评论对象 - * @return ModelImageCommentVo对象 + * @param parentComments 父评论列表 + * @return 用户ID集合 */ - @NotNull - private ModelImageCommentVo getModelImageCommentVo(ModelImageComment modelImageComment) { - Long userId = modelImageComment.getUserId(); - SysUser sysUser = sysUserService.selectUserById(userId); - - // 构建ModelImageCommentVo对象 - ModelImageCommentVo modelImageCommentVo = new ModelImageCommentVo(); - modelImageCommentVo.setUserId(userId); - modelImageCommentVo.setUserName(sysUser.getUserName()); - modelImageCommentVo.setUserAvatar(sysUser.getAvatar()); - modelImageCommentVo.setCommentId(modelImageComment.getId()); - modelImageCommentVo.setContent(modelImageComment.getContent()); - // 查询子评论 - modelImageCommentVo.setContentList(getContentList(modelImageComment.getId())); - modelImageCommentVo.setLikeNum(modelImageComment.getLikeNum()); - modelImageCommentVo.setCreateTime(modelImageComment.getCreateTime()); - return modelImageCommentVo; + private List collectUserIds(List parentComments) { + List userIds = new ArrayList<>(); + for (ModelImageComment comment : parentComments) { + userIds.add(comment.getUserId()); + } + return userIds; } - /** - * 递归查询子评论 + * 批量查询子评论 * - * @param modelImageCommentId 父评论id - * @return List + * @param parentComments 父评论列表 + * @return 子评论列表 */ - private List getContentList(Long modelImageCommentId) { - List modelImageCommentVoList = new ArrayList<>(); - if (Objects.isNull(modelImageCommentId)) { - return modelImageCommentVoList; + private List getChildComments(List parentComments) { + if (parentComments.isEmpty()) { + return new ArrayList<>(); } + // 提取父评论ID集合 + List parentIds = parentComments.stream() + .map(ModelImageComment::getId) + .collect(Collectors.toList()); // 查询子评论 - LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .eq(ModelImageComment::getParentId, modelImageCommentId) - .orderByDesc(ModelImageComment::getCreateTime); - - List modelImageCommentList = baseMapper.selectList(lqw); - - for (ModelImageComment modelImageComment : modelImageCommentList) { - Long userId = modelImageComment.getUserId(); - SysUser sysUser = sysUserService.selectUserById(userId); - ModelImageCommentVo modelImageCommentVo = new ModelImageCommentVo(); - modelImageCommentVo.setUserId(userId); - modelImageCommentVo.setUserName(sysUser.getUserName()); - modelImageCommentVo.setUserAvatar(sysUser.getAvatar()); - modelImageCommentVo.setCommentId(modelImageComment.getId()); - modelImageCommentVo.setContent(modelImageComment.getContent()); - modelImageCommentVo.setLikeNum(modelImageComment.getLikeNum()); - modelImageCommentVo.setCreateTime(modelImageComment.getCreateTime()); - - - modelImageCommentVoList.add(modelImageCommentVo); - } - return modelImageCommentVoList; + return baseMapper.selectList( + new LambdaQueryWrapper() + .in(ModelImageComment::getParentId, parentIds) + .orderByAsc(ModelImageComment::getCreateTime) + ); } + /** + * 构建树形VO结构 + */ + private List buildCommentTree(List parentComments, + List childComments, + Map userMap) { + // 按父ID分组子评论 + Map> childMap = new HashMap<>(); + for (ModelImageComment child : childComments) { + Long parentId = child.getParentId(); + childMap.computeIfAbsent(parentId, k -> new ArrayList<>()).add(child); + } + + // 构建VO树 + List result = new ArrayList<>(); + for (ModelImageComment parent : parentComments) { + // 转换父评论VO + ModelImageCommentVo parentVo = convertToVo(parent, userMap); + // 获取子评论VO列表 + List children = childMap.getOrDefault(parent.getId(), new ArrayList<>()); + List childVos = new ArrayList<>(); + for (ModelImageComment child : children) { + childVos.add(convertToVo(child, userMap)); + } + parentVo.setContentList(childVos); + result.add(parentVo); + } + return result; + } + + /** + * 转换单个评论为VO对象 + */ + private ModelImageCommentVo convertToVo(ModelImageComment comment, Map userMap) { + SysUser user = userMap.get(comment.getUserId()); + if (user == null) { + user = createDefaultUser(); // 处理用户信息缺失 + } + + ModelImageCommentVo vo = new ModelImageCommentVo(); + vo.setUserId(comment.getUserId()); + vo.setUserName(user.getUserName()); + vo.setUserAvatar(user.getAvatar()); + vo.setCommentId(comment.getId()); + vo.setContent(comment.getContent()); + vo.setReplyUserId(comment.getReplyUserId()); + vo.setLikeNum(comment.getLikeNum()); + vo.setCreateTime(comment.getCreateTime()); + return vo; + } + + /** + * 创建默认用户(防止空指针) + */ + private SysUser createDefaultUser() { + SysUser defaultUser = new SysUser(); + defaultUser.setUserName("匿名用户"); + defaultUser.setAvatar("/default-avatar.png"); + return defaultUser; + } } diff --git a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/WorkFlowCommentServiceImpl.java b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/WorkFlowCommentServiceImpl.java index 6284e04..84c0f4f 100644 --- a/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/WorkFlowCommentServiceImpl.java +++ b/mcwl-resource/src/main/java/com/mcwl/resource/service/impl/WorkFlowCommentServiceImpl.java @@ -1,10 +1,14 @@ package com.mcwl.resource.service.impl; +import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mcwl.common.core.domain.entity.SysUser; import com.mcwl.common.utils.SecurityUtils; +import com.mcwl.resource.domain.ModelImageComment; import com.mcwl.resource.domain.WorkFlowComment; +import com.mcwl.resource.domain.dto.WorkFlowCommentRes; +import com.mcwl.resource.domain.vo.ModelImageCommentVo; import com.mcwl.resource.domain.vo.WorkFlowCommentVo; import com.mcwl.resource.mapper.WorkFlowCommentMapper; import com.mcwl.resource.service.WorkFlowCommentService; @@ -13,13 +17,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.validation.constraints.NotNull; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 工作流评论 实现层 + * * @Author:ChenYan * @Project:McWl * @Package:com.mcwl.resource.service.impl @@ -31,112 +35,161 @@ import java.util.Objects; public class WorkFlowCommentServiceImpl extends ServiceImpl implements WorkFlowCommentService { @Autowired - private ISysUserService sysUserService; + private ISysUserService sysUserService; @Autowired - private WorkFlowCommentMapper workFlowCommentMapper; + private WorkFlowCommentMapper workFlowCommentMapper; @Override - public void comment(WorkFlowComment workFlowComment) { - Long parentId = workFlowComment.getParentId(); - if (parentId != null){ + public void comment(WorkFlowCommentRes workFlowCommentRes) { + Long parentId = workFlowCommentRes.getParentId(); + if (parentId != null) { WorkFlowComment mic = workFlowCommentMapper.selectById(parentId); - if (Objects.nonNull(parentId) && Objects.isNull(mic)) { + if (Objects.isNull(mic)) { return; } } + WorkFlowComment workFlowComment = new WorkFlowComment(); + BeanUtil.copyProperties(workFlowCommentRes, workFlowComment); workFlowComment.setUserId(SecurityUtils.getUserId()); - workFlowComment.setCreateBy(SecurityUtils.getUsername()); - workFlowComment.setUpdateBy(SecurityUtils.getUsername()); - workFlowComment.setUpdateTime(new Date()); workFlowCommentMapper.insert(workFlowComment); } @Override public List getComment(Long imageId) { - List workFlowCommentVos = new ArrayList<>(); // 查询所有父评论 - LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.eq(WorkFlowComment::getWorkFlowId, imageId) - .isNull(WorkFlowComment::getParentId) - .orderByDesc(WorkFlowComment::getCreateTime); - // 添加父评论 - List workFlowComments = workFlowCommentMapper.selectList(lqw); - for (WorkFlowComment workFlowComment : workFlowComments) { - WorkFlowCommentVo workFlowCommentVo = getModelCommentVo(workFlowComment); - workFlowCommentVos.add(workFlowCommentVo); + List parentComments = baseMapper.selectList( + new LambdaQueryWrapper() + .eq(WorkFlowComment::getWorkFlowId, imageId) + .isNull(WorkFlowComment::getParentId) + .orderByAsc(WorkFlowComment::getCreateTime) + ); + + // 无评论直接返回空列表 + if (parentComments.isEmpty()) { + return new ArrayList<>(); } - return workFlowCommentVos; - } + // 2. 收集所有用户ID(父评论+子评论) + List userIds = collectUserIds(parentComments); // 收集父评论用户ID + List childComments = getChildComments(parentComments); // 查询子评论 + for (WorkFlowComment child : childComments) { + userIds.add(child.getUserId()); // 收集子评论用户ID + } + // 3. 批量查询用户信息(避免N+1查询) + Map userMap = userIds.isEmpty() ? + new HashMap<>() : + sysUserService.listByIds(userIds).stream() + .collect(Collectors.toMap(SysUser::getUserId, Function.identity())); + + + // 4. 构建评论树结构 + return buildCommentTree(parentComments, childComments, userMap); + } /** - * 构建ModelCommentVo对象 + * 收集父评论的用户ID * - * @param workFlowComment 父评论对象 - * @return WorkFlowCommentVo + * @param parentComments 父评论列表 + * @return 用户ID集合 */ - @NotNull - private WorkFlowCommentVo getModelCommentVo(WorkFlowComment workFlowComment) { - Long userId = workFlowComment.getUserId(); - SysUser sysUser = sysUserService.selectUserById(userId); - - // 构建WorkFlowCommentVo对象 - WorkFlowCommentVo workFlowCommentVo = new WorkFlowCommentVo(); - workFlowCommentVo.setUserId(userId); - workFlowCommentVo.setUserName(sysUser.getUserName()); - workFlowCommentVo.setUserAvatar(sysUser.getAvatar()); - workFlowCommentVo.setCommentId(workFlowComment.getId()); - workFlowCommentVo.setContent(workFlowComment.getContent()); - // 查询子评论 - workFlowCommentVo.setContentList(getContentList(workFlowComment.getId())); - workFlowCommentVo.setLikeNum(workFlowComment.getLikeNum()); - workFlowCommentVo.setCreateTime(workFlowComment.getCreateTime()); - return workFlowCommentVo; + private List collectUserIds(List parentComments) { + List userIds = new ArrayList<>(); + for (WorkFlowComment comment : parentComments) { + userIds.add(comment.getUserId()); + } + return userIds; } - /** - * 递归查询子评论 + * 批量查询子评论 * - * @param modelCommentId 父评论id - * @return List + * @param parentComments 父评论列表 + * @return 子评论列表 */ - private List getContentList(Long modelCommentId) { - List modelCommentVoList = new ArrayList<>(); - if (Objects.isNull(modelCommentId)) { - return modelCommentVoList; + private List getChildComments(List parentComments) { + if (parentComments.isEmpty()) { + return new ArrayList<>(); } + // 提取父评论ID集合 + List parentIds = parentComments.stream() + .map(WorkFlowComment::getId) + .collect(Collectors.toList()); // 查询子评论 - LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .eq(WorkFlowComment::getParentId, modelCommentId) - .orderByDesc(WorkFlowComment::getCreateTime); - - List modelCommentList = workFlowCommentMapper.selectList(lqw); - - for (WorkFlowComment modelComment : modelCommentList) { - Long userId = modelComment.getUserId(); - SysUser sysUser = sysUserService.selectUserById(userId); - WorkFlowCommentVo modelCommentVo = new WorkFlowCommentVo(); - modelCommentVo.setUserId(userId); - modelCommentVo.setUserName(sysUser.getUserName()); - modelCommentVo.setUserAvatar(sysUser.getAvatar()); - modelCommentVo.setCommentId(modelComment.getId()); - modelCommentVo.setContent(modelComment.getContent()); - modelCommentVo.setLikeNum(modelComment.getLikeNum()); - modelCommentVo.setCreateTime(modelComment.getCreateTime()); - - - modelCommentVoList.add(modelCommentVo); - } - return modelCommentVoList; + return baseMapper.selectList( + new LambdaQueryWrapper() + .in(WorkFlowComment::getParentId, parentIds) + .orderByAsc(WorkFlowComment::getCreateTime) + ); } + /** + * 构建树形VO结构 + */ + private List buildCommentTree(List parentComments, + List childComments, + Map userMap) { + // 按父ID分组子评论 + Map> childMap = new HashMap<>(); + for (WorkFlowComment child : childComments) { + Long parentId = child.getParentId(); + childMap.computeIfAbsent(parentId, k -> new ArrayList<>()).add(child); + } + + // 构建VO树 + List result = new ArrayList<>(); + for (WorkFlowComment parent : parentComments) { + // 转换父评论VO + WorkFlowCommentVo parentVo = convertToVo(parent, userMap); + // 获取子评论VO列表 + List children = childMap.getOrDefault(parent.getId(), new ArrayList<>()); + List childVos = new ArrayList<>(); + for (WorkFlowComment child : children) { + childVos.add(convertToVo(child, userMap)); + } + parentVo.setContentList(childVos); + result.add(parentVo); + } + return result; + } + + /** + * 转换单个评论为VO对象 + */ + private WorkFlowCommentVo convertToVo(WorkFlowComment comment, Map userMap) { + SysUser user = userMap.get(comment.getUserId()); + if (user == null) { + user = createDefaultUser(); // 处理用户信息缺失 + } + + WorkFlowCommentVo vo = new WorkFlowCommentVo(); + vo.setUserId(comment.getUserId()); + vo.setUserName(user.getUserName()); + vo.setUserAvatar(user.getAvatar()); + vo.setCommentId(comment.getId()); + vo.setContent(comment.getContent()); + vo.setReplyUserId(comment.getReplyUserId()); + vo.setLikeNum(comment.getLikeNum()); + vo.setCreateTime(comment.getCreateTime()); + return vo; + } + + /** + * 创建默认用户(防止空指针) + */ + private SysUser createDefaultUser() { + SysUser defaultUser = new SysUser(); + defaultUser.setUserName("匿名用户"); + defaultUser.setAvatar("/default-avatar.png"); + return defaultUser; + } + + }