mall:完善商品品牌的前后端实现

pull/2/head
YunaiV 2022-07-30 22:15:03 +08:00
parent efd4942129
commit fa9823161e
22 changed files with 287 additions and 566 deletions

View File

@ -24,64 +24,6 @@ SET NAMES utf8mb4;
-- ---------------------------- -- ----------------------------
-- Table structure for product_brand -- Table structure for product_brand
-- ---------------------------- -- ----------------------------
DROP TABLE IF EXISTS `product_brand`;
CREATE TABLE `product_brand`
(
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '',
`category_id` bigint NOT NULL COMMENT '',
`name` varchar(255) NOT NULL COMMENT '',
`banner_url` varchar(255) NOT NULL COMMENT '',
`sort` int DEFAULT '0' COMMENT '',
`description` varchar(1024) DEFAULT NULL COMMENT '',
`status` tinyint NOT NULL COMMENT '',
`creator` varchar(64) DEFAULT '' COMMENT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '',
`updater` varchar(64) DEFAULT '' COMMENT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB COMMENT='';
-- TODO id : 2000 2001
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES (2000, '', '', 1, 1, 0, '/mall', 'merchant', NULL, 0);
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES (2001, '', '', 1, 1, 2000, 'product', 'dict', NULL, 0);
-- SQL
INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES ('', '', 2, 0, 2001, 'category', '', 'mall/product/category/index', 0);
-- ID
SELECT @parentId := LAST_INSERT_ID();
-- SQL
INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES ('', 'product:category:query', 3, 1, @parentId, '', '', '', 0);
INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES ('', 'product:category:create', 3, 2, @parentId, '', '', '', 0);
INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES ('', 'product:category:update', 3, 3, @parentId, '', '', '', 0);
INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES ('', 'product:category:delete', 3, 4, @parentId, '', '', '', 0);
INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES ('', 'product:category:export', 3, 5, @parentId, '', '', '', 0);
-- SQL
INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES ('', '', 2, 1, 2001, 'brand', '', 'mall/product/brand/index', 0);
-- ID
SELECT @parentId := LAST_INSERT_ID();
-- SQL
INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES ('', 'product:brand:query', 3, 1, @parentId, '', '', '', 0);
INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES ('', 'product:brand:create', 3, 2, @parentId, '', '', '', 0);
INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES ('', 'product:brand:update', 3, 3, @parentId, '', '', '', 0);
INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES ('', 'product:brand:delete', 3, 4, @parentId, '', '', '', 0);
INSERT INTO `system_menu`(`name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`)
VALUES ('', 'product:brand:export', 3, 5, @parentId, '', '', '', 0);
-- ---------------------------- -- ----------------------------
-- Table structure for market_activity -- Table structure for market_activity

View File

@ -17,7 +17,7 @@ public interface ErrorCodeConstants {
ErrorCode PRODUCT_CATEGORY_DISABLED = new ErrorCode(1008001004, "商品分类({})已禁用,无法使用"); ErrorCode PRODUCT_CATEGORY_DISABLED = new ErrorCode(1008001004, "商品分类({})已禁用,无法使用");
// ========== 品牌相关编号 1008002000 ========== // ========== 品牌相关编号 1008002000 ==========
ErrorCode BRAND_NOT_EXISTS = new ErrorCode(1008002000, "品牌不存在"); ErrorCode PRODUCT_BRAND_NOT_EXISTS = new ErrorCode(1008002000, "品牌不存在");
// ========== 规格名称 1008003000 ========== // ========== 规格名称 1008003000 ==========
ErrorCode PROPERTY_NOT_EXISTS = new ErrorCode(1008003000, "规格名称不存在"); ErrorCode PROPERTY_NOT_EXISTS = new ErrorCode(1008003000, "规格名称不存在");

View File

@ -5,9 +5,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.*; import cn.iocoder.yudao.module.product.controller.admin.brand.vo.*;
import cn.iocoder.yudao.module.product.convert.brand.BrandConvert; import cn.iocoder.yudao.module.product.convert.brand.ProductBrandConvert;
import cn.iocoder.yudao.module.product.dal.dataobject.brand.BrandDO; import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO;
import cn.iocoder.yudao.module.product.service.brand.BrandService; import cn.iocoder.yudao.module.product.service.brand.ProductBrandService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -24,26 +24,26 @@ import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Api(tags = "管理后台 - 品牌") @Api(tags = "管理后台 - 商品品牌")
@RestController @RestController
@RequestMapping("/product/brand") @RequestMapping("/product/brand")
@Validated @Validated
public class BrandController { public class ProductBrandController {
@Resource @Resource
private BrandService brandService; private ProductBrandService brandService;
@PostMapping("/create") @PostMapping("/create")
@ApiOperation("创建品牌") @ApiOperation("创建品牌")
@PreAuthorize("@ss.hasPermission('product:brand:create')") @PreAuthorize("@ss.hasPermission('product:brand:create')")
public CommonResult<Long> createBrand(@Valid @RequestBody BrandCreateReqVO createReqVO) { public CommonResult<Long> createBrand(@Valid @RequestBody ProductBrandCreateReqVO createReqVO) {
return success(brandService.createBrand(createReqVO)); return success(brandService.createProductBrand(createReqVO));
} }
@PutMapping("/update") @PutMapping("/update")
@ApiOperation("更新品牌") @ApiOperation("更新品牌")
@PreAuthorize("@ss.hasPermission('product:brand:update')") @PreAuthorize("@ss.hasPermission('product:brand:update')")
public CommonResult<Boolean> updateBrand(@Valid @RequestBody BrandUpdateReqVO updateReqVO) { public CommonResult<Boolean> updateBrand(@Valid @RequestBody ProductBrandUpdateReqVO updateReqVO) {
brandService.updateBrand(updateReqVO); brandService.updateBrand(updateReqVO);
return success(true); return success(true);
} }
@ -61,29 +61,17 @@ public class BrandController {
@ApiOperation("获得品牌") @ApiOperation("获得品牌")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('product:brand:query')") @PreAuthorize("@ss.hasPermission('product:brand:query')")
public CommonResult<BrandRespVO> getBrand(@RequestParam("id") Long id) { public CommonResult<ProductBrandRespVO> getBrand(@RequestParam("id") Long id) {
BrandDO brand = brandService.getBrand(id); ProductBrandDO brand = brandService.getBrand(id);
return success(BrandConvert.INSTANCE.convert(brand)); return success(ProductBrandConvert.INSTANCE.convert(brand));
} }
@GetMapping("/page") @GetMapping("/page")
@ApiOperation("获得品牌分页") @ApiOperation("获得品牌分页")
@PreAuthorize("@ss.hasPermission('product:brand:query')") @PreAuthorize("@ss.hasPermission('product:brand:query')")
public CommonResult<PageResult<BrandRespVO>> getBrandPage(@Valid BrandPageReqVO pageVO) { public CommonResult<PageResult<ProductBrandRespVO>> getBrandPage(@Valid ProductBrandPageReqVO pageVO) {
PageResult<BrandDO> pageResult = brandService.getBrandPage(pageVO); PageResult<ProductBrandDO> pageResult = brandService.getBrandPage(pageVO);
return success(BrandConvert.INSTANCE.convertPage(pageResult)); return success(ProductBrandConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@ApiOperation("导出品牌 Excel")
@PreAuthorize("@ss.hasPermission('product:brand:export')")
@OperateLog(type = EXPORT)
public void exportBrandExcel(@Valid BrandExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<BrandDO> list = brandService.getBrandList(exportReqVO);
// 导出 Excel
List<BrandExcelVO> datas = BrandConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "品牌.xls", "数据", BrandExcelVO.class, datas);
} }
} }

View File

@ -1,45 +0,0 @@
package cn.iocoder.yudao.module.product.controller.admin.brand.vo;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
import com.alibaba.excel.annotation.ExcelProperty;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
/**
* Excel VO
*
* @author
*/
@Data
public class BrandExcelVO {
@ExcelProperty("品牌编号")
private Long id;
@ExcelProperty("分类编号")
private Long categoryId;
@ExcelProperty("品牌名称")
private String name;
@ExcelProperty("品牌图片")
private String bannerUrl;
@ExcelProperty("品牌排序")
private Integer sort;
@ExcelProperty("品牌描述")
private String description;
@ExcelProperty(value = "状态", converter = DictConvert.class)
@DictFormat("common_status") // TODO 代码优化:建议设置到对应的 XXXDictTypeConstants 枚举类中
private Integer status;
@ExcelProperty("创建时间")
private Date createTime;
}

View File

@ -1,28 +0,0 @@
package cn.iocoder.yudao.module.product.controller.admin.brand.vo;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel(value = "管理后台 - 品牌 Excel 导出 Request VO", description = "参数和 BrandPageReqVO 是一致的")
@Data
public class BrandExportReqVO {
@ApiModelProperty(value = "分类编号", example = "1")
private Long categoryId;
@ApiModelProperty(value = "品牌名称", example = "芋道")
private String name;
@ApiModelProperty(value = "状态", example = "0")
private Integer status;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "创建时间")
private Date[] createTime;
}

View File

@ -1,20 +1,16 @@
package cn.iocoder.yudao.module.product.controller.admin.brand.vo; package cn.iocoder.yudao.module.product.controller.admin.brand.vo;
import lombok.*; import io.swagger.annotations.ApiModelProperty;
import java.util.*; import lombok.Data;
import io.swagger.annotations.*;
import javax.validation.constraints.*; import javax.validation.constraints.NotNull;
/** /**
* Base VO VO 使 * Base VO VO 使
* VO Swagger * VO Swagger
*/ */
@Data @Data
public class BrandBaseVO { public class ProductBrandBaseVO {
@ApiModelProperty(value = "分类编号", required = true, example = "1")
@NotNull(message = "分类编号不能为空")
private Long categoryId;
@ApiModelProperty(value = "品牌名称", required = true, example = "芋道") @ApiModelProperty(value = "品牌名称", required = true, example = "芋道")
@NotNull(message = "品牌名称不能为空") @NotNull(message = "品牌名称不能为空")
@ -22,7 +18,7 @@ public class BrandBaseVO {
@ApiModelProperty(value = "品牌图片", required = true) @ApiModelProperty(value = "品牌图片", required = true)
@NotNull(message = "品牌图片不能为空") @NotNull(message = "品牌图片不能为空")
private String bannerUrl; private String picUrl;
@ApiModelProperty(value = "品牌排序", example = "1") @ApiModelProperty(value = "品牌排序", example = "1")
private Integer sort; private Integer sort;

View File

@ -1,14 +1,12 @@
package cn.iocoder.yudao.module.product.controller.admin.brand.vo; package cn.iocoder.yudao.module.product.controller.admin.brand.vo;
import lombok.*; import lombok.*;
import java.util.*;
import io.swagger.annotations.*; import io.swagger.annotations.*;
import javax.validation.constraints.*;
@ApiModel("管理后台 - 品牌创建 Request VO") @ApiModel("管理后台 - 商品品牌创建 Request VO")
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true) @ToString(callSuper = true)
public class BrandCreateReqVO extends BrandBaseVO { public class ProductBrandCreateReqVO extends ProductBrandBaseVO {
} }

View File

@ -1,21 +1,22 @@
package cn.iocoder.yudao.module.product.controller.admin.brand.vo; package cn.iocoder.yudao.module.product.controller.admin.brand.vo;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("管理后台 - 品牌分页 Request VO") @ApiModel("管理后台 - 商品品牌分页 Request VO")
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true) @ToString(callSuper = true)
public class BrandPageReqVO extends PageParam { public class ProductBrandPageReqVO extends PageParam {
@ApiModelProperty(value = "分类编号", example = "1")
private Long categoryId;
@ApiModelProperty(value = "品牌名称", example = "芋道") @ApiModelProperty(value = "品牌名称", example = "芋道")
private String name; private String name;

View File

@ -1,14 +1,18 @@
package cn.iocoder.yudao.module.product.controller.admin.brand.vo; package cn.iocoder.yudao.module.product.controller.admin.brand.vo;
import lombok.*; import io.swagger.annotations.ApiModel;
import java.util.*; import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.*; import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.Date;
@ApiModel("管理后台 - 品牌 Response VO") @ApiModel("管理后台 - 品牌 Response VO")
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true) @ToString(callSuper = true)
public class BrandRespVO extends BrandBaseVO { public class ProductBrandRespVO extends ProductBrandBaseVO {
@ApiModelProperty(value = "品牌编号", required = true, example = "1") @ApiModelProperty(value = "品牌编号", required = true, example = "1")
private Long id; private Long id;

View File

@ -1,15 +1,14 @@
package cn.iocoder.yudao.module.product.controller.admin.brand.vo; package cn.iocoder.yudao.module.product.controller.admin.brand.vo;
import lombok.*; import lombok.*;
import java.util.*;
import io.swagger.annotations.*; import io.swagger.annotations.*;
import javax.validation.constraints.*; import javax.validation.constraints.*;
@ApiModel("管理后台 - 品牌更新 Request VO") @ApiModel("管理后台 - 商品品牌更新 Request VO")
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true) @ToString(callSuper = true)
public class BrandUpdateReqVO extends BrandBaseVO { public class ProductBrandUpdateReqVO extends ProductBrandBaseVO {
@ApiModelProperty(value = "品牌编号", required = true, example = "1") @ApiModelProperty(value = "品牌编号", required = true, example = "1")
@NotNull(message = "品牌编号不能为空") @NotNull(message = "品牌编号不能为空")

View File

@ -1,34 +0,0 @@
package cn.iocoder.yudao.module.product.convert.brand;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.*;
import cn.iocoder.yudao.module.product.dal.dataobject.brand.BrandDO;
/**
* Convert
*
* @author
*/
@Mapper
public interface BrandConvert {
BrandConvert INSTANCE = Mappers.getMapper(BrandConvert.class);
BrandDO convert(BrandCreateReqVO bean);
BrandDO convert(BrandUpdateReqVO bean);
BrandRespVO convert(BrandDO bean);
List<BrandRespVO> convertList(List<BrandDO> list);
PageResult<BrandRespVO> convertPage(PageResult<BrandDO> page);
List<BrandExcelVO> convertList02(List<BrandDO> list);
}

View File

@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.product.convert.brand;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandCreateReqVO;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandRespVO;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandUpdateReqVO;
import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* Convert
*
* @author
*/
@Mapper
public interface ProductBrandConvert {
ProductBrandConvert INSTANCE = Mappers.getMapper(ProductBrandConvert.class);
ProductBrandDO convert(ProductBrandCreateReqVO bean);
ProductBrandDO convert(ProductBrandUpdateReqVO bean);
ProductBrandRespVO convert(ProductBrandDO bean);
List<ProductBrandRespVO> convertList(List<ProductBrandDO> list);
PageResult<ProductBrandRespVO> convertPage(PageResult<ProductBrandDO> page);
}

View File

@ -6,9 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*; import lombok.*;
// TODO @JeromeSoarProduct 前缀
/** /**
* DO * DO
* *
* @author * @author
*/ */
@ -19,17 +18,13 @@ import lombok.*;
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class BrandDO extends BaseDO { public class ProductBrandDO extends BaseDO {
/** /**
* *
*/ */
@TableId @TableId
private Long id; private Long id;
/**
*
*/
private Long categoryId;
/** /**
* *
*/ */
@ -37,7 +32,7 @@ public class BrandDO extends BaseDO {
/** /**
* *
*/ */
private String bannerUrl; private String picUrl;
/** /**
* *
*/ */

View File

@ -1,38 +0,0 @@
package cn.iocoder.yudao.module.product.dal.mysql.brand;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.product.dal.dataobject.brand.BrandDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.*;
/**
* Mapper
*
* @author
*/
@Mapper
public interface BrandMapper extends BaseMapperX<BrandDO> {
default PageResult<BrandDO> selectPage(BrandPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<BrandDO>()
.eqIfPresent(BrandDO::getCategoryId, reqVO.getCategoryId())
.likeIfPresent(BrandDO::getName, reqVO.getName())
.eqIfPresent(BrandDO::getStatus, reqVO.getStatus())
.betweenIfPresent(BrandDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(BrandDO::getId));
}
default List<BrandDO> selectList(BrandExportReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<BrandDO>()
.eqIfPresent(BrandDO::getCategoryId, reqVO.getCategoryId())
.likeIfPresent(BrandDO::getName, reqVO.getName())
.eqIfPresent(BrandDO::getStatus, reqVO.getStatus())
.betweenIfPresent(BrandDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(BrandDO::getId));
}
}

View File

@ -0,0 +1,21 @@
package cn.iocoder.yudao.module.product.dal.mysql.brand;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandPageReqVO;
import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ProductBrandMapper extends BaseMapperX<ProductBrandDO> {
default PageResult<ProductBrandDO> selectPage(ProductBrandPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ProductBrandDO>()
.likeIfPresent(ProductBrandDO::getName, reqVO.getName())
.eqIfPresent(ProductBrandDO::getStatus, reqVO.getStatus())
.betweenIfPresent(ProductBrandDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ProductBrandDO::getId));
}
}

View File

@ -1,17 +1,21 @@
package cn.iocoder.yudao.module.product.service.brand; package cn.iocoder.yudao.module.product.service.brand;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.*;
import cn.iocoder.yudao.module.product.dal.dataobject.brand.BrandDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandCreateReqVO;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandPageReqVO;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandUpdateReqVO;
import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO;
import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
/** /**
* Service * Service
* *
* @author * @author
*/ */
public interface BrandService { public interface ProductBrandService {
/** /**
* *
@ -19,14 +23,14 @@ public interface BrandService {
* @param createReqVO * @param createReqVO
* @return * @return
*/ */
Long createBrand(@Valid BrandCreateReqVO createReqVO); Long createProductBrand(@Valid ProductBrandCreateReqVO createReqVO);
/** /**
* *
* *
* @param updateReqVO * @param updateReqVO
*/ */
void updateBrand(@Valid BrandUpdateReqVO updateReqVO); void updateBrand(@Valid ProductBrandUpdateReqVO updateReqVO);
/** /**
* *
@ -41,7 +45,7 @@ public interface BrandService {
* @param id * @param id
* @return * @return
*/ */
BrandDO getBrand(Long id); ProductBrandDO getBrand(Long id);
/** /**
* *
@ -49,7 +53,7 @@ public interface BrandService {
* @param ids * @param ids
* @return * @return
*/ */
List<BrandDO> getBrandList(Collection<Long> ids); List<ProductBrandDO> getBrandList(Collection<Long> ids);
/** /**
* *
@ -57,14 +61,6 @@ public interface BrandService {
* @param pageReqVO * @param pageReqVO
* @return * @return
*/ */
PageResult<BrandDO> getBrandPage(BrandPageReqVO pageReqVO); PageResult<ProductBrandDO> getBrandPage(ProductBrandPageReqVO pageReqVO);
/**
* , Excel
*
* @param exportReqVO
* @return
*/
List<BrandDO> getBrandList(BrandExportReqVO exportReqVO);
} }

View File

@ -1,19 +1,21 @@
package cn.iocoder.yudao.module.product.service.brand; package cn.iocoder.yudao.module.product.service.brand;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandCreateReqVO;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandPageReqVO;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandUpdateReqVO;
import cn.iocoder.yudao.module.product.convert.brand.ProductBrandConvert;
import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO;
import cn.iocoder.yudao.module.product.dal.mysql.brand.ProductBrandMapper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import java.util.*; import javax.annotation.Resource;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.*; import java.util.Collection;
import cn.iocoder.yudao.module.product.dal.dataobject.brand.BrandDO; import java.util.List;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.product.convert.brand.BrandConvert;
import cn.iocoder.yudao.module.product.dal.mysql.brand.BrandMapper;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PRODUCT_BRAND_NOT_EXISTS;
/** /**
* Service * Service
@ -22,26 +24,26 @@ import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*;
*/ */
@Service @Service
@Validated @Validated
public class BrandServiceImpl implements BrandService { public class ProductBrandServiceImpl implements ProductBrandService {
@Resource @Resource
private BrandMapper brandMapper; private ProductBrandMapper brandMapper;
@Override @Override
public Long createBrand(BrandCreateReqVO createReqVO) { public Long createProductBrand(ProductBrandCreateReqVO createReqVO) {
// 插入 // 插入
BrandDO brand = BrandConvert.INSTANCE.convert(createReqVO); ProductBrandDO brand = ProductBrandConvert.INSTANCE.convert(createReqVO);
brandMapper.insert(brand); brandMapper.insert(brand);
// 返回 // 返回
return brand.getId(); return brand.getId();
} }
@Override @Override
public void updateBrand(BrandUpdateReqVO updateReqVO) { public void updateBrand(ProductBrandUpdateReqVO updateReqVO) {
// 校验存在 // 校验存在
this.validateBrandExists(updateReqVO.getId()); validateBrandExists(updateReqVO.getId());
// 更新 // 更新
BrandDO updateObj = BrandConvert.INSTANCE.convert(updateReqVO); ProductBrandDO updateObj = ProductBrandConvert.INSTANCE.convert(updateReqVO);
brandMapper.updateById(updateObj); brandMapper.updateById(updateObj);
} }
@ -55,28 +57,23 @@ public class BrandServiceImpl implements BrandService {
private void validateBrandExists(Long id) { private void validateBrandExists(Long id) {
if (brandMapper.selectById(id) == null) { if (brandMapper.selectById(id) == null) {
throw exception(BRAND_NOT_EXISTS); throw exception(PRODUCT_BRAND_NOT_EXISTS);
} }
} }
@Override @Override
public BrandDO getBrand(Long id) { public ProductBrandDO getBrand(Long id) {
return brandMapper.selectById(id); return brandMapper.selectById(id);
} }
@Override @Override
public List<BrandDO> getBrandList(Collection<Long> ids) { public List<ProductBrandDO> getBrandList(Collection<Long> ids) {
return brandMapper.selectBatchIds(ids); return brandMapper.selectBatchIds(ids);
} }
@Override @Override
public PageResult<BrandDO> getBrandPage(BrandPageReqVO pageReqVO) { public PageResult<ProductBrandDO> getBrandPage(ProductBrandPageReqVO pageReqVO) {
return brandMapper.selectPage(pageReqVO); return brandMapper.selectPage(pageReqVO);
} }
@Override
public List<BrandDO> getBrandList(BrandExportReqVO exportReqVO) {
return brandMapper.selectList(exportReqVO);
}
} }

View File

@ -1,173 +0,0 @@
package cn.iocoder.yudao.module.product.service.brand;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.MockBean;
import javax.annotation.Resource;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.*;
import cn.iocoder.yudao.module.product.dal.dataobject.brand.BrandDO;
import cn.iocoder.yudao.module.product.dal.mysql.brand.BrandMapper;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import javax.annotation.Resource;
import org.springframework.context.annotation.Import;
import java.util.*;
import static cn.hutool.core.util.RandomUtil.*;
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
/**
* {@link BrandServiceImpl}
*
* @author
*/
@Import(BrandServiceImpl.class)
public class BrandServiceImplTest extends BaseDbUnitTest {
@Resource
private BrandServiceImpl brandService;
@Resource
private BrandMapper brandMapper;
@Test
public void testCreateBrand_success() {
// 准备参数
BrandCreateReqVO reqVO = randomPojo(BrandCreateReqVO.class);
// 调用
Long brandId = brandService.createBrand(reqVO);
// 断言
assertNotNull(brandId);
// 校验记录的属性是否正确
BrandDO brand = brandMapper.selectById(brandId);
assertPojoEquals(reqVO, brand);
}
@Test
public void testUpdateBrand_success() {
// mock 数据
BrandDO dbBrand = randomPojo(BrandDO.class);
brandMapper.insert(dbBrand);// @Sql: 先插入出一条存在的数据
// 准备参数
BrandUpdateReqVO reqVO = randomPojo(BrandUpdateReqVO.class, o -> {
o.setId(dbBrand.getId()); // 设置更新的 ID
});
// 调用
brandService.updateBrand(reqVO);
// 校验是否更新正确
BrandDO brand = brandMapper.selectById(reqVO.getId()); // 获取最新的
assertPojoEquals(reqVO, brand);
}
@Test
public void testUpdateBrand_notExists() {
// 准备参数
BrandUpdateReqVO reqVO = randomPojo(BrandUpdateReqVO.class);
// 调用, 并断言异常
assertServiceException(() -> brandService.updateBrand(reqVO), BRAND_NOT_EXISTS);
}
@Test
public void testDeleteBrand_success() {
// mock 数据
BrandDO dbBrand = randomPojo(BrandDO.class);
brandMapper.insert(dbBrand);// @Sql: 先插入出一条存在的数据
// 准备参数
Long id = dbBrand.getId();
// 调用
brandService.deleteBrand(id);
// 校验数据不存在了
assertNull(brandMapper.selectById(id));
}
@Test
public void testDeleteBrand_notExists() {
// 准备参数
Long id = randomLongId();
// 调用, 并断言异常
assertServiceException(() -> brandService.deleteBrand(id), BRAND_NOT_EXISTS);
}
@Test
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
public void testGetBrandPage() {
// mock 数据
BrandDO dbBrand = randomPojo(BrandDO.class, o -> { // 等会查询到
o.setCategoryId(null);
o.setName(null);
o.setStatus(null);
o.setCreateTime(null);
});
brandMapper.insert(dbBrand);
// 测试 categoryId 不匹配
brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setCategoryId(null)));
// 测试 name 不匹配
brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setName(null)));
// 测试 status 不匹配
brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setStatus(null)));
// 测试 createTime 不匹配
brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setCreateTime(null)));
// 准备参数
BrandPageReqVO reqVO = new BrandPageReqVO();
reqVO.setCategoryId(null);
reqVO.setName(null);
reqVO.setStatus(null);
reqVO.setCreateTime((new Date[]{}));
// 调用
PageResult<BrandDO> pageResult = brandService.getBrandPage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbBrand, pageResult.getList().get(0));
}
@Test
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
public void testGetBrandList() {
// mock 数据
BrandDO dbBrand = randomPojo(BrandDO.class, o -> { // 等会查询到
o.setCategoryId(null);
o.setName(null);
o.setStatus(null);
o.setCreateTime(null);
});
brandMapper.insert(dbBrand);
// 测试 categoryId 不匹配
brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setCategoryId(null)));
// 测试 name 不匹配
brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setName(null)));
// 测试 status 不匹配
brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setStatus(null)));
// 测试 createTime 不匹配
brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setCreateTime(null)));
// 准备参数
BrandExportReqVO reqVO = new BrandExportReqVO();
reqVO.setCategoryId(null);
reqVO.setName(null);
reqVO.setStatus(null);
reqVO.setCreateTime((new Date[]{}));
// 调用
List<BrandDO> list = brandService.getBrandList(reqVO);
// 断言
assertEquals(1, list.size());
assertPojoEquals(dbBrand, list.get(0));
}
}

