From a2c4af86b65f9c0b339bfcb37b1cc00b33f48b9e Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Thu, 10 Jul 2025 12:41:46 +0800
Subject: [PATCH] feat(clothes): 添加社区评论功能

---
 src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesSocialListVo.java           |    2 
 src/main/resources/templates/febs/views/modules/clothesType/socialList.html          |   30 ++
 src/main/java/cc/mrbird/febs/mall/entity/ClothesSocialComment.java                   |    2 
 src/main/java/cc/mrbird/febs/mall/service/ApiClothesSocialService.java               |    4 
 src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesSocialCommentVo.java        |   29 ++
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesSocialServiceImpl.java      |  109 ++++++++++
 src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java           |   46 ++++
 src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiSocialInfoVo.java                    |   12 +
 src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiAllCommentVo.java                    |   34 +++
 src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiAllSocialVo.java                     |    2 
 src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java |   40 ++++
 src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java  |   26 ++
 src/main/resources/mapper/modules/ClothesSocialMapper.xml                            |    1 
 src/main/resources/templates/febs/views/modules/clothesType/socialComment.html       |   86 ++++++++
 src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesSocialCommentDto.java        |   25 ++
 src/main/java/cc/mrbird/febs/common/utils/AppContants.java                           |    2 
 src/main/resources/mapper/modules/ClothesSocialCommentMapper.xml                     |   39 +++
 src/main/java/cc/mrbird/febs/mall/mapper/ClothesSocialCommentMapper.java             |   10 +
 src/main/java/cc/mrbird/febs/mall/entity/ClothesSocial.java                          |    3 
 src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesSocialController.java |   19 +
 src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java                    |    7 
 src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiAllCommentDto.java                  |   28 ++
 22 files changed, 548 insertions(+), 8 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/utils/AppContants.java b/src/main/java/cc/mrbird/febs/common/utils/AppContants.java
index a212e5c..24a177b 100644
--- a/src/main/java/cc/mrbird/febs/common/utils/AppContants.java
+++ b/src/main/java/cc/mrbird/febs/common/utils/AppContants.java
@@ -7,6 +7,8 @@
     /**
      * 系统用户
      */
+    public static final String SOCIAL_COMMENT = "SOCIAL_COMMENT";
+
     public static final String SYSTEM_USER = "system";
     
     public static final String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzIfAF0gZs9zn9ENRtz6ocHa8MGljmMmCsjLsRvTIAilBMypMJz/VNooAOhd8GTdsWm8FNGVhRauv7RfxorFJ4Um2UbweUQBIZP2pzZMnclHxhUmYZsn/6IaPzijiUNfEjygtE7ezvso/67ecZJwqfrtlbEjqUbRgo17Qj23suwQIDAQAB";
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java b/src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java
index 32587c8..3464909 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/clothes/AdminClothesTypeController.java
@@ -6,10 +6,13 @@
 import cc.mrbird.febs.common.entity.QueryRequest;
 import cc.mrbird.febs.common.enumerates.OrderDeliveryStateEnum;
 import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
+import cc.mrbird.febs.common.utils.AppContants;
+import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.common.utils.excl.ExcelSheetPO;
 import cc.mrbird.febs.common.utils.excl.ExcelUtil;
 import cc.mrbird.febs.common.utils.excl.ExcelVersion;
 import cc.mrbird.febs.common.utils.excl.ResponseHeadUtil;
+import cc.mrbird.febs.mall.controller.order.ViewMallOrderController;
 import cc.mrbird.febs.mall.dto.AdminHappyActivityCategoryDto;
 import cc.mrbird.febs.mall.dto.DeliverGoodsDto;
 import cc.mrbird.febs.mall.dto.activity.AdminCategoryAddDto;
