Commit 7a792a7d48306b2cd8091a28f0ccf743840bbb35

Authored by jason
1 parent 7fef5943

商品收藏相关修改

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;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 6 import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoritePageReqVO;
6 7 import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoriteReqVO;
7 8 import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoriteRespVO;
  9 +import cn.iocoder.yudao.module.product.convert.favorite.ProductFavoriteConvert;
  10 +import cn.iocoder.yudao.module.product.dal.dataobject.favorite.ProductFavoriteDO;
  11 +import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
8 12 import cn.iocoder.yudao.module.product.service.favorite.ProductFavoriteService;
  13 +import cn.iocoder.yudao.module.product.service.spu.ProductSpuService;
9 14 import io.swagger.v3.oas.annotations.Operation;
10 15 import io.swagger.v3.oas.annotations.tags.Tag;
11 16 import org.springframework.web.bind.annotation.*;
... ... @@ -13,6 +18,9 @@ import org.springframework.web.bind.annotation.*;
13 18 import javax.annotation.Resource;
14 19 import javax.validation.Valid;
15 20  
  21 +import java.util.List;
  22 +import java.util.Objects;
  23 +
16 24 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
17 25 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
18 26  
... ... @@ -23,30 +31,46 @@ public class AppFavoriteController {
23 31  
24 32 @Resource
25 33 private ProductFavoriteService productFavoriteService;
  34 + @Resource
  35 + private ProductSpuService productSpuService;
26 36  
27 37 @PostMapping(value = "/create")
28 38 @Operation(summary = "商品收藏")
29   - public CommonResult<Boolean> createFavorite(@RequestBody @Valid AppFavoriteReqVO reqVO) {
  39 + //@PreAuthenticated TODO 暂时注释
  40 + public CommonResult<Long> createFavorite(@RequestBody @Valid AppFavoriteReqVO reqVO) {
30 41 return success(productFavoriteService.createFavorite(getLoginUserId(), reqVO));
31 42 }
32 43  
33 44 @DeleteMapping(value = "/delete")
34 45 @Operation(summary = "取消商品收藏")
35 46 public CommonResult<Boolean> deleteFavorite(@RequestBody @Valid AppFavoriteReqVO reqVO) {
36   - return success(productFavoriteService.deleteFavorite(getLoginUserId(), reqVO));
  47 + productFavoriteService.deleteFavorite(getLoginUserId(), reqVO);
  48 + return success(Boolean.TRUE);
37 49 }
38 50  
39 51 @GetMapping(value = "/page")
40 52 @Operation(summary = "分页获取商品收藏列表")
41 53 public CommonResult<PageResult<AppFavoriteRespVO>> getFavoritePage(AppFavoritePageReqVO reqVO) {
42   - return success(productFavoriteService.getFavoritePage(getLoginUserId(),reqVO));
  54 + PageResult<ProductFavoriteDO> favorites = productFavoriteService.getFavoritePage(getLoginUserId(), reqVO);
  55 + if (favorites.getTotal() <= 0) {
  56 + return success(PageResult.empty());
  57 + }
  58 + List<ProductFavoriteDO> productFavoriteList = favorites.getList();
  59 + // 得到商品 spu 信息
  60 + List<Long> spuIds = CollectionUtils.convertList(productFavoriteList, ProductFavoriteDO::getSpuId);
  61 + List<ProductSpuDO> spuList = productSpuService.getSpuList(spuIds);
  62 + //转换 VO
  63 + PageResult<AppFavoriteRespVO> pageResult = new PageResult<>(favorites.getTotal());
  64 + pageResult.setList(ProductFavoriteConvert.INSTANCE.convertList(productFavoriteList, spuList));
  65 + return success(pageResult);
43 66 }
44 67  
45 68  
46 69 @GetMapping(value = "/exits")
47 70 @Operation(summary = "检查是否收藏过商品")
48 71 public CommonResult<Boolean> isFavoriteExists(AppFavoriteReqVO reqVO) {
49   - return success(productFavoriteService.checkFavorite(getLoginUserId(), reqVO));
  72 + ProductFavoriteDO favoriteDO = productFavoriteService.getFavorite(getLoginUserId(), reqVO);
  73 + return success(Objects.nonNull(favoriteDO));
50 74 }
51 75  
52 76 }
... ...
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;
9 9  
10 10 import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
11 11  
12   -@Schema(description = "用户 APP - 商品收藏 Request VO") // 用于收藏、取消收藏
  12 +@Schema(description = "用户 APP - 商品收藏 Request VO") // 用于收藏、取消收藏, 获取收藏
13 13 @Data
14 14 public class AppFavoriteReqVO {
15 15  
... ...
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/favorite/ProductFavoriteConvert.java
1 1 package cn.iocoder.yudao.module.product.convert.favorite;
2 2  
  3 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
3 4 import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoriteReqVO;
4 5 import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoriteRespVO;
5 6 import cn.iocoder.yudao.module.product.dal.dataobject.favorite.ProductFavoriteDO;
... ... @@ -8,13 +9,28 @@ import org.mapstruct.Mapper;
8 9 import org.mapstruct.Mapping;
9 10 import org.mapstruct.factory.Mappers;
10 11  
  12 +import java.util.ArrayList;
  13 +import java.util.List;
  14 +import java.util.Map;
  15 +
11 16 @Mapper
12 17 public interface ProductFavoriteConvert {
13 18  
14 19 ProductFavoriteConvert INSTANCE = Mappers.getMapper(ProductFavoriteConvert.class);
15 20  
16 21 ProductFavoriteDO convert(Long userId, AppFavoriteReqVO reqVO);
  22 +
17 23 @Mapping(target = "id", source = "favoriteDO.id")
18 24 @Mapping(target = "spuName", source = "spuDO.name")
19 25 AppFavoriteRespVO convert(ProductSpuDO spuDO, ProductFavoriteDO favoriteDO);
  26 +
  27 + default List<AppFavoriteRespVO> convertList(List<ProductFavoriteDO> productFavoriteDOList, List<ProductSpuDO> productSpuDOList) {
  28 + List<AppFavoriteRespVO> resultList = new ArrayList<>(productFavoriteDOList.size());
  29 + Map<Long, ProductSpuDO> spuMap = CollectionUtils.convertMap(productSpuDOList, ProductSpuDO::getId);
  30 + for (ProductFavoriteDO item : productFavoriteDOList) {
  31 + ProductSpuDO spuDO = spuMap.get(item.getSpuId());
  32 + resultList.add(convert(spuDO, item));
  33 + }
  34 + return resultList;
  35 + }
20 36 }
... ...
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;
4 4 import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoritePageReqVO;
5 5 import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoriteReqVO;
6 6 import cn.iocoder.yudao.module.product.controller.app.favorite.vo.AppFavoriteRespVO;
  7 +import cn.iocoder.yudao.module.product.dal.dataobject.favorite.ProductFavoriteDO;
7 8  
8 9 import javax.validation.Valid;
9 10  
... ... @@ -20,7 +21,7 @@ public interface ProductFavoriteService {
20 21 * @param userId 用户 id
21 22 * @param reqVO 请求 vo
22 23 */
23   - Boolean createFavorite(Long userId, @Valid AppFavoriteReqVO reqVO);
  24 + Long createFavorite(Long userId, @Valid AppFavoriteReqVO reqVO);
24 25  
25 26 /**
26 27 * 取消商品收藏
... ... @@ -28,25 +29,22 @@ public interface ProductFavoriteService {
28 29 * @param userId 用户 id
29 30 * @param reqVO 请求 vo
30 31 */
31   - Boolean deleteFavorite(Long userId, @Valid AppFavoriteReqVO reqVO);
  32 + void deleteFavorite(Long userId, @Valid AppFavoriteReqVO reqVO);
32 33  
33   - // TODO @Jason:VO 拼接,可以交给 Controller 哈,Service 尽量简洁
34 34 /**
35 35 * 分页查询用户收藏列表
36 36 *
37 37 * @param userId 用户 id
38 38 * @param reqVO 请求 vo
39 39 */
40   - PageResult<AppFavoriteRespVO> getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO);
  40 + PageResult<ProductFavoriteDO> getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO);
41 41  
42   - // TODO @Jason 这个方法最好返回 FavoriteDO 就好。Service 要通用;
43 42 /**
44   - * 检查是否收藏过商品
  43 + * 获取收藏过商品
45 44 *
46 45 * @param userId 用户id
47 46 * @param reqVO 请求 vo
48   - * @return true: 已收藏 false: 未收藏
49 47 */
50   - Boolean checkFavorite(Long userId, @Valid AppFavoriteReqVO reqVO);
  48 + ProductFavoriteDO getFavorite(Long userId, @Valid AppFavoriteReqVO reqVO);
51 49  
52 50 }
... ...
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_
35 35 public class ProductFavoriteServiceImpl implements ProductFavoriteService {
36 36  
37 37 @Resource
38   - private ProductSpuService productSpuService;
39   -
40   - // TODO @JASON:ProductFavoriteMapper 最好全一点哈。productFavoriteMapper
41   - @Resource
42   - private ProductFavoriteMapper mapper;
  38 + private ProductFavoriteMapper productFavoriteMapper;
43 39  
44 40 @Override
45   - public Boolean createFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) {
46   - // TODO @JASON:userId 校验可以去掉,直接在 Controller 要求登录,通过 @PreAuthenticated 注解
47   - Assert.notNull(userId, "the userId must not be null");
48   - ProductFavoriteDO favoriteDO = mapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType());
  41 + public Long createFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) {
  42 + ProductFavoriteDO favoriteDO = productFavoriteMapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType());