View File

@ -0,0 +1,132 @@
package cn.iocoder.yudao.module.product.service.brand;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandCreateReqVO;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandPageReqVO;
import cn.iocoder.yudao.module.product.controller.admin.brand.vo.ProductBrandUpdateReqVO;
import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO;
import cn.iocoder.yudao.module.product.dal.mysql.brand.ProductBrandMapper;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Import;
import javax.annotation.Resource;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.buildTime;
import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.PRODUCT_BRAND_NOT_EXISTS;
import static org.junit.jupiter.api.Assertions.*;
/**
* {@link ProductBrandServiceImpl}
*
* @author
*/
@Import(ProductBrandServiceImpl.class)
public class ProductBrandServiceImplTest extends BaseDbUnitTest {
@Resource
private ProductBrandServiceImpl brandService;
@Resource
private ProductBrandMapper brandMapper;
@Test
public void testCreateBrand_success() {
// 准备参数
ProductBrandCreateReqVO reqVO = randomPojo(ProductBrandCreateReqVO.class);
// 调用
Long brandId = brandService.createProductBrand(reqVO);
// 断言
assertNotNull(brandId);
// 校验记录的属性是否正确
ProductBrandDO brand = brandMapper.selectById(brandId);
assertPojoEquals(reqVO, brand);
}
@Test
public void testUpdateBrand_success() {
// mock 数据
ProductBrandDO dbBrand = randomPojo(ProductBrandDO.class);
brandMapper.insert(dbBrand);// @Sql: 先插入出一条存在的数据
// 准备参数
ProductBrandUpdateReqVO reqVO = randomPojo(ProductBrandUpdateReqVO.class, o -> {
o.setId(dbBrand.getId()); // 设置更新的 ID
});
// 调用
brandService.updateBrand(reqVO);
// 校验是否更新正确
ProductBrandDO brand = brandMapper.selectById(reqVO.getId()); // 获取最新的
assertPojoEquals(reqVO, brand);
}
@Test
public void testUpdateBrand_notExists() {
// 准备参数
ProductBrandUpdateReqVO reqVO = randomPojo(ProductBrandUpdateReqVO.class);
// 调用, 并断言异常
assertServiceException(() -> brandService.updateBrand(reqVO), PRODUCT_BRAND_NOT_EXISTS);
}
@Test
public void testDeleteBrand_success() {
// mock 数据
ProductBrandDO dbBrand = randomPojo(ProductBrandDO.class);
brandMapper.insert(dbBrand);// @Sql: 先插入出一条存在的数据
// 准备参数
Long id = dbBrand.getId();
// 调用
brandService.deleteBrand(id);
// 校验数据不存在了
assertNull(brandMapper.selectById(id));
}
@Test
public void testDeleteBrand_notExists() {
// 准备参数
Long id = randomLongId();
// 调用, 并断言异常
assertServiceException(() -> brandService.deleteBrand(id), PRODUCT_BRAND_NOT_EXISTS);
}
@Test
public void testGetBrandPage() {
// mock 数据
ProductBrandDO dbBrand = randomPojo(ProductBrandDO.class, o -> { // 等会查询到
o.setName("芋道源码");
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
o.setCreateTime(buildTime(2022, 2, 1));
});
brandMapper.insert(dbBrand);
// 测试 name 不匹配
brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setName("源码")));
// 测试 status 不匹配
brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
// 测试 createTime 不匹配
brandMapper.insert(cloneIgnoreId(dbBrand, o -> o.setCreateTime(buildTime(2022, 3, 1))));
// 准备参数
ProductBrandPageReqVO reqVO = new ProductBrandPageReqVO();
reqVO.setName("芋道");
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
reqVO.setCreateTime((new Date[]{buildTime(2022, 1, 1), buildTime(2022, 2, 25)}));
// 调用
PageResult<ProductBrandDO> pageResult = brandService.getBrandPage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbBrand, pageResult.getList().get(0));
}
}

