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"></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"></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