@@ -49,6 +52,7 @@
 public class AdminClothesTypeController extends BaseController {
 
     private final ClothesTypeService clothesTypeService;
+    private final RedisUtils redisUtils;
 
     /**
      * 分类列表
@@ -121,6 +125,20 @@
             }
         }
         Map<String, Object> data = getDataTable(clothesTypeService.getSocialListInPage(dto, request));
+        return new FebsResponse().success().data(data);
+    }
+
+
+
+    /**
+     * 社区列表-评论列表
+     */
+    @GetMapping("socialComment")
+    public FebsResponse socialComment(ClothesSocialComment dto, QueryRequest request, Integer parentId) {
+        String existToken = redisUtils.getString(AppContants.SOCIAL_COMMENT);
+        long socialId = Long.parseLong(existToken);
+        dto.setSocialId(socialId);
+        Map<String, Object> data = getDataTable(clothesTypeService.socialComment(dto,request));
         return new FebsResponse().success().data(data);
     }
 
@@ -239,6 +257,28 @@
     }
 
     /**
+     * 社区-开启评论
+     */
+    @GetMapping("commentStateSwitch/{id}/{state}")
+    @ControllerEndpoint(operation = "社区-开启评论", exceptionMessage = "操作失败")
+    public FebsResponse commentStateSwitch(@NotNull(message = "{required}") @PathVariable Long id,
+                                    @NotNull(message = "{required}") @PathVariable Integer state) {
+
+        return clothesTypeService.commentStateSwitch(id,state);
+    }
+
+    /**
+     * 社区-评论-是否展示
+     */
+    @GetMapping("showStateSwitch/{id}/{state}")
+    @ControllerEndpoint(operation = "社区-评论-是否展示", exceptionMessage = "操作失败")
+    public FebsResponse showStateSwitch(@NotNull(message = "{required}") @PathVariable Long id,
+                                    @NotNull(message = "{required}") @PathVariable Integer state) {
+
+        return clothesTypeService.showStateSwitch(id,state);
+    }
+
+    /**
      * 社区-推荐首页
      */
     @GetMapping("socialHotState/{id}/{state}")
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesSocialController.java b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesSocialController.java
index 3f7f8a8..d9b3a59 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesSocialController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ApiClothesSocialController.java
@@ -104,5 +104,24 @@
     }
 
 
+    @ApiOperation(value = "评论", notes = "评论")
+    @PostMapping(value = "/comment")
+    public FebsResponse comment(@RequestBody @Validated ApiClothesSocialCommentDto dto) {
+
+        return apiClothesSocialService.comment(dto);
+    }
+
+
+    @ApiOperation(value = "评论列表", notes = "评论列表")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "success", response = ApiAllCommentVo.class)
+    })
+    @PostMapping(value = "/allComment")
+    public FebsResponse allComment(@RequestBody @Validated ApiAllCommentDto dto) {
+
+        return apiClothesSocialService.allComment(dto);
+    }
+
+
 
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java
index 392ec52..861888d 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/clothes/ViewClothesTypeController.java
@@ -3,7 +3,9 @@
 import cc.mrbird.febs.common.controller.BaseController;
 import cc.mrbird.febs.common.entity.FebsConstant;
 import cc.mrbird.febs.common.enumerates.SocialPatternLocationTypeEnum;
+import cc.mrbird.febs.common.utils.AppContants;
 import cc.mrbird.febs.common.utils.FebsUtil;
+import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.mall.entity.*;
 import cc.mrbird.febs.mall.mapper.*;
 import cc.mrbird.febs.mall.service.ClothesTypeService;
@@ -59,6 +61,7 @@
     private final MallExpressInfoMapper mallExpressInfoMapper;
     private final ClothesPatternRemarkMapper clothesPatternRemarkMapper;
     private final ClothesLocationRemarkMapper clothesLocationRemarkMapper;
+    private final RedisUtils redisUtils;
 
     /**
      * 社区分类列表
@@ -106,6 +109,27 @@
         return FebsUtil.view("modules/clothesType/socialList");
     }
 
+
+
+    /**
+     * 社区列表-查看评论
+     * @return
+     */
+    @GetMapping("/socialComment/{id}")
+    @RequiresPermissions("socialComment:view")
+    public String socialComment(@PathVariable Long id, Model model) {
+
+        String existToken = redisUtils.getString(AppContants.SOCIAL_COMMENT);
+        if (StrUtil.isNotBlank(existToken)) {
+            Object o = redisUtils.get(existToken);
+            if (ObjectUtil.isNotEmpty(o)) {
+                redisUtils.del(existToken);
+            }
+        }
+        redisUtils.set(AppContants.SOCIAL_COMMENT, id, -1);
+        return FebsUtil.view("modules/clothesType/socialComment");
+    }
+
     /**
      * 社区-新增
      */
@@ -115,6 +139,8 @@
         return FebsUtil.view("modules/clothesType/socialAdd");
     }
 