49 43 if (Objects.nonNull(favoriteDO)) {
50 44 throw exception(FAVORITE_EXISTS);
51 45 }
52 46 ProductFavoriteDO entity = ProductFavoriteConvert.INSTANCE.convert(userId, reqVO);
53   - mapper.insert(entity);
54   - // TODO @JASON:可以返回 Long id;
55   - return Boolean.TRUE;
  47 + productFavoriteMapper.insert(entity);
  48 + return entity.getId();
56 49 }
57 50  
58 51 @Override
59   - public Boolean deleteFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) {
60   - Assert.notNull(userId, "the userId must not be null ");
61   - ProductFavoriteDO favoriteDO = mapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType());
  52 + public void deleteFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) {
  53 + ProductFavoriteDO favoriteDO = productFavoriteMapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType());
62 54 if (Objects.isNull(favoriteDO)) {
63 55 throw exception(FAVORITE_NOT_EXISTS);
64 56 }
65   - mapper.deleteById(favoriteDO.getId());
66   - // TODO 可以不返回
67   - return Boolean.TRUE;
  57 + productFavoriteMapper.deleteById(favoriteDO.getId());
68 58 }
69 59  
70 60 @Override
71   - public PageResult<AppFavoriteRespVO> getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO) {
72   - Assert.notNull(userId, "the userId must not be null ");
73   - PageResult<ProductFavoriteDO> favorites = mapper.selectPageByUserAndType(userId, reqVO.getType(), reqVO);
74   - // TODO @Jason:if return 更好;例如说,如果判断是空,就 return 掉;
75   - if (favorites.getTotal() > 0) {
76   - PageResult<AppFavoriteRespVO> pageResult = new PageResult<>(favorites.getTotal());
77   - List<ProductFavoriteDO> list = favorites.getList();
78   - // 得到商品 spu 信息
79   - List<Long> spuIds = CollectionUtils.convertList(list, ProductFavoriteDO::getSpuId);
80   - // TODO @Jason:这里可以用默认的方法,不用 , val -> val 拉
81   - Map<Long, ProductSpuDO> spuMap = CollectionUtils.convertMap(productSpuService.getSpuList(spuIds), ProductSpuDO::getId, val -> val);
82   - List<AppFavoriteRespVO> resultList = new ArrayList<>(list.size());
83   - for (ProductFavoriteDO item : list) {
84   - ProductSpuDO spuDO = spuMap.get(item.getSpuId());
85   - // TODO @Jason:可以让 convert 整个 convert 放到 mapstruct 里。convert 就是用于各种数据转换,不带逻辑的那种。
86   - resultList.add(ProductFavoriteConvert.INSTANCE.convert(spuDO, item));
87   - }
88   - pageResult.setList(resultList);
89   - return pageResult;
90   - }else {
91   - return PageResult.empty();
92   - }
  61 + public PageResult<ProductFavoriteDO> getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO) {
  62 + return productFavoriteMapper.selectPageByUserAndType(userId, reqVO.getType(), reqVO);
93 63 }
94 64  
95 65 @Override
96   - public Boolean checkFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) {
97   - Assert.notNull(userId, "the userId must not be null ");
98   - ProductFavoriteDO favoriteDO = mapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType());
99   - return Objects.nonNull(favoriteDO);
  66 + public ProductFavoriteDO getFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) {
  67 + return productFavoriteMapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType());
100 68 }
101 69  
102 70 }
... ...