From 7a792a7d48306b2cd8091a28f0ccf743840bbb35 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sun, 14 May 2023 23:39:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=93=81=E6=94=B6=E8=97=8F=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/favorite/AppFavoriteController.java | 32 +++++++++-- .../app/favorite/vo/AppFavoriteReqVO.java | 2 +- .../favorite/ProductFavoriteConvert.java | 16 ++++++ .../favorite/ProductFavoriteService.java | 14 ++--- .../favorite/ProductFavoriteServiceImpl.java | 56 ++++--------------- 5 files changed, 63 insertions(+), 57 deletions(-) diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/favorite/AppFavoriteController.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/favorite/AppFavoriteController.java index 4359dd124..9859e433e 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/favorite/AppFavoriteController.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/favorite/AppFavoriteController.java @@ -2,10 +2,15 @@ package cn.iocoder.yudao.module.product.controller.app.favorite; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoritePageReqVO; import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoriteReqVO; import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoriteRespVO; +import cn.iocoder.yudao.module.product.convert.favorite.ProductFavoriteConvert; +import cn.iocoder.yudao.module.product.dal.dataobject.favorite.ProductFavoriteDO; +import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; import cn.iocoder.yudao.module.product.service.favorite.ProductFavoriteService; +import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.web.bind.annotation.*; @@ -13,6 +18,9 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -23,30 +31,46 @@ public class AppFavoriteController { @Resource private ProductFavoriteService productFavoriteService; + @Resource + private ProductSpuService productSpuService; @PostMapping(value = "/create") @Operation(summary = "商品收藏") - public CommonResult createFavorite(@RequestBody @Valid AppFavoriteReqVO reqVO) { + //@PreAuthenticated TODO 暂时注释 + public CommonResult createFavorite(@RequestBody @Valid AppFavoriteReqVO reqVO) { return success(productFavoriteService.createFavorite(getLoginUserId(), reqVO)); } @DeleteMapping(value = "/delete") @Operation(summary = "取消商品收藏") public CommonResult deleteFavorite(@RequestBody @Valid AppFavoriteReqVO reqVO) { - return success(productFavoriteService.deleteFavorite(getLoginUserId(), reqVO)); + productFavoriteService.deleteFavorite(getLoginUserId(), reqVO); + return success(Boolean.TRUE); } @GetMapping(value = "/page") @Operation(summary = "分页获取商品收藏列表") public CommonResult> getFavoritePage(AppFavoritePageReqVO reqVO) { - return success(productFavoriteService.getFavoritePage(getLoginUserId(),reqVO)); + PageResult favorites = productFavoriteService.getFavoritePage(getLoginUserId(), reqVO); + if (favorites.getTotal() <= 0) { + return success(PageResult.empty()); + } + List productFavoriteList = favorites.getList(); + // 得到商品 spu 信息 + List spuIds = CollectionUtils.convertList(productFavoriteList, ProductFavoriteDO::getSpuId); + List spuList = productSpuService.getSpuList(spuIds); + //转换 VO + PageResult pageResult = new PageResult<>(favorites.getTotal()); + pageResult.setList(ProductFavoriteConvert.INSTANCE.convertList(productFavoriteList, spuList)); + return success(pageResult); } @GetMapping(value = "/exits") @Operation(summary = "检查是否收藏过商品") public CommonResult isFavoriteExists(AppFavoriteReqVO reqVO) { - return success(productFavoriteService.checkFavorite(getLoginUserId(), reqVO)); + ProductFavoriteDO favoriteDO = productFavoriteService.getFavorite(getLoginUserId(), reqVO); + return success(Objects.nonNull(favoriteDO)); } } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/favorite/vo/AppFavoriteReqVO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/favorite/vo/AppFavoriteReqVO.java index 95fa8e867..415b474ab 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/favorite/vo/AppFavoriteReqVO.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/favorite/vo/AppFavoriteReqVO.java @@ -9,7 +9,7 @@ import javax.validation.constraints.NotNull; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; -@Schema(description = "用户 APP - 商品收藏 Request VO") // 用于收藏、取消收藏 +@Schema(description = "用户 APP - 商品收藏 Request VO") // 用于收藏、取消收藏, 获取收藏 @Data public class AppFavoriteReqVO { diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/favorite/ProductFavoriteConvert.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/favorite/ProductFavoriteConvert.java index 0d9e5e809..097a877fc 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/favorite/ProductFavoriteConvert.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/favorite/ProductFavoriteConvert.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.product.convert.favorite; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoriteReqVO; import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoriteRespVO; import cn.iocoder.yudao.module.product.dal.dataobject.favorite.ProductFavoriteDO; @@ -8,13 +9,28 @@ import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + @Mapper public interface ProductFavoriteConvert { ProductFavoriteConvert INSTANCE = Mappers.getMapper(ProductFavoriteConvert.class); ProductFavoriteDO convert(Long userId, AppFavoriteReqVO reqVO); + @Mapping(target = "id", source = "favoriteDO.id") @Mapping(target = "spuName", source = "spuDO.name") AppFavoriteRespVO convert(ProductSpuDO spuDO, ProductFavoriteDO favoriteDO); + + default List convertList(List productFavoriteDOList, List productSpuDOList) { + List resultList = new ArrayList<>(productFavoriteDOList.size()); + Map spuMap = CollectionUtils.convertMap(productSpuDOList, ProductSpuDO::getId); + for (ProductFavoriteDO item : productFavoriteDOList) { + ProductSpuDO spuDO = spuMap.get(item.getSpuId()); + resultList.add(convert(spuDO, item)); + } + return resultList; + } } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/favorite/ProductFavoriteService.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/favorite/ProductFavoriteService.java index 262cef1af..2c6076969 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/favorite/ProductFavoriteService.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/favorite/ProductFavoriteService.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoritePageReqVO; import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoriteReqVO; import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoriteRespVO; +import cn.iocoder.yudao.module.product.dal.dataobject.favorite.ProductFavoriteDO; import javax.validation.Valid; @@ -20,7 +21,7 @@ public interface ProductFavoriteService { * @param userId 用户 id * @param reqVO 请求 vo */ - Boolean createFavorite(Long userId, @Valid AppFavoriteReqVO reqVO); + Long createFavorite(Long userId, @Valid AppFavoriteReqVO reqVO); /** * 取消商品收藏 @@ -28,25 +29,22 @@ public interface ProductFavoriteService { * @param userId 用户 id * @param reqVO 请求 vo */ - Boolean deleteFavorite(Long userId, @Valid AppFavoriteReqVO reqVO); + void deleteFavorite(Long userId, @Valid AppFavoriteReqVO reqVO); - // TODO @Jason:VO 拼接,可以交给 Controller 哈,Service 尽量简洁 /** * 分页查询用户收藏列表 * * @param userId 用户 id * @param reqVO 请求 vo */ - PageResult getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO); + PageResult getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO); - // TODO @Jason 这个方法最好返回 FavoriteDO 就好。Service 要通用; /** - * 检查是否收藏过商品 + * 获取收藏过商品 * * @param userId 用户id * @param reqVO 请求 vo - * @return true: 已收藏 false: 未收藏 */ - Boolean checkFavorite(Long userId, @Valid AppFavoriteReqVO reqVO); + ProductFavoriteDO getFavorite(Long userId, @Valid AppFavoriteReqVO reqVO); } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/favorite/ProductFavoriteServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/favorite/ProductFavoriteServiceImpl.java index 77d592f6d..25ae0966a 100644 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/favorite/ProductFavoriteServiceImpl.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/favorite/ProductFavoriteServiceImpl.java @@ -35,68 +35,36 @@ import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.FAVORITE_ public class ProductFavoriteServiceImpl implements ProductFavoriteService { @Resource - private ProductSpuService productSpuService; - - // TODO @JASON:ProductFavoriteMapper 最好全一点哈。productFavoriteMapper - @Resource - private ProductFavoriteMapper mapper; + private ProductFavoriteMapper productFavoriteMapper; @Override - public Boolean createFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) { - // TODO @JASON:userId 校验可以去掉,直接在 Controller 要求登录,通过 @PreAuthenticated 注解 - Assert.notNull(userId, "the userId must not be null"); - ProductFavoriteDO favoriteDO = mapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType()); + public Long createFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) { + ProductFavoriteDO favoriteDO = productFavoriteMapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType()); if (Objects.nonNull(favoriteDO)) { throw exception(FAVORITE_EXISTS); } ProductFavoriteDO entity = ProductFavoriteConvert.INSTANCE.convert(userId, reqVO); - mapper.insert(entity); - // TODO @JASON:可以返回 Long id; - return Boolean.TRUE; + productFavoriteMapper.insert(entity); + return entity.getId(); } @Override - public Boolean deleteFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) { - Assert.notNull(userId, "the userId must not be null "); - ProductFavoriteDO favoriteDO = mapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType()); + public void deleteFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) { + ProductFavoriteDO favoriteDO = productFavoriteMapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType()); if (Objects.isNull(favoriteDO)) { throw exception(FAVORITE_NOT_EXISTS); } - mapper.deleteById(favoriteDO.getId()); - // TODO 可以不返回 - return Boolean.TRUE; + productFavoriteMapper.deleteById(favoriteDO.getId()); } @Override - public PageResult getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO) { - Assert.notNull(userId, "the userId must not be null "); - PageResult favorites = mapper.selectPageByUserAndType(userId, reqVO.getType(), reqVO); - // TODO @Jason:if return 更好;例如说,如果判断是空,就 return 掉; - if (favorites.getTotal() > 0) { - PageResult pageResult = new PageResult<>(favorites.getTotal()); - List list = favorites.getList(); - // 得到商品 spu 信息 - List spuIds = CollectionUtils.convertList(list, ProductFavoriteDO::getSpuId); - // TODO @Jason:这里可以用默认的方法,不用 , val -> val 拉 - Map spuMap = CollectionUtils.convertMap(productSpuService.getSpuList(spuIds), ProductSpuDO::getId, val -> val); - List resultList = new ArrayList<>(list.size()); - for (ProductFavoriteDO item : list) { - ProductSpuDO spuDO = spuMap.get(item.getSpuId()); - // TODO @Jason:可以让 convert 整个 convert 放到 mapstruct 里。convert 就是用于各种数据转换,不带逻辑的那种。 - resultList.add(ProductFavoriteConvert.INSTANCE.convert(spuDO, item)); - } - pageResult.setList(resultList); - return pageResult; - }else { - return PageResult.empty(); - } + public PageResult getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO) { + return productFavoriteMapper.selectPageByUserAndType(userId, reqVO.getType(), reqVO); } @Override - public Boolean checkFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) { - Assert.notNull(userId, "the userId must not be null "); - ProductFavoriteDO favoriteDO = mapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType()); - return Objects.nonNull(favoriteDO); + public ProductFavoriteDO getFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) { + return productFavoriteMapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType()); } }