diff --git a/admin/admin-application/src/main/java/cn/iocoder/mall/admin/application/controller/admins/AdminController.java b/admin/admin-application/src/main/java/cn/iocoder/mall/admin/application/controller/admins/AdminController.java index ca21069fd..a14c331d2 100644 --- a/admin/admin-application/src/main/java/cn/iocoder/mall/admin/application/controller/admins/AdminController.java +++ b/admin/admin-application/src/main/java/cn/iocoder/mall/admin/application/controller/admins/AdminController.java @@ -82,7 +82,7 @@ public class AdminController { @GetMapping("/page") @ApiOperation(value = "管理员分页") @ApiImplicitParams({ - @ApiImplicitParam(name = "nickname", value = "昵称,模糊匹配", required = true, example = "小王"), + @ApiImplicitParam(name = "nickname", value = "昵称,模糊匹配", example = "小王"), @ApiImplicitParam(name = "pageNo", value = "页码,从 0 开始", example = "0"), @ApiImplicitParam(name = "pageSize", value = "每页条数", required = true, example = "10"), }) diff --git a/admin/admin-service-api/src/main/java/cn/iocoder/mall/admin/api/dto/AdminPageDTO.java b/admin/admin-service-api/src/main/java/cn/iocoder/mall/admin/api/dto/AdminPageDTO.java index 959a3babe..d1e89acef 100644 --- a/admin/admin-service-api/src/main/java/cn/iocoder/mall/admin/api/dto/AdminPageDTO.java +++ b/admin/admin-service-api/src/main/java/cn/iocoder/mall/admin/api/dto/AdminPageDTO.java @@ -1,10 +1,14 @@ package cn.iocoder.mall.admin.api.dto; +import javax.validation.constraints.NotNull; + public class AdminPageDTO { private String nickname; + @NotNull(message = "页码不能为空") private Integer pageNo; + @NotNull(message = "每页条数不能为空") private Integer pageSize; public Integer getPageNo() { diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductSpuController.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductSpuController.java index 59fde7a0d..0430e28b9 100644 --- a/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductSpuController.java +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductSpuController.java @@ -4,8 +4,10 @@ import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.admin.sdk.context.AdminSecurityContextHolder; import cn.iocoder.mall.product.api.ProductSpuService; import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO; +import cn.iocoder.mall.product.api.bo.ProductSpuPageBO; import cn.iocoder.mall.product.api.dto.ProductSkuAddOrUpdateDTO; import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO; +import cn.iocoder.mall.product.api.dto.ProductSpuPageDTO; import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO; import cn.iocoder.mall.product.application.convert.ProductSpuConvert; import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuDetailVO; @@ -103,8 +105,18 @@ public class AdminsProductSpuController { @GetMapping("/spu/page") @ApiOperation("商品 SPU 分页列表") - public CommonResult spuPage() { - return null; + @ApiImplicitParams({ + @ApiImplicitParam(name = "name", value = "商品名称,模糊匹配", example = "小王"), + @ApiImplicitParam(name = "pageNo", value = "页码,从 0 开始", example = "0"), + @ApiImplicitParam(name = "pageSize", value = "每页条数", required = true, example = "10"), + }) + public CommonResult spuPage(@RequestParam(value = "name", required = false) String name, + @RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo, + @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) { + // 创建 ProductSpuPageDTO 对象 + ProductSpuPageDTO productSpuPageDTO = new ProductSpuPageDTO().setName(name).setPageNo(pageNo).setPageSize(pageSize); + CommonResult result = productSpuService.getProductSpuPage(productSpuPageDTO); + return ProductSpuConvert.INSTANCE.convert2(result); } @GetMapping("/spu/info") diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/convert/ProductSpuConvert.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/convert/ProductSpuConvert.java index d734a1aa3..590e6ae66 100644 --- a/product/product-application/src/main/java/cn/iocoder/mall/product/application/convert/ProductSpuConvert.java +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/convert/ProductSpuConvert.java @@ -2,7 +2,9 @@ package cn.iocoder.mall.product.application.convert; import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO; +import cn.iocoder.mall.product.api.bo.ProductSpuPageBO; import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuDetailVO; +import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuPageVO; import org.mapstruct.Mapper; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; @@ -18,4 +20,7 @@ public interface ProductSpuConvert { @Mappings({}) CommonResult convert(CommonResult result); + @Mappings({}) + CommonResult convert2(CommonResult result); + } \ No newline at end of file diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductSpuVO.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductSpuVO.java index b36f6b789..78c92406c 100644 --- a/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductSpuVO.java +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductSpuVO.java @@ -1,10 +1,104 @@ package cn.iocoder.mall.product.application.vo.admins; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; @ApiModel(value = "商品 SPU VO", description = "不包括 SKU 信息 VO") public class AdminsProductSpuVO { + @ApiModelProperty(value = "SPU 编号", required = true, example = "1") + private Integer id; + // ========== 基本信息 ========= + @ApiModelProperty(value = "SPU 名字", required = true, example = "厮大牛逼") + private String name; + @ApiModelProperty(value = "卖点", required = true, example = "各种 MQ 骚操作") + private String sellPoint; + @ApiModelProperty(value = "描述", required = true, example = "你就说强不强") + private String description; + @ApiModelProperty(value = "分类编号", required = true, example = "反正我是信了") + private Integer cid; + @ApiModelProperty(value = "商品主图地址的数组", required = true, example = "http://www.iocoder.cn") + private List picUrls; + + // ========== 其他信息 ========= + @ApiModelProperty(value = "是否上架商品(是否可见)", required = true, example = "true") + private Boolean visible; + @ApiModelProperty(value = "排序字段", required = true, example = "10") + private Integer sort; + + public Integer getId() { + return id; + } + + public AdminsProductSpuVO setId(Integer id) { + this.id = id; + return this; + } + + public String getName() { + return name; + } + + public AdminsProductSpuVO setName(String name) { + this.name = name; + return this; + } + + public String getSellPoint() { + return sellPoint; + } + + public AdminsProductSpuVO setSellPoint(String sellPoint) { + this.sellPoint = sellPoint; + return this; + } + + public String getDescription() { + return description; + } + + public AdminsProductSpuVO setDescription(String description) { + this.description = description; + return this; + } + + public Integer getCid() { + return cid; + } + + public AdminsProductSpuVO setCid(Integer cid) { + this.cid = cid; + return this; + } + + public List getPicUrls() { + return picUrls; + } + + public AdminsProductSpuVO setPicUrls(List picUrls) { + this.picUrls = picUrls; + return this; + } + + public Boolean getVisible() { + return visible; + } + + public AdminsProductSpuVO setVisible(Boolean visible) { + this.visible = visible; + return this; + } + + public Integer getSort() { + return sort; + } + + public AdminsProductSpuVO setSort(Integer sort) { + this.sort = sort; + return this; + } } \ No newline at end of file diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/ProductSpuService.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/ProductSpuService.java index f5e2543a4..25eae89ce 100644 --- a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/ProductSpuService.java +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/ProductSpuService.java @@ -3,11 +3,14 @@ package cn.iocoder.mall.product.api; import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.product.api.bo.ProductSpuBO; import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO; +import cn.iocoder.mall.product.api.bo.ProductSpuPageBO; import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO; +import cn.iocoder.mall.product.api.dto.ProductSpuPageDTO; import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO; public interface ProductSpuService { + // TODO 芋艿,需要去改改 ProductSpuBO getProductSpu(Integer id); CommonResult addProductSpu(Integer adminId, ProductSpuAddDTO productSpuAddDTO); @@ -16,4 +19,6 @@ public interface ProductSpuService { CommonResult updateProductSpuSort(Integer adminId, Integer spuId, Integer sort); + CommonResult getProductSpuPage(ProductSpuPageDTO productSpuPageDTO); + } \ No newline at end of file diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductSpuBO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductSpuBO.java index 7ae0a87bf..b77874859 100644 --- a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductSpuBO.java +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductSpuBO.java @@ -1,15 +1,123 @@ package cn.iocoder.mall.product.api.bo; +import java.util.List; + public class ProductSpuBO { + /** + * SPU 编号 + */ private Integer id; + // ========== 基本信息 ========= + /** + * SPU 名字 + */ + private String name; + /** + * 卖点 + */ + private String sellPoint; + /** + * 描述 + */ + private String description; + /** + * 分类编号 + */ + private Integer cid; + /** + * 商品主图地址 + * + * 数组,以逗号分隔 + * + * 建议尺寸:800*800像素,你可以拖拽图片调整顺序,最多上传15张 + */ + private List picUrls; + + // ========== 其他信息 ========= + /** + * 是否上架商品(是否可见)。 + * + * true 为已上架 + * false 为已下架 + */ + private Boolean visible; + /** + * 排序字段 + */ + private Integer sort; + public Integer getId() { return id; } - public void setId(Integer id) { + public ProductSpuBO setId(Integer id) { this.id = id; + return this; + } + + public String getName() { + return name; + } + + public ProductSpuBO setName(String name) { + this.name = name; + return this; + } + + public String getSellPoint() { + return sellPoint; + } + + public ProductSpuBO setSellPoint(String sellPoint) { + this.sellPoint = sellPoint; + return this; + } + + public String getDescription() { + return description; + } + + public ProductSpuBO setDescription(String description) { + this.description = description; + return this; + } + + public Integer getCid() { + return cid; + } + + public ProductSpuBO setCid(Integer cid) { + this.cid = cid; + return this; + } + + public List getPicUrls() { + return picUrls; + } + + public ProductSpuBO setPicUrls(List picUrls) { + this.picUrls = picUrls; + return this; + } + + public Boolean getVisible() { + return visible; + } + + public ProductSpuBO setVisible(Boolean visible) { + this.visible = visible; + return this; + } + + public Integer getSort() { + return sort; + } + + public ProductSpuBO setSort(Integer sort) { + this.sort = sort; + return this; } } \ No newline at end of file diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductSpuPageBO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductSpuPageBO.java new file mode 100644 index 000000000..89ca0756d --- /dev/null +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductSpuPageBO.java @@ -0,0 +1,34 @@ +package cn.iocoder.mall.product.api.bo; + +import java.util.List; + +public class ProductSpuPageBO { + + /** + * Spu 数组 + */ + private List spus; + /** + * 总量 + */ + private Integer count; + + public List getSpus() { + return spus; + } + + public ProductSpuPageBO setSpus(List spus) { + this.spus = spus; + return this; + } + + public Integer getCount() { + return count; + } + + public ProductSpuPageBO setCount(Integer count) { + this.count = count; + return this; + } + +} \ No newline at end of file diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuPageDTO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuPageDTO.java new file mode 100644 index 000000000..b325904ee --- /dev/null +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuPageDTO.java @@ -0,0 +1,41 @@ +package cn.iocoder.mall.product.api.dto; + +import javax.validation.constraints.NotNull; + +public class ProductSpuPageDTO { + + private String name; + + @NotNull(message = "页码不能为空") + private Integer pageNo; + @NotNull(message = "每页条数不能为空") + private Integer pageSize; + + public String getName() { + return name; + } + + public ProductSpuPageDTO setName(String name) { + this.name = name; + return this; + } + + public Integer getPageNo() { + return pageNo; + } + + public ProductSpuPageDTO setPageNo(Integer pageNo) { + this.pageNo = pageNo; + return this; + } + + public Integer getPageSize() { + return pageSize; + } + + public ProductSpuPageDTO setPageSize(Integer pageSize) { + this.pageSize = pageSize; + return this; + } + +} \ No newline at end of file diff --git a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/convert/ProductSpuConvert.java b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/convert/ProductSpuConvert.java index b32d012c8..4935dafe4 100644 --- a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/convert/ProductSpuConvert.java +++ b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/convert/ProductSpuConvert.java @@ -13,6 +13,7 @@ import cn.iocoder.mall.product.dataobject.ProductSpuDO; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; +import org.mapstruct.Named; import org.mapstruct.factory.Mappers; import java.util.ArrayList; @@ -25,9 +26,14 @@ public interface ProductSpuConvert { ProductSpuConvert INSTANCE = Mappers.getMapper(ProductSpuConvert.class); - @Mappings({}) + @Mappings({ + @Mapping(source = "picUrls", target = "picUrls", qualifiedByName = "translatePicUrlsFromString") + }) ProductSpuBO convert(ProductSpuDO spu); + @Mappings({}) + List convert(List spus); + @Mappings({ @Mapping(source = "picUrls", target = "picUrls", ignore = true) }) @@ -79,4 +85,9 @@ public interface ProductSpuConvert { return spuDetail; } + @Named("translatePicUrlsFromString") + default List translatePicUrlsFromString(String picUrls) { + return StringUtil.split(picUrls, ","); + } + } \ No newline at end of file diff --git a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dao/ProductSpuMapper.java b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dao/ProductSpuMapper.java index b5c5d02dd..acb590d8d 100644 --- a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dao/ProductSpuMapper.java +++ b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dao/ProductSpuMapper.java @@ -1,8 +1,11 @@ package cn.iocoder.mall.product.dao; import cn.iocoder.mall.product.dataobject.ProductSpuDO; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface ProductSpuMapper { @@ -12,4 +15,10 @@ public interface ProductSpuMapper { void update(ProductSpuDO productSpuDO); + List selectListByNameLikeOrderBySortAsc(@Param("name") String name, + @Param("offset") Integer offset, + @Param("limit") Integer limit); + + Integer selectCountByNameLike(@Param("name") String name); + } \ No newline at end of file diff --git a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/service/ProductSpuServiceImpl.java b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/service/ProductSpuServiceImpl.java index 45dfe9985..982558898 100644 --- a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/service/ProductSpuServiceImpl.java +++ b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/service/ProductSpuServiceImpl.java @@ -9,10 +9,12 @@ import cn.iocoder.mall.product.api.ProductSpuService; import cn.iocoder.mall.product.api.bo.ProductAttrDetailBO; import cn.iocoder.mall.product.api.bo.ProductSpuBO; import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO; +import cn.iocoder.mall.product.api.bo.ProductSpuPageBO; import cn.iocoder.mall.product.api.constant.ProductErrorCodeEnum; import cn.iocoder.mall.product.api.constant.ProductSpuConstants; import cn.iocoder.mall.product.api.dto.ProductSkuAddOrUpdateDTO; import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO; +import cn.iocoder.mall.product.api.dto.ProductSpuPageDTO; import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO; import cn.iocoder.mall.product.convert.ProductSpuConvert; import cn.iocoder.mall.product.dao.ProductSkuMapper; @@ -169,6 +171,19 @@ public class ProductSpuServiceImpl implements ProductSpuService { return CommonResult.success(true); } + @Override + public CommonResult getProductSpuPage(ProductSpuPageDTO productSpuPageDTO) { + ProductSpuPageBO productSpuPage = new ProductSpuPageBO(); + // 查询分页数据 + int offset = productSpuPageDTO.getPageNo() * productSpuPageDTO.getPageSize(); + productSpuPage.setSpus(ProductSpuConvert.INSTANCE.convert(productSpuMapper.selectListByNameLikeOrderBySortAsc(productSpuPageDTO.getName(), + offset, productSpuPageDTO.getPageSize()))); + // 查询分页总数 + productSpuPage.setCount(productSpuMapper.selectCountByNameLike(productSpuPageDTO.getName())); + // 返回结果 + return CommonResult.success(productSpuPage); + } + private CommonResult validProductSku(List productSkuAddDTOs, List productAttrDetailBOs) { // 创建 ProductAttrDetailBO 的映射。其中,KEY 为 ProductAttrDetailBO.attrValueId ,即规格值的编号 Map productAttrDetailBOMap = productAttrDetailBOs.stream().collect( diff --git a/product/product-service-impl/src/main/resources/mapper/ProductSpuMapper.xml b/product/product-service-impl/src/main/resources/mapper/ProductSpuMapper.xml index d5b04aa49..2389a1634 100644 --- a/product/product-service-impl/src/main/resources/mapper/ProductSpuMapper.xml +++ b/product/product-service-impl/src/main/resources/mapper/ProductSpuMapper.xml @@ -2,11 +2,17 @@ + + id, name, sell_point, description, cid, + pic_urls, visible, sort, create_time + + @@ -50,4 +56,30 @@ WHERE id = #{id} + + + + \ No newline at end of file