商品分类提交~
parent
13e9b5526b
commit
5192472ed5
|
@ -22,8 +22,8 @@ public class MVCConfiguration implements WebMvcConfigurer {
|
||||||
@Override
|
@Override
|
||||||
public void addInterceptors(InterceptorRegistry registry) {
|
public void addInterceptors(InterceptorRegistry registry) {
|
||||||
// registry.addInterceptor(securityInterceptor).addPathPatterns("/user/**", "/admin/**"); // 只拦截我们定义的接口
|
// registry.addInterceptor(securityInterceptor).addPathPatterns("/user/**", "/admin/**"); // 只拦截我们定义的接口
|
||||||
registry.addInterceptor(adminSecurityInterceptor).addPathPatterns("/admin/**")
|
registry.addInterceptor(adminSecurityInterceptor).addPathPatterns("/admins/**")
|
||||||
.excludePathPatterns("/admin/passport/login"); // 排除登陆接口
|
.excludePathPatterns("/admins/passport/login"); // 排除登陆接口
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,14 +1,124 @@
|
||||||
package cn.iocoder.mall.product.application.controller.admins;
|
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.ProductCategoryTreeNodeVO;
|
||||||
|
import cn.iocoder.mall.product.application.vo.ProductCategoryVO;
|
||||||
|
import com.alibaba.dubbo.config.annotation.Reference;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
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
|
@RestController
|
||||||
@RequestMapping("admins/product/category")
|
@RequestMapping("admins/category")
|
||||||
@Api("商品分类")
|
@Api("商品分类")
|
||||||
public class AdminsProductCategoryController {
|
public class AdminsProductCategoryController {
|
||||||
|
|
||||||
|
@Reference(validation = "true")
|
||||||
|
private ProductCategoryService productCategoryService;
|
||||||
|
|
||||||
|
@GetMapping("/tree")
|
||||||
|
@ApiOperation("获得分类树结构")
|
||||||
|
public CommonResult<List<ProductCategoryTreeNodeVO>> tree() {
|
||||||
|
List<ProductCategoryBO> productCategories = productCategoryService.getAll().getData();
|
||||||
|
// 创建 ProductCategoryTreeNodeVO Map
|
||||||
|
Map<Integer, ProductCategoryTreeNodeVO> treeNodeMap = productCategories.stream().collect(Collectors.toMap(ProductCategoryBO::getId, ProductCategoryConvert.INSTANCE::convert));
|
||||||
|
// 处理父子关系
|
||||||
|
treeNodeMap.values().stream()
|
||||||
|
.filter(node -> !node.getPid().equals(ProductCategoryConstants.PID_ROOT))
|
||||||
|
.forEach((childNode) -> {
|
||||||
|
// 获得父节点
|
||||||
|
ProductCategoryTreeNodeVO parentNode = treeNodeMap.get(childNode.getPid());
|
||||||
|
if (parentNode.getChildren() == null) { // 初始化 children 数组
|
||||||
|
parentNode.setChildren(new ArrayList<>());
|
||||||
|
}
|
||||||
|
// 将自己添加到父节点中
|
||||||
|
parentNode.getChildren().add(childNode);
|
||||||
|
});
|
||||||
|
// 获得到所有的根节点
|
||||||
|
List<ProductCategoryTreeNodeVO> rootNodes = treeNodeMap.values().stream()
|
||||||
|
.filter(node -> node.getPid().equals(ProductCategoryConstants.PID_ROOT))
|
||||||
|
.sorted(Comparator.comparing(ProductCategoryTreeNodeVO::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<ProductCategoryVO> 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<ProductCategoryBO> 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<Boolean> 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<Boolean> 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<Boolean> delete(@RequestParam("id") Integer id) {
|
||||||
|
return productCategoryService.deleteProductCategory(AdminSecurityContextHolder.getContext().getAdminId(), id);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,7 +1,10 @@
|
||||||
package cn.iocoder.mall.product.application.convert;
|
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.api.bo.ProductCategoryBO;
|
||||||
import cn.iocoder.mall.product.application.vo.ProductCategorySimpleVO;
|
import cn.iocoder.mall.product.application.vo.ProductCategorySimpleVO;
|
||||||
|
import cn.iocoder.mall.product.application.vo.ProductCategoryTreeNodeVO;
|
||||||
|
import cn.iocoder.mall.product.application.vo.ProductCategoryVO;
|
||||||
import org.mapstruct.Mapper;
|
import org.mapstruct.Mapper;
|
||||||
import org.mapstruct.Mappings;
|
import org.mapstruct.Mappings;
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
@ -18,5 +21,8 @@ public interface ProductCategoryConvert {
|
||||||
|
|
||||||
List<ProductCategorySimpleVO> convertToVO(List<ProductCategoryBO> categoryList);
|
List<ProductCategorySimpleVO> convertToVO(List<ProductCategoryBO> categoryList);
|
||||||
|
|
||||||
|
ProductCategoryTreeNodeVO convert(ProductCategoryBO category);
|
||||||
|
|
||||||
|
CommonResult<ProductCategoryVO> convert(CommonResult<ProductCategoryBO> result);
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,10 +1,112 @@
|
||||||
package cn.iocoder.mall.product.application.vo;
|
package cn.iocoder.mall.product.application.vo;
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@ApiModel("产品分类树节点 VO")
|
@ApiModel("产品分类树节点 VO")
|
||||||
public class ProductCategoryTreeNodeVO {
|
public class ProductCategoryTreeNodeVO {
|
||||||
|
|
||||||
|
@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<ProductCategoryTreeNodeVO> children;
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryTreeNodeVO setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPid() {
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryTreeNodeVO setPid(Integer pid) {
|
||||||
|
this.pid = pid;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryTreeNodeVO setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryTreeNodeVO setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPicUrl() {
|
||||||
|
return picUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryTreeNodeVO setPicUrl(String picUrl) {
|
||||||
|
this.picUrl = picUrl;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getSort() {
|
||||||
|
return sort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryTreeNodeVO setSort(Integer sort) {
|
||||||
|
this.sort = sort;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryTreeNodeVO setStatus(Integer status) {
|
||||||
|
this.status = status;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getCreateTime() {
|
||||||
|
return createTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryTreeNodeVO setCreateTime(Date createTime) {
|
||||||
|
this.createTime = createTime;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ProductCategoryTreeNodeVO> getChildren() {
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryTreeNodeVO setChildren(List<ProductCategoryTreeNodeVO> children) {
|
||||||
|
this.children = children;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,4 +1,100 @@
|
||||||
package cn.iocoder.mall.product.application.vo;
|
package cn.iocoder.mall.product.application.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@ApiModel("产品分类 VO")
|
||||||
public class ProductCategoryVO {
|
public class ProductCategoryVO {
|
||||||
|
|
||||||
|
@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 ProductCategoryVO setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPid() {
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryVO setPid(Integer pid) {
|
||||||
|
this.pid = pid;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryVO setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryVO setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPicUrl() {
|
||||||
|
return picUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryVO setPicUrl(String picUrl) {
|
||||||
|
this.picUrl = picUrl;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getSort() {
|
||||||
|
return sort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryVO setSort(Integer sort) {
|
||||||
|
this.sort = sort;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryVO setStatus(Integer status) {
|
||||||
|
this.status = status;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getCreateTime() {
|
||||||
|
return createTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductCategoryVO setCreateTime(Date createTime) {
|
||||||
|
this.createTime = createTime;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -18,7 +18,7 @@ public interface ProductCategoryService {
|
||||||
/**
|
/**
|
||||||
* @return 返回所有产品分类们
|
* @return 返回所有产品分类们
|
||||||
*/
|
*/
|
||||||
List<ProductCategoryBO> getAll();
|
CommonResult<List<ProductCategoryBO>> getAll();
|
||||||
|
|
||||||
CommonResult<ProductCategoryBO> addProductCategory(Integer adminId, ProductCategoryAddDTO productCategoryAddDTO);
|
CommonResult<ProductCategoryBO> addProductCategory(Integer adminId, ProductCategoryAddDTO productCategoryAddDTO);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package cn.iocoder.mall.product.api.bo;
|
package cn.iocoder.mall.product.api.bo;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品分类 BO
|
* 商品分类 BO
|
||||||
*/
|
*/
|
||||||
|
@ -19,6 +21,10 @@ public class ProductCategoryBO {
|
||||||
* 名称
|
* 名称
|
||||||
*/
|
*/
|
||||||
private String name;
|
private String name;
|
||||||
|
/**
|
||||||
|
* 描述
|
||||||
|
*/
|
||||||
|
private String description;
|
||||||
/**
|
/**
|
||||||
* 分类图片
|
* 分类图片
|
||||||
*/
|
*/
|
||||||
|
@ -27,6 +33,17 @@ public class ProductCategoryBO {
|
||||||
* 排序值
|
* 排序值
|
||||||
*/
|
*/
|
||||||
private Integer sort;
|
private Integer sort;
|
||||||
|
/**
|
||||||
|
* 状态
|
||||||
|
*
|
||||||
|
* 1-开启
|
||||||
|
* 2-关闭
|
||||||
|
*/
|
||||||
|
private Integer status;
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
public Integer getId() {
|
public Integer getId() {
|
||||||
return id;
|
return id;
|
||||||
|
@ -67,4 +84,32 @@ public class ProductCategoryBO {
|
||||||
public void setSort(Integer sort) {
|
public void setSort(Integer sort) {
|
||||||
this.sort = 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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ public class ProductCategoryConstants {
|
||||||
/**
|
/**
|
||||||
* 状态 - 关闭
|
* 状态 - 关闭
|
||||||
*/
|
*/
|
||||||
public static final Integer STATUS_DISABLE = 1;
|
public static final Integer STATUS_DISABLE = 2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 父分类编号 - 根节点
|
* 父分类编号 - 根节点
|
||||||
|
|
|
@ -25,7 +25,7 @@ public class ProductCategoryAddDTO {
|
||||||
/**
|
/**
|
||||||
* 分类图片
|
* 分类图片
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "分类图片不能为空")
|
// @NotNull(message = "分类图片不能为空")
|
||||||
private String picUrl;
|
private String picUrl;
|
||||||
/**
|
/**
|
||||||
* 排序值
|
* 排序值
|
||||||
|
|
|
@ -30,7 +30,7 @@ public class ProductCategoryUpdateDTO {
|
||||||
/**
|
/**
|
||||||
* 分类图片
|
* 分类图片
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "分类图片不能为空")
|
// @NotNull(message = "分类图片不能为空")
|
||||||
private String picUrl;
|
private String picUrl;
|
||||||
/**
|
/**
|
||||||
* 排序值
|
* 排序值
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ import cn.iocoder.common.framework.dataobject.BaseDO;
|
||||||
*/
|
*/
|
||||||
public class ProductCategoryDO extends BaseDO {
|
public class ProductCategoryDO extends BaseDO {
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public static final Integer STATUS_ENABLE = 1;
|
public static final Integer STATUS_ENABLE = 1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package cn.iocoder.mall.product.service;
|
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.dataobject.BaseDO;
|
||||||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||||
import cn.iocoder.common.framework.vo.CommonResult;
|
import cn.iocoder.common.framework.vo.CommonResult;
|
||||||
|
@ -32,15 +33,15 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ProductCategoryBO> getAll() {
|
public CommonResult<List<ProductCategoryBO>> getAll() {
|
||||||
List<ProductCategoryDO> categoryList = productCategoryMapper.selectList();
|
List<ProductCategoryDO> categoryList = productCategoryMapper.selectList();
|
||||||
return ProductCategoryConvert.INSTANCE.convertToBO(categoryList);
|
return CommonResult.success(ProductCategoryConvert.INSTANCE.convertToBO(categoryList));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CommonResult<ProductCategoryBO> addProductCategory(Integer adminId, ProductCategoryAddDTO productCategoryAddDTO) {
|
public CommonResult<ProductCategoryBO> addProductCategory(Integer adminId, ProductCategoryAddDTO productCategoryAddDTO) {
|
||||||
// 校验父分类是否存在
|
// 校验父分类是否存在
|
||||||
if (ProductCategoryConstants.PID_ROOT.equals(productCategoryAddDTO.getPid())
|
if (!ProductCategoryConstants.PID_ROOT.equals(productCategoryAddDTO.getPid())
|
||||||
&& productCategoryMapper.selectById(productCategoryAddDTO.getPid()) == null) {
|
&& productCategoryMapper.selectById(productCategoryAddDTO.getPid()) == null) {
|
||||||
return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_CATEGORY_PARENT_NOT_EXISTS.getCode());
|
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());
|
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) {
|
&& productCategoryMapper.selectById(productCategoryUpdateDTO.getPid()) == null) {
|
||||||
return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_CATEGORY_PARENT_NOT_EXISTS.getCode());
|
return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_CATEGORY_PARENT_NOT_EXISTS.getCode());
|
||||||
}
|
}
|
||||||
|
@ -78,6 +79,10 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CommonResult<Boolean> updateProductCategoryStatus(Integer adminId, Integer productCategoryId, Integer status) {
|
public CommonResult<Boolean> 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);
|
ProductCategoryDO productCategory = productCategoryMapper.selectById(productCategoryId);
|
||||||
if (productCategory == null) {
|
if (productCategory == null) {
|
||||||
|
@ -107,11 +112,16 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
|
||||||
}
|
}
|
||||||
// TODO 芋艿:考虑下,是否需要判断下该分类下是否有商品
|
// TODO 芋艿:考虑下,是否需要判断下该分类下是否有商品
|
||||||
// 标记删除商品分类
|
// 标记删除商品分类
|
||||||
ProductCategoryDO updateProductCategory = new ProductCategoryDO();
|
ProductCategoryDO updateProductCategory = new ProductCategoryDO().setId(productCategoryId);
|
||||||
updateProductCategory.setDeleted(BaseDO.DELETED_YES);
|
updateProductCategory.setDeleted(BaseDO.DELETED_YES);
|
||||||
productCategoryMapper.update(updateProductCategory);
|
productCategoryMapper.update(updateProductCategory);
|
||||||
// TODO 操作日志
|
// TODO 操作日志
|
||||||
return CommonResult.success(true);
|
return CommonResult.success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isValidStatus(Integer status) {
|
||||||
|
return ProductCategoryConstants.STATUS_ENABLE.equals(status)
|
||||||
|
|| ProductCategoryConstants.STATUS_DISABLE.equals(status);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -3,7 +3,7 @@
|
||||||
<mapper namespace="cn.iocoder.mall.product.dao.ProductCategoryMapper">
|
<mapper namespace="cn.iocoder.mall.product.dao.ProductCategoryMapper">
|
||||||
|
|
||||||
<sql id="FIELDS">
|
<sql id="FIELDS">
|
||||||
id, pid, name, descrption, pic_url,
|
id, pid, name, description, pic_url,
|
||||||
sort, status, create_time
|
sort, status, create_time
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
<update id="update" parameterType="ProductCategoryDO">
|
<update id="update" parameterType="ProductCategoryDO">
|
||||||
UPDATE resource
|
UPDATE product_category
|
||||||
<set>
|
<set>
|
||||||
<if test="pid != null">
|
<if test="pid != null">
|
||||||
pid = #{pid},
|
pid = #{pid},
|
||||||
|
|
Loading…
Reference in New Issue