View File

@ -16,9 +16,8 @@ CREATE TABLE IF NOT EXISTS "product_category" (
CREATE TABLE IF NOT EXISTS "product_brand" ( CREATE TABLE IF NOT EXISTS "product_brand" (
"id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"category_id" bigint(20) NOT NULL,
"name" varchar(255) NOT NULL, "name" varchar(255) NOT NULL,
"banner_url" varchar(255) NOT NULL, "pic_url" varchar(255) NOT NULL,
"sort" int(11), "sort" int(11),
"description" varchar(1024), "description" varchar(1024),
"status" tinyint(4) NOT NULL, "status" tinyint(4) NOT NULL,
@ -28,4 +27,4 @@ CREATE TABLE IF NOT EXISTS "product_brand" (
"update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE, "deleted" bit NOT NULL DEFAULT FALSE,
PRIMARY KEY ("id") PRIMARY KEY ("id")
) COMMENT ''; ) COMMENT '';

View File

@ -26,25 +26,18 @@
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
v-hasPermi="['product:brand:create']">新增 v-hasPermi="['product:brand:create']">新增</el-button>
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
:loading="exportLoading"
v-hasPermi="['product:brand:export']">导出
</el-button>
</el-col> </el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
<!-- 列表 --> <!-- 列表 -->
<el-table v-loading="loading" :data="list"> <el-table v-loading="loading" :data="list">
<el-table-column label="商品分类" align="center" prop="categoryId"/> <el-table-column label="品牌编号" align="center" prop="id"/>
<el-table-column label="品牌名称" align="center" prop="name"/> <el-table-column label="品牌名称" align="center" prop="name"/>
<el-table-column label="品牌图片" align="center" prop="bannerUrl"> <el-table-column label="品牌图片" align="center" prop="picUrl">
<template slot-scope="scope"> <template slot-scope="scope">
<img v-if="scope.row.bannerUrl" :src="scope.row.bannerUrl" alt="分类图片" class="img-height"/> <img v-if="scope.row.picUrl" :src="scope.row.picUrl" alt="分类图片" style="height: 100px;" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="品牌排序" align="center" prop="sort"/> <el-table-column label="品牌排序" align="center" prop="sort"/>
@ -77,15 +70,11 @@
<!-- 对话框(添加 / 修改) --> <!-- 对话框(添加 / 修改) -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="商品分类" prop="categoryId">
<Treeselect v-model="form.categoryId" :options="categoryOptions" :normalizer="normalizer" :show-count="true"
placeholder="请选择商品分类"/>
</el-form-item>
<el-form-item label="品牌名称" prop="name"> <el-form-item label="品牌名称" prop="name">
<el-input v-model="form.name" placeholder="请输入品牌名称"/> <el-input v-model="form.name" placeholder="请输入品牌名称"/>
</el-form-item> </el-form-item>
<el-form-item label="品牌图片" prop="bannerUrl"> <el-form-item label="品牌图片" prop="picUrl">
<imageUpload v-model="form.bannerUrl" :limit="1"/> <imageUpload v-model="form.picUrl" :limit="1"/>
</el-form-item> </el-form-item>
<el-form-item label="品牌排序" prop="sort"> <el-form-item label="品牌排序" prop="sort">
<el-input v-model="form.sort" placeholder="请输入品牌排序"/> <el-input v-model="form.sort" placeholder="请输入品牌排序"/>
@ -113,20 +102,18 @@
import { import {
createBrand, createBrand,
deleteBrand, deleteBrand,
exportBrandExcel,
getBrand, getBrand,
getBrandPage, getBrandPage,
updateBrand updateBrand
} from "@/api/mall/product/brand"; } from "@/api/mall/product/brand";
import {getProductCategoryList} from "@/api/mall/product/category";
import ImageUpload from '@/components/ImageUpload'; import ImageUpload from '@/components/ImageUpload';
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css"; import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import {CommonStatusEnum} from "@/utils/constants";
export default { export default {
name: "Brand", name: "ProductBrand",
components: { components: {
ImageUpload, Treeselect, ImageUpload
}, },
data() { data() {
return { return {
@ -153,21 +140,18 @@ export default {
status: null, status: null,
createTime: [] createTime: []
}, },
//
categoryOptions: [],
// //
form: {}, form: {},
// //
rules: { rules: {
categoryId: [{required: true, message: "分类编号不能为空", trigger: "blur"}],
name: [{required: true, message: "品牌名称不能为空", trigger: "blur"}], name: [{required: true, message: "品牌名称不能为空", trigger: "blur"}],
bannerUrl: [{required: true, message: "品牌图片不能为空", trigger: "blur"}], picUrl: [{required: true, message: "品牌图片不能为空", trigger: "blur"}],
sort: [{required: true, message: "品牌排序不能为空", trigger: "blur"}],
status: [{required: true, message: "状态不能为空", trigger: "change"}], status: [{required: true, message: "状态不能为空", trigger: "change"}],
} }
}; };
}, },
created() { created() {
this.getTreeselect();
this.getList(); this.getList();
}, },
methods: { methods: {
@ -181,26 +165,6 @@ export default {
this.loading = false; this.loading = false;
}); });
}, },
/** 转换菜单数据结构 */
normalizer(node) {
if (node.children && !node.children.length) {
delete node.children;
}
return {
id: node.id,
label: node.name,
children: node.children
};
},
/** 查询分类下拉树结构 */
getTreeselect() {
getProductCategoryList().then(response => {
this.categoryOptions = [];
const menu = {id: 0, name: '商品分类', children: []};
menu.children = this.handleTree(response.data, "id", "pid");
this.categoryOptions.push(menu);
});
},
/** 取消按钮 */ /** 取消按钮 */
cancel() { cancel() {
this.open = false; this.open = false;
@ -210,12 +174,11 @@ export default {
reset() { reset() {
this.form = { this.form = {
id: undefined, id: undefined,
categoryId: undefined,
name: undefined, name: undefined,
bannerUrl: undefined, picUrl: undefined,
sort: undefined, sort: 0,
description: undefined, description: undefined,
status: undefined, status: CommonStatusEnum.ENABLE,
}; };
this.resetForm("form"); this.resetForm("form");
}, },
@ -232,14 +195,12 @@ export default {
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd() { handleAdd() {
this.reset(); this.reset();
this.getTreeselect();
this.open = true; this.open = true;
this.title = "添加品牌"; this.title = "添加品牌";
}, },
/** 修改按钮操作 */ /** 修改按钮操作 */
handleUpdate(row) { handleUpdate(row) {
this.reset(); this.reset();
this.getTreeselect();
const id = row.id; const id = row.id;
getBrand(id).then(response => { getBrand(id).then(response => {
this.form = response.data; this.form = response.data;
@ -280,30 +241,7 @@ export default {
this.$modal.msgSuccess("删除成功"); this.$modal.msgSuccess("删除成功");
}).catch(() => { }).catch(() => {
}); });
},
/** 导出按钮操作 */
handleExport() {
//
let params = {...this.queryParams};
params.pageNo = undefined;
params.pageSize = undefined;
//
this.$modal.confirm('是否确认导出所有品牌数据项?').then(() => {
this.exportLoading = true;
return exportBrandExcel(params);
}).then(response => {
this.$download.excel(response, "品牌.xls");
this.exportLoading = false;
}).catch(() => {
});
} }
} }
}; };
</script> </script>
<style scoped lang="scss">
//
.img-height {
height: 150px;
}
</style>

View File

@ -113,7 +113,7 @@ import ImageUpload from '@/components/ImageUpload';
import {CommonStatusEnum} from "@/utils/constants"; import {CommonStatusEnum} from "@/utils/constants";
export default { export default {
name: "Category", name: "ProductCategory",
components: { components: {
Editor, Treeselect, ImageUpload Editor, Treeselect, ImageUpload
}, },