diff --git a/admin/admin-application/src/main/java/cn/iocoder/mall/admin/application/config/MVCConfiguration.java b/admin/admin-application/src/main/java/cn/iocoder/mall/admin/application/config/MVCConfiguration.java index 8cfdabb64..fe9bebbf4 100644 --- a/admin/admin-application/src/main/java/cn/iocoder/mall/admin/application/config/MVCConfiguration.java +++ b/admin/admin-application/src/main/java/cn/iocoder/mall/admin/application/config/MVCConfiguration.java @@ -22,8 +22,8 @@ public class MVCConfiguration implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // registry.addInterceptor(securityInterceptor).addPathPatterns("/user/**", "/admin/**"); // 只拦截我们定义的接口 - registry.addInterceptor(adminSecurityInterceptor).addPathPatterns("/admin/**") - .excludePathPatterns("/admin/passport/login"); // 排除登陆接口 + registry.addInterceptor(adminSecurityInterceptor).addPathPatterns("/admins/**") + .excludePathPatterns("/admins/passport/login"); // 排除登陆接口 } @Override diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductCategoryController.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductCategoryController.java index c1b3ecf7e..e13957856 100644 --- a/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductCategoryController.java +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductCategoryController.java @@ -1,14 +1,124 @@ package cn.iocoder.mall.product.application.controller.admins; +import cn.iocoder.common.framework.vo.CommonResult; +import cn.iocoder.mall.admin.sdk.context.AdminSecurityContextHolder; +import cn.iocoder.mall.product.api.ProductCategoryService; +import cn.iocoder.mall.product.api.bo.ProductCategoryBO; +import cn.iocoder.mall.product.api.constant.ProductCategoryConstants; +import cn.iocoder.mall.product.api.dto.ProductCategoryAddDTO; +import cn.iocoder.mall.product.api.dto.ProductCategoryUpdateDTO; +import cn.iocoder.mall.product.application.convert.ProductCategoryConvert; +import cn.iocoder.mall.product.application.vo.admins.AdminProductCategoryTreeNodeVO; +import cn.iocoder.mall.product.application.vo.admins.AdminsProductCategoryVO; +import com.alibaba.dubbo.config.annotation.Reference; import io.swagger.annotations.Api; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; @RestController -@RequestMapping("admins/product/category") +@RequestMapping("admins/category") @Api("商品分类") public class AdminsProductCategoryController { - + @Reference(validation = "true") + private ProductCategoryService productCategoryService; + + @GetMapping("/tree") + @ApiOperation("获得分类树结构") + public CommonResult> tree() { + List productCategories = productCategoryService.getAll().getData(); + // 创建 ProductCategoryTreeNodeVO Map + Map treeNodeMap = productCategories.stream().collect(Collectors.toMap(ProductCategoryBO::getId, ProductCategoryConvert.INSTANCE::convert)); + // 处理父子关系 + treeNodeMap.values().stream() + .filter(node -> !node.getPid().equals(ProductCategoryConstants.PID_ROOT)) + .forEach((childNode) -> { + // 获得父节点 + AdminProductCategoryTreeNodeVO parentNode = treeNodeMap.get(childNode.getPid()); + if (parentNode.getChildren() == null) { // 初始化 children 数组 + parentNode.setChildren(new ArrayList<>()); + } + // 将自己添加到父节点中 + parentNode.getChildren().add(childNode); + }); + // 获得到所有的根节点 + List rootNodes = treeNodeMap.values().stream() + .filter(node -> node.getPid().equals(ProductCategoryConstants.PID_ROOT)) + .sorted(Comparator.comparing(AdminProductCategoryTreeNodeVO::getSort)) + .collect(Collectors.toList()); + return CommonResult.success(rootNodes); + } + + @PostMapping("/add") + @ApiOperation(value = "创建商品分类") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pid", value = "父级分类编号", required = true, example = "1"), + @ApiImplicitParam(name = "name", value = "分类名字(标识)", required = true, example = "admin/info"), + @ApiImplicitParam(name = "description", value = "描述", required = true, example = "1"), + @ApiImplicitParam(name = "picUrl", value = "分类图片", example = "http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg/"), + @ApiImplicitParam(name = "sort", value = "排序", required = true, example = "1"), + }) + public CommonResult add(@RequestParam("pid") Integer pid, + @RequestParam("name") String name, + @RequestParam("description") String description, + @RequestParam(value = "picUrl", required = false) String picUrl, + @RequestParam("sort") Integer sort) { + // 创建 ProductCategoryAddDTO 对象 + ProductCategoryAddDTO productCategoryAddDTO = new ProductCategoryAddDTO().setPid(pid).setName(name) + .setDescription(description).setPicUrl(picUrl).setSort(sort); + // 创建商品分类 + CommonResult result = productCategoryService.addProductCategory(AdminSecurityContextHolder.getContext().getAdminId(), productCategoryAddDTO); + // 返回结果 + return ProductCategoryConvert.INSTANCE.convert(result); + } + + @PostMapping("/update") + @ApiOperation(value = "更新商品分类") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "分类编号", required = true, example = "1"), + @ApiImplicitParam(name = "pid", value = "父级分类编号", required = true, example = "1"), + @ApiImplicitParam(name = "name", value = "分类名字(标识)", required = true, example = "admin/info"), + @ApiImplicitParam(name = "description", value = "描述", required = true, example = "1"), + @ApiImplicitParam(name = "picUrl", value = "分类图片", example = "http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg/"), + @ApiImplicitParam(name = "sort", value = "排序", required = true, example = "1"), + }) + public CommonResult update(@RequestParam("id") Integer id, + @RequestParam("pid") Integer pid, + @RequestParam("name") String name, + @RequestParam("description") String description, + @RequestParam(value = "picUrl", required = false) String picUrl, + @RequestParam("sort") Integer sort) { + // 创建 ProductCategoryUpdateDTO 对象 + ProductCategoryUpdateDTO productCategoryAddDTO = new ProductCategoryUpdateDTO().setId(id).setPid(pid).setName(name) + .setDescription(description).setPicUrl(picUrl).setSort(sort); + // 更新商品分类 + return productCategoryService.updateProductCategory(AdminSecurityContextHolder.getContext().getAdminId(), productCategoryAddDTO); + } + + @PostMapping("/update_status") + @ApiOperation(value = "更新商品分类状态") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "商品分类编号", required = true, example = "1"), + @ApiImplicitParam(name = "status", value = "状态。1 - 开启;2 - 禁用", required = true, example = "1"), + }) + public CommonResult updateStatus(@RequestParam("id") Integer id, + @RequestParam("status") Integer status) { + return productCategoryService.updateProductCategoryStatus(AdminSecurityContextHolder.getContext().getAdminId(), id, status); + } + + @PostMapping("/delete") + @ApiOperation(value = "删除商品分类") + @ApiImplicitParam(name = "id", value = "商品分类编号", required = true, example = "1") + public CommonResult delete(@RequestParam("id") Integer id) { + return productCategoryService.deleteProductCategory(AdminSecurityContextHolder.getContext().getAdminId(), id); + } } \ No newline at end of file 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 new file mode 100644 index 000000000..4308f0698 --- /dev/null +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/admins/AdminsProductSpuController.java @@ -0,0 +1,101 @@ +package cn.iocoder.mall.product.application.controller.admins; + +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.dto.ProductSkuAddDTO; +import cn.iocoder.mall.product.api.dto.ProductSkuUpdateDTO; +import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO; +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; +import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuPageVO; +import com.alibaba.dubbo.config.annotation.Reference; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +@RestController +@RequestMapping("admins") +@Api("商品 SPU + SKU") +public class AdminsProductSpuController { + + @Reference(validation = "true") + private ProductSpuService productSpuService; + + @Autowired + private ObjectMapper objectMapper; // jackson 解析 + + @PostMapping("/spu/add") + @ApiOperation("创建商品") + public CommonResult add(@RequestParam("name") String name, + @RequestParam("sellPoint") String sellPoint, + @RequestParam("description") String description, + @RequestParam("cid") Integer cid, + @RequestParam("picURLs") List picUrls, + @RequestParam("visible") Boolean visible, + @RequestParam("skuStr") String skuStr) { // TODO 芋艿,因为考虑不使用 json 接受参数,所以这里手动转。 + // 创建 ProductSpuAddDTO 对象 + ProductSpuAddDTO productSpuAddDTO = new ProductSpuAddDTO().setName(name).setSellPoint(sellPoint) + .setDescription(description).setCid(cid).setPicUrls(picUrls).setVisible(visible) + .setSkus(parseSkus(skuStr, ProductSkuAddDTO.class)); + // 保存商品 + CommonResult result = productSpuService.addProductSpu(AdminSecurityContextHolder.getContext().getAdminId(), productSpuAddDTO); + // 返回结果 + return ProductSpuConvert.INSTANCE.convert(result); + } + + @PostMapping("/spu/update") + @ApiOperation("更新商品") + public CommonResult update(@RequestParam("id") Integer id, + @RequestParam("name") String name, + @RequestParam("sellPoint") String sellPoint, + @RequestParam("description") String description, + @RequestParam("cid") Integer cid, + @RequestParam("picURLs") List picUrls, + @RequestParam("visible") Boolean visible, + @RequestParam("skuStr") String skuStr) { // TODO 芋艿,因为考虑不使用 json 接受参数,所以这里手动转。 + // 创建 ProductSpuUpdateDTO 对象 + ProductSpuUpdateDTO productSpuUpdateDTO = new ProductSpuUpdateDTO().setId(id).setName(name).setSellPoint(sellPoint) + .setDescription(description).setCid(cid).setPicUrls(picUrls).setVisible(visible) + .setSkus(parseSkus(skuStr, ProductSkuUpdateDTO.class)); + // 更新商品 + return productSpuService.updateProductSpu(AdminSecurityContextHolder.getContext().getAdminId(), productSpuUpdateDTO); + } + + @PostMapping("/spu/update_sort") + @ApiOperation("更新商品的排序") + public CommonResult updateSort(@RequestParam("id") Integer id, + @RequestParam("sort") Integer sort) { + return null; + } + + @GetMapping("/spu/page") + @ApiOperation("商品 SPU 分页列表") + public CommonResult spuPage() { + return null; + } + + @GetMapping("/spu/info") + @ApiOperation("商品 SPU 明细") + public CommonResult info() { + return null; + } + + private List parseSkus(String skuStr, Class clazz) { + JavaType type = objectMapper.getTypeFactory().constructParametricType(List.class, clazz); + try { + return objectMapper.readValue(skuStr, type); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} \ No newline at end of file diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/users/ProductCategoryController.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/users/ProductCategoryController.java index b7857d249..b925258d6 100644 --- a/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/users/ProductCategoryController.java +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/controller/users/ProductCategoryController.java @@ -3,7 +3,7 @@ package cn.iocoder.mall.product.application.controller.users; import cn.iocoder.mall.product.api.ProductCategoryService; import cn.iocoder.mall.product.api.bo.ProductCategoryBO; import cn.iocoder.mall.product.application.convert.ProductCategoryConvert; -import cn.iocoder.mall.product.application.vo.ProductCategorySimpleVO; +import cn.iocoder.mall.product.application.vo.users.UsersProductCategoryVO; import com.alibaba.dubbo.config.annotation.Reference; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -26,7 +26,7 @@ public class ProductCategoryController { @GetMapping @ApiOperation("获得指定编号下的子分类的数组") @ApiImplicitParam(name = "pid", value = "指定分类编号", required = true, example = "0") - public List list(@RequestParam("pid") Integer pid) { + public List list(@RequestParam("pid") Integer pid) { List result = productCategoryService.getListByPid(pid); return ProductCategoryConvert.INSTANCE.convertToVO(result); } diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/convert/ProductCategoryConvert.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/convert/ProductCategoryConvert.java index 687715dbe..f0602a9f9 100644 --- a/product/product-application/src/main/java/cn/iocoder/mall/product/application/convert/ProductCategoryConvert.java +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/convert/ProductCategoryConvert.java @@ -1,7 +1,10 @@ package cn.iocoder.mall.product.application.convert; +import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.product.api.bo.ProductCategoryBO; -import cn.iocoder.mall.product.application.vo.ProductCategorySimpleVO; +import cn.iocoder.mall.product.application.vo.users.UsersProductCategoryVO; +import cn.iocoder.mall.product.application.vo.admins.AdminProductCategoryTreeNodeVO; +import cn.iocoder.mall.product.application.vo.admins.AdminsProductCategoryVO; import org.mapstruct.Mapper; import org.mapstruct.Mappings; import org.mapstruct.factory.Mappers; @@ -14,9 +17,12 @@ public interface ProductCategoryConvert { ProductCategoryConvert INSTANCE = Mappers.getMapper(ProductCategoryConvert.class); @Mappings({}) - ProductCategorySimpleVO convertToVO(ProductCategoryBO category); + UsersProductCategoryVO convertToVO(ProductCategoryBO category); - List convertToVO(List categoryList); + List convertToVO(List categoryList); + AdminProductCategoryTreeNodeVO convert(ProductCategoryBO category); -} + CommonResult convert(CommonResult result); + +} \ No newline at end of file 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 new file mode 100644 index 000000000..d734a1aa3 --- /dev/null +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/convert/ProductSpuConvert.java @@ -0,0 +1,21 @@ +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.application.vo.admins.AdminsProductSpuDetailVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mappings; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface ProductSpuConvert { + + ProductSpuConvert INSTANCE = Mappers.getMapper(ProductSpuConvert.class); + + @Mappings({}) + AdminsProductSpuDetailVO convert(ProductSpuDetailBO productSpuDetailBO); + + @Mappings({}) + CommonResult convert(CommonResult result); + +} \ No newline at end of file diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/ProductCategoryTreeNodeVO.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/ProductCategoryTreeNodeVO.java deleted file mode 100644 index 532e0401f..000000000 --- a/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/ProductCategoryTreeNodeVO.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.iocoder.mall.product.application.vo; - -import io.swagger.annotations.ApiModel; - -@ApiModel("产品分类树节点 VO") -public class ProductCategoryTreeNodeVO { - - - -} \ No newline at end of file diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/ProductCategoryVO.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/ProductCategoryVO.java deleted file mode 100644 index 5b5c1c70c..000000000 --- a/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/ProductCategoryVO.java +++ /dev/null @@ -1,4 +0,0 @@ -package cn.iocoder.mall.product.application.vo; - -public class ProductCategoryVO { -} diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminProductCategoryTreeNodeVO.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminProductCategoryTreeNodeVO.java new file mode 100644 index 000000000..15807ae1f --- /dev/null +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminProductCategoryTreeNodeVO.java @@ -0,0 +1,112 @@ +package cn.iocoder.mall.product.application.vo.admins; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.Date; +import java.util.List; + +@ApiModel("产品分类树节点 VO") +public class AdminProductCategoryTreeNodeVO { + + @ApiModelProperty(value = "分类编号", required = true, example = "1") + private Integer id; + @ApiModelProperty(value = "父分类编号", required = true, example = "0") + private Integer pid; + @ApiModelProperty(value = "分类名", required = true, example = "手机") + private String name; + @ApiModelProperty(value = "描述", required = true, example = "这个商品很吊") + private String description; + @ApiModelProperty(value = "分类图片", notes = "一般情况下,只有根分类才有图片", example = "http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg") + private String picUrl; + @ApiModelProperty(value = "排序值", required = true, example = "10") + private Integer sort; + @ApiModelProperty(value = "状态", required = true, notes = "1-开启;2-关闭", example = "1") + private Integer status; + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳") + private Date createTime; + @ApiModelProperty(value = "子节点数组") + private List children; + + public Integer getId() { + return id; + } + + public AdminProductCategoryTreeNodeVO setId(Integer id) { + this.id = id; + return this; + } + + public Integer getPid() { + return pid; + } + + public AdminProductCategoryTreeNodeVO setPid(Integer pid) { + this.pid = pid; + return this; + } + + public String getName() { + return name; + } + + public AdminProductCategoryTreeNodeVO setName(String name) { + this.name = name; + return this; + } + + public String getDescription() { + return description; + } + + public AdminProductCategoryTreeNodeVO setDescription(String description) { + this.description = description; + return this; + } + + public String getPicUrl() { + return picUrl; + } + + public AdminProductCategoryTreeNodeVO setPicUrl(String picUrl) { + this.picUrl = picUrl; + return this; + } + + public Integer getSort() { + return sort; + } + + public AdminProductCategoryTreeNodeVO setSort(Integer sort) { + this.sort = sort; + return this; + } + + public Integer getStatus() { + return status; + } + + public AdminProductCategoryTreeNodeVO setStatus(Integer status) { + this.status = status; + return this; + } + + public Date getCreateTime() { + return createTime; + } + + public AdminProductCategoryTreeNodeVO setCreateTime(Date createTime) { + this.createTime = createTime; + return this; + } + + public List getChildren() { + return children; + } + + public AdminProductCategoryTreeNodeVO setChildren(List children) { + this.children = children; + return this; + } + +} \ No newline at end of file diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductCategoryVO.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductCategoryVO.java new file mode 100644 index 000000000..4a309b383 --- /dev/null +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductCategoryVO.java @@ -0,0 +1,100 @@ +package cn.iocoder.mall.product.application.vo.admins; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.Date; + +@ApiModel("产品分类 VO") +public class AdminsProductCategoryVO { + + @ApiModelProperty(value = "分类编号", required = true, example = "1") + private Integer id; + @ApiModelProperty(value = "父分类编号", required = true, example = "0") + private Integer pid; + @ApiModelProperty(value = "分类名", required = true, example = "手机") + private String name; + @ApiModelProperty(value = "描述", required = true, example = "这个商品很吊") + private String description; + @ApiModelProperty(value = "分类图片", notes = "一般情况下,只有根分类才有图片", example = "http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg") + private String picUrl; + @ApiModelProperty(value = "排序值", required = true, example = "10") + private Integer sort; + @ApiModelProperty(value = "状态", required = true, notes = "1-开启;2-关闭", example = "1") + private Integer status; + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳") + private Date createTime; + + public Integer getId() { + return id; + } + + public AdminsProductCategoryVO setId(Integer id) { + this.id = id; + return this; + } + + public Integer getPid() { + return pid; + } + + public AdminsProductCategoryVO setPid(Integer pid) { + this.pid = pid; + return this; + } + + public String getName() { + return name; + } + + public AdminsProductCategoryVO setName(String name) { + this.name = name; + return this; + } + + public String getDescription() { + return description; + } + + public AdminsProductCategoryVO setDescription(String description) { + this.description = description; + return this; + } + + public String getPicUrl() { + return picUrl; + } + + public AdminsProductCategoryVO setPicUrl(String picUrl) { + this.picUrl = picUrl; + return this; + } + + public Integer getSort() { + return sort; + } + + public AdminsProductCategoryVO setSort(Integer sort) { + this.sort = sort; + return this; + } + + public Integer getStatus() { + return status; + } + + public AdminsProductCategoryVO setStatus(Integer status) { + this.status = status; + return this; + } + + public Date getCreateTime() { + return createTime; + } + + public AdminsProductCategoryVO setCreateTime(Date createTime) { + this.createTime = createTime; + return this; + } + +} \ No newline at end of file diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductSpuDetailVO.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductSpuDetailVO.java new file mode 100644 index 000000000..aebbbcc23 --- /dev/null +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductSpuDetailVO.java @@ -0,0 +1,10 @@ +package cn.iocoder.mall.product.application.vo.admins; + +import io.swagger.annotations.ApiModel; + +@ApiModel(value = "商品 SPU 详细 VO", description = "包括 SKU 信息 VO") +public class AdminsProductSpuDetailVO { + + + +} diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductSpuPageVO.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductSpuPageVO.java new file mode 100644 index 000000000..0f9569375 --- /dev/null +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductSpuPageVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.mall.product.application.vo.admins; + +import io.swagger.annotations.ApiModel; + +import java.util.List; + +@ApiModel("商品 SPU 分页 VO") +public class AdminsProductSpuPageVO { + + /** + * spu 数组 + */ + private List spus; + /** + * 总数 + */ + private Integer count; + + public List getSpus() { + return spus; + } + + public AdminsProductSpuPageVO setSpus(List spus) { + this.spus = spus; + return this; + } + + public Integer getCount() { + return count; + } + + public AdminsProductSpuPageVO setCount(Integer count) { + this.count = count; + return this; + } + +} \ 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 new file mode 100644 index 000000000..b36f6b789 --- /dev/null +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/admins/AdminsProductSpuVO.java @@ -0,0 +1,10 @@ +package cn.iocoder.mall.product.application.vo.admins; + +import io.swagger.annotations.ApiModel; + +@ApiModel(value = "商品 SPU VO", description = "不包括 SKU 信息 VO") +public class AdminsProductSpuVO { + + + +} \ No newline at end of file diff --git a/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/ProductCategorySimpleVO.java b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/users/UsersProductCategoryVO.java similarity index 91% rename from product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/ProductCategorySimpleVO.java rename to product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/users/UsersProductCategoryVO.java index 49d4cf801..d32304b64 100644 --- a/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/ProductCategorySimpleVO.java +++ b/product/product-application/src/main/java/cn/iocoder/mall/product/application/vo/users/UsersProductCategoryVO.java @@ -1,10 +1,10 @@ -package cn.iocoder.mall.product.application.vo; +package cn.iocoder.mall.product.application.vo.users; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @ApiModel("商品分类(简单)") -public class ProductCategorySimpleVO { +public class UsersProductCategoryVO { @ApiModelProperty(value = "分类编号", required = true, example = "1") private Integer id; diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/ProductCategoryService.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/ProductCategoryService.java index 55bd12082..27da26221 100644 --- a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/ProductCategoryService.java +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/ProductCategoryService.java @@ -18,7 +18,7 @@ public interface ProductCategoryService { /** * @return 返回所有产品分类们 */ - List getAll(); + CommonResult> getAll(); CommonResult addProductCategory(Integer adminId, ProductCategoryAddDTO productCategoryAddDTO); 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 b2fc9aa43..047c3b788 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 @@ -1,9 +1,17 @@ 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.dto.ProductSpuAddDTO; +import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO; public interface ProductSpuService { ProductSpuBO getProductSpu(Integer id); + CommonResult addProductSpu(Integer adminId, ProductSpuAddDTO productSpuAddDTO); + + CommonResult updateProductSpu(Integer adminId, ProductSpuUpdateDTO productSpuUpdateDTO); + } diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductAttrBO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductAttrBO.java new file mode 100644 index 000000000..766c44006 --- /dev/null +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductAttrBO.java @@ -0,0 +1,61 @@ +package cn.iocoder.mall.product.api.bo; + +/** + * 商品规格 BO + */ +public class ProductAttrBO { + + /** + * 规格编号 + */ + private Integer attrId; + /** + * 规格名 + */ + private String attrName; + /** + * 规格值 + */ + private Integer attrValueId; + /** + * 规格值名 + */ + private String attrValueName; + + public Integer getAttrId() { + return attrId; + } + + public ProductAttrBO setAttrId(Integer attrId) { + this.attrId = attrId; + return this; + } + + public String getAttrName() { + return attrName; + } + + public ProductAttrBO setAttrName(String attrName) { + this.attrName = attrName; + return this; + } + + public Integer getAttrValueId() { + return attrValueId; + } + + public ProductAttrBO setAttrValueId(Integer attrValueId) { + this.attrValueId = attrValueId; + return this; + } + + public String getAttrValueName() { + return attrValueName; + } + + public ProductAttrBO setAttrValueName(String attrValueName) { + this.attrValueName = attrValueName; + return this; + } + +} \ No newline at end of file diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductCategoryBO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductCategoryBO.java index af90b1afe..ae56b4d2d 100644 --- a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductCategoryBO.java +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductCategoryBO.java @@ -1,5 +1,7 @@ package cn.iocoder.mall.product.api.bo; +import java.util.Date; + /** * 商品分类 BO */ @@ -19,6 +21,10 @@ public class ProductCategoryBO { * 名称 */ private String name; + /** + * 描述 + */ + private String description; /** * 分类图片 */ @@ -27,6 +33,17 @@ public class ProductCategoryBO { * 排序值 */ private Integer sort; + /** + * 状态 + * + * 1-开启 + * 2-关闭 + */ + private Integer status; + /** + * 创建时间 + */ + private Date createTime; public Integer getId() { return id; @@ -67,4 +84,32 @@ public class ProductCategoryBO { public void setSort(Integer sort) { this.sort = sort; } + + public String getDescription() { + return description; + } + + public ProductCategoryBO setDescription(String description) { + this.description = description; + return this; + } + + public Integer getStatus() { + return status; + } + + public ProductCategoryBO setStatus(Integer status) { + this.status = status; + return this; + } + + public Date getCreateTime() { + return createTime; + } + + public ProductCategoryBO setCreateTime(Date createTime) { + this.createTime = createTime; + return this; + } + } diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductSkuDetailBO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductSkuDetailBO.java new file mode 100644 index 000000000..806320c2c --- /dev/null +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductSkuDetailBO.java @@ -0,0 +1,45 @@ +package cn.iocoder.mall.product.api.bo; + +import java.util.List; + +/** + * 商品 Sku 明细 BO + */ +public class ProductSkuDetailBO { + + /** + * sku 编号 + */ + private Integer id; + /** + * 商品编号 + */ + private Integer itemId; + + // TODO 店铺编号 + + /** + * 状态 + * + * 1-正常 + * 2-禁用 + */ + private Integer status; + /** + * 图片地址 + */ + private String picURL; + /** + * 规格值数组 + */ + private List attrs; + /** + * 价格,单位:分 + */ + private Integer price; + /** + * 库存数量 + */ + private Integer quantity; + +} \ No newline at end of file diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductSpuDetailBO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductSpuDetailBO.java new file mode 100644 index 000000000..22631318d --- /dev/null +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/bo/ProductSpuDetailBO.java @@ -0,0 +1,65 @@ +package cn.iocoder.mall.product.api.bo; + +import cn.iocoder.mall.product.api.dto.ProductSkuAddDTO; + +import java.util.List; + +/** + * 商品 Spu 明细 BO(包括 Sku 明细) + */ +public class ProductSpuDetailBO { + + /** + * 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 order; + + // + + // ========== SKU ========= + + /** + * SKU 数组 + */ + private List skus; + +} \ No newline at end of file diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/constant/ProductCategoryConstants.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/constant/ProductCategoryConstants.java index 1e83e5ad6..ebf6bfb99 100644 --- a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/constant/ProductCategoryConstants.java +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/constant/ProductCategoryConstants.java @@ -9,7 +9,7 @@ public class ProductCategoryConstants { /** * 状态 - 关闭 */ - public static final Integer STATUS_DISABLE = 1; + public static final Integer STATUS_DISABLE = 2; /** * 父分类编号 - 根节点 diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductCategoryAddDTO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductCategoryAddDTO.java index 8c677c7b5..4b839944c 100644 --- a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductCategoryAddDTO.java +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductCategoryAddDTO.java @@ -25,7 +25,7 @@ public class ProductCategoryAddDTO { /** * 分类图片 */ - @NotNull(message = "分类图片不能为空") +// @NotNull(message = "分类图片不能为空") private String picUrl; /** * 排序值 diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductCategoryUpdateDTO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductCategoryUpdateDTO.java index 611b6e133..ed9737310 100644 --- a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductCategoryUpdateDTO.java +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductCategoryUpdateDTO.java @@ -30,7 +30,7 @@ public class ProductCategoryUpdateDTO { /** * 分类图片 */ - @NotNull(message = "分类图片不能为空") +// @NotNull(message = "分类图片不能为空") private String picUrl; /** * 排序值 diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuAddDTO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuAddDTO.java new file mode 100644 index 000000000..d3986ccac --- /dev/null +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuAddDTO.java @@ -0,0 +1,50 @@ +package cn.iocoder.mall.product.api.dto; + +import java.util.List; + +/** + * 商品 Sku 添加 DTO + */ +public class ProductSkuAddDTO { + + /** + * 规格值数组 + */ + private List attrs; + /** + * 价格,单位:分 + */ + private Integer price; + /** + * 库存数量 + */ + private Integer quantity; + + public List getAttrs() { + return attrs; + } + + public ProductSkuAddDTO setAttrs(List attrs) { + this.attrs = attrs; + return this; + } + + public Integer getPrice() { + return price; + } + + public ProductSkuAddDTO setPrice(Integer price) { + this.price = price; + return this; + } + + public Integer getQuantity() { + return quantity; + } + + public ProductSkuAddDTO setQuantity(Integer quantity) { + this.quantity = quantity; + return this; + } + +} \ No newline at end of file diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuUpdateDTO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuUpdateDTO.java new file mode 100644 index 000000000..f11ad3707 --- /dev/null +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSkuUpdateDTO.java @@ -0,0 +1,50 @@ +package cn.iocoder.mall.product.api.dto; + +import java.util.List; + +/** + * 商品 Sku 更新 DTO + */ +public class ProductSkuUpdateDTO { + + /** + * 规格值数组 + */ + private List attrs; + /** + * 价格,单位:分 + */ + private Integer price; + /** + * 库存数量 + */ + private Integer quantity; + + public List getAttrs() { + return attrs; + } + + public ProductSkuUpdateDTO setAttrs(List attrs) { + this.attrs = attrs; + return this; + } + + public Integer getPrice() { + return price; + } + + public ProductSkuUpdateDTO setPrice(Integer price) { + this.price = price; + return this; + } + + public Integer getQuantity() { + return quantity; + } + + public ProductSkuUpdateDTO setQuantity(Integer quantity) { + this.quantity = quantity; + return this; + } + +} \ No newline at end of file diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuAddDTO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuAddDTO.java new file mode 100644 index 000000000..a2e25fc22 --- /dev/null +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuAddDTO.java @@ -0,0 +1,120 @@ +package cn.iocoder.mall.product.api.dto; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 商品 SPU + SKU 添加 DTO + */ +public class ProductSpuAddDTO { + + // ========== 基本信息 ========= + /** + * SPU 名字 + */ + @NotEmpty(message = "SPU 名字不能为空") + private String name; + /** + * 卖点 + */ + @NotEmpty(message = "卖点不能为空") + private String sellPoint; + /** + * 描述 + */ + @NotEmpty(message = "描述不能为空") + private String description; + /** + * 分类编号 + */ + @NotEmpty(message = "分类不能为空") + private Integer cid; + /** + * 商品主图地址 + */ + @NotNull(message = "商品主图不能为空") + private List picUrls; + + // ========== 其他信息 ========= + /** + * 是否上架商品(是否可见)。 + * + * true 为已上架 + * false 为已下架 + */ + @NotNull(message = "是否上架不能为空") + private Boolean visible; + + // ========== SKU ========= + + /** + * SKU 数组 + */ + @NotNull(message = "SKU 不能为空") + private List skus; + + public String getName() { + return name; + } + + public ProductSpuAddDTO setName(String name) { + this.name = name; + return this; + } + + public String getSellPoint() { + return sellPoint; + } + + public ProductSpuAddDTO setSellPoint(String sellPoint) { + this.sellPoint = sellPoint; + return this; + } + + public String getDescription() { + return description; + } + + public ProductSpuAddDTO setDescription(String description) { + this.description = description; + return this; + } + + public Integer getCid() { + return cid; + } + + public ProductSpuAddDTO setCid(Integer cid) { + this.cid = cid; + return this; + } + + public List getPicUrls() { + return picUrls; + } + + public ProductSpuAddDTO setPicUrls(List picUrls) { + this.picUrls = picUrls; + return this; + } + + public Boolean getVisible() { + return visible; + } + + public ProductSpuAddDTO setVisible(Boolean visible) { + this.visible = visible; + return this; + } + + public List getSkus() { + return skus; + } + + public ProductSpuAddDTO setSkus(List skus) { + this.skus = skus; + return this; + } + +} \ No newline at end of file diff --git a/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuUpdateDTO.java b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuUpdateDTO.java new file mode 100644 index 000000000..07566ae2d --- /dev/null +++ b/product/product-service-api/src/main/java/cn/iocoder/mall/product/api/dto/ProductSpuUpdateDTO.java @@ -0,0 +1,134 @@ +package cn.iocoder.mall.product.api.dto; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 商品 SPU + SKU 更新 DTO + */ +public class ProductSpuUpdateDTO { + + /** + * Spu 编号 + */ + @NotNull(message = "SPU 编号不能为空") + private Integer id; + + // ========== 基本信息 ========= + /** + * SPU 名字 + */ + @NotEmpty(message = "SPU 名字不能为空") + private String name; + /** + * 卖点 + */ + @NotEmpty(message = "卖点不能为空") + private String sellPoint; + /** + * 描述 + */ + @NotEmpty(message = "描述不能为空") + private String description; + /** + * 分类编号 + */ + @NotEmpty(message = "分类不能为空") + private Integer cid; + /** + * 商品主图地址 + */ + @NotNull(message = "商品主图不能为空") + private List picUrls; + + // ========== 其他信息 ========= + /** + * 是否上架商品(是否可见)。 + * + * true 为已上架 + * false 为已下架 + */ + @NotNull(message = "是否上架不能为空") + private Boolean visible; + + // ========== SKU ========= + + /** + * SKU 数组 + */ + @NotNull(message = "SKU 不能为空") + private List skus; + + public String getName() { + return name; + } + + public ProductSpuUpdateDTO setName(String name) { + this.name = name; + return this; + } + + public String getSellPoint() { + return sellPoint; + } + + public ProductSpuUpdateDTO setSellPoint(String sellPoint) { + this.sellPoint = sellPoint; + return this; + } + + public String getDescription() { + return description; + } + + public ProductSpuUpdateDTO setDescription(String description) { + this.description = description; + return this; + } + + public Integer getCid() { + return cid; + } + + public ProductSpuUpdateDTO setCid(Integer cid) { + this.cid = cid; + return this; + } + + public List getPicUrls() { + return picUrls; + } + + public ProductSpuUpdateDTO setPicUrls(List picUrls) { + this.picUrls = picUrls; + return this; + } + + public Boolean getVisible() { + return visible; + } + + public ProductSpuUpdateDTO setVisible(Boolean visible) { + this.visible = visible; + return this; + } + + public List getSkus() { + return skus; + } + + public ProductSpuUpdateDTO setSkus(List skus) { + this.skus = skus; + return this; + } + + public Integer getId() { + return id; + } + + public ProductSpuUpdateDTO setId(Integer id) { + this.id = id; + return this; + } +} \ No newline at end of file diff --git a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/config/ServiceExceptionConfiguration.java b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/config/ServiceExceptionConfiguration.java new file mode 100644 index 000000000..e5f1e1ea3 --- /dev/null +++ b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/config/ServiceExceptionConfiguration.java @@ -0,0 +1,26 @@ +package cn.iocoder.mall.product.config; + +import cn.iocoder.common.framework.util.ServiceExceptionUtil; +import cn.iocoder.mall.product.api.constant.ProductErrorCodeEnum; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.event.EventListener; + +@Configuration +public class ServiceExceptionConfiguration { + + @EventListener(ApplicationReadyEvent.class) // 可参考 https://www.cnblogs.com/ssslinppp/p/7607509.html + public void initMessages() { +// 从 service_exception_message.properties 加载错误码的方案 +// Properties properties; +// try { +// properties = PropertiesLoaderUtils.loadAllProperties("classpath:service_exception_message.properties"); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } + for (ProductErrorCodeEnum item : ProductErrorCodeEnum.values()) { + ServiceExceptionUtil.put(item.getCode(), item.getMessage()); + } + } + +} \ No newline at end of file diff --git a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductCategoryDO.java b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductCategoryDO.java index b68542bd4..1152ab5e2 100644 --- a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductCategoryDO.java +++ b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductCategoryDO.java @@ -7,6 +7,7 @@ import cn.iocoder.common.framework.dataobject.BaseDO; */ public class ProductCategoryDO extends BaseDO { + @Deprecated public static final Integer STATUS_ENABLE = 1; /** diff --git a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductSkuDO.java b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductSkuDO.java index 737c0eaf6..a3f3b4f09 100644 --- a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductSkuDO.java +++ b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductSkuDO.java @@ -1,11 +1,11 @@ package cn.iocoder.mall.product.dataobject; -import java.util.Date; +import cn.iocoder.common.framework.dataobject.BaseDO; /** * 商品 SKU */ -public class ProductSkuDO { +public class ProductSkuDO extends BaseDO { /** * sku 编号 @@ -22,7 +22,7 @@ public class ProductSkuDO { * 状态 * * 1-正常 - * 2-删除 + * 2-禁用 */ private Integer status; /** @@ -36,24 +36,20 @@ public class ProductSkuDO { */ private String attrs; /** - * 价格,单位分 + * 价格,单位:分 */ private Integer price; /** - * 商品在付款减库存的状态下,该Sku上未付款的订单数量 + * 库存数量 */ - private Integer withHoldQuantity; - /** - * 销量 - */ - private Integer soldNum; - /** - * 创建时间 - */ - private Date createTime; - /** - * 更新时间 - */ - private Date updateTime; + private Integer quantity; + // /** +// * 商品在付款减库存的状态下,该Sku上未付款的订单数量 +// */ +// private Integer withHoldQuantity; +// /** +// * 销量 +// */ +// private Integer soldNum; } \ No newline at end of file diff --git a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductSpuDO.java b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductSpuDO.java index f406b7f8b..621baaf59 100644 --- a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductSpuDO.java +++ b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductSpuDO.java @@ -1,36 +1,18 @@ package cn.iocoder.mall.product.dataobject; -import java.util.Date; +import cn.iocoder.common.framework.dataobject.BaseDO; /** * 商品 SPU */ -public class ProductSpuDO { - - // ========== 基础字段 ========= +public class ProductSpuDO extends BaseDO { /** * SPU 编号 */ private Integer id; - // TODO 店铺编号 - - /** - * 创建时间 - */ - private Date createTime; - /** - * 最后更新时间 - */ - private Date updateTime; - /** - * 状态 - * - * 1-正常 - * 2-删除 - */ - private Integer status; + // TODO 店铺编号 先不考虑,因为第一个版本,不做 B2B2C // ========== 基本信息 ========= /** @@ -38,9 +20,13 @@ public class ProductSpuDO { */ private String name; /** - * SPU 描述 + * 卖点 */ - private String descrption; + private String sellPoint; + /** + * 描述 + */ + private String description; /** * 分类编号 */ @@ -52,7 +38,7 @@ public class ProductSpuDO { * * 建议尺寸:800*800像素,你可以拖拽图片调整顺序,最多上传15张 */ - private String picURLs; + private String picUrls; // TODO 价格库存 @@ -79,4 +65,66 @@ public class ProductSpuDO { this.id = id; } + public String getName() { + return name; + } + + public ProductSpuDO setName(String name) { + this.name = name; + return this; + } + + public String getSellPoint() { + return sellPoint; + } + + public ProductSpuDO setSellPoint(String sellPoint) { + this.sellPoint = sellPoint; + return this; + } + + public String getDescription() { + return description; + } + + public ProductSpuDO setDescription(String description) { + this.description = description; + return this; + } + + public Integer getCid() { + return cid; + } + + public ProductSpuDO setCid(Integer cid) { + this.cid = cid; + return this; + } + + public String getPicUrls() { + return picUrls; + } + + public ProductSpuDO setPicUrls(String picUrls) { + this.picUrls = picUrls; + return this; + } + + public Boolean getVisible() { + return visible; + } + + public ProductSpuDO setVisible(Boolean visible) { + this.visible = visible; + return this; + } + + public Integer getOrder() { + return order; + } + + public ProductSpuDO setOrder(Integer order) { + this.order = order; + return this; + } } \ No newline at end of file diff --git a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductStockDO.java b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductStockDO.java index ff1e814ae..21043fcaa 100644 --- a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductStockDO.java +++ b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductStockDO.java @@ -5,6 +5,7 @@ import java.util.Date; /** * Product 库存 */ +@Deprecated // TODO 芋艿,咱暂时不加库存表和库存服务 public class ProductStockDO { /** diff --git a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/service/ProductCategoryServiceImpl.java b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/service/ProductCategoryServiceImpl.java index 1a0915e72..cebdae3f0 100644 --- a/product/product-service-impl/src/main/java/cn/iocoder/mall/product/service/ProductCategoryServiceImpl.java +++ b/product/product-service-impl/src/main/java/cn/iocoder/mall/product/service/ProductCategoryServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.mall.product.service; +import cn.iocoder.common.framework.constant.SysErrorCodeEnum; import cn.iocoder.common.framework.dataobject.BaseDO; import cn.iocoder.common.framework.util.ServiceExceptionUtil; import cn.iocoder.common.framework.vo.CommonResult; @@ -32,15 +33,15 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { } @Override - public List getAll() { + public CommonResult> getAll() { List categoryList = productCategoryMapper.selectList(); - return ProductCategoryConvert.INSTANCE.convertToBO(categoryList); + return CommonResult.success(ProductCategoryConvert.INSTANCE.convertToBO(categoryList)); } @Override public CommonResult addProductCategory(Integer adminId, ProductCategoryAddDTO productCategoryAddDTO) { // 校验父分类是否存在 - if (ProductCategoryConstants.PID_ROOT.equals(productCategoryAddDTO.getPid()) + if (!ProductCategoryConstants.PID_ROOT.equals(productCategoryAddDTO.getPid()) && productCategoryMapper.selectById(productCategoryAddDTO.getPid()) == null) { return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_CATEGORY_PARENT_NOT_EXISTS.getCode()); } @@ -65,7 +66,7 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_CATEGORY_PARENT_NOT_SELF.getCode()); } // 校验父分类是否存在 - if (ProductCategoryConstants.PID_ROOT.equals(productCategoryUpdateDTO.getPid()) + if (!ProductCategoryConstants.PID_ROOT.equals(productCategoryUpdateDTO.getPid()) && productCategoryMapper.selectById(productCategoryUpdateDTO.getPid()) == null) { return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_CATEGORY_PARENT_NOT_EXISTS.getCode()); } @@ -78,6 +79,10 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { @Override public CommonResult updateProductCategoryStatus(Integer adminId, Integer productCategoryId, Integer status) { + // 校验参数 + if (!isValidStatus(status)) { + return CommonResult.error(SysErrorCodeEnum.VALIDATION_REQUEST_PARAM_ERROR.getCode(), "变更状态必须是开启(1)或关闭(2)"); // TODO 有点搓 + } // 校验分类是否存在 ProductCategoryDO productCategory = productCategoryMapper.selectById(productCategoryId); if (productCategory == null) { @@ -107,11 +112,16 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { } // TODO 芋艿:考虑下,是否需要判断下该分类下是否有商品 // 标记删除商品分类 - ProductCategoryDO updateProductCategory = new ProductCategoryDO(); + ProductCategoryDO updateProductCategory = new ProductCategoryDO().setId(productCategoryId); updateProductCategory.setDeleted(BaseDO.DELETED_YES); productCategoryMapper.update(updateProductCategory); // TODO 操作日志 return CommonResult.success(true); } + private boolean isValidStatus(Integer status) { + return ProductCategoryConstants.STATUS_ENABLE.equals(status) + || ProductCategoryConstants.STATUS_DISABLE.equals(status); + } + } \ 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 3cc508617..21ec281a3 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 @@ -1,7 +1,11 @@ package cn.iocoder.mall.product.service; +import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.mall.product.api.ProductSpuService; import cn.iocoder.mall.product.api.bo.ProductSpuBO; +import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO; +import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO; +import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO; import cn.iocoder.mall.product.convert.ProductSpuConvert; import cn.iocoder.mall.product.dao.ProductSpuMapper; import cn.iocoder.mall.product.dataobject.ProductSpuDO; @@ -22,4 +26,14 @@ public class ProductSpuServiceImpl implements ProductSpuService { return ProductSpuConvert.INSTANCE.convert(productSpuDO); } + @Override + public CommonResult addProductSpu(Integer adminId, ProductSpuAddDTO productSpuAddDTO) { + return null; + } + + @Override + public CommonResult updateProductSpu(Integer adminId, ProductSpuUpdateDTO productSpuUpdateDTO) { + return null; + } + } \ No newline at end of file diff --git a/product/product-service-impl/src/main/resources/mapper/ProductCategoryMapper.xml b/product/product-service-impl/src/main/resources/mapper/ProductCategoryMapper.xml index 7f8023b5d..a67772ca7 100644 --- a/product/product-service-impl/src/main/resources/mapper/ProductCategoryMapper.xml +++ b/product/product-service-impl/src/main/resources/mapper/ProductCategoryMapper.xml @@ -3,7 +3,7 @@ - id, pid, name, descrption, pic_url, + id, pid, name, description, pic_url, sort, status, create_time @@ -43,7 +43,7 @@ - UPDATE resource + UPDATE product_category pid = #{pid},