+
+
     /**
      * 社区-修改
      */
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiAllCommentDto.java b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiAllCommentDto.java
new file mode 100644
index 0000000..f6d7f5d
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiAllCommentDto.java
@@ -0,0 +1,28 @@
+package cc.mrbird.febs.mall.dto.clothes;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiAllCommentDto", description = "参数")
+public class ApiAllCommentDto {
+
+    @NotNull(message = "页码不能为空")
+    @ApiModelProperty(value = "页码", example = "1")
+    private Integer pageNow;
+
+    @NotNull(message = "每页数量不能为空")
+    @ApiModelProperty(value = "每页数量", example = "10")
+    private Integer pageSize;
+
+    @NotNull(message = "社区不能为空")
+    @ApiModelProperty(value = "社区ID")
+    private Long socialId;
+
+    @ApiModelProperty(value = "评论ID,有值则代表查询子评论")
+    private Long parentId;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesSocialCommentDto.java b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesSocialCommentDto.java
new file mode 100644
index 0000000..568a0e5
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/clothes/ApiClothesSocialCommentDto.java
@@ -0,0 +1,25 @@
+package cc.mrbird.febs.mall.dto.clothes;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiClothesSocialCommentDto", description = "参数")
+public class ApiClothesSocialCommentDto {
+
+
+    @NotNull(message = "社区不能为空")
+    @ApiModelProperty(value = "社区ID")
+    private Long socialId;
+
+    @NotNull(message = "评论不能为空")
+    @ApiModelProperty(value = "父级评论ID,没有就传0")
+    private Long commentId;
+
+    @NotNull(message = "内容不能为空")
+    @ApiModelProperty(value = "内容")
+    private String comment;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesSocial.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesSocial.java
index 3acd812..b30d300 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/ClothesSocial.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesSocial.java
@@ -20,6 +20,7 @@
      `del_flag` int(11) DEFAULT '0' COMMENT '删除标识 0-未删除 1-已删除',
      `state` int(11) DEFAULT '0' COMMENT '状态 0-不展示 1-展示',
      `order_cnt` int(11) DEFAULT '0' COMMENT '排序',
+     `comment_state` int(11) DEFAULT '0' COMMENT '是否允许评论 0-不允许 1-允许',
      */
     private Long memberId;
     private String name;
@@ -30,6 +31,7 @@
     private Integer state;
     private Integer hotState;
     private Integer orderCnt;
+    private Integer commentState;
 
     @TableField(exist = false)
     private String thumbs;
@@ -40,4 +42,5 @@
     @TableField(exist = false)
     private List<String> images;
 
+
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ClothesSocialComment.java b/src/main/java/cc/mrbird/febs/mall/entity/ClothesSocialComment.java
index fad2d91..504c0bf 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/ClothesSocialComment.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ClothesSocialComment.java
@@ -11,6 +11,7 @@
      *
      `member_id` bigint(20) DEFAULT NULL,
      `social_id` bigint(20) DEFAULT NULL COMMENT '来源ID',
+     `comment_id` bigint(20) DEFAULT NULL,
      `parent_id` bigint(20) DEFAULT NULL COMMENT '来源选项ID',
      `comment` text COMMENT '评论',
      `show_state` int(11) DEFAULT '0' COMMENT '展示状态 1:显示 0:隐藏',
@@ -18,6 +19,7 @@
 
     private Long memberId;
     private Long socialId;
+    private Long commentId;
     private Long parentId;
     private String comment;
     private Integer showState;
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesSocialCommentMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesSocialCommentMapper.java
index 46e2bc6..39aaaa1 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/ClothesSocialCommentMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ClothesSocialCommentMapper.java
@@ -1,7 +1,17 @@
 package cc.mrbird.febs.mall.mapper;
 
+import cc.mrbird.febs.mall.dto.clothes.ApiAllCommentDto;
 import cc.mrbird.febs.mall.entity.ClothesSocialComment;
+import cc.mrbird.febs.mall.vo.clothes.AdminClothesSocialCommentVo;
+import cc.mrbird.febs.mall.vo.clothes.ApiAllCommentVo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
 
 public interface ClothesSocialCommentMapper  extends BaseMapper<ClothesSocialComment> {
+
+    Page<ApiAllCommentVo> selectPageInComment(Page<ApiAllCommentVo> page,  @Param("record")ApiAllCommentDto dto);
+
+    IPage<AdminClothesSocialCommentVo> selectSocialCommentListInPage(Page<AdminClothesSocialCommentVo> page, @Param("record")ClothesSocialComment dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/ApiClothesSocialService.java b/src/main/java/cc/mrbird/febs/mall/service/ApiClothesSocialService.java
index 48ae8c6..80dbafe 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/ApiClothesSocialService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/ApiClothesSocialService.java
@@ -23,4 +23,8 @@
     FebsResponse addCollect(ApiSocialCollectAddDto dto);
 
     FebsResponse museToDesign(ApiClothesSocialMuseDto dto);
+
+    FebsResponse comment(ApiClothesSocialCommentDto dto);
+
+    FebsResponse allComment(ApiAllCommentDto dto);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java b/src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java
index a6ca28f..1592a9b 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/ClothesTypeService.java
@@ -8,6 +8,7 @@
 import cc.mrbird.febs.mall.dto.clothes.*;
 import cc.mrbird.febs.mall.entity.*;
 import cc.mrbird.febs.mall.vo.clothes.AdminClothesOrderListVo;
+import cc.mrbird.febs.mall.vo.clothes.AdminClothesSocialCommentVo;
 import cc.mrbird.febs.mall.vo.clothes.AdminClothesSocialListVo;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -83,8 +84,14 @@
 
     IPage<AdminClothesSocialListVo> getSocialListInPage(AdminClothesSocialListDto dto, QueryRequest request);
 
+    IPage<AdminClothesSocialCommentVo> socialComment(ClothesSocialComment dto, QueryRequest request);
+
     FebsResponse socialState(Long id, Integer state);
 
+    FebsResponse commentStateSwitch(Long id, Integer state);
+
+    FebsResponse showStateSwitch(Long id, Integer state);
+
     FebsResponse socialHotState(Long id, Integer state);
 
     FebsResponse socialDelete(Long id);
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesSocialServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesSocialServiceImpl.java
index 6e9ee3b..4d730aa 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesSocialServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiClothesSocialServiceImpl.java
@@ -27,9 +27,7 @@
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -62,6 +60,7 @@
     private final ClothesTypeArtMapper clothesTypeArtMapper;
     private final ClothesLocationRemarkMapper clothesLocationRemarkMapper;
     private final ClothesPatternRemarkMapper clothesPatternRemarkMapper;
+    private final ClothesSocialCommentMapper clothesSocialCommentMapper;
 
 
     @Override
@@ -114,8 +113,36 @@
         // 调用Mapper方法获取活动分页数据
         Page<ApiAllSocialVo> voPage = clothesSocialMapper.selectPageInSocial(page, dto);
 
+        List<ApiAllSocialVo> vos = voPage.getRecords();
+        if (CollUtil.isNotEmpty(vos)) {
+            Set<Long> socialIds = vos.stream()
+                    .map(ApiAllSocialVo::getId)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+
+            if (CollUtil.isNotEmpty(socialIds)) {
+                List<ClothesSocialFollow> clothesSocialFollows = clothesSocialFollowMapper.selectList(
+                        Wrappers.lambdaQuery(ClothesSocialFollow.class)
+                                .select(ClothesSocialFollow::getId, ClothesSocialFollow::getSourceId)
+                                .in(ClothesSocialFollow::getSourceId, socialIds)
+                                .eq(ClothesSocialFollow::getType, SocialTypeEnum.LIKE.getValue())
+                );
+
+                Map<Long, Long> likeCountBySocialIdMap = new HashMap<>();
+                if (CollUtil.isNotEmpty(clothesSocialFollows)) {
+                    likeCountBySocialIdMap = clothesSocialFollows.stream()
+                            .collect(Collectors.groupingBy(ClothesSocialFollow::getSourceId, Collectors.counting()));
+                }
+
+                for (ApiAllSocialVo item : vos){
+                    item.setLikeCnt(likeCountBySocialIdMap.getOrDefault(item.getId(), 0L).intValue());
+                }
+            }
+        }
+
         return new FebsResponse().success().data(voPage);
     }
+
 
     @Override
     public FebsResponse socialInfo(ApiSocialInfoDto dto) {
@@ -130,6 +157,7 @@
             apiSocialInfoVo.setName(clothesSocial.getName());
             apiSocialInfoVo.setContent(clothesSocial.getContent());
             apiSocialInfoVo.setCreatedTime(clothesSocial.getCreatedTime());
+            apiSocialInfoVo.setCommentState(clothesSocial.getCommentState());
 
             List<ClothesSocialFile> clothesSocialFiles = clothesSocialFileMapper.selectList(
                     Wrappers.lambdaQuery(ClothesSocialFile.class)
@@ -211,6 +239,29 @@
                     apiSocialMuseVo.setLocationRemarkList(locationRemarkList);
                 }
                 apiSocialMuseVo.setTotalAmount(totalAmount.setScale(2, RoundingMode.DOWN));
+
+                List<ClothesSocialFollow> clothesSocialFollows = clothesSocialFollowMapper.selectList(
+                        Wrappers.lambdaQuery(ClothesSocialFollow.class)
+                                .select(ClothesSocialFollow::getType)
+                                .eq(ClothesSocialFollow::getSourceId, socialId)
+                );
+                if (CollUtil.isNotEmpty(clothesSocialFollows)){
+
+                    Map<Integer, Long> collect = clothesSocialFollows.stream()
+                            .collect(Collectors.groupingBy(ClothesSocialFollow::getType, Collectors.counting()));
+                    apiSocialInfoVo.setLikeCnt(collect.getOrDefault(SocialTypeEnum.LIKE.getValue(), 0L).intValue());
+                    apiSocialInfoVo.setCollectCnt(collect.getOrDefault(SocialTypeEnum.COLLECT.getValue(), 0L).intValue());
+                }
+
+                List<ClothesSocialComment> clothesSocialComments = clothesSocialCommentMapper.selectList(
+                        Wrappers.lambdaQuery(ClothesSocialComment.class)
+                                .eq(ClothesSocialComment::getSocialId, socialId)
+                                .eq(ClothesSocialComment::getShowState, ClothesEnum.UP.getCode())
+                                .isNull(ClothesSocialComment::getParentId)
+                );
+                if (CollUtil.isNotEmpty(clothesSocialComments)){
+                    apiSocialInfoVo.setCommentCnt(clothesSocialComments.size());
+                }
             }
         }
 
@@ -496,6 +547,58 @@
         return new FebsResponse().success().data(record);
     }
 
+    @Override
+    public FebsResponse comment(ApiClothesSocialCommentDto dto) {
+
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        Long socialId = dto.getSocialId();
+        Long commentId = dto.getCommentId();
+        ClothesSocial clothesSocial = clothesSocialMapper.selectById(socialId);
+        if (ObjectUtil.isNull(clothesSocial)){
+            return new FebsResponse().fail().message("社区不存在");
+        }
+        if (ClothesEnum.DOWN.getCode() == clothesSocial.getCommentState()){
+            return new FebsResponse().fail().message("禁止评论");
+        }
+        ClothesSocialComment entity = new ClothesSocialComment();
+        entity.setMemberId(memberId);
+        entity.setSocialId(socialId);
+        entity.setComment(dto.getComment());
+        ClothesSocialComment clothesSocialComment = clothesSocialCommentMapper.selectById(commentId);
+        if(ObjectUtil.isNotNull(clothesSocialComment)){
+            entity.setParentId(clothesSocialComment.getParentId());
+            entity.setCommentId(clothesSocialComment.getId());
+        }
+        clothesSocialCommentMapper.insert(entity);
+
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse allComment(ApiAllCommentDto dto) {
+        // 创建分页对象,传入当前页和每页大小
+        Page<ApiAllCommentVo> page = new Page<>(dto.getPageNow(), dto.getPageSize());
+        // 调用Mapper方法获取活动分页数据
+        Page<ApiAllCommentVo> voPage = clothesSocialCommentMapper.selectPageInComment(page, dto);
+        List<ApiAllCommentVo> records = voPage.getRecords();
+        if (CollUtil.isNotEmpty(records)){
+            Set<Long> collect = records.stream().map(ApiAllCommentVo::getCommentId).collect(Collectors.toSet());
+            List<ClothesSocialComment> clothesSocialComments = clothesSocialCommentMapper.selectList(
+                    Wrappers.lambdaQuery(ClothesSocialComment.class)
+                            .select(ClothesSocialComment::getParentId)
+                            .in(ClothesSocialComment::getParentId, collect)
+            );
+            if (CollUtil.isNotEmpty(clothesSocialComments)){
+                Map<Long, Long> collect1 = clothesSocialComments.stream()
+                        .collect(Collectors.groupingBy(ClothesSocialComment::getParentId, Collectors.counting()));
+                for (ApiAllCommentVo vo : records){
+                    vo.setCommentCnt(collect1.getOrDefault(vo.getCommentId(), 0L).intValue());
+                }
+            }
+        }
+        return new FebsResponse().success().data(voPage);
+    }
+
     public static void main(String[] args) {
         JSONObject jsonObject = new JSONObject();
         jsonObject.putByPath("text", "123");
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java
index f52d65f..0c1efce 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ClothesTypeServiceImpl.java
@@ -16,10 +16,7 @@
 import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
 import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
 import cc.mrbird.febs.mall.vo.AdminMallOrderInfoVo;
-import cc.mrbird.febs.mall.vo.clothes.AdminClothesLocationRemarkVo;
-import cc.mrbird.febs.mall.vo.clothes.AdminClothesOrderListVo;
-import cc.mrbird.febs.mall.vo.clothes.AdminClothesPatternRemarkVo;
-import cc.mrbird.febs.mall.vo.clothes.AdminClothesSocialListVo;
+import cc.mrbird.febs.mall.vo.clothes.*;
 import cc.mrbird.febs.pay.util.WeixinServiceUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
@@ -74,6 +71,7 @@
 
     private final ClothesPatternRemarkMapper clothesPatternRemarkMapper;
     private final ClothesLocationRemarkMapper clothesLocationRemarkMapper;
+    private final ClothesSocialCommentMapper clothesSocialCommentMapper;
 
     private final IApiMallMemberWalletService memberWalletService;
     private final IMallMoneyFlowService mallMoneyFlowService;
@@ -752,6 +750,13 @@
     }
 
     @Override
+    public IPage<AdminClothesSocialCommentVo> socialComment(ClothesSocialComment dto, QueryRequest request) {
+        Page<AdminClothesSocialCommentVo> page = new Page<>(request.getPageNum(), request.getPageSize());
+        IPage<AdminClothesSocialCommentVo> vos = clothesSocialCommentMapper.selectSocialCommentListInPage(page, dto);
+        return vos;
+    }
+
+    @Override
     public FebsResponse socialState(Long id, Integer state) {
 
         ClothesSocial clothesSocial = clothesSocialMapper.selectById(id);
@@ -768,6 +773,39 @@
     }
 
     @Override
+    public FebsResponse commentStateSwitch(Long id, Integer state) {
+
+        ClothesSocial clothesSocial = clothesSocialMapper.selectById(id);
+        if(ObjectUtil.isNull(clothesSocial)){
+            throw new RuntimeException("内容不存在");
+        }
+        clothesSocialMapper.update(
+                null,
+                Wrappers.lambdaUpdate(ClothesSocial.class)
+                        .set(ClothesSocial::getCommentState, state)
+                        .eq(ClothesSocial::getId, id)
+        );
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
+    public FebsResponse showStateSwitch(Long id, Integer state) {
+
+        ClothesSocialComment clothesSocialComment = clothesSocialCommentMapper.selectById(id);
+
+        if(ObjectUtil.isNull(clothesSocialComment)){
+            throw new RuntimeException("评论不存在");
+        }
+        clothesSocialCommentMapper.update(
+                null,
+                Wrappers.lambdaUpdate(ClothesSocialComment.class)
+                        .set(ClothesSocialComment::getShowState, state)
+                        .eq(ClothesSocialComment::getId, id)
+        );
+        return new FebsResponse().success().message("操作成功");
+    }
+
+    @Override
     public FebsResponse socialHotState(Long id, Integer state) {
 
         ClothesSocial clothesSocial = clothesSocialMapper.selectById(id);
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesSocialCommentVo.java b/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesSocialCommentVo.java
new file mode 100644
index 0000000..1472c12
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesSocialCommentVo.java
@@ -0,0 +1,29 @@
+package cc.mrbird.febs.mall.vo.clothes;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class AdminClothesSocialCommentVo {
+
+    @ApiModelProperty(value = "评论ID")
+    private Long commentId;
+
+    @ApiModelProperty(value = "昵称")
+    private String memberName;
+
+    @ApiModelProperty(value = "展示状态 1:显示 0:隐藏")
+    private Integer showState;
+
+    @ApiModelProperty(value = "内容")
+    private String comment;
+
+
+    @ApiModelProperty(value = "时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesSocialListVo.java b/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesSocialListVo.java
index 29ac47e..22bf8df 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesSocialListVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/clothes/AdminClothesSocialListVo.java
@@ -8,6 +8,8 @@
     private String name;
     private String socialTitle;
     private Integer socialState;
+
+    private Integer commentState;
     private Integer hotState;
     private Integer delFlag;
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiAllCommentVo.java b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiAllCommentVo.java
new file mode 100644
index 0000000..89b9451
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiAllCommentVo.java
@@ -0,0 +1,34 @@
+package cc.mrbird.febs.mall.vo.clothes;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel(value = "ApiAllCommentVo", description = "参数")
+public class ApiAllCommentVo {
+
+    @ApiModelProperty(value = "评论ID")
+    private Long commentId;
+
+    @ApiModelProperty(value = "昵称")
+    private String memberName;
+
+    @ApiModelProperty(value = "头像")
+    private String memberAvatar;
+
+
+    @ApiModelProperty(value = "内容")
+    private String comment;
+
+
+    @ApiModelProperty(value = "时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "评论数量")
+    private Integer commentCnt = 0;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiAllSocialVo.java b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiAllSocialVo.java
index a3a617f..c7e0f53 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiAllSocialVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiAllSocialVo.java
@@ -18,5 +18,7 @@
     private String name;
     @ApiModelProperty(value = "封面")
     private String indexFile;
+    @ApiModelProperty(value = "点赞数量")
+    private Integer likeCnt;
 
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiSocialInfoVo.java b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiSocialInfoVo.java
index 4708498..3dc5524 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiSocialInfoVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/clothes/ApiSocialInfoVo.java
@@ -33,4 +33,16 @@
     @ApiModelProperty(value = "我的灵感")
     private ApiSocialMuseVo muse;
 
+    @ApiModelProperty(value = "点赞数量")
+    private Integer likeCnt = 0;
+
+    @ApiModelProperty(value = "收藏数量")
+    private Integer collectCnt = 0;
+
+    @ApiModelProperty(value = "评论数量")
+    private Integer commentCnt = 0;
+
+    @ApiModelProperty(value = "是否允许评论 0-禁止 1-允许")
+    private Integer commentState;
+
 }
diff --git a/src/main/resources/mapper/modules/ClothesSocialCommentMapper.xml b/src/main/resources/mapper/modules/ClothesSocialCommentMapper.xml
index 6cb717c..c7a6db4 100644
--- a/src/main/resources/mapper/modules/ClothesSocialCommentMapper.xml
+++ b/src/main/resources/mapper/modules/ClothesSocialCommentMapper.xml
@@ -2,5 +2,44 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cc.mrbird.febs.mall.mapper.ClothesSocialCommentMapper">
 
+    <select id="selectPageInComment" resultType="cc.mrbird.febs.mall.vo.clothes.ApiAllCommentVo">
+        select
+        b.name as memberName,
+        b.avatar as memberAvatar,
+        a.id as commentId,
+        a.comment as comment,
+        a.created_time as createdTime
+        from clothes_social_comment a
+        left join mall_member b on a.member_id = b.id
+        left join clothes_social c on a.social_id = b.id
+        <where>
+            and a.show_state = 1
+            and a.social_id = #{record.socialId}
+            <if test="record != null">
+                <if test="record.parentId != null">
+                    and a.parent_id = #{record.parentId}
+                </if>
+                <if test="record.parentId == null">
+                    and a.parent_id is null
+                </if>
+            </if>
+        </where>
+        order bya.created_time asc
+    </select>
 
+    <select id="selectSocialCommentListInPage" resultType="cc.mrbird.febs.mall.vo.clothes.AdminClothesSocialCommentVo">
+        select
+        b.name as memberName,
+        a.id as commentId,
+        a.show_state as showState,
+        a.comment as comment,
+        a.created_time as createdTime
+        from clothes_social_comment a
+        left join mall_member b on a.member_id = b.id
+        left join clothes_social c on a.social_id = b.id
+        <where>
+            and a.social_id = #{record.socialId}
+        </where>
+        order by a.created_time asc
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/ClothesSocialMapper.xml b/src/main/resources/mapper/modules/ClothesSocialMapper.xml
index aedfcd4..7623eee 100644
--- a/src/main/resources/mapper/modules/ClothesSocialMapper.xml
+++ b/src/main/resources/mapper/modules/ClothesSocialMapper.xml
@@ -9,6 +9,7 @@
         a.name as socialTitle,
         a.del_flag as delFlag,
         a.hot_state as hotState,
+        a.comment_state as commentState,
         a.state as socialState
         from clothes_social a
         left join mall_member b on a.member_id = b.id
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/socialComment.html b/src/main/resources/templates/febs/views/modules/clothesType/socialComment.html
new file mode 100644
index 0000000..825d271
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/clothesType/socialComment.html
@@ -0,0 +1,86 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-comment-child" lay-title="评论">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+
+                    <form class="layui-form layui-table-form" lay-filter="comment-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="commentChild" lay-data="{id: 'commentChild'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/html" id="showStateSwitch">
+    {{# if(d.showState === 1) { }}
+    <input type="checkbox" value={{d.commentId}} lay-text="显示|隐藏" checked lay-skin="switch" lay-filter="showStateSwitch">
+    {{# } else { }}
+    <input type="checkbox" value={{d.commentId}} lay-text="显示|隐藏" lay-skin="switch" lay-filter="showStateSwitch">
+    {{# } }}
+</script>
+<script data-th-inline="none" type="text/javascript">
+    layui.use(['dropdown', 'jquery', 'laydate', 'form', 'table', 'febs', 'treeSelect' ,'eleTree'], function () {
+        var $ = layui.jquery,
+            laydate = layui.laydate,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            treeSelect = layui.treeSelect,
+            dropdown = layui.dropdown,
+            $view = $('#febs-comment-child'),
+            $query = $view.find('#query'),
+            sortObject = {field: 'createTime', type: null},
+            tableIns,
+            createTimeFrom,
+            createTimeTo;
+
+        form.render();
+
+        // 查询按钮
+        $query.on('click', function () {
+            tableIns.reload({where: null, page: {curr: 1}});
+        });
+
+        form.on('switch(showStateSwitch)', function (data) {
+            console.log(data.value);
+            if (data.elem.checked) {
+                showStateSwitch(data.value,1);
+            } else {
+                showStateSwitch(data.value,0);
+            }
+        })
+        function showStateSwitch(id,state) {
+            febs.get(ctx + 'admin/clothesType/showStateSwitch/' + id+'/' + state, null, function (data) {
+                febs.alert.success(data.message);
+                $query.click();
+            });
+        }
+
+        initCommentTable();
+
+        function initCommentTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'commentChild',
+                url: ctx + 'admin/clothesType/socialComment?parentId=1',
+                cols: [[
+                    {field: 'commentId', title: '评论ID', minWidth: 80,align:'center'},
+                    {field: 'showState', title: '是否显示', templet: '#showStateSwitch', minWidth: 130,align:'center'},
+                    {field: 'memberName', title: '昵称', minWidth: 150,align:'center'},
+                    {field: 'comment', title: '内容', minWidth: 150,align:'left'},
+                    {field: 'createdTime', title: '时间', minWidth: 150,align:'left'},
+                ]]
+            });
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/clothesType/socialList.html b/src/main/resources/templates/febs/views/modules/clothesType/socialList.html
index 375fa07..a7f124b 100644
--- a/src/main/resources/templates/febs/views/modules/clothesType/socialList.html
+++ b/src/main/resources/templates/febs/views/modules/clothesType/socialList.html
@@ -57,6 +57,13 @@
     <a lay-event="edit" shiro:hasPermission="votesActivityUpdate:update"><i
             class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
 </script>
+<script type="text/html" id="commentStateSwitch">
+    {{# if(d.commentState === 1) { }}
+    <input type="checkbox" value={{d.id}} lay-text="允许|禁止" checked lay-skin="switch" lay-filter="commentStateSwitch">
+    {{# } else { }}
+    <input type="checkbox" value={{d.id}} lay-text="允许|禁止" lay-skin="switch" lay-filter="commentStateSwitch">
+    {{# } }}
+</script>
 <script type="text/html" id="scStateSwitch">
     {{# if(d.socialState === 1) { }}
     <input type="checkbox" value={{d.id}} lay-text="展示|隐藏" checked lay-skin="switch" lay-filter="scStateSwitch">
@@ -91,6 +98,7 @@
 <script type="text/html" id="activityOption">
     <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="scUpdateEvent">编辑</button>
     <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="museEvent">设计灵感</button>
+    <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="commentEvent">查看评论</button>
     <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" lay-event="scDeleteEvent">删除</button>
 </script>
 
@@ -154,6 +162,11 @@
                     }
                 });
             }
+            if (layEvent === 'commentEvent') {
+                febs.modal.open('评论','modules/clothesType/socialComment/' + data.id, {
+                    area:['100%','100%'],
+                });
+            }
             if (layEvent === 'museEvent') {
                 febs.modal.open('编辑','modules/clothesType/socialMuseUpdate/' + data.id, {
                     btn: ['提交', '取消'],
@@ -195,6 +208,20 @@
                 $query.click();
             });
         }
+
+        form.on('switch(commentStateSwitch)', function (data) {
+            if (data.elem.checked) {
+                commentStateSwitch(data.value,1);
+            } else {
+                commentStateSwitch(data.value,0);
+            }
+        })
+        function commentStateSwitch(id,state) {
+            febs.get(ctx + 'admin/clothesType/commentStateSwitch/' + id+'/' + state, null, function (data) {
+                febs.alert.success(data.message);
+                $query.click();
+            });
+        }
         function delAct(id) {
             febs.get(ctx + 'admin/clothesType/socialDelete/' + id, null, function (data) {
                 febs.alert.success(data.message);
@@ -230,9 +257,10 @@
                 defaultToolbar:[],
                 cols: [[
                     {type: 'numbers', title: '', width: 80},
-                    {title: '操作', toolbar: '#activityOption', minWidth: 200, align: 'center'},
+                    {title: '操作', toolbar: '#activityOption', minWidth: 400, align: 'center'},
                     {field: 'name', title: '发布人', minWidth: 150,align:'left'},
                     {field: 'socialTitle', title: '标题', minWidth: 150,align:'left'},
+                    {field: 'commentState', title: '允许评论', templet: '#commentStateSwitch', minWidth: 130,align:'center'},
                     {field: 'socialState', title: '状态', templet: '#scStateSwitch', minWidth: 130,align:'center'},
                     {field: 'hotState', title: '显示首页', templet: '#scHotStateSwitch', minWidth: 130,align:'center'},
                     {templet:"#socialDelFlagFormat",  title: '是否删除', minWidth: 140,align:'left'},

--
Gitblit v1.9.1