Commit 467811a42eeb7f7bb54c3b6d7c73b11c13f786a9
1 parent
0ffa7ff4
REVIEW 商品收藏的逻辑 v2
Showing
6 changed files
with
48 additions
and
33 deletions
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/favorite/AppFavoriteController.java
| @@ -26,29 +26,27 @@ public class AppFavoriteController { | @@ -26,29 +26,27 @@ public class AppFavoriteController { | ||
| 26 | 26 | ||
| 27 | @PostMapping(value = "/create") | 27 | @PostMapping(value = "/create") |
| 28 | @Operation(summary = "商品收藏") | 28 | @Operation(summary = "商品收藏") |
| 29 | - public CommonResult<Boolean> create(@RequestBody @Valid AppFavoriteReqVO reqVO) { | ||
| 30 | - Long loginUserId = getLoginUserId(); | ||
| 31 | - return success(productFavoriteService.create(loginUserId, reqVO)); | 29 | + public CommonResult<Boolean> createFavorite(@RequestBody @Valid AppFavoriteReqVO reqVO) { |
| 30 | + return success(productFavoriteService.createFavorite(getLoginUserId(), reqVO)); | ||
| 32 | } | 31 | } |
| 33 | 32 | ||
| 34 | @DeleteMapping(value = "/delete") | 33 | @DeleteMapping(value = "/delete") |
| 35 | - @Operation(summary = "取消商品收藏(通过商品详情)") | ||
| 36 | - public CommonResult<Boolean> delete(@RequestBody @Valid AppFavoriteReqVO reqVO) { | ||
| 37 | - Long loginUserId = getLoginUserId(); | ||
| 38 | - return success(productFavoriteService.delete(loginUserId,reqVO)); | 34 | + @Operation(summary = "取消商品收藏") |
| 35 | + public CommonResult<Boolean> deleteFavorite(@RequestBody @Valid AppFavoriteReqVO reqVO) { | ||
| 36 | + return success(productFavoriteService.deleteFavorite(getLoginUserId(), reqVO)); | ||
| 39 | } | 37 | } |
| 40 | 38 | ||
| 41 | @GetMapping(value = "/page") | 39 | @GetMapping(value = "/page") |
| 42 | @Operation(summary = "分页获取商品收藏列表") | 40 | @Operation(summary = "分页获取商品收藏列表") |
| 43 | - public CommonResult<PageResult<AppFavoriteRespVO>> page(AppFavoritePageReqVO reqVO) { | ||
| 44 | - Long userId = getLoginUserId(); | ||
| 45 | - return success(productFavoriteService.page(userId,reqVO)); | 41 | + public CommonResult<PageResult<AppFavoriteRespVO>> getFavoritePage(AppFavoritePageReqVO reqVO) { |
| 42 | + return success(productFavoriteService.getFavoritePage(getLoginUserId(),reqVO)); | ||
| 46 | } | 43 | } |
| 47 | 44 | ||
| 48 | - @GetMapping(value = "/checkFavorite") | 45 | + |
| 46 | + @GetMapping(value = "/exits") | ||
| 49 | @Operation(summary = "检查是否收藏过商品") | 47 | @Operation(summary = "检查是否收藏过商品") |
| 50 | - public CommonResult<Boolean> checkFavorite(AppFavoriteReqVO reqVO) { | ||
| 51 | - Long userId = getLoginUserId(); | ||
| 52 | - return success(productFavoriteService.checkFavorite(userId,reqVO)); | 48 | + public CommonResult<Boolean> isFavoriteExists(AppFavoriteReqVO reqVO) { |
| 49 | + return success(productFavoriteService.checkFavorite(getLoginUserId(), reqVO)); | ||
| 53 | } | 50 | } |
| 51 | + | ||
| 54 | } | 52 | } |
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,7 +9,7 @@ import javax.validation.constraints.NotNull; | ||
| 9 | 9 | ||
| 10 | import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; | 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 | @Data | 13 | @Data |
| 14 | public class AppFavoriteReqVO { | 14 | public class AppFavoriteReqVO { |
| 15 | 15 |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/favorite/vo/AppFavoriteRespVO.java
| @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.product.controller.app.favorite.vo; | @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.product.controller.app.favorite.vo; | ||
| 2 | 2 | ||
| 3 | import io.swagger.v3.oas.annotations.media.Schema; | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | import lombok.Data; | 4 | import lombok.Data; |
| 5 | - | ||
| 6 | import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; | 5 | import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; |
| 7 | 6 | ||
| 8 | @Schema(description = "用户APP - 商品收藏 Response VO") | 7 | @Schema(description = "用户APP - 商品收藏 Response VO") |
| @@ -19,6 +18,7 @@ public class AppFavoriteRespVO { | @@ -19,6 +18,7 @@ public class AppFavoriteRespVO { | ||
| 19 | private Integer type; | 18 | private Integer type; |
| 20 | 19 | ||
| 21 | // ========== 商品相关字段 ========== | 20 | // ========== 商品相关字段 ========== |
| 21 | + | ||
| 22 | @Schema(description = "商品 SPU 名称", example = "赵六") | 22 | @Schema(description = "商品 SPU 名称", example = "赵六") |
| 23 | private String spuName; | 23 | private String spuName; |
| 24 | 24 |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/favorite/ProductFavoriteMapper.java
| @@ -31,4 +31,5 @@ public interface ProductFavoriteMapper extends BaseMapperX<ProductFavoriteDO> { | @@ -31,4 +31,5 @@ public interface ProductFavoriteMapper extends BaseMapperX<ProductFavoriteDO> { | ||
| 31 | .eq(ProductFavoriteDO::getType, type) | 31 | .eq(ProductFavoriteDO::getType, type) |
| 32 | .orderByDesc(ProductFavoriteDO::getId)); | 32 | .orderByDesc(ProductFavoriteDO::getId)); |
| 33 | } | 33 | } |
| 34 | + | ||
| 34 | } | 35 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/favorite/ProductFavoriteService.java
| @@ -16,30 +16,37 @@ public interface ProductFavoriteService { | @@ -16,30 +16,37 @@ public interface ProductFavoriteService { | ||
| 16 | 16 | ||
| 17 | /** | 17 | /** |
| 18 | * 创建商品收藏 | 18 | * 创建商品收藏 |
| 19 | - * @param userId 用户id | ||
| 20 | - * @param reqVO 请求vo | 19 | + * |
| 20 | + * @param userId 用户 id | ||
| 21 | + * @param reqVO 请求 vo | ||
| 21 | */ | 22 | */ |
| 22 | - Boolean create(Long userId, @Valid AppFavoriteReqVO reqVO); | 23 | + Boolean createFavorite(Long userId, @Valid AppFavoriteReqVO reqVO); |
| 23 | 24 | ||
| 24 | /** | 25 | /** |
| 25 | - * 取消商品收藏 (通过商品详情页面) | ||
| 26 | - * @param userId 用户id | ||
| 27 | - * @param reqVO 请求vo | 26 | + * 取消商品收藏 |
| 27 | + * | ||
| 28 | + * @param userId 用户 id | ||
| 29 | + * @param reqVO 请求 vo | ||
| 28 | */ | 30 | */ |
| 29 | - Boolean delete(Long userId, @Valid AppFavoriteReqVO reqVO); | 31 | + Boolean deleteFavorite(Long userId, @Valid AppFavoriteReqVO reqVO); |
| 30 | 32 | ||
| 33 | + // TODO @Jason:VO 拼接,可以交给 Controller 哈,Service 尽量简洁 | ||
| 31 | /** | 34 | /** |
| 32 | * 分页查询用户收藏列表 | 35 | * 分页查询用户收藏列表 |
| 33 | - * @param userId 用户id | 36 | + * |
| 37 | + * @param userId 用户 id | ||
| 34 | * @param reqVO 请求 vo | 38 | * @param reqVO 请求 vo |
| 35 | */ | 39 | */ |
| 36 | - PageResult<AppFavoriteRespVO> page(Long userId, @Valid AppFavoritePageReqVO reqVO); | 40 | + PageResult<AppFavoriteRespVO> getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO); |
| 37 | 41 | ||
| 42 | + // TODO @Jason 这个方法最好返回 FavoriteDO 就好。Service 要通用; | ||
| 38 | /** | 43 | /** |
| 39 | * 检查是否收藏过商品 | 44 | * 检查是否收藏过商品 |
| 45 | + * | ||
| 40 | * @param userId 用户id | 46 | * @param userId 用户id |
| 41 | * @param reqVO 请求 vo | 47 | * @param reqVO 请求 vo |
| 42 | * @return true: 已收藏 false: 未收藏 | 48 | * @return true: 已收藏 false: 未收藏 |
| 43 | */ | 49 | */ |
| 44 | Boolean checkFavorite(Long userId, @Valid AppFavoriteReqVO reqVO); | 50 | Boolean checkFavorite(Long userId, @Valid AppFavoriteReqVO reqVO); |
| 51 | + | ||
| 45 | } | 52 | } |
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/favorite/ProductFavoriteServiceImpl.java
| @@ -22,8 +22,8 @@ import java.util.Map; | @@ -22,8 +22,8 @@ import java.util.Map; | ||
| 22 | import java.util.Objects; | 22 | import java.util.Objects; |
| 23 | 23 | ||
| 24 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 24 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 25 | -import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PRODUCT_FAVORITE_EXISTS; | ||
| 26 | -import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PRODUCT_FAVORITE_NOT_EXISTS; | 25 | +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.FAVORITE_EXISTS; |
| 26 | +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.FAVORITE_NOT_EXISTS; | ||
| 27 | 27 | ||
| 28 | /** | 28 | /** |
| 29 | * 商品收藏 Service 实现类 | 29 | * 商品收藏 Service 实现类 |
| @@ -33,47 +33,56 @@ import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PRODUCT_F | @@ -33,47 +33,56 @@ import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PRODUCT_F | ||
| 33 | @Service | 33 | @Service |
| 34 | @Validated | 34 | @Validated |
| 35 | public class ProductFavoriteServiceImpl implements ProductFavoriteService { | 35 | public class ProductFavoriteServiceImpl implements ProductFavoriteService { |
| 36 | + | ||
| 36 | @Resource | 37 | @Resource |
| 37 | private ProductSpuService productSpuService; | 38 | private ProductSpuService productSpuService; |
| 39 | + | ||
| 40 | + // TODO @JASON:ProductFavoriteMapper 最好全一点哈。productFavoriteMapper | ||
| 38 | @Resource | 41 | @Resource |
| 39 | private ProductFavoriteMapper mapper; | 42 | private ProductFavoriteMapper mapper; |
| 40 | 43 | ||
| 41 | @Override | 44 | @Override |
| 42 | - public Boolean create(Long userId, @Valid AppFavoriteReqVO reqVO) { | 45 | + public Boolean createFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) { |
| 46 | + // TODO @JASON:userId 校验可以去掉,直接在 Controller 要求登录,通过 @PreAuthenticated 注解 | ||
| 43 | Assert.notNull(userId, "the userId must not be null"); | 47 | Assert.notNull(userId, "the userId must not be null"); |
| 44 | ProductFavoriteDO favoriteDO = mapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType()); | 48 | ProductFavoriteDO favoriteDO = mapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType()); |
| 45 | if (Objects.nonNull(favoriteDO)) { | 49 | if (Objects.nonNull(favoriteDO)) { |
| 46 | - throw exception(PRODUCT_FAVORITE_EXISTS); | 50 | + throw exception(FAVORITE_EXISTS); |
| 47 | } | 51 | } |
| 48 | ProductFavoriteDO entity = ProductFavoriteConvert.INSTANCE.convert(userId, reqVO); | 52 | ProductFavoriteDO entity = ProductFavoriteConvert.INSTANCE.convert(userId, reqVO); |
| 49 | mapper.insert(entity); | 53 | mapper.insert(entity); |
| 54 | + // TODO @JASON:可以返回 Long id; | ||
| 50 | return Boolean.TRUE; | 55 | return Boolean.TRUE; |
| 51 | } | 56 | } |
| 52 | 57 | ||
| 53 | @Override | 58 | @Override |
| 54 | - public Boolean delete(Long userId, @Valid AppFavoriteReqVO reqVO) { | 59 | + public Boolean deleteFavorite(Long userId, @Valid AppFavoriteReqVO reqVO) { |
| 55 | Assert.notNull(userId, "the userId must not be null "); | 60 | Assert.notNull(userId, "the userId must not be null "); |
| 56 | ProductFavoriteDO favoriteDO = mapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType()); | 61 | ProductFavoriteDO favoriteDO = mapper.selectByUserAndSpuAndType(userId, reqVO.getSpuId(), reqVO.getType()); |
| 57 | if (Objects.isNull(favoriteDO)) { | 62 | if (Objects.isNull(favoriteDO)) { |
| 58 | - throw exception(PRODUCT_FAVORITE_NOT_EXISTS); | 63 | + throw exception(FAVORITE_NOT_EXISTS); |
| 59 | } | 64 | } |
| 60 | mapper.deleteById(favoriteDO.getId()); | 65 | mapper.deleteById(favoriteDO.getId()); |
| 66 | + // TODO 可以不返回 | ||
| 61 | return Boolean.TRUE; | 67 | return Boolean.TRUE; |
| 62 | } | 68 | } |
| 63 | 69 | ||
| 64 | @Override | 70 | @Override |
| 65 | - public PageResult<AppFavoriteRespVO> page(Long userId, @Valid AppFavoritePageReqVO reqVO) { | 71 | + public PageResult<AppFavoriteRespVO> getFavoritePage(Long userId, @Valid AppFavoritePageReqVO reqVO) { |
| 66 | Assert.notNull(userId, "the userId must not be null "); | 72 | Assert.notNull(userId, "the userId must not be null "); |
| 67 | PageResult<ProductFavoriteDO> favorites = mapper.selectPageByUserAndType(userId, reqVO.getType(), reqVO); | 73 | PageResult<ProductFavoriteDO> favorites = mapper.selectPageByUserAndType(userId, reqVO.getType(), reqVO); |
| 74 | + // TODO @Jason:if return 更好;例如说,如果判断是空,就 return 掉; | ||
| 68 | if (favorites.getTotal() > 0) { | 75 | if (favorites.getTotal() > 0) { |
| 69 | PageResult<AppFavoriteRespVO> pageResult = new PageResult<>(favorites.getTotal()); | 76 | PageResult<AppFavoriteRespVO> pageResult = new PageResult<>(favorites.getTotal()); |
| 70 | List<ProductFavoriteDO> list = favorites.getList(); | 77 | List<ProductFavoriteDO> list = favorites.getList(); |
| 71 | - //得到商品spu 信息 | 78 | + // 得到商品 spu 信息 |
| 72 | List<Long> spuIds = CollectionUtils.convertList(list, ProductFavoriteDO::getSpuId); | 79 | List<Long> spuIds = CollectionUtils.convertList(list, ProductFavoriteDO::getSpuId); |
| 80 | + // TODO @Jason:这里可以用默认的方法,不用 , val -> val 拉 | ||
| 73 | Map<Long, ProductSpuDO> spuMap = CollectionUtils.convertMap(productSpuService.getSpuList(spuIds), ProductSpuDO::getId, val -> val); | 81 | Map<Long, ProductSpuDO> spuMap = CollectionUtils.convertMap(productSpuService.getSpuList(spuIds), ProductSpuDO::getId, val -> val); |
| 74 | List<AppFavoriteRespVO> resultList = new ArrayList<>(list.size()); | 82 | List<AppFavoriteRespVO> resultList = new ArrayList<>(list.size()); |
| 75 | for (ProductFavoriteDO item : list) { | 83 | for (ProductFavoriteDO item : list) { |
| 76 | ProductSpuDO spuDO = spuMap.get(item.getSpuId()); | 84 | ProductSpuDO spuDO = spuMap.get(item.getSpuId()); |
| 85 | + // TODO @Jason:可以让 convert 整个 convert 放到 mapstruct 里。convert 就是用于各种数据转换,不带逻辑的那种。 | ||
| 77 | resultList.add(ProductFavoriteConvert.INSTANCE.convert(spuDO, item)); | 86 | resultList.add(ProductFavoriteConvert.INSTANCE.convert(spuDO, item)); |
| 78 | } | 87 | } |
| 79 | pageResult.setList(resultList); | 88 | pageResult.setList(resultList); |