Compare commits
6 Commits
master
...
mall_exten
Author | SHA1 | Date |
---|---|---|
|
ac54a32dd5 | |
|
cc6b7f1bb1 | |
|
c54fdbc35c | |
|
4b495bc7da | |
|
75464ca79b | |
|
022a1046f1 |
|
@ -0,0 +1,40 @@
|
|||
-- mall 菜单SQL
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
|
||||
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
|
||||
`deleted`, `tenant_id`)
|
||||
VALUES (1185, '商品管理', '', 1, 12, 0, '/mall', 'shopping', NULL, 0, '1', '2022-01-02 17:12:50', '1',
|
||||
'2022-01-02 17:12:50', b'0', 0);
|
||||
|
||||
-- mall 商品模块SQL
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
|
||||
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
|
||||
`deleted`, `tenant_id`)
|
||||
VALUES (1186, '商品规格键管理', '', 2, 0, 1185, 'product-attr-key', '', 'mall/product/attr/index', 0, '',
|
||||
'2022-01-02 17:13:21', '1', '2022-01-02 17:14:56', b'0', 0);
|
||||
|
||||
-- mall 商品模块 attr 权限SQL
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
|
||||
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
|
||||
`deleted`, `tenant_id`)
|
||||
VALUES (1187, '商品规格键查询', 'mall:product-attr-key:query', 3, 1, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '',
|
||||
'2022-01-02 17:13:21', b'0', 0);
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
|
||||
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
|
||||
`deleted`, `tenant_id`)
|
||||
VALUES (1188, '商品规格键创建', 'mall:product-attr-key:create', 3, 2, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '',
|
||||
'2022-01-02 17:13:21', b'0', 0);
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
|
||||
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
|
||||
`deleted`, `tenant_id`)
|
||||
VALUES (1189, '商品规格键更新', 'mall:product-attr-key:update', 3, 3, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '',
|
||||
'2022-01-02 17:13:21', b'0', 0);
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
|
||||
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
|
||||
`deleted`, `tenant_id`)
|
||||
VALUES (1190, '商品规格键删除', 'mall:product-attr-key:delete', 3, 4, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '',
|
||||
'2022-01-02 17:13:21', b'0', 0);
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`,
|
||||
`component`, `status`, `creator`, `create_time`, `updater`, `update_time`,
|
||||
`deleted`, `tenant_id`)
|
||||
VALUES (1191, '商品规格键导出', 'mall:product-attr-key:export', 3, 5, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '',
|
||||
'2022-01-02 17:13:21', b'0', 0);
|
|
@ -0,0 +1,92 @@
|
|||
/*
|
||||
Navicat Premium Data Transfer
|
||||
|
||||
Source Server : 阿里云数据库
|
||||
Source Server Type : MySQL
|
||||
Source Server Version : 80018
|
||||
Source Host : rm-j6cxl87683w973f78ho.mysql.rds.aliyuncs.com:3306
|
||||
Source Schema : ruoyi-vue-pro
|
||||
|
||||
Target Server Type : MySQL
|
||||
Target Server Version : 80018
|
||||
File Encoding : 65001
|
||||
|
||||
Date: 03/01/2022 16:07:09
|
||||
*/
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for mall_product_attr_key
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `mall_product_attr_key`;
|
||||
CREATE TABLE `mall_product_attr_key` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '规格键编号',
|
||||
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '规格键名称',
|
||||
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态\n *\n * 1-开启\n * 2-禁用',
|
||||
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品规格键';
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of mall_product_attr_key
|
||||
-- ----------------------------
|
||||
BEGIN;
|
||||
INSERT INTO `mall_product_attr_key` VALUES (1, '手机型号2', 0, '1', '2022-01-02 17:27:54', '1', '2022-01-02 17:28:01', b'1');
|
||||
INSERT INTO `mall_product_attr_key` VALUES (2, '手机型号', 0, '1', '2022-01-02 17:28:08', '1', '2022-01-02 19:01:34', b'0');
|
||||
INSERT INTO `mall_product_attr_key` VALUES (3, '衬衫', 0, '1', '2022-01-02 19:03:00', '1', '2022-01-02 19:03:00', b'0');
|
||||
INSERT INTO `mall_product_attr_key` VALUES (4, '无用的', 0, '1', '2022-01-03 15:50:08', '1', '2022-01-03 15:50:11', b'1');
|
||||
COMMIT;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for mall_product_attr_value
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `mall_product_attr_value`;
|
||||
CREATE TABLE `mall_product_attr_value` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '规格值编号',
|
||||
`attr_key_id` bigint(20) NOT NULL COMMENT '规格键编号',
|
||||
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '规格值名字',
|
||||
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态',
|
||||
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品规格值';
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of mall_product_attr_value
|
||||
-- ----------------------------
|
||||
BEGIN;
|
||||
INSERT INTO `mall_product_attr_value` VALUES (1, 2, 'iPhone 13 Pro', 0, '1', '2022-01-03 11:13:11', '1', '2022-01-03 11:13:37', b'0');
|
||||
INSERT INTO `mall_product_attr_value` VALUES (2, 2, 'iPhone 13', 0, '1', '2022-01-03 11:13:46', '1', '2022-01-03 11:56:36', b'0');
|
||||
INSERT INTO `mall_product_attr_value` VALUES (3, 2, 'iPhone 13 Pro Max', 0, '1', '2022-01-03 11:13:58', '1', '2022-01-03 14:55:56', b'0');
|
||||
INSERT INTO `mall_product_attr_value` VALUES (4, 3, '连衣裙', 0, '1', '2022-01-03 11:51:42', '1', '2022-01-03 11:51:42', b'0');
|
||||
INSERT INTO `mall_product_attr_value` VALUES (5, 2, '皮衣', 0, '1', '2022-01-03 11:56:53', '1', '2022-01-03 11:57:05', b'1');
|
||||
INSERT INTO `mall_product_attr_value` VALUES (6, 3, '大一', 0, '1', '2022-01-03 11:57:14', '1', '2022-01-03 11:57:14', b'0');
|
||||
INSERT INTO `mall_product_attr_value` VALUES (7, 3, '紫色', 1, '1', '2022-01-03 11:57:24', '1', '2022-01-03 15:38:36', b'0');
|
||||
INSERT INTO `mall_product_attr_value` VALUES (8, 2, 'XiaoMi 12 Pro', 0, '1', '2022-01-03 11:57:34', '1', '2022-01-03 14:50:36', b'0');
|
||||
INSERT INTO `mall_product_attr_value` VALUES (9, 3, 'BUG了', 0, '1', '2022-01-03 11:57:53', '1', '2022-01-03 14:55:32', b'0');
|
||||
INSERT INTO `mall_product_attr_value` VALUES (10, 3, '123', 0, '1', '2022-01-03 14:00:34', '1', '2022-01-03 14:04:33', b'1');
|
||||
INSERT INTO `mall_product_attr_value` VALUES (11, 2, '123', 1, '1', '2022-01-03 14:00:57', '1', '2022-01-03 14:50:41', b'1');
|
||||
INSERT INTO `mall_product_attr_value` VALUES (12, 3, '毛衣', 0, '1', '2022-01-03 14:55:21', '1', '2022-01-03 15:38:33', b'0');
|
||||
INSERT INTO `mall_product_attr_value` VALUES (13, 2, '乌鱼子', 1, '1', '2022-01-03 14:55:43', '1', '2022-01-03 14:55:43', b'0');
|
||||
INSERT INTO `mall_product_attr_value` VALUES (14, 2, 'vivo 12', 0, '1', '2022-01-03 14:57:49', '1', '2022-01-03 14:57:49', b'0');
|
||||
COMMIT;
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1185, '商品管理', '', 1, 12, 0, '/mall', 'shopping', NULL, 0, '1', '2022-01-02 17:12:50', '1', '2022-01-02 17:12:50', b'0', 0);
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1186, '商品规格键管理', '', 2, 0, 1185, 'product-attr-key', '', 'mall/product/attr/index', 0, '', '2022-01-02 17:13:21', '1', '2022-01-02 17:14:56', b'0', 0);
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1187, '商品规格键查询', 'mall:product-attr-key:query', 3, 1, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '', '2022-01-02 17:13:21', b'0', 0);
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1188, '商品规格键创建', 'mall:product-attr-key:create', 3, 2, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '', '2022-01-02 17:13:21', b'0', 0);
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1189, '商品规格键更新', 'mall:product-attr-key:update', 3, 3, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '', '2022-01-02 17:13:21', b'0', 0);
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1190, '商品规格键删除', 'mall:product-attr-key:delete', 3, 4, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '', '2022-01-02 17:13:21', b'0', 0);
|
||||
INSERT INTO `sys_menu`(`id`, `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (1191, '商品规格键导出', 'mall:product-attr-key:export', 3, 5, 1186, '', '', '', 0, '', '2022-01-02 17:13:21', '', '2022-01-02 17:13:21', b'0', 0);
|
|
@ -65,7 +65,8 @@ public class InfFileController {
|
|||
@ApiOperation("下载文件")
|
||||
@ApiImplicitParam(name = "path", value = "文件附件", required = true, dataTypeClass = MultipartFile.class)
|
||||
public void getFile(HttpServletResponse response, @PathVariable("path") String path) throws IOException {
|
||||
TenantContextHolder.setNullTenantId();
|
||||
// TODO @aquan 开发需要默认写死等待优化
|
||||
TenantContextHolder.setTenantId(1L);
|
||||
InfFileDO file = fileCoreService.getFile(path);
|
||||
if (file == null) {
|
||||
log.warn("[getFile][path({}) 文件不存在]", path);
|
||||
|
@ -79,6 +80,7 @@ public class InfFileController {
|
|||
@ApiOperation("获得文件分页")
|
||||
@PreAuthorize("@ss.hasPermission('infra:file:query')")
|
||||
public CommonResult<PageResult<InfFileRespVO>> getFilePage(@Valid InfFilePageReqVO pageVO) {
|
||||
TenantContextHolder.setNullTenantId();
|
||||
PageResult<InfFileDO> pageResult = fileService.getFilePage(pageVO);
|
||||
return success(InfFileConvert.INSTANCE.convertPage(pageResult));
|
||||
}
|
||||
|
|
|
@ -0,0 +1,120 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.convert.product.MallProductAttrKeyConvert;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductAttrKeyService;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiImplicitParam;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@Api(tags = "商品规格键")
|
||||
@RestController
|
||||
@RequestMapping("/mall/product-attr-key")
|
||||
@Validated
|
||||
public class MallProductAttrKeyController {
|
||||
|
||||
@Resource
|
||||
private MallProductAttrKeyService productAttrKeyService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@ApiOperation("创建商品规格键")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:create')")
|
||||
public CommonResult<Long> createProductAttrKey(@Valid @RequestBody MallProductAttrKeyCreateReqVO createReqVO) {
|
||||
return success(productAttrKeyService.createProductAttrKey(createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@ApiOperation("更新商品规格键")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:update')")
|
||||
public CommonResult<Boolean> updateProductAttrKey(@Valid @RequestBody MallProductAttrKeyUpdateReqVO updateReqVO) {
|
||||
productAttrKeyService.updateProductAttrKey(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@PutMapping("/update-status")
|
||||
@ApiOperation("修改商品规格键状态")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:update')")
|
||||
public CommonResult<Boolean> updateProductAttrStatus(@Valid @RequestBody MallProductAttrKeyUpdateStatusReqVO reqVO) {
|
||||
productAttrKeyService.updateProductAttrKeyStatus(reqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@ApiOperation("删除商品规格键")
|
||||
@ApiImplicitParam(name = "id", value = "编号", required = true)
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:delete')")
|
||||
public CommonResult<Boolean> deleteProductAttrKey(@RequestParam("id") Long id) {
|
||||
productAttrKeyService.deleteProductAttrKey(id);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/get")
|
||||
@ApiOperation("获得商品规格键")
|
||||
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class)
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
|
||||
public CommonResult<MallProductAttrKeyRespVO> getProductAttrKey(@RequestParam("id") Long id) {
|
||||
MallProductAttrKeyDO productAttrKey = productAttrKeyService.getProductAttrKey(id);
|
||||
return success(MallProductAttrKeyConvert.INSTANCE.convert(productAttrKey));
|
||||
}
|
||||
|
||||
@GetMapping("/list")
|
||||
@ApiOperation("获得商品规格键列表")
|
||||
@ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
|
||||
public CommonResult<List<MallProductAttrKeyRespVO>> getProductAttrKeyList(
|
||||
@RequestParam("ids") Collection<Long> ids) {
|
||||
List<MallProductAttrKeyDO> list = productAttrKeyService.getProductAttrKeyList(ids);
|
||||
return success(MallProductAttrKeyConvert.INSTANCE.convertList(list));
|
||||
}
|
||||
|
||||
@GetMapping("/list-all-simple")
|
||||
@ApiOperation(value = "获取全部的商品规格键")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
|
||||
public CommonResult<List<MallProductAttrKeySimpleRespVO>> getAttrKeySimpleList() {
|
||||
List<MallProductAttrKeyDO> list = productAttrKeyService.getProductAttrKeyList();
|
||||
return success(MallProductAttrKeyConvert.INSTANCE.convertSimpleList(list));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@ApiOperation("获得商品规格键分页")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
|
||||
public CommonResult<PageResult<MallProductAttrKeyRespVO>> getProductAttrKeyPage(
|
||||
@Valid MallProductAttrKeyPageReqVO pageVO) {
|
||||
PageResult<MallProductAttrKeyDO> pageResult = productAttrKeyService.getProductAttrKeyPage(pageVO);
|
||||
return success(MallProductAttrKeyConvert.INSTANCE.convertPage(pageResult));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@ApiOperation("导出商品规格键 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:export')")
|
||||
@OperateLog(type = EXPORT)
|
||||
public void exportProductAttrKeyExcel(@Valid MallProductAttrKeyExportReqVO exportReqVO,
|
||||
HttpServletResponse response) throws IOException {
|
||||
List<MallProductAttrKeyDO> list = productAttrKeyService.getProductAttrKeyList(exportReqVO);
|
||||
// 导出 Excel
|
||||
List<MallProductAttrKeyExcelVO> datas = MallProductAttrKeyConvert.INSTANCE.convertList02(list);
|
||||
ExcelUtils.write(response, "商品规格键.xls", "数据", MallProductAttrKeyExcelVO.class, datas);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,127 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.convert.product.MallProductAttrValueConvert;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrValueDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductAttrKeyService;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductAttrValueService;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiImplicitParam;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@Api(tags = "商品规格值")
|
||||
@RestController
|
||||
@RequestMapping("/mall/product-attr-value")
|
||||
@Validated
|
||||
public class MallProductAttrValueController {
|
||||
|
||||
@Resource
|
||||
private MallProductAttrValueService productAttrValueService;
|
||||
|
||||
@Resource
|
||||
private MallProductAttrKeyService productAttrKeyService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@ApiOperation("创建商品规格值")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:create')")
|
||||
public CommonResult<Long> createProductAttrValue(@Valid @RequestBody MallProductAttrValueCreateReqVO createReqVO) {
|
||||
return success(productAttrValueService.createProductAttrValue(createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@ApiOperation("更新商品规格值")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:update')")
|
||||
public CommonResult<Boolean> updateProductAttrValue(
|
||||
@Valid @RequestBody MallProductAttrValueUpdateReqVO updateReqVO) {
|
||||
productAttrValueService.updateProductAttrValue(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@PutMapping("/update-status")
|
||||
@ApiOperation("修改商品规格值状态")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:update')")
|
||||
public CommonResult<Boolean> updateProductAttrStatus(
|
||||
@Valid @RequestBody MallProductAttrValueUpdateStatusReqVO reqVO) {
|
||||
productAttrValueService.updateProductAttrKeyStatus(reqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@ApiOperation("删除商品规格值")
|
||||
@ApiImplicitParam(name = "id", value = "编号", required = true)
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:delete')")
|
||||
public CommonResult<Boolean> deleteProductAttrValue(@RequestParam("id") Long id) {
|
||||
productAttrValueService.deleteProductAttrValue(id);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/get")
|
||||
@ApiOperation("获得商品规格值")
|
||||
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
|
||||
public CommonResult<MallProductAttrValueRespVO> getProductAttrValue(@RequestParam("id") Long id) {
|
||||
MallProductAttrValueDO productAttrValue = productAttrValueService.getProductAttrValue(id);
|
||||
return success(MallProductAttrValueConvert.INSTANCE.convert(productAttrValue));
|
||||
}
|
||||
|
||||
@GetMapping("/list")
|
||||
@ApiOperation("获得商品规格值列表")
|
||||
@ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
|
||||
public CommonResult<List<MallProductAttrValueRespVO>> getProductAttrValueList(
|
||||
@RequestParam("ids") Collection<Long> ids) {
|
||||
List<MallProductAttrValueDO> list = productAttrValueService.getProductAttrValueList(ids);
|
||||
return success(MallProductAttrValueConvert.INSTANCE.convertList(list));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@ApiOperation("获得商品规格值分页")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:query')")
|
||||
public CommonResult<PageResult<MallProductAttrValueRespVO>> getProductAttrValuePage(
|
||||
@Valid MallProductAttrValuePageReqVO pageVO) {
|
||||
PageResult<MallProductAttrValueDO> pageResult = productAttrValueService.getProductAttrValuePage(pageVO);
|
||||
return success(MallProductAttrValueConvert.INSTANCE.convertPage(pageResult));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@ApiOperation("导出商品规格值 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:export')")
|
||||
@OperateLog(type = EXPORT)
|
||||
public void exportProductAttrValueExcel(@Valid MallProductAttrValueExportReqVO exportReqVO,
|
||||
HttpServletResponse response) throws IOException {
|
||||
// 数据处理
|
||||
List<MallProductAttrValueDO> list = productAttrValueService.getProductAttrValueList(exportReqVO);
|
||||
List<MallProductAttrValueExcelVO> datas = MallProductAttrValueConvert.INSTANCE.convertList02(list);
|
||||
Map<Long, MallProductAttrKeyDO> productAttrKeyMap = productAttrKeyService
|
||||
.getProductAttrKeyMap(CollectionUtils.convertList(list, MallProductAttrValueDO::getAttrKeyId));
|
||||
datas.forEach(c -> {
|
||||
c.setAttrKeyName(productAttrKeyMap.get(c.getAttrKeyId()).getName());
|
||||
});
|
||||
|
||||
ExcelUtils.write(response, "商品规格值.xls", "数据", MallProductAttrValueExcelVO.class, datas);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,113 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.convert.product.MallProductBrandConvert;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductBrandDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductBrandService;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiImplicitParam;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
||||
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@Api(tags = "商品品牌")
|
||||
@RestController
|
||||
@RequestMapping("/mall/product-brand")
|
||||
@Validated
|
||||
public class MallProductBrandController {
|
||||
|
||||
@Resource
|
||||
private MallProductBrandService productBrandService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@ApiOperation("创建商品品牌")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-brand:create')")
|
||||
public CommonResult<Long> createProductBrand(@Valid @RequestBody MallProductBrandCreateReqVO createReqVO) {
|
||||
return success(productBrandService.createProductBrand(createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@ApiOperation("更新商品品牌")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-brand:update')")
|
||||
public CommonResult<Boolean> updateProductBrand(@Valid @RequestBody MallProductBrandUpdateReqVO updateReqVO) {
|
||||
productBrandService.updateProductBrand(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@PutMapping("/update-status")
|
||||
@ApiOperation("修改商品品牌状态")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:update')")
|
||||
public CommonResult<Boolean> updateProductAttrStatus(@Valid @RequestBody MallProductBrandUpdateStatusReqVO reqVO) {
|
||||
productBrandService.updateProductBrandStatus(reqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@ApiOperation("删除商品品牌")
|
||||
@ApiImplicitParam(name = "id", value = "编号", required = true)
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-brand:delete')")
|
||||
public CommonResult<Boolean> deleteProductBrand(@RequestParam("id") Long id) {
|
||||
productBrandService.deleteProductBrand(id);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/get")
|
||||
@ApiOperation("获得商品品牌")
|
||||
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Integer.class)
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-brand:query')")
|
||||
public CommonResult<MallProductBrandRespVO> getProductBrand(@RequestParam("id") Long id) {
|
||||
MallProductBrandDO productBrand = productBrandService.getProductBrand(id);
|
||||
return success(MallProductBrandConvert.INSTANCE.convert(productBrand));
|
||||
}
|
||||
|
||||
@GetMapping("/list")
|
||||
@ApiOperation("获得商品品牌列表")
|
||||
@ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-brand:query')")
|
||||
public CommonResult<List<MallProductBrandRespVO>> getProductBrandList(
|
||||
@RequestParam("ids") Collection<Long> ids) {
|
||||
List<MallProductBrandDO> list = productBrandService.getProductBrandList(ids);
|
||||
return success(MallProductBrandConvert.INSTANCE.convertList(list));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@ApiOperation("获得商品品牌分页")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-brand:query')")
|
||||
public CommonResult<PageResult<MallProductBrandRespVO>> getProductBrandPage(
|
||||
@Valid MallProductBrandPageReqVO pageVO) {
|
||||
PageResult<MallProductBrandDO> pageResult = productBrandService.getProductBrandPage(pageVO);
|
||||
return success(MallProductBrandConvert.INSTANCE.convertPage(pageResult));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@ApiOperation("导出商品品牌 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-brand:export')")
|
||||
@OperateLog(type = EXPORT)
|
||||
public void exportProductBrandExcel(@Valid MallProductBrandExportReqVO exportReqVO,
|
||||
HttpServletResponse response) throws IOException {
|
||||
List<MallProductBrandDO> list = productBrandService.getProductBrandList(exportReqVO);
|
||||
// 导出 Excel
|
||||
List<MallProductBrandExcelVO> datas = MallProductBrandConvert.INSTANCE.convertList02(list);
|
||||
ExcelUtils.write(response, "商品品牌.xls", "数据", MallProductBrandExcelVO.class, datas);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,122 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.convert.product.MallProductCategoryConvert;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductCategoryDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductCategoryService;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
|
||||
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiImplicitParam;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
|
||||
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@Api(tags = "商品分类")
|
||||
@RestController
|
||||
@RequestMapping("/mall/product-category")
|
||||
@Validated
|
||||
public class MallProductCategoryController {
|
||||
|
||||
@Resource
|
||||
private MallProductCategoryService productCategoryService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@ApiOperation("创建商品分类")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-category:create')")
|
||||
public CommonResult<Long> createProductCategory(@Valid @RequestBody MallProductCategoryCreateReqVO createReqVO) {
|
||||
return success(productCategoryService.createProductCategory(createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@ApiOperation("更新商品分类")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-category:update')")
|
||||
public CommonResult<Boolean> updateProductCategory(@Valid @RequestBody MallProductCategoryUpdateReqVO updateReqVO) {
|
||||
productCategoryService.updateProductCategory(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@PutMapping("/update-status")
|
||||
@ApiOperation("修改商品分类状态")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-attr-key:update')")
|
||||
public CommonResult<Boolean> updateProductAttrStatus(@Valid @RequestBody MallProductCategoryUpdateStatusReqVO reqVO) {
|
||||
productCategoryService.updateProductBrandStatus(reqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@ApiOperation("删除商品分类")
|
||||
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-category:delete')")
|
||||
public CommonResult<Boolean> deleteProductCategory(@RequestParam("id") Long id) {
|
||||
productCategoryService.deleteProductCategory(id);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/get")
|
||||
@ApiOperation("获得商品分类")
|
||||
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-category:query')")
|
||||
public CommonResult<MallProductCategoryRespVO> getProductCategory(@RequestParam("id") Long id) {
|
||||
MallProductCategoryDO productCategory = productCategoryService.getProductCategory(id);
|
||||
return success(MallProductCategoryConvert.INSTANCE.convert(productCategory));
|
||||
}
|
||||
|
||||
@GetMapping("/get-roots")
|
||||
@ApiOperation("获得商品顶级")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-category:query')")
|
||||
public CommonResult<List<MallProductSimpleCategoryRespVO>> getProductCategoryRoots() {
|
||||
List<MallProductCategoryDO> categoryRoots = productCategoryService.getProductCategoryRoots();
|
||||
return success(MallProductCategoryConvert.INSTANCE.convertRootList(categoryRoots));
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("/list")
|
||||
@ApiOperation("获得商品分类列表")
|
||||
@ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-category:query')")
|
||||
public CommonResult<List<MallProductCategoryRespVO>> getProductCategoryList(
|
||||
@RequestParam("ids") Collection<Long> ids) {
|
||||
List<MallProductCategoryDO> list = productCategoryService.getProductCategoryList(ids);
|
||||
return success(MallProductCategoryConvert.INSTANCE.convertList(list));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@ApiOperation("获得商品分类分页")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-category:query')")
|
||||
public CommonResult<PageResult<MallProductCategoryRespVO>> getProductCategoryPage(
|
||||
@Valid MallProductCategoryPageReqVO pageVO) {
|
||||
PageResult<MallProductCategoryDO> pageResult = productCategoryService.getProductCategoryPage(pageVO);
|
||||
return success(MallProductCategoryConvert.INSTANCE.convertPage(pageResult));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@ApiOperation("导出商品分类 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('mall:product-category:export')")
|
||||
@OperateLog(type = EXPORT)
|
||||
public void exportProductCategoryExcel(@Valid MallProductCategoryExportReqVO exportReqVO,
|
||||
HttpServletResponse response) throws IOException {
|
||||
List<MallProductCategoryDO> list = productCategoryService.getProductCategoryList(exportReqVO);
|
||||
// 导出 Excel
|
||||
List<MallProductCategoryExcelVO> datas = MallProductCategoryConvert.INSTANCE.convertList02(list);
|
||||
ExcelUtils.write(response, "商品分类.xls", "数据", MallProductCategoryExcelVO.class, datas);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* 商品规格键 Base VO,提供给添加、修改、详细的子 VO 使用
|
||||
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Data
|
||||
public class MallProductAttrKeyBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "规格键名称", required = true)
|
||||
@NotNull(message = "规格键名称不能为空")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "状态", required = true)
|
||||
@NotNull(message = "状态")
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
|
||||
|
||||
import lombok.*;
|
||||
import io.swagger.annotations.*;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品规格键创建 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductAttrKeyCreateReqVO extends MallProductAttrKeyBaseVO {
|
||||
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
|
||||
|
||||
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
|
||||
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@Data
|
||||
public class MallProductAttrKeyExcelVO {
|
||||
|
||||
@ExcelProperty("规格键编号")
|
||||
private Long id;
|
||||
|
||||
@ExcelProperty("规格键名称")
|
||||
private String name;
|
||||
|
||||
@DictFormat("sys_common_status")
|
||||
@ExcelProperty(value = "状态", converter = DictConvert.class)
|
||||
private Integer status;
|
||||
|
||||
@ExcelProperty("创建时间")
|
||||
private Date createTime;
|
||||
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
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;
|
||||
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel(value = "商品规格键 Excel 导出 Request VO", description = "参数和 MallProductAttrKeyPageReqVO 是一致的")
|
||||
@Data
|
||||
public class MallProductAttrKeyExportReqVO {
|
||||
|
||||
@ApiModelProperty(value = "规格键名称")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "状态")
|
||||
private Integer status;
|
||||
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@ApiModelProperty(value = "开始创建时间")
|
||||
private Date beginCreateTime;
|
||||
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@ApiModelProperty(value = "结束创建时间")
|
||||
private Date endCreateTime;
|
||||
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
|
||||
|
||||
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 java.util.Date;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品规格键分页 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductAttrKeyPageReqVO extends PageParam {
|
||||
|
||||
@ApiModelProperty(value = "规格键名称")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "状态")
|
||||
private Integer status;
|
||||
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@ApiModelProperty(value = "开始创建时间")
|
||||
private Date beginCreateTime;
|
||||
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@ApiModelProperty(value = "结束创建时间")
|
||||
private Date endCreateTime;
|
||||
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品规格键 Response VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductAttrKeyRespVO extends MallProductAttrKeyBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "规格键编号", required = true)
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty(value = "创建时间", required = true)
|
||||
private Date createTime;
|
||||
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@Data
|
||||
@ApiModel("商品规格键精简 Response VO")
|
||||
public class MallProductAttrKeySimpleRespVO {
|
||||
|
||||
@ApiModelProperty(value = "商品规格键ID")
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty(value = "规格键名称", required = true)
|
||||
private String name;
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
|
||||
|
||||
import lombok.*;
|
||||
import io.swagger.annotations.*;
|
||||
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品规格键更新 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductAttrKeyUpdateReqVO extends MallProductAttrKeyBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "规格键编号", required = true)
|
||||
@NotNull(message = "规格键编号不能为空")
|
||||
private Long id;
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("修改商品规格键状态 Request VO")
|
||||
@Data
|
||||
public class MallProductAttrKeyUpdateStatusReqVO {
|
||||
|
||||
@ApiModelProperty(value = "规格键编号", required = true, example = "1024")
|
||||
@NotNull(message = "规格键编号不能为空")
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举")
|
||||
@NotNull(message = "状态不能为空")
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* 商品规格值 Base VO,提供给添加、修改、详细的子 VO 使用
|
||||
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Data
|
||||
public class MallProductAttrValueBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "规格键编号", required = true)
|
||||
@NotNull(message = "规格键编号不能为空")
|
||||
private Long attrKeyId;
|
||||
|
||||
@ApiModelProperty(value = "规格值名字", required = true)
|
||||
@NotNull(message = "规格值名字不能为空")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "状态", required = true)
|
||||
@NotNull(message = "状态不能为空")
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品规格值创建 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductAttrValueCreateReqVO extends MallProductAttrValueBaseVO {
|
||||
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
|
||||
|
||||
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
|
||||
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
|
||||
import com.alibaba.excel.annotation.ExcelIgnore;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 商品规格值 Excel VO
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Data
|
||||
public class MallProductAttrValueExcelVO {
|
||||
|
||||
@ExcelProperty("规格值编号")
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 规格键编号
|
||||
*/
|
||||
@ExcelIgnore
|
||||
private Long attrKeyId;
|
||||
|
||||
@ExcelProperty("规格键名称")
|
||||
private String attrKeyName;
|
||||
|
||||
@ExcelProperty("规格值名字")
|
||||
private String name;
|
||||
|
||||
@DictFormat("sys_common_status")
|
||||
@ExcelProperty(value = "状态", converter = DictConvert.class)
|
||||
private Integer status;
|
||||
|
||||
@ExcelProperty("创建时间")
|
||||
private Date createTime;
|
||||
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
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;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel(value = "商品规格值 Excel 导出 Request VO", description = "参数和 MallProductAttrValuePageReqVO 是一致的")
|
||||
@Data
|
||||
public class MallProductAttrValueExportReqVO {
|
||||
|
||||
@ApiModelProperty(value = "规格键编号")
|
||||
private Long attrKeyId;
|
||||
|
||||
@ApiModelProperty(value = "规格值名字")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "状态")
|
||||
private Integer status;
|
||||
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@ApiModelProperty(value = "开始创建时间")
|
||||
private Date beginCreateTime;
|
||||
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@ApiModelProperty(value = "结束创建时间")
|
||||
private Date endCreateTime;
|
||||
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
|
||||
|
||||
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 java.util.Date;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品规格值分页 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductAttrValuePageReqVO extends PageParam {
|
||||
|
||||
@ApiModelProperty(value = "规格键编号")
|
||||
private Long attrKeyId;
|
||||
|
||||
@ApiModelProperty(value = "规格值名字")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "状态")
|
||||
private Integer status;
|
||||
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@ApiModelProperty(value = "开始创建时间")
|
||||
private Date beginCreateTime;
|
||||
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
@ApiModelProperty(value = "结束创建时间")
|
||||
private Date endCreateTime;
|
||||
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品规格值 Response VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductAttrValueRespVO extends MallProductAttrValueBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "规格值编号", required = true)
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty(value = "创建时间", required = true)
|
||||
private Date createTime;
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
|
||||
|
||||
import lombok.*;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import io.swagger.annotations.*;
|
||||
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品规格值更新 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductAttrValueUpdateReqVO extends MallProductAttrValueBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "规格值编号", required = true)
|
||||
@NotNull(message = "规格值编号不能为空")
|
||||
private Long id;
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("修改商品规格值状态 Request VO")
|
||||
@Data
|
||||
public class MallProductAttrValueUpdateStatusReqVO {
|
||||
|
||||
@ApiModelProperty(value = "规格值编号", required = true, example = "1024")
|
||||
@NotNull(message = "规格值编号不能为空")
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举")
|
||||
@NotNull(message = "状态不能为空")
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* 商品品牌 Base VO,提供给添加、修改、详细的子 VO 使用
|
||||
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Data
|
||||
public class MallProductBrandBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "品牌名称", required = true)
|
||||
@NotNull(message = "品牌名称不能为空")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "品牌描述")
|
||||
private String description;
|
||||
|
||||
@ApiModelProperty(value = "品牌名图片")
|
||||
private String picUrl;
|
||||
|
||||
@ApiModelProperty(value = "状态", required = true)
|
||||
@NotNull(message = "状态不能为空")
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品品牌创建 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductBrandCreateReqVO extends MallProductBrandBaseVO {
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand;
|
||||
|
||||
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
|
||||
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 商品品牌 Excel VO
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Data
|
||||
public class MallProductBrandExcelVO {
|
||||
|
||||
@ExcelProperty("品牌编号")
|
||||
private Integer id;
|
||||
|
||||
@ExcelProperty("品牌名称")
|
||||
private String name;
|
||||
|
||||
@ExcelProperty("品牌描述")
|
||||
private String description;
|
||||
|
||||
@ExcelProperty("品牌名图片")
|
||||
private String picUrl;
|
||||
|
||||
@DictFormat("sys_common_status")
|
||||
@ExcelProperty(value = "状态", converter = DictConvert.class)
|
||||
private Integer status;
|
||||
|
||||
@ExcelProperty("创建时间")
|
||||
private Date createTime;
|
||||
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel(value = "商品品牌 Excel 导出 Request VO", description = "参数和 MallProductBrandPageReqVO 是一致的")
|
||||
@Data
|
||||
public class MallProductBrandExportReqVO {
|
||||
|
||||
@ApiModelProperty(value = "品牌名称")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "状态")
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand;
|
||||
|
||||
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;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品品牌分页 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductBrandPageReqVO extends PageParam {
|
||||
|
||||
@ApiModelProperty(value = "品牌名称")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "状态")
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品品牌 Response VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductBrandRespVO extends MallProductBrandBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "品牌编号", required = true)
|
||||
private Integer id;
|
||||
|
||||
@ApiModelProperty(value = "创建时间", required = true)
|
||||
private Date createTime;
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品品牌更新 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductBrandUpdateReqVO extends MallProductBrandBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "品牌编号", required = true)
|
||||
@NotNull(message = "品牌编号不能为空")
|
||||
private Long id;
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("修改商品品牌状态 Request VO")
|
||||
@Data
|
||||
public class MallProductBrandUpdateStatusReqVO {
|
||||
|
||||
@ApiModelProperty(value = "商品品牌编号", required = true, example = "1024")
|
||||
@NotNull(message = "商品品牌编号不能为空")
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举")
|
||||
@NotNull(message = "状态不能为空")
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* 商品分类 Base VO,提供给添加、修改、详细的子 VO 使用
|
||||
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Data
|
||||
public class MallProductCategoryBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "父分类编号", required = true)
|
||||
@NotNull(message = "父分类编号不能为空")
|
||||
private Long pid;
|
||||
|
||||
@ApiModelProperty(value = "分类名称", required = true)
|
||||
@NotNull(message = "分类名称不能为空")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "分类描述")
|
||||
private String description;
|
||||
|
||||
@ApiModelProperty(value = "分类图片")
|
||||
private String picUrl;
|
||||
|
||||
@ApiModelProperty(value = "分类排序", required = true)
|
||||
@NotNull(message = "分类排序不能为空")
|
||||
private Integer sort;
|
||||
|
||||
@ApiModelProperty(value = "状态", required = true)
|
||||
@NotNull(message = "状态不能为空")
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品分类创建 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductCategoryCreateReqVO extends MallProductCategoryBaseVO {
|
||||
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category;
|
||||
|
||||
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
|
||||
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 商品分类 Excel VO
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Data
|
||||
public class MallProductCategoryExcelVO {
|
||||
|
||||
@ExcelProperty("分类编号")
|
||||
private Long id;
|
||||
|
||||
@ExcelProperty("父分类编号")
|
||||
private Long pid;
|
||||
|
||||
@ExcelProperty("分类名称")
|
||||
private String name;
|
||||
|
||||
@ExcelProperty("分类描述")
|
||||
private String description;
|
||||
|
||||
@ExcelProperty("分类图片")
|
||||
private String picUrl;
|
||||
|
||||
@ExcelProperty("分类排序")
|
||||
private Integer sort;
|
||||
|
||||
@DictFormat("sys_common_status")
|
||||
@ExcelProperty(value = "状态", converter = DictConvert.class)
|
||||
private Integer status;
|
||||
|
||||
@ExcelProperty("创建时间")
|
||||
private Date createTime;
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel(value = "商品分类 Excel 导出 Request VO", description = "参数和 MallProductCategoryPageReqVO 是一致的")
|
||||
@Data
|
||||
public class MallProductCategoryExportReqVO {
|
||||
|
||||
@ApiModelProperty(value = "父分类编号")
|
||||
private Long pid;
|
||||
|
||||
@ApiModelProperty(value = "分类名称")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "状态")
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category;
|
||||
|
||||
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;
|
||||
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品分类分页 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductCategoryPageReqVO extends PageParam {
|
||||
|
||||
@ApiModelProperty(value = "父分类编号,不传递默认为根目录")
|
||||
private Long pid;
|
||||
|
||||
@ApiModelProperty(value = "分类名称,查询当前目录下的")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "状态")
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品分类 Response VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductCategoryRespVO extends MallProductCategoryBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "分类编号", required = true)
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty(value = "创建时间", required = true)
|
||||
private Date createTime;
|
||||
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品分类更新 Request VO")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductCategoryUpdateReqVO extends MallProductCategoryBaseVO {
|
||||
|
||||
@ApiModelProperty(value = "分类编号", required = true)
|
||||
@NotNull(message = "分类编号不能为空")
|
||||
private Long id;
|
||||
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("修改商品状态 Request VO")
|
||||
@Data
|
||||
public class MallProductCategoryUpdateStatusReqVO {
|
||||
|
||||
@ApiModelProperty(value = "商品类别编号", required = true, example = "1024")
|
||||
@NotNull(message = "商品类别编号不能为空")
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 SysCommonStatusEnum 枚举")
|
||||
@NotNull(message = "状态不能为空")
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.ToString;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author aquan
|
||||
*/
|
||||
@ApiModel("商品分类简单信息 Response VO")
|
||||
@Data
|
||||
@ToString(callSuper = true)
|
||||
public class MallProductSimpleCategoryRespVO implements Serializable {
|
||||
|
||||
@ApiModelProperty(value = "分类编号", required = true)
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty(value = "分类名称", required = true)
|
||||
@NotNull(message = "分类名称不能为空")
|
||||
private String name;
|
||||
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
/**
|
||||
* 提供 POJO 类的实体转换
|
||||
*
|
||||
* 目前使用 MapStruct 框架
|
||||
*/
|
||||
package cn.iocoder.yudao.adminserver.modules.mall.convert;
|
|
@ -0,0 +1,37 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.convert.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品规格键 Convert
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Mapper
|
||||
public interface MallProductAttrKeyConvert {
|
||||
|
||||
MallProductAttrKeyConvert INSTANCE = Mappers.getMapper(MallProductAttrKeyConvert.class);
|
||||
|
||||
MallProductAttrKeyDO convert(MallProductAttrKeyCreateReqVO bean);
|
||||
|
||||
MallProductAttrKeyDO convert(MallProductAttrKeyUpdateStatusReqVO bean);
|
||||
|
||||
MallProductAttrKeyDO convert(MallProductAttrKeyUpdateReqVO bean);
|
||||
|
||||
MallProductAttrKeyRespVO convert(MallProductAttrKeyDO bean);
|
||||
|
||||
List<MallProductAttrKeyRespVO> convertList(List<MallProductAttrKeyDO> list);
|
||||
|
||||
List<MallProductAttrKeySimpleRespVO> convertSimpleList(List<MallProductAttrKeyDO> list);
|
||||
|
||||
PageResult<MallProductAttrKeyRespVO> convertPage(PageResult<MallProductAttrKeyDO> page);
|
||||
|
||||
List<MallProductAttrKeyExcelVO> convertList02(List<MallProductAttrKeyDO> list);
|
||||
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.convert.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrValueDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品规格值 Convert
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Mapper
|
||||
public interface MallProductAttrValueConvert {
|
||||
|
||||
MallProductAttrValueConvert INSTANCE = Mappers.getMapper(MallProductAttrValueConvert.class);
|
||||
|
||||
MallProductAttrValueDO convert(MallProductAttrValueCreateReqVO bean);
|
||||
|
||||
MallProductAttrValueDO convert(MallProductAttrValueUpdateReqVO bean);
|
||||
|
||||
MallProductAttrValueRespVO convert(MallProductAttrValueDO bean);
|
||||
|
||||
MallProductAttrValueDO convert(MallProductAttrValueUpdateStatusReqVO bean);
|
||||
|
||||
List<MallProductAttrValueRespVO> convertList(List<MallProductAttrValueDO> list);
|
||||
|
||||
PageResult<MallProductAttrValueRespVO> convertPage(PageResult<MallProductAttrValueDO> page);
|
||||
|
||||
List<MallProductAttrValueExcelVO> convertList02(List<MallProductAttrValueDO> list);
|
||||
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.convert.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductBrandDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品品牌 Convert
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Mapper
|
||||
public interface MallProductBrandConvert {
|
||||
|
||||
MallProductBrandConvert INSTANCE = Mappers.getMapper(MallProductBrandConvert.class);
|
||||
|
||||
MallProductBrandDO convert(MallProductBrandCreateReqVO bean);
|
||||
|
||||
MallProductBrandDO convert(MallProductBrandUpdateReqVO bean);
|
||||
|
||||
MallProductBrandDO convert(MallProductBrandUpdateStatusReqVO bean);
|
||||
|
||||
MallProductBrandRespVO convert(MallProductBrandDO bean);
|
||||
|
||||
List<MallProductBrandRespVO> convertList(List<MallProductBrandDO> list);
|
||||
|
||||
PageResult<MallProductBrandRespVO> convertPage(PageResult<MallProductBrandDO> page);
|
||||
|
||||
List<MallProductBrandExcelVO> convertList02(List<MallProductBrandDO> list);
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.convert.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductCategoryDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品分类 Convert
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Mapper
|
||||
public interface MallProductCategoryConvert {
|
||||
|
||||
MallProductCategoryConvert INSTANCE = Mappers.getMapper(MallProductCategoryConvert.class);
|
||||
|
||||
MallProductCategoryDO convert(MallProductCategoryUpdateStatusReqVO bean);
|
||||
|
||||
MallProductCategoryDO convert(MallProductCategoryCreateReqVO bean);
|
||||
|
||||
MallProductCategoryDO convert(MallProductCategoryUpdateReqVO bean);
|
||||
|
||||
MallProductCategoryRespVO convert(MallProductCategoryDO bean);
|
||||
|
||||
List<MallProductCategoryRespVO> convertList(List<MallProductCategoryDO> list);
|
||||
|
||||
List<MallProductSimpleCategoryRespVO> convertRootList(List<MallProductCategoryDO> list);
|
||||
|
||||
PageResult<MallProductCategoryRespVO> convertPage(PageResult<MallProductCategoryDO> page);
|
||||
|
||||
List<MallProductCategoryExcelVO> convertList02(List<MallProductCategoryDO> list);
|
||||
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao>
|
|
@ -0,0 +1,36 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* 商品规格键 DO
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@TableName("mall_product_attr_key")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MallProductAttrKeyDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 规格键编号
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
/**
|
||||
* 规格键名称
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* 商品规格值 DO
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@TableName("mall_product_attr_value")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MallProductAttrValueDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 规格值编号
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
/**
|
||||
* 规格键编号
|
||||
*/
|
||||
private Long attrKeyId;
|
||||
/**
|
||||
* 规格值名字
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* 商品品牌 DO
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@TableName("mall_product_brand")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MallProductBrandDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 品牌编号
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
/**
|
||||
* 品牌名称
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 品牌描述
|
||||
*/
|
||||
private String description;
|
||||
/**
|
||||
* 品牌名图片
|
||||
*/
|
||||
private String picUrl;
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* 商品分类 DO
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@TableName("mall_product_category")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class MallProductCategoryDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 分类编号
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
/**
|
||||
* 父分类编号
|
||||
*/
|
||||
private Long pid;
|
||||
/**
|
||||
* 分类名称
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 分类描述
|
||||
*/
|
||||
private String description;
|
||||
/**
|
||||
* 分类图片
|
||||
*/
|
||||
private String picUrl;
|
||||
/**
|
||||
* 分类排序
|
||||
*/
|
||||
private Integer sort;
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.MallProductAttrKeyExportReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.MallProductAttrKeyPageReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
|
||||
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.QueryWrapperX;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品规格键 Mapper
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Mapper
|
||||
public interface MallProductAttrKeyMapper extends BaseMapperX<MallProductAttrKeyDO> {
|
||||
|
||||
default PageResult<MallProductAttrKeyDO> selectPage(MallProductAttrKeyPageReqVO reqVO) {
|
||||
return selectPage(reqVO, new QueryWrapperX<MallProductAttrKeyDO>()
|
||||
.likeIfPresent("name", reqVO.getName())
|
||||
.eqIfPresent("status", reqVO.getStatus())
|
||||
.betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
|
||||
.orderByDesc("id"));
|
||||
}
|
||||
|
||||
default List<MallProductAttrKeyDO> selectList(MallProductAttrKeyExportReqVO reqVO) {
|
||||
return selectList(new QueryWrapperX<MallProductAttrKeyDO>()
|
||||
.likeIfPresent("name", reqVO.getName())
|
||||
.eqIfPresent("status", reqVO.getStatus())
|
||||
.betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
|
||||
.orderByDesc("id"));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.MallProductAttrValueExportReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.MallProductAttrValuePageReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrValueDO;
|
||||
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.QueryWrapperX;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品规格值 Mapper
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Mapper
|
||||
public interface MallProductAttrValueMapper extends BaseMapperX<MallProductAttrValueDO> {
|
||||
|
||||
default PageResult<MallProductAttrValueDO> selectPage(MallProductAttrValuePageReqVO reqVO) {
|
||||
return selectPage(reqVO, new QueryWrapperX<MallProductAttrValueDO>()
|
||||
.eqIfPresent("attr_key_id", reqVO.getAttrKeyId())
|
||||
.likeIfPresent("name", reqVO.getName())
|
||||
.eqIfPresent("status", reqVO.getStatus())
|
||||
.betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
|
||||
.orderByDesc("id"));
|
||||
}
|
||||
|
||||
default List<MallProductAttrValueDO> selectList(MallProductAttrValueExportReqVO reqVO) {
|
||||
return selectList(new QueryWrapperX<MallProductAttrValueDO>()
|
||||
.eqIfPresent("attr_key_id", reqVO.getAttrKeyId())
|
||||
.likeIfPresent("name", reqVO.getName())
|
||||
.eqIfPresent("status", reqVO.getStatus())
|
||||
.betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
|
||||
.orderByDesc("id"));
|
||||
}
|
||||
|
||||
default Long selectCount(Long attrKeyId) {
|
||||
return selectCount(new LambdaQueryWrapper<MallProductAttrValueDO>()
|
||||
.eq(MallProductAttrValueDO::getAttrKeyId, attrKeyId));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand.MallProductBrandExportReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand.MallProductBrandPageReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductBrandDO;
|
||||
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.QueryWrapperX;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品品牌 Mapper
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Mapper
|
||||
public interface MallProductBrandMapper extends BaseMapperX<MallProductBrandDO> {
|
||||
|
||||
default PageResult<MallProductBrandDO> selectPage(MallProductBrandPageReqVO reqVO) {
|
||||
return selectPage(reqVO, new QueryWrapperX<MallProductBrandDO>()
|
||||
.likeIfPresent("name", reqVO.getName())
|
||||
.eqIfPresent("status", reqVO.getStatus())
|
||||
.orderByDesc("id"));
|
||||
}
|
||||
|
||||
default List<MallProductBrandDO> selectList(MallProductBrandExportReqVO reqVO) {
|
||||
return selectList(new QueryWrapperX<MallProductBrandDO>()
|
||||
.likeIfPresent("name", reqVO.getName())
|
||||
.eqIfPresent("status", reqVO.getStatus())
|
||||
.orderByDesc("id"));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category.MallProductCategoryExportReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category.MallProductCategoryPageReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductCategoryDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.enums.MallProductCategoryConstants;
|
||||
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.QueryWrapperX;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品分类 Mapper
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Mapper
|
||||
public interface MallProductCategoryMapper extends BaseMapperX<MallProductCategoryDO> {
|
||||
|
||||
default PageResult<MallProductCategoryDO> selectPage(MallProductCategoryPageReqVO reqVO) {
|
||||
return selectPage(reqVO, new QueryWrapperX<MallProductCategoryDO>()
|
||||
.eqIfPresent("pid", reqVO.getPid())
|
||||
.likeIfPresent("name", reqVO.getName())
|
||||
.eqIfPresent("status", reqVO.getStatus())
|
||||
.orderByDesc("id"));
|
||||
}
|
||||
|
||||
default List<MallProductCategoryDO> selectList(MallProductCategoryExportReqVO reqVO) {
|
||||
return selectList(new QueryWrapperX<MallProductCategoryDO>()
|
||||
.eqIfPresent("pid", reqVO.getPid())
|
||||
.likeIfPresent("name", reqVO.getName())
|
||||
.eqIfPresent("status", reqVO.getStatus())
|
||||
.orderByDesc("id"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询顶级商品分类列表
|
||||
*
|
||||
* @return 顶级商品分类列表
|
||||
*/
|
||||
default List<MallProductCategoryDO> selectRoots(){
|
||||
return selectList(new LambdaQueryWrapper<MallProductCategoryDO>()
|
||||
.eq(MallProductCategoryDO::getPid, MallProductCategoryConstants.CATEGORY_ROOT_PID));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询当前类别下的子类目数量
|
||||
* @param id 类目 ID
|
||||
* @return 子类目数量
|
||||
*/
|
||||
default Long selectLeavesCount(Long id) {
|
||||
return selectCount(new LambdaQueryWrapper<MallProductCategoryDO>().eq(MallProductCategoryDO::getPid,id));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.enums;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
|
||||
|
||||
/**
|
||||
* mall 商城模块错误码
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
public interface MallErrorCodeConstants {
|
||||
|
||||
/**
|
||||
* ========== 商品规格模块 1-008-000-000 ==========
|
||||
*/
|
||||
ErrorCode PRODUCT_ATTR_KEY_NOT_EXISTS = new ErrorCode(1008000001, "商品规格键不存在");
|
||||
|
||||
ErrorCode PRODUCT_ATTR_VALUE_NOT_EXISTS = new ErrorCode(1008000002, "商品规格值不存在");
|
||||
|
||||
ErrorCode PRODUCT_ATTR_KEY_EXIST_VALUES_CANT_DELETE = new ErrorCode(1008000002, "商品规格键存在商品规格值无法删除");
|
||||
|
||||
/**
|
||||
* ========== 商品品牌模块 1-009-000-000 ==========
|
||||
*/
|
||||
ErrorCode PRODUCT_BRAND_NOT_EXISTS = new ErrorCode(1009000001, "商品品牌不存在");
|
||||
|
||||
/**
|
||||
* ========== 商品分类模块 1-010-000-000 ==========
|
||||
*/
|
||||
ErrorCode PRODUCT_CATEGORY_NOT_EXISTS = new ErrorCode(1010000001, "商品分类不存在");
|
||||
|
||||
ErrorCode PRODUCT_CATEGORY_LEAVERS_EXISTS_CANT_DELETE = new ErrorCode(1010000002, "当前商品分类存在子分类,无法删除");
|
||||
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.enums;
|
||||
|
||||
/**
|
||||
* 商品类别常量枚举
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
public interface MallProductCategoryConstants {
|
||||
|
||||
/**
|
||||
* 分类根 PID 值
|
||||
*/
|
||||
Long CATEGORY_ROOT_PID = 0L;
|
||||
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
/**
|
||||
* mall 包下,我们放商城相关模块。
|
||||
* 例如说:商品(spu、sku、分类、规格)、订单(正向交易、逆向退款)、营销(营销活动、优惠劵)等等
|
||||
*
|
||||
* 缩写:mall
|
||||
*/
|
||||
package cn.iocoder.yudao.adminserver.modules.mall;
|
|
@ -0,0 +1,99 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.service.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 商品规格键 Service 接口
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
public interface MallProductAttrKeyService {
|
||||
|
||||
/**
|
||||
* 创建商品规格键
|
||||
*
|
||||
* @param createReqVO 创建信息
|
||||
* @return 编号
|
||||
*/
|
||||
Long createProductAttrKey(@Valid MallProductAttrKeyCreateReqVO createReqVO);
|
||||
|
||||
/**
|
||||
* 更新商品规格键
|
||||
*
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
void updateProductAttrKey(@Valid MallProductAttrKeyUpdateReqVO updateReqVO);
|
||||
|
||||
/**
|
||||
* 更新商品规格键状态
|
||||
*
|
||||
* @param updateStatusReqVO 更新状态
|
||||
*/
|
||||
void updateProductAttrKeyStatus(@Valid MallProductAttrKeyUpdateStatusReqVO updateStatusReqVO);
|
||||
|
||||
/**
|
||||
* 删除商品规格键
|
||||
*
|
||||
* @param id 编号
|
||||
*/
|
||||
void deleteProductAttrKey(Long id);
|
||||
|
||||
/**
|
||||
* 获得商品规格键
|
||||
*
|
||||
* @param id 编号
|
||||
* @return 商品规格键
|
||||
*/
|
||||
MallProductAttrKeyDO getProductAttrKey(Long id);
|
||||
|
||||
/**
|
||||
* 获得商品规格键列表
|
||||
*
|
||||
* @param ids 编号
|
||||
* @return 商品规格键列表
|
||||
*/
|
||||
List<MallProductAttrKeyDO> getProductAttrKeyList(Collection<Long> ids);
|
||||
|
||||
/**
|
||||
* 获得商品规格键分页
|
||||
*
|
||||
* @param pageReqVO 分页查询
|
||||
* @return 商品规格键分页
|
||||
*/
|
||||
PageResult<MallProductAttrKeyDO> getProductAttrKeyPage(MallProductAttrKeyPageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 获得商品规格键列表, 用于 Excel 导出
|
||||
*
|
||||
* @param exportReqVO 查询条件
|
||||
* @return 商品规格键列表
|
||||
*/
|
||||
List<MallProductAttrKeyDO> getProductAttrKeyList(MallProductAttrKeyExportReqVO exportReqVO);
|
||||
|
||||
/**
|
||||
* 获得商品规格键列表
|
||||
*
|
||||
* @return 商品规格键列表
|
||||
*/
|
||||
List<MallProductAttrKeyDO> getProductAttrKeyList();
|
||||
|
||||
/**
|
||||
* 根据 商品规格件 ID 集合 获取 Map 数据列表
|
||||
*
|
||||
* @param keyIdList 商品规格件 ID 集合
|
||||
* @return Map 数据列表
|
||||
*/
|
||||
default Map<Long, MallProductAttrKeyDO> getProductAttrKeyMap(Collection<Long> keyIdList) {
|
||||
List<MallProductAttrKeyDO> list = this.getProductAttrKeyList(keyIdList);
|
||||
if (list.size() < 1) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
return CollectionUtils.convertMap(list, MallProductAttrKeyDO::getId);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.service.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrValueDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品规格值 Service 接口
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
public interface MallProductAttrValueService {
|
||||
|
||||
/**
|
||||
* 创建商品规格值
|
||||
*
|
||||
* @param createReqVO 创建信息
|
||||
* @return 编号
|
||||
*/
|
||||
Long createProductAttrValue(@Valid MallProductAttrValueCreateReqVO createReqVO);
|
||||
|
||||
/**
|
||||
* 更新商品规格值
|
||||
*
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
void updateProductAttrValue(@Valid MallProductAttrValueUpdateReqVO updateReqVO);
|
||||
|
||||
/**
|
||||
* 更新商品规格值状态
|
||||
*
|
||||
* @param updateStatusReqVO 更新状态
|
||||
*/
|
||||
void updateProductAttrKeyStatus(@Valid MallProductAttrValueUpdateStatusReqVO updateStatusReqVO);
|
||||
|
||||
/**
|
||||
* 删除商品规格值
|
||||
*
|
||||
* @param id 编号
|
||||
*/
|
||||
void deleteProductAttrValue(Long id);
|
||||
|
||||
/**
|
||||
* 获得商品规格值
|
||||
*
|
||||
* @param id 编号
|
||||
* @return 商品规格值
|
||||
*/
|
||||
MallProductAttrValueDO getProductAttrValue(Long id);
|
||||
|
||||
/**
|
||||
* 获得商品规格值列表
|
||||
*
|
||||
* @param ids 编号
|
||||
* @return 商品规格值列表
|
||||
*/
|
||||
List<MallProductAttrValueDO> getProductAttrValueList(Collection<Long> ids);
|
||||
|
||||
/**
|
||||
* 获得商品规格值分页
|
||||
*
|
||||
* @param pageReqVO 分页查询
|
||||
* @return 商品规格值分页
|
||||
*/
|
||||
PageResult<MallProductAttrValueDO> getProductAttrValuePage(MallProductAttrValuePageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 获得商品规格值列表, 用于 Excel 导出
|
||||
*
|
||||
* @param exportReqVO 查询条件
|
||||
* @return 商品规格值列表
|
||||
*/
|
||||
List<MallProductAttrValueDO> getProductAttrValueList(MallProductAttrValueExportReqVO exportReqVO);
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.service.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductBrandDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品品牌 Service 接口
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
public interface MallProductBrandService {
|
||||
|
||||
/**
|
||||
* 创建商品品牌
|
||||
*
|
||||
* @param createReqVO 创建信息
|
||||
* @return 编号
|
||||
*/
|
||||
Long createProductBrand(@Valid MallProductBrandCreateReqVO createReqVO);
|
||||
|
||||
/**
|
||||
* 更新商品品牌
|
||||
*
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
void updateProductBrand(@Valid MallProductBrandUpdateReqVO updateReqVO);
|
||||
|
||||
/**
|
||||
* 更新商品品牌状态
|
||||
*
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
void updateProductBrandStatus(MallProductBrandUpdateStatusReqVO updateReqVO);
|
||||
|
||||
/**
|
||||
* 删除商品品牌
|
||||
*
|
||||
* @param id 编号
|
||||
*/
|
||||
void deleteProductBrand(Long id);
|
||||
|
||||
/**
|
||||
* 获得商品品牌
|
||||
*
|
||||
* @param id 编号
|
||||
* @return 商品品牌
|
||||
*/
|
||||
MallProductBrandDO getProductBrand(Long id);
|
||||
|
||||
/**
|
||||
* 获得商品品牌列表
|
||||
*
|
||||
* @param ids 编号
|
||||
* @return 商品品牌列表
|
||||
*/
|
||||
List<MallProductBrandDO> getProductBrandList(Collection<Long> ids);
|
||||
|
||||
/**
|
||||
* 获得商品品牌分页
|
||||
*
|
||||
* @param pageReqVO 分页查询
|
||||
* @return 商品品牌分页
|
||||
*/
|
||||
PageResult<MallProductBrandDO> getProductBrandPage(MallProductBrandPageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 获得商品品牌列表, 用于 Excel 导出
|
||||
*
|
||||
* @param exportReqVO 查询条件
|
||||
* @return 商品品牌列表
|
||||
*/
|
||||
List<MallProductBrandDO> getProductBrandList(MallProductBrandExportReqVO exportReqVO);
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,86 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.service.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductCategoryDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品分类 Service 接口
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
public interface MallProductCategoryService {
|
||||
|
||||
/**
|
||||
* 创建商品分类
|
||||
*
|
||||
* @param createReqVO 创建信息
|
||||
* @return 编号
|
||||
*/
|
||||
Long createProductCategory(@Valid MallProductCategoryCreateReqVO createReqVO);
|
||||
|
||||
/**
|
||||
* 更新商品分类
|
||||
*
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
void updateProductCategory(@Valid MallProductCategoryUpdateReqVO updateReqVO);
|
||||
|
||||
/**
|
||||
* 更新商品分类状态
|
||||
*
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
void updateProductBrandStatus(MallProductCategoryUpdateStatusReqVO updateReqVO);
|
||||
|
||||
/**
|
||||
* 删除商品分类
|
||||
*
|
||||
* @param id 编号
|
||||
*/
|
||||
void deleteProductCategory(Long id);
|
||||
|
||||
/**
|
||||
* 获得商品分类
|
||||
*
|
||||
* @param id 编号
|
||||
* @return 商品分类
|
||||
*/
|
||||
MallProductCategoryDO getProductCategory(Long id);
|
||||
|
||||
/**
|
||||
* 获取顶级商品分类简单信息列表
|
||||
*
|
||||
* @return 顶级商品分类列表
|
||||
*/
|
||||
List<MallProductCategoryDO> getProductCategoryRoots();
|
||||
|
||||
/**
|
||||
* 获得商品分类列表
|
||||
*
|
||||
* @param ids 编号
|
||||
* @return 商品分类列表
|
||||
*/
|
||||
List<MallProductCategoryDO> getProductCategoryList(Collection<Long> ids);
|
||||
|
||||
/**
|
||||
* 获得商品分类分页
|
||||
*
|
||||
* @param pageReqVO 分页查询
|
||||
* @return 商品分类分页
|
||||
*/
|
||||
PageResult<MallProductCategoryDO> getProductCategoryPage(MallProductCategoryPageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 获得商品分类列表, 用于 Excel 导出
|
||||
*
|
||||
* @param exportReqVO 查询条件
|
||||
* @return 商品分类列表
|
||||
*/
|
||||
List<MallProductCategoryDO> getProductCategoryList(MallProductCategoryExportReqVO exportReqVO);
|
||||
|
||||
}
|
|
@ -0,0 +1,110 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.service.product.impl;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.convert.product.MallProductAttrKeyConvert;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductAttrKeyMapper;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductAttrValueMapper;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductAttrKeyService;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.adminserver.modules.mall.enums.MallErrorCodeConstants.*;
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
|
||||
/**
|
||||
* 商品规格键 Service 实现类
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Service
|
||||
@Validated
|
||||
public class MallProductAttrKeyServiceImpl implements MallProductAttrKeyService {
|
||||
|
||||
@Resource
|
||||
private MallProductAttrKeyMapper productAttrKeyMapper;
|
||||
|
||||
@Resource
|
||||
private MallProductAttrValueMapper productAttrValueMapper;
|
||||
|
||||
@Override
|
||||
public Long createProductAttrKey(MallProductAttrKeyCreateReqVO createReqVO) {
|
||||
// 插入
|
||||
MallProductAttrKeyDO productAttrKey = MallProductAttrKeyConvert.INSTANCE.convert(createReqVO);
|
||||
productAttrKeyMapper.insert(productAttrKey);
|
||||
// 返回
|
||||
return productAttrKey.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateProductAttrKey(MallProductAttrKeyUpdateReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
this.validateProductAttrKeyExists(updateReqVO.getId());
|
||||
// 更新
|
||||
MallProductAttrKeyDO updateObj = MallProductAttrKeyConvert.INSTANCE.convert(updateReqVO);
|
||||
productAttrKeyMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新商品规格键状态
|
||||
*
|
||||
* @param updateStatusReqVO 更新状态
|
||||
*/
|
||||
@Override
|
||||
public void updateProductAttrKeyStatus(MallProductAttrKeyUpdateStatusReqVO updateStatusReqVO) {
|
||||
// 校验存在
|
||||
this.validateProductAttrKeyExists(updateStatusReqVO.getId());
|
||||
productAttrKeyMapper.updateById(MallProductAttrKeyConvert.INSTANCE.convert(updateStatusReqVO));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteProductAttrKey(Long id) {
|
||||
// 校验存在
|
||||
this.validateProductAttrKeyExists(id);
|
||||
|
||||
// 校验如果商品规格键下有值则无法删除
|
||||
if (productAttrValueMapper.selectCount(id) > 0) {
|
||||
throw exception(PRODUCT_ATTR_KEY_EXIST_VALUES_CANT_DELETE);
|
||||
}
|
||||
|
||||
// 删除
|
||||
productAttrKeyMapper.deleteById(id);
|
||||
}
|
||||
|
||||
private void validateProductAttrKeyExists(Long id) {
|
||||
if (productAttrKeyMapper.selectById(id) == null) {
|
||||
throw exception(PRODUCT_ATTR_KEY_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public MallProductAttrKeyDO getProductAttrKey(Long id) {
|
||||
return productAttrKeyMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MallProductAttrKeyDO> getProductAttrKeyList(Collection<Long> ids) {
|
||||
return productAttrKeyMapper.selectBatchIds(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<MallProductAttrKeyDO> getProductAttrKeyPage(MallProductAttrKeyPageReqVO pageReqVO) {
|
||||
return productAttrKeyMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MallProductAttrKeyDO> getProductAttrKeyList(MallProductAttrKeyExportReqVO exportReqVO) {
|
||||
return productAttrKeyMapper.selectList(exportReqVO);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<MallProductAttrKeyDO> getProductAttrKeyList() {
|
||||
return productAttrKeyMapper.selectList();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,95 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.service.product.impl;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.convert.product.MallProductAttrValueConvert;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrValueDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductAttrValueMapper;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductAttrValueService;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.adminserver.modules.mall.enums.MallErrorCodeConstants.PRODUCT_ATTR_VALUE_NOT_EXISTS;
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
|
||||
/**
|
||||
* 商品规格值 Service 实现类
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Service
|
||||
@Validated
|
||||
public class MallProductAttrValueServiceImpl implements MallProductAttrValueService {
|
||||
|
||||
@Resource
|
||||
private MallProductAttrValueMapper productAttrValueMapper;
|
||||
|
||||
@Override
|
||||
public Long createProductAttrValue(MallProductAttrValueCreateReqVO createReqVO) {
|
||||
// 插入
|
||||
MallProductAttrValueDO productAttrValue = MallProductAttrValueConvert.INSTANCE.convert(createReqVO);
|
||||
productAttrValueMapper.insert(productAttrValue);
|
||||
// 返回
|
||||
return productAttrValue.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateProductAttrValue(MallProductAttrValueUpdateReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
this.validateProductAttrValueExists(updateReqVO.getId());
|
||||
// 更新
|
||||
MallProductAttrValueDO updateObj = MallProductAttrValueConvert.INSTANCE.convert(updateReqVO);
|
||||
productAttrValueMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新商品规格值状态
|
||||
*
|
||||
* @param updateStatusReqVO 更新状态
|
||||
*/
|
||||
@Override
|
||||
public void updateProductAttrKeyStatus(MallProductAttrValueUpdateStatusReqVO updateStatusReqVO) {
|
||||
this.validateProductAttrValueExists(updateStatusReqVO.getId());
|
||||
productAttrValueMapper.updateById(MallProductAttrValueConvert.INSTANCE.convert(updateStatusReqVO));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteProductAttrValue(Long id) {
|
||||
// 校验存在
|
||||
this.validateProductAttrValueExists(id);
|
||||
// todo @aquan 后续优化有商品使用当前值的时候无法删除
|
||||
// 删除
|
||||
productAttrValueMapper.deleteById(id);
|
||||
}
|
||||
|
||||
private void validateProductAttrValueExists(Long id) {
|
||||
if (productAttrValueMapper.selectById(id) == null) {
|
||||
throw exception(PRODUCT_ATTR_VALUE_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public MallProductAttrValueDO getProductAttrValue(Long id) {
|
||||
return productAttrValueMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MallProductAttrValueDO> getProductAttrValueList(Collection<Long> ids) {
|
||||
return productAttrValueMapper.selectBatchIds(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<MallProductAttrValueDO> getProductAttrValuePage(MallProductAttrValuePageReqVO pageReqVO) {
|
||||
return productAttrValueMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MallProductAttrValueDO> getProductAttrValueList(MallProductAttrValueExportReqVO exportReqVO) {
|
||||
return productAttrValueMapper.selectList(exportReqVO);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.service.product.impl;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.convert.product.MallProductBrandConvert;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductBrandDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductBrandMapper;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductBrandService;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.adminserver.modules.mall.enums.MallErrorCodeConstants.PRODUCT_BRAND_NOT_EXISTS;
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
|
||||
/**
|
||||
* 商品品牌 Service 实现类
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Service
|
||||
@Validated
|
||||
public class MallProductBrandServiceImpl implements MallProductBrandService {
|
||||
|
||||
@Resource
|
||||
private MallProductBrandMapper productBrandMapper;
|
||||
|
||||
@Override
|
||||
public Long createProductBrand(MallProductBrandCreateReqVO createReqVO) {
|
||||
// 插入
|
||||
MallProductBrandDO productBrand = MallProductBrandConvert.INSTANCE.convert(createReqVO);
|
||||
productBrandMapper.insert(productBrand);
|
||||
// 返回
|
||||
return productBrand.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateProductBrand(MallProductBrandUpdateReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
this.validateProductBrandExists(updateReqVO.getId());
|
||||
// 更新
|
||||
MallProductBrandDO updateObj = MallProductBrandConvert.INSTANCE.convert(updateReqVO);
|
||||
productBrandMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新商品品牌状态
|
||||
*
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
@Override
|
||||
public void updateProductBrandStatus(MallProductBrandUpdateStatusReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
this.validateProductBrandExists(updateReqVO.getId());
|
||||
// 更新
|
||||
MallProductBrandDO updateObj = MallProductBrandConvert.INSTANCE.convert(updateReqVO);
|
||||
productBrandMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteProductBrand(Long id) {
|
||||
// 校验存在
|
||||
this.validateProductBrandExists(id);
|
||||
// TODO @aquan 后续优化品牌有商品时,无法删除
|
||||
// 删除
|
||||
productBrandMapper.deleteById(id);
|
||||
}
|
||||
|
||||
private void validateProductBrandExists(Long id) {
|
||||
if (productBrandMapper.selectById(id) == null) {
|
||||
throw exception(PRODUCT_BRAND_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public MallProductBrandDO getProductBrand(Long id) {
|
||||
return productBrandMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MallProductBrandDO> getProductBrandList(Collection<Long> ids) {
|
||||
return productBrandMapper.selectBatchIds(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<MallProductBrandDO> getProductBrandPage(MallProductBrandPageReqVO pageReqVO) {
|
||||
return productBrandMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MallProductBrandDO> getProductBrandList(MallProductBrandExportReqVO exportReqVO) {
|
||||
return productBrandMapper.selectList(exportReqVO);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,120 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.service.product.impl;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category.*;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.convert.product.MallProductCategoryConvert;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductCategoryDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductCategoryMapper;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.enums.MallProductCategoryConstants;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.service.product.MallProductCategoryService;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.adminserver.modules.mall.enums.MallErrorCodeConstants.PRODUCT_CATEGORY_LEAVERS_EXISTS_CANT_DELETE;
|
||||
import static cn.iocoder.yudao.adminserver.modules.mall.enums.MallErrorCodeConstants.PRODUCT_CATEGORY_NOT_EXISTS;
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
|
||||
/**
|
||||
* 商品分类 Service 实现类
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Service
|
||||
@Validated
|
||||
public class MallProductCategoryServiceImpl implements MallProductCategoryService {
|
||||
|
||||
@Resource
|
||||
private MallProductCategoryMapper productCategoryMapper;
|
||||
|
||||
@Override
|
||||
public Long createProductCategory(MallProductCategoryCreateReqVO createReqVO) {
|
||||
// 插入
|
||||
MallProductCategoryDO productCategory = MallProductCategoryConvert.INSTANCE.convert(createReqVO);
|
||||
productCategoryMapper.insert(productCategory);
|
||||
// 返回
|
||||
return productCategory.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateProductCategory(MallProductCategoryUpdateReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
this.validateProductCategoryExists(updateReqVO.getId());
|
||||
// 更新
|
||||
MallProductCategoryDO updateObj = MallProductCategoryConvert.INSTANCE.convert(updateReqVO);
|
||||
productCategoryMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新商品分类状态
|
||||
*
|
||||
* @param updateReqVO 更新信息
|
||||
*/
|
||||
@Override
|
||||
public void updateProductBrandStatus(MallProductCategoryUpdateStatusReqVO updateReqVO) {
|
||||
// 校验存在
|
||||
this.validateProductCategoryExists(updateReqVO.getId());
|
||||
// 更新
|
||||
MallProductCategoryDO updateObj = MallProductCategoryConvert.INSTANCE.convert(updateReqVO);
|
||||
productCategoryMapper.updateById(updateObj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteProductCategory(Long id) {
|
||||
// 校验存在
|
||||
this.validateProductCategoryExists(id);
|
||||
// 校验是否存在子类目
|
||||
this.validateProductCategoryContainsLeaves(id);
|
||||
// 删除
|
||||
productCategoryMapper.deleteById(id);
|
||||
}
|
||||
|
||||
private void validateProductCategoryExists(Long id) {
|
||||
if (productCategoryMapper.selectById(id) == null) {
|
||||
throw exception(PRODUCT_CATEGORY_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
private void validateProductCategoryContainsLeaves(Long id) {
|
||||
if (productCategoryMapper.selectLeavesCount(id) > 0) {
|
||||
throw exception(PRODUCT_CATEGORY_LEAVERS_EXISTS_CANT_DELETE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public MallProductCategoryDO getProductCategory(Long id) {
|
||||
return productCategoryMapper.selectById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MallProductCategoryDO> getProductCategoryRoots() {
|
||||
return productCategoryMapper.selectRoots();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MallProductCategoryDO> getProductCategoryList(Collection<Long> ids) {
|
||||
return productCategoryMapper.selectBatchIds(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<MallProductCategoryDO> getProductCategoryPage(MallProductCategoryPageReqVO pageReqVO) {
|
||||
// 对栏父栏目ID做处理,如果是空的则表示为根栏目
|
||||
if (pageReqVO.getPid() == null) {
|
||||
pageReqVO.setPid(MallProductCategoryConstants.CATEGORY_ROOT_PID);
|
||||
}
|
||||
return productCategoryMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MallProductCategoryDO> getProductCategoryList(MallProductCategoryExportReqVO exportReqVO) {
|
||||
// 对栏父栏目ID做处理,如果是空的则表示为根栏目
|
||||
if (exportReqVO.getPid() == null) {
|
||||
exportReqVO.setPid(MallProductCategoryConstants.CATEGORY_ROOT_PID);
|
||||
}
|
||||
return productCategoryMapper.selectList(exportReqVO);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,10 +1,9 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.pay.controller.app.vo;
|
||||
|
||||
import lombok.*;
|
||||
import java.util.*;
|
||||
import io.swagger.annotations.*;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 支付应用信息 Excel VO
|
||||
|
|
|
@ -0,0 +1,173 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.service.product;
|
||||
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.MallProductAttrKeyCreateReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.MallProductAttrKeyExportReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.MallProductAttrKeyPageReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrkey.MallProductAttrKeyUpdateReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrKeyDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductAttrKeyMapper;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.service.product.impl.MallProductAttrKeyServiceImpl;
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.adminserver.modules.mall.enums.MallErrorCodeConstants.PRODUCT_ATTR_KEY_NOT_EXISTS;
|
||||
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 org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* {@link MallProductAttrKeyServiceImpl} 的单元测试类
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Import(MallProductAttrKeyServiceImpl.class)
|
||||
public class MallProductAttrKeyServiceTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private MallProductAttrKeyServiceImpl productAttrKeyService;
|
||||
|
||||
@Resource
|
||||
private MallProductAttrKeyMapper productAttrKeyMapper;
|
||||
|
||||
@Test
|
||||
public void testCreateProductAttrKey_success() {
|
||||
// 准备参数
|
||||
MallProductAttrKeyCreateReqVO reqVO = randomPojo(MallProductAttrKeyCreateReqVO.class,o ->
|
||||
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
|
||||
|
||||
// 调用
|
||||
Long productAttrKeyId = productAttrKeyService.createProductAttrKey(reqVO);
|
||||
// 断言
|
||||
assertNotNull(productAttrKeyId);
|
||||
// 校验记录的属性是否正确
|
||||
MallProductAttrKeyDO productAttrKey = productAttrKeyMapper.selectById(productAttrKeyId);
|
||||
assertPojoEquals(reqVO, productAttrKey);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateProductAttrKey_success() {
|
||||
// mock 数据
|
||||
MallProductAttrKeyDO dbProductAttrKey = randomPojo(MallProductAttrKeyDO.class,o ->
|
||||
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
|
||||
productAttrKeyMapper.insert(dbProductAttrKey);// @Sql: 先插入出一条存在的数据
|
||||
// 准备参数
|
||||
MallProductAttrKeyUpdateReqVO reqVO = randomPojo(MallProductAttrKeyUpdateReqVO.class, o -> {
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
o.setId(dbProductAttrKey.getId()); // 设置更新的 ID
|
||||
});
|
||||
|
||||
// 调用
|
||||
productAttrKeyService.updateProductAttrKey(reqVO);
|
||||
// 校验是否更新正确
|
||||
MallProductAttrKeyDO productAttrKey = productAttrKeyMapper.selectById(reqVO.getId()); // 获取最新的
|
||||
assertPojoEquals(reqVO, productAttrKey);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateProductAttrKey_notExists() {
|
||||
// 准备参数
|
||||
MallProductAttrKeyUpdateReqVO reqVO = randomPojo(MallProductAttrKeyUpdateReqVO.class,o ->
|
||||
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> productAttrKeyService.updateProductAttrKey(reqVO), PRODUCT_ATTR_KEY_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteProductAttrKey_success() {
|
||||
// mock 数据
|
||||
MallProductAttrKeyDO dbProductAttrKey = randomPojo(MallProductAttrKeyDO.class,o ->
|
||||
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
|
||||
productAttrKeyMapper.insert(dbProductAttrKey);// @Sql: 先插入出一条存在的数据
|
||||
// 准备参数
|
||||
Long id = dbProductAttrKey.getId();
|
||||
|
||||
// 调用
|
||||
productAttrKeyService.deleteProductAttrKey(id);
|
||||
// 校验数据不存在了
|
||||
assertNull(productAttrKeyMapper.selectById(id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteProductAttrKey_notExists() {
|
||||
// 准备参数
|
||||
// mock 数据
|
||||
Long id = randomLongId();
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> productAttrKeyService.deleteProductAttrKey(id), PRODUCT_ATTR_KEY_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test // TODO 请修改 null 为需要的值
|
||||
public void testGetProductAttrKeyPage() {
|
||||
// mock 数据
|
||||
MallProductAttrKeyDO dbProductAttrKey = randomPojo(MallProductAttrKeyDO.class, o -> { // 等会查询到
|
||||
o.setName("电子产品");
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
o.setCreateTime(buildTime(2022, 1, 3));
|
||||
});
|
||||
productAttrKeyMapper.insert(dbProductAttrKey);
|
||||
// 测试 name 不匹配
|
||||
productAttrKeyMapper.insert(cloneIgnoreId(dbProductAttrKey, o -> o.setName("服装")));
|
||||
// 测试 status 不匹配
|
||||
productAttrKeyMapper.insert(
|
||||
cloneIgnoreId(dbProductAttrKey, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
|
||||
// 测试 createTime 不匹配
|
||||
productAttrKeyMapper.insert(cloneIgnoreId(dbProductAttrKey, o -> o.setCreateTime(buildTime(2021, 11, 3))));
|
||||
// 准备参数
|
||||
MallProductAttrKeyPageReqVO reqVO = new MallProductAttrKeyPageReqVO();
|
||||
reqVO.setName("电子产品");
|
||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
reqVO.setBeginCreateTime(buildTime(2022, 1, 3));
|
||||
reqVO.setEndCreateTime(buildTime(2022, 1, 3));
|
||||
|
||||
// 调用
|
||||
PageResult<MallProductAttrKeyDO> pageResult = productAttrKeyService.getProductAttrKeyPage(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, pageResult.getTotal());
|
||||
assertEquals(1, pageResult.getList().size());
|
||||
assertPojoEquals(dbProductAttrKey, pageResult.getList().get(0));
|
||||
}
|
||||
|
||||
@Test // TODO 请修改 null 为需要的值
|
||||
public void testGetProductAttrKeyList() {
|
||||
// mock 数据
|
||||
MallProductAttrKeyDO dbProductAttrKey = randomPojo(MallProductAttrKeyDO.class, o -> { // 等会查询到
|
||||
o.setName("电子产品");
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
o.setCreateTime(buildTime(2022, 1, 3));
|
||||
});
|
||||
productAttrKeyMapper.insert(dbProductAttrKey);
|
||||
// 测试 name 不匹配
|
||||
productAttrKeyMapper.insert(cloneIgnoreId(dbProductAttrKey, o -> o.setName("服装")));
|
||||
// 测试 status 不匹配
|
||||
productAttrKeyMapper.insert(
|
||||
cloneIgnoreId(dbProductAttrKey, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
|
||||
// 测试 createTime 不匹配
|
||||
productAttrKeyMapper.insert(cloneIgnoreId(dbProductAttrKey, o -> o.setCreateTime(buildTime(2021, 11, 3))));
|
||||
// 准备参数
|
||||
MallProductAttrKeyExportReqVO reqVO = new MallProductAttrKeyExportReqVO();
|
||||
reqVO.setName("电子产品");
|
||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
reqVO.setBeginCreateTime(buildTime(2022, 1, 3));
|
||||
reqVO.setEndCreateTime(buildTime(2022, 1, 3));
|
||||
|
||||
// 调用
|
||||
List<MallProductAttrKeyDO> list = productAttrKeyService.getProductAttrKeyList(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, list.size());
|
||||
assertPojoEquals(dbProductAttrKey, list.get(0));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,183 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.service.product;
|
||||
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.MallProductAttrValueCreateReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.MallProductAttrValueExportReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.MallProductAttrValuePageReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.attrvalue.MallProductAttrValueUpdateReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductAttrValueDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductAttrValueMapper;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.service.product.impl.MallProductAttrValueServiceImpl;
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.adminserver.modules.mall.enums.MallErrorCodeConstants.PRODUCT_ATTR_VALUE_NOT_EXISTS;
|
||||
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 org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* {@link MallProductAttrValueServiceImpl} 的单元测试类
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Import(MallProductAttrValueServiceImpl.class)
|
||||
public class MallProductAttrValueServiceTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private MallProductAttrValueServiceImpl productAttrValueService;
|
||||
|
||||
@Resource
|
||||
private MallProductAttrValueMapper productAttrValueMapper;
|
||||
|
||||
@Test
|
||||
public void testCreateProductAttrValue_success() {
|
||||
// 准备参数
|
||||
MallProductAttrValueCreateReqVO reqVO = randomPojo(MallProductAttrValueCreateReqVO.class, o ->
|
||||
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
|
||||
|
||||
// 调用
|
||||
Long productAttrValueId = productAttrValueService.createProductAttrValue(reqVO);
|
||||
// 断言
|
||||
assertNotNull(productAttrValueId);
|
||||
// 校验记录的属性是否正确
|
||||
MallProductAttrValueDO productAttrValue = productAttrValueMapper.selectById(productAttrValueId);
|
||||
assertPojoEquals(reqVO, productAttrValue);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateProductAttrValue_success() {
|
||||
// mock 数据
|
||||
MallProductAttrValueDO dbProductAttrValue = randomPojo(MallProductAttrValueDO.class, o ->
|
||||
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
|
||||
productAttrValueMapper.insert(dbProductAttrValue);// @Sql: 先插入出一条存在的数据
|
||||
// 准备参数
|
||||
MallProductAttrValueUpdateReqVO reqVO = randomPojo(MallProductAttrValueUpdateReqVO.class, o -> {
|
||||
o.setStatus(CommonStatusEnum.DISABLE.getStatus());
|
||||
o.setId(dbProductAttrValue.getId()); // 设置更新的 ID
|
||||
});
|
||||
|
||||
// 调用
|
||||
productAttrValueService.updateProductAttrValue(reqVO);
|
||||
// 校验是否更新正确
|
||||
MallProductAttrValueDO productAttrValue = productAttrValueMapper.selectById(reqVO.getId()); // 获取最新的
|
||||
assertPojoEquals(reqVO, productAttrValue);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateProductAttrValue_notExists() {
|
||||
// 准备参数
|
||||
MallProductAttrValueUpdateReqVO reqVO = randomPojo(MallProductAttrValueUpdateReqVO.class, o ->
|
||||
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> productAttrValueService.updateProductAttrValue(reqVO),
|
||||
PRODUCT_ATTR_VALUE_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteProductAttrValue_success() {
|
||||
// mock 数据
|
||||
MallProductAttrValueDO dbProductAttrValue = randomPojo(MallProductAttrValueDO.class, o ->
|
||||
o.setStatus((RandomUtil.randomEle(CommonStatusEnum.values()).getStatus())));
|
||||
productAttrValueMapper.insert(dbProductAttrValue);// @Sql: 先插入出一条存在的数据
|
||||
// 准备参数
|
||||
Long id = dbProductAttrValue.getId();
|
||||
|
||||
// 调用
|
||||
productAttrValueService.deleteProductAttrValue(id);
|
||||
// 校验数据不存在了
|
||||
assertNull(productAttrValueMapper.selectById(id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteProductAttrValue_notExists() {
|
||||
// 准备参数
|
||||
Long id = randomLongId();
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> productAttrValueService.deleteProductAttrValue(id), PRODUCT_ATTR_VALUE_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test // TODO 请修改 null 为需要的值
|
||||
public void testGetProductAttrValuePage() {
|
||||
// mock 数据
|
||||
MallProductAttrValueDO dbProductAttrValue = randomPojo(MallProductAttrValueDO.class, o -> { // 等会查询到
|
||||
o.setAttrKeyId(1L);
|
||||
o.setName("海尔笔记本电脑");
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
o.setCreateTime(buildTime(2022, 1, 3));
|
||||
});
|
||||
productAttrValueMapper.insert(dbProductAttrValue);
|
||||
// 测试 attrKeyId 不匹配
|
||||
productAttrValueMapper.insert(cloneIgnoreId(dbProductAttrValue, o -> o.setAttrKeyId(2L)));
|
||||
// 测试 name 不匹配
|
||||
productAttrValueMapper.insert(cloneIgnoreId(dbProductAttrValue, o -> o.setName("红双喜乒乓球")));
|
||||
// 测试 status 不匹配
|
||||
productAttrValueMapper.insert(
|
||||
cloneIgnoreId(dbProductAttrValue, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
|
||||
// 测试 createTime 不匹配
|
||||
productAttrValueMapper.insert(cloneIgnoreId(dbProductAttrValue, o ->
|
||||
o.setCreateTime(buildTime(2021, 12, 12))));
|
||||
// 准备参数
|
||||
MallProductAttrValuePageReqVO reqVO = new MallProductAttrValuePageReqVO();
|
||||
reqVO.setAttrKeyId(1L);
|
||||
reqVO.setName("海尔笔记本电脑");
|
||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
reqVO.setBeginCreateTime(buildTime(2022, 1, 3));
|
||||
reqVO.setEndCreateTime(buildTime(2022, 1, 3));
|
||||
|
||||
// 调用
|
||||
PageResult<MallProductAttrValueDO> pageResult = productAttrValueService.getProductAttrValuePage(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, pageResult.getTotal());
|
||||
assertEquals(1, pageResult.getList().size());
|
||||
assertPojoEquals(dbProductAttrValue, pageResult.getList().get(0));
|
||||
}
|
||||
|
||||
@Test // TODO 请修改 null 为需要的值
|
||||
public void testGetProductAttrValueList() {
|
||||
// mock 数据
|
||||
MallProductAttrValueDO dbProductAttrValue = randomPojo(MallProductAttrValueDO.class, o -> { // 等会查询到
|
||||
o.setAttrKeyId(1L);
|
||||
o.setName("海尔笔记本电脑");
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
o.setCreateTime(buildTime(2022, 1, 3));
|
||||
});
|
||||
productAttrValueMapper.insert(dbProductAttrValue);
|
||||
// 测试 attrKeyId 不匹配
|
||||
productAttrValueMapper.insert(cloneIgnoreId(dbProductAttrValue, o -> o.setAttrKeyId(2L)));
|
||||
// 测试 name 不匹配
|
||||
productAttrValueMapper.insert(cloneIgnoreId(dbProductAttrValue, o -> o.setName("红双喜乒乓球")));
|
||||
// 测试 status 不匹配
|
||||
productAttrValueMapper.insert(
|
||||
cloneIgnoreId(dbProductAttrValue, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
|
||||
// 测试 createTime 不匹配
|
||||
productAttrValueMapper.insert(cloneIgnoreId(dbProductAttrValue, o ->
|
||||
o.setCreateTime(buildTime(2021, 12, 12))));
|
||||
// 准备参数
|
||||
MallProductAttrValueExportReqVO reqVO = new MallProductAttrValueExportReqVO();
|
||||
reqVO.setAttrKeyId(1L);
|
||||
reqVO.setName("海尔笔记本电脑");
|
||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
reqVO.setBeginCreateTime(buildTime(2022, 1, 3));
|
||||
reqVO.setEndCreateTime(buildTime(2022, 1, 3));
|
||||
|
||||
// 调用
|
||||
List<MallProductAttrValueDO> list = productAttrValueService.getProductAttrValueList(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, list.size());
|
||||
assertPojoEquals(dbProductAttrValue, list.get(0));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,158 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.service.product;
|
||||
|
||||
import cn.hutool.core.util.RandomUtil;
|
||||
import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand.MallProductBrandCreateReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand.MallProductBrandExportReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand.MallProductBrandPageReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.brand.MallProductBrandUpdateReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductBrandDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductBrandMapper;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.service.product.impl.MallProductBrandServiceImpl;
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.adminserver.modules.mall.enums.MallErrorCodeConstants.PRODUCT_BRAND_NOT_EXISTS;
|
||||
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.*;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* {@link MallProductBrandServiceImpl} 的单元测试类
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Import(MallProductBrandServiceImpl.class)
|
||||
public class MallProductBrandServiceTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private MallProductBrandServiceImpl productBrandService;
|
||||
|
||||
@Resource
|
||||
private MallProductBrandMapper productBrandMapper;
|
||||
|
||||
@Test
|
||||
public void testCreateProductBrand_success() {
|
||||
// 准备参数
|
||||
MallProductBrandCreateReqVO reqVO = randomPojo(MallProductBrandCreateReqVO.class, o ->
|
||||
o.setStatus(RandomUtil.randomEle(CommonStatusEnum.values()).getStatus()));
|
||||
|
||||
// 调用
|
||||
Long productBrandId = productBrandService.createProductBrand(reqVO);
|
||||
// 断言
|
||||
assertNotNull(productBrandId);
|
||||
// 校验记录的属性是否正确
|
||||
MallProductBrandDO productBrand = productBrandMapper.selectById(productBrandId);
|
||||
assertPojoEquals(reqVO, productBrand);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateProductBrand_success() {
|
||||
// mock 数据
|
||||
MallProductBrandDO dbProductBrand = randomPojo(MallProductBrandDO.class,
|
||||
o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
|
||||
productBrandMapper.insert(dbProductBrand);// @Sql: 先插入出一条存在的数据
|
||||
// 准备参数
|
||||
MallProductBrandUpdateReqVO reqVO = randomPojo(MallProductBrandUpdateReqVO.class, o -> {
|
||||
o.setStatus(CommonStatusEnum.DISABLE.getStatus());
|
||||
o.setId(dbProductBrand.getId()); // 设置更新的 ID
|
||||
});
|
||||
|
||||
// 调用
|
||||
productBrandService.updateProductBrand(reqVO);
|
||||
// 校验是否更新正确
|
||||
MallProductBrandDO productBrand = productBrandMapper.selectById(reqVO.getId()); // 获取最新的
|
||||
assertPojoEquals(reqVO, productBrand);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateProductBrand_notExists() {
|
||||
// 准备参数
|
||||
MallProductBrandUpdateReqVO reqVO = randomPojo(MallProductBrandUpdateReqVO.class,
|
||||
o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> productBrandService.updateProductBrand(reqVO), PRODUCT_BRAND_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteProductBrand_success() {
|
||||
// mock 数据
|
||||
MallProductBrandDO dbProductBrand = randomPojo(MallProductBrandDO.class,
|
||||
o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
|
||||
productBrandMapper.insert(dbProductBrand);// @Sql: 先插入出一条存在的数据
|
||||
// 准备参数
|
||||
Long id = dbProductBrand.getId();
|
||||
|
||||
// 调用
|
||||
productBrandService.deleteProductBrand(id);
|
||||
// 校验数据不存在了
|
||||
assertNull(productBrandMapper.selectById(id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteProductBrand_notExists() {
|
||||
// 准备参数
|
||||
Long id = randomLongId();
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> productBrandService.deleteProductBrand(id), PRODUCT_BRAND_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test // TODO 请修改 null 为需要的值
|
||||
public void testGetProductBrandPage() {
|
||||
// mock 数据
|
||||
MallProductBrandDO dbProductBrand = randomPojo(MallProductBrandDO.class, o -> { // 等会查询到
|
||||
o.setName("奥迪");
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
});
|
||||
productBrandMapper.insert(dbProductBrand);
|
||||
// 测试 name 不匹配
|
||||
productBrandMapper.insert(cloneIgnoreId(dbProductBrand, o -> o.setName("奔驰")));
|
||||
// 测试 status 不匹配
|
||||
productBrandMapper.insert(cloneIgnoreId(dbProductBrand, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
|
||||
// 准备参数
|
||||
MallProductBrandPageReqVO reqVO = new MallProductBrandPageReqVO();
|
||||
reqVO.setName("奥迪");
|
||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
|
||||
// 调用
|
||||
PageResult<MallProductBrandDO> pageResult = productBrandService.getProductBrandPage(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, pageResult.getTotal());
|
||||
assertEquals(1, pageResult.getList().size());
|
||||
assertPojoEquals(dbProductBrand, pageResult.getList().get(0));
|
||||
}
|
||||
|
||||
@Test // TODO 请修改 null 为需要的值
|
||||
public void testGetProductBrandList() {
|
||||
// mock 数据
|
||||
MallProductBrandDO dbProductBrand = randomPojo(MallProductBrandDO.class, o -> { // 等会查询到
|
||||
o.setName("奥迪");
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
});
|
||||
productBrandMapper.insert(dbProductBrand);
|
||||
// 测试 name 不匹配
|
||||
productBrandMapper.insert(cloneIgnoreId(dbProductBrand, o -> o.setName("奔驰")));
|
||||
// 测试 status 不匹配
|
||||
productBrandMapper.insert(cloneIgnoreId(dbProductBrand, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
|
||||
// 准备参数
|
||||
MallProductBrandExportReqVO reqVO = new MallProductBrandExportReqVO();
|
||||
reqVO.setName("奥迪");
|
||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
|
||||
// 调用
|
||||
List<MallProductBrandDO> list = productBrandService.getProductBrandList(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, list.size());
|
||||
assertPojoEquals(dbProductBrand, list.get(0));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,175 @@
|
|||
package cn.iocoder.yudao.adminserver.modules.mall.service.product;
|
||||
|
||||
import cn.iocoder.yudao.adminserver.BaseDbUnitTest;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category.MallProductCategoryCreateReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category.MallProductCategoryExportReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category.MallProductCategoryPageReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.controller.product.vo.category.MallProductCategoryUpdateReqVO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.dataobject.product.MallProductCategoryDO;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.dal.mysql.product.MallProductCategoryMapper;
|
||||
import cn.iocoder.yudao.adminserver.modules.mall.service.product.impl.MallProductCategoryServiceImpl;
|
||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.adminserver.modules.mall.enums.MallErrorCodeConstants.PRODUCT_CATEGORY_NOT_EXISTS;
|
||||
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 org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* {@link MallProductCategoryServiceImpl} 的单元测试类
|
||||
*
|
||||
* @author aquan
|
||||
*/
|
||||
@Import(MallProductCategoryServiceImpl.class)
|
||||
public class MallProductCategoryServiceTest extends BaseDbUnitTest {
|
||||
|
||||
@Resource
|
||||
private MallProductCategoryServiceImpl productCategoryService;
|
||||
|
||||
@Resource
|
||||
private MallProductCategoryMapper productCategoryMapper;
|
||||
|
||||
@Test
|
||||
public void testCreateProductCategory_success() {
|
||||
// 准备参数
|
||||
MallProductCategoryCreateReqVO reqVO = randomPojo(MallProductCategoryCreateReqVO.class,
|
||||
o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
|
||||
|
||||
// 调用
|
||||
Long productCategoryId = productCategoryService.createProductCategory(reqVO);
|
||||
// 断言
|
||||
assertNotNull(productCategoryId);
|
||||
// 校验记录的属性是否正确
|
||||
MallProductCategoryDO productCategory = productCategoryMapper.selectById(productCategoryId);
|
||||
assertPojoEquals(reqVO, productCategory);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateProductCategory_success() {
|
||||
// mock 数据
|
||||
MallProductCategoryDO dbProductCategory = randomPojo(MallProductCategoryDO.class,
|
||||
o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
|
||||
productCategoryMapper.insert(dbProductCategory);// @Sql: 先插入出一条存在的数据
|
||||
// 准备参数
|
||||
MallProductCategoryUpdateReqVO reqVO = randomPojo(MallProductCategoryUpdateReqVO.class, o -> {
|
||||
o.setStatus(CommonStatusEnum.DISABLE.getStatus());
|
||||
o.setId(dbProductCategory.getId()); // 设置更新的 ID
|
||||
});
|
||||
|
||||
// 调用
|
||||
productCategoryService.updateProductCategory(reqVO);
|
||||
// 校验是否更新正确
|
||||
MallProductCategoryDO productCategory = productCategoryMapper.selectById(reqVO.getId()); // 获取最新的
|
||||
assertPojoEquals(reqVO, productCategory);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateProductCategory_notExists() {
|
||||
// 准备参数
|
||||
MallProductCategoryUpdateReqVO reqVO = randomPojo(MallProductCategoryUpdateReqVO.class,
|
||||
o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> productCategoryService.updateProductCategory(reqVO), PRODUCT_CATEGORY_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteProductCategory_success() {
|
||||
// mock 数据
|
||||
MallProductCategoryDO dbProductCategory = randomPojo(MallProductCategoryDO.class,
|
||||
o -> o.setStatus(CommonStatusEnum.ENABLE.getStatus()));
|
||||
productCategoryMapper.insert(dbProductCategory);// @Sql: 先插入出一条存在的数据
|
||||
// 准备参数
|
||||
Long id = dbProductCategory.getId();
|
||||
|
||||
// 调用
|
||||
productCategoryService.deleteProductCategory(id);
|
||||
// 校验数据不存在了
|
||||
assertNull(productCategoryMapper.selectById(id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeleteProductCategory_notExists() {
|
||||
// 准备参数
|
||||
Long id = randomLongId();
|
||||
|
||||
// 调用, 并断言异常
|
||||
assertServiceException(() -> productCategoryService.deleteProductCategory(id), PRODUCT_CATEGORY_NOT_EXISTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetProductCategoryPage() {
|
||||
// mock 数据
|
||||
MallProductCategoryDO dbProductCategory = randomPojo(MallProductCategoryDO.class, o -> { // 等会查询到
|
||||
o.setPid(0L);
|
||||
o.setName("彩电");
|
||||
o.setDescription("家庭电器");
|
||||
o.setPicUrl("https://127.0.0.1/file/111.jpg");
|
||||
o.setSort(0);
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
o.setCreateTime(buildTime(2022, 1, 3));
|
||||
});
|
||||
productCategoryMapper.insert(dbProductCategory);
|
||||
// 测试 pid 不匹配
|
||||
productCategoryMapper.insert(cloneIgnoreId(dbProductCategory, o -> o.setPid(2L)));
|
||||
// 测试 name 不匹配
|
||||
productCategoryMapper.insert(cloneIgnoreId(dbProductCategory, o -> o.setName("服装")));
|
||||
// 测试 status 不匹配
|
||||
productCategoryMapper.insert(cloneIgnoreId(dbProductCategory, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
|
||||
// 准备参数
|
||||
MallProductCategoryPageReqVO reqVO = new MallProductCategoryPageReqVO();
|
||||
reqVO.setPid(0L);
|
||||
reqVO.setName("彩电");
|
||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
|
||||
// 调用
|
||||
PageResult<MallProductCategoryDO> pageResult = productCategoryService.getProductCategoryPage(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, pageResult.getTotal());
|
||||
assertEquals(1, pageResult.getList().size());
|
||||
assertPojoEquals(dbProductCategory, pageResult.getList().get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetProductCategoryList() {
|
||||
// mock 数据
|
||||
MallProductCategoryDO dbProductCategory = randomPojo(MallProductCategoryDO.class, o -> { // 等会查询到
|
||||
o.setPid(0L);
|
||||
o.setName("彩电");
|
||||
o.setDescription("家庭电器");
|
||||
o.setPicUrl("https://127.0.0.1/file/111.jpg");
|
||||
o.setSort(0);
|
||||
o.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
o.setCreateTime(buildTime(2022, 1, 3));
|
||||
});
|
||||
productCategoryMapper.insert(dbProductCategory);
|
||||
// 测试 pid 不匹配
|
||||
productCategoryMapper.insert(cloneIgnoreId(dbProductCategory, o -> o.setPid(2L)));
|
||||
// 测试 name 不匹配
|
||||
productCategoryMapper.insert(cloneIgnoreId(dbProductCategory, o -> o.setName("服装")));
|
||||
// 测试 status 不匹配
|
||||
productCategoryMapper.insert(cloneIgnoreId(dbProductCategory, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
|
||||
// 准备参数
|
||||
MallProductCategoryExportReqVO reqVO = new MallProductCategoryExportReqVO();
|
||||
reqVO.setPid(0L);
|
||||
reqVO.setName("彩电");
|
||||
reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
|
||||
// 调用
|
||||
List<MallProductCategoryDO> list = productCategoryService.getProductCategoryList(reqVO);
|
||||
// 断言
|
||||
assertEquals(1, list.size());
|
||||
assertPojoEquals(dbProductCategory, list.get(0));
|
||||
}
|
||||
|
||||
}
|
|
@ -33,6 +33,13 @@ DELETE FROM pay_channel;
|
|||
DELETE FROM pay_order;
|
||||
DELETE FROM pay_refund;
|
||||
|
||||
|
||||
-- mall 模块
|
||||
DELETE FROM mall_product_attr_key;
|
||||
DELETE FROM mall_product_attr_value;
|
||||
DELETE FROM mall_product_brand;
|
||||
DELETE FROM mall_product_category;
|
||||
|
||||
-- bpm 开头的 DB
|
||||
DELETE FROM "bpm_form";
|
||||
DELETE FROM "bpm_user_group";
|
||||
|
|
|
@ -490,9 +490,8 @@ CREATE TABLE IF NOT EXISTS "pay_merchant"
|
|||
PRIMARY KEY ("id")
|
||||
) COMMENT '支付商户信息';
|
||||
|
||||
-- bpm 开头的 DB
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "pay_app" (
|
||||
CREATE TABLE IF NOT EXISTS "pay_app"
|
||||
(
|
||||
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
"name" varchar(64) NOT NULL,
|
||||
"status" tinyint NOT NULL,
|
||||
|
@ -594,31 +593,94 @@ CREATE TABLE IF NOT EXISTS `pay_refund` (
|
|||
|
||||
-- bpm 开头的 DB
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "bpm_form" (
|
||||
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
"name" varchar(63) NOT NULL,
|
||||
"status" tinyint NOT NULL,
|
||||
"fields" varchar(255) NOT NULL,
|
||||
"conf" varchar(255) NOT NULL,
|
||||
"remark" varchar(255),
|
||||
"creator" varchar(64) DEFAULT '',
|
||||
"create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updater" varchar(64) DEFAULT '',
|
||||
"update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deleted" bit NOT NULL DEFAULT FALSE,
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "bpm_form"
|
||||
(
|
||||
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
"name" varchar(63) NOT NULL,
|
||||
"status" tinyint NOT NULL,
|
||||
"fields" varchar(255) NOT NULL,
|
||||
"conf" varchar(255) NOT NULL,
|
||||
"remark" varchar(255),
|
||||
"creator" varchar(64) DEFAULT '',
|
||||
"create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updater" varchar(64) DEFAULT '',
|
||||
"update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deleted" bit NOT NULL DEFAULT FALSE,
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT '动态表单';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "bpm_user_group" (
|
||||
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
"name" varchar(63) NOT NULL,
|
||||
"description" varchar(255) NOT NULL,
|
||||
"status" tinyint NOT NULL,
|
||||
CREATE TABLE IF NOT EXISTS "bpm_user_group"
|
||||
(
|
||||
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
"name" varchar(63) NOT NULL,
|
||||
"description" varchar(255) NOT NULL,
|
||||
"status" tinyint NOT NULL,
|
||||
"member_user_ids" varchar(255) NOT NULL,
|
||||
"creator" varchar(64) DEFAULT '',
|
||||
"create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updater" varchar(64) DEFAULT '',
|
||||
"update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deleted" bit NOT NULL DEFAULT FALSE,
|
||||
"creator" varchar(64) DEFAULT '',
|
||||
"create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updater" varchar(64) DEFAULT '',
|
||||
"update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"deleted" bit NOT NULL DEFAULT FALSE,
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT '用户组';
|
||||
) COMMENT '用户组';
|
||||
|
||||
|
||||
CREATE TABLE `mall_product_attr_key`
|
||||
(
|
||||
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
`name` varchar(50) NOT NULL DEFAULT '',
|
||||
`status` tinyint(4) NOT NULL DEFAULT '1',
|
||||
`creator` varchar(64) DEFAULT '',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updater` varchar(64) DEFAULT '',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`deleted` bit(1) NOT NULL DEFAULT false,
|
||||
PRIMARY KEY (`id`)
|
||||
) COMMENT = '商品规格键';
|
||||
|
||||
CREATE TABLE `mall_product_attr_value`
|
||||
(
|
||||
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
`attr_key_id` bigint(20) NOT NULL ,
|
||||
`name` varchar(50) NOT NULL DEFAULT '',
|
||||
`status` tinyint(4) NOT NULL DEFAULT '1',
|
||||
`creator` varchar(64) DEFAULT '',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updater` varchar(64) DEFAULT '',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`deleted` bit(1) NOT NULL DEFAULT false,
|
||||
PRIMARY KEY (`id`)
|
||||
) COMMENT = '商品规格值';
|
||||
|
||||
CREATE TABLE `mall_product_brand`
|
||||
(
|
||||
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
`name` varchar(50) NOT NULL DEFAULT '',
|
||||
`description` varchar(250) DEFAULT NULL,
|
||||
`pic_url` varchar(1024) DEFAULT NULL,
|
||||
`status` tinyint(4) NOT NULL DEFAULT '1',
|
||||
`creator` varchar(64) DEFAULT '',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updater` varchar(64) DEFAULT '',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`deleted` bit(1) NOT NULL DEFAULT false,
|
||||
PRIMARY KEY (`id`)
|
||||
) COMMENT = '商品品牌';
|
||||
|
||||
CREATE TABLE `mall_product_category`
|
||||
(
|
||||
"id" number NOT NULL GENERATED BY DEFAULT AS IDENTITY,
|
||||
`pid` bigint(20) NOT NULL,
|
||||
`name` varchar(16) NOT NULL DEFAULT '',
|
||||
`description` varchar(250) DEFAULT NULL,
|
||||
`pic_url` varchar(1024) DEFAULT NULL,
|
||||
`sort` int(11) NOT NULL,
|
||||
`status` tinyint(4) NOT NULL DEFAULT '1',
|
||||
`creator` varchar(64) DEFAULT '',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updater` varchar(64) DEFAULT '',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`deleted` bit(1) NOT NULL DEFAULT false,
|
||||
PRIMARY KEY (`id`)
|
||||
) COMMENT = '商品分类表'
|
||||
|
|
|
@ -1,5 +1,14 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
// 上传文件
|
||||
export function uploadFile(data){
|
||||
return request({
|
||||
url: '/infra/file/upload',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除文件
|
||||
export function deleteFile(id) {
|
||||
return request({
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
// 创建商品规格键
|
||||
export function createProductAttrKey(data) {
|
||||
return request({
|
||||
url: '/mall/product-attr-key/create',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 更新商品规格键
|
||||
export function updateProductAttrKey(data) {
|
||||
return request({
|
||||
url: '/mall/product-attr-key/update',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 更新商品规格键状态
|
||||
export function updateProductAttrKeyStatus(id, status) {
|
||||
const data = {
|
||||
id,
|
||||
status
|
||||
}
|
||||
return request({
|
||||
url: '/mall/product-attr-key/update-status',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除商品规格键
|
||||
export function deleteProductAttrKey(id) {
|
||||
return request({
|
||||
url: '/mall/product-attr-key/delete?id=' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 获得商品规格键
|
||||
export function getProductAttrKey(id) {
|
||||
return request({
|
||||
url: '/mall/product-attr-key/get?id=' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 获得商品规格键分页
|
||||
export function getProductAttrKeyPage(query) {
|
||||
return request({
|
||||
url: '/mall/product-attr-key/page',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 导出商品规格键 Excel
|
||||
export function exportProductAttrKeyExcel(query) {
|
||||
return request({
|
||||
url: '/mall/product-attr-key/export-excel',
|
||||
method: 'get',
|
||||
params: query,
|
||||
responseType: 'blob'
|
||||
})
|
||||
}
|
||||
|
||||
// 获得所有的商品规格键
|
||||
export function getAttrKeySimpleList() {
|
||||
return request({
|
||||
url: '/mall/product-attr-key/list-all-simple',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
// 创建商品规格值
|
||||
export function createProductAttrValue(data) {
|
||||
return request({
|
||||
url: '/mall/product-attr-value/create',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 更新商品规格值
|
||||
export function updateProductAttrValue(data) {
|
||||
return request({
|
||||
url: '/mall/product-attr-value/update',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 更新商品规格值状态
|
||||
export function updateProductAttrValueStatus(id, status) {
|
||||
const data = {
|
||||
id,
|
||||
status
|
||||
}
|
||||
return request({
|
||||
url: '/mall/product-attr-value/update-status',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除商品规格值
|
||||
export function deleteProductAttrValue(id) {
|
||||
return request({
|
||||
url: '/mall/product-attr-value/delete?id=' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 获得商品规格值
|
||||
export function getProductAttrValue(id) {
|
||||
return request({
|
||||
url: '/mall/product-attr-value/get?id=' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 获得商品规格值分页
|
||||
export function getProductAttrValuePage(query) {
|
||||
return request({
|
||||
url: '/mall/product-attr-value/page',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 导出商品规格值 Excel
|
||||
export function exportProductAttrValueExcel(query) {
|
||||
return request({
|
||||
url: '/mall/product-attr-value/export-excel',
|
||||
method: 'get',
|
||||
params: query,
|
||||
responseType: 'blob'
|
||||
})
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
// 创建商品品牌
|
||||
export function createProductBrand(data) {
|
||||
return request({
|
||||
url: '/mall/product-brand/create',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 更新商品品牌
|
||||
export function updateProductBrand(data) {
|
||||
return request({
|
||||
url: '/mall/product-brand/update',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 更新商品品牌状态
|
||||
export function updateProductBrandStatus(id, status) {
|
||||
const data = {
|
||||
id,
|
||||
status
|
||||
}
|
||||
return request({
|
||||
url: '/mall/product-brand/update-status',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除商品品牌
|
||||
export function deleteProductBrand(id) {
|
||||
return request({
|
||||
url: '/mall/product-brand/delete?id=' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 获得商品品牌
|
||||
export function getProductBrand(id) {
|
||||
return request({
|
||||
url: '/mall/product-brand/get?id=' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 获得商品品牌分页
|
||||
export function getProductBrandPage(query) {
|
||||
return request({
|
||||
url: '/mall/product-brand/page',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 导出商品品牌 Excel
|
||||
export function exportProductBrandExcel(query) {
|
||||
return request({
|
||||
url: '/mall/product-brand/export-excel',
|
||||
method: 'get',
|
||||
params: query,
|
||||
responseType: 'blob'
|
||||
})
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
// 创建商品分类
|
||||
export function createProductCategory(data) {
|
||||
return request({
|
||||
url: '/mall/product-category/create',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 更新商品分类
|
||||
export function updateProductCategory(data) {
|
||||
return request({
|
||||
url: '/mall/product-category/update',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 更新商品分类状态
|
||||
export function updateProductCategoryStatus(id, status) {
|
||||
const data = {
|
||||
id,
|
||||
status
|
||||
}
|
||||
return request({
|
||||
url: '/mall/product-category/update-status',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除商品分类
|
||||
export function deleteProductCategory(id) {
|
||||
return request({
|
||||
url: '/mall/product-category/delete?id=' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 获得商品分类
|
||||
export function getProductCategory(id) {
|
||||
return request({
|
||||
url: '/mall/product-category/get?id=' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 获得商品顶级分类
|
||||
export function getProductRootCategory() {
|
||||
return request({
|
||||
url: '/mall/product-category/get-roots',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
// 获得商品分类分页
|
||||
export function getProductCategoryPage(query) {
|
||||
return request({
|
||||
url: '/mall/product-category/page',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 导出商品分类 Excel
|
||||
export function exportProductCategoryExcel(query) {
|
||||
return request({
|
||||
url: '/mall/product-category/export-excel',
|
||||
method: 'get',
|
||||
params: query,
|
||||
responseType: 'blob'
|
||||
})
|
||||
}
|
|
@ -91,6 +91,18 @@ export const constantRoutes = [
|
|||
}
|
||||
]
|
||||
}, {
|
||||
path: '/mall',
|
||||
component: Layout,
|
||||
hidden: true,
|
||||
children: [
|
||||
{
|
||||
path: 'product-attr-key/:attrId(\\d+)',
|
||||
component: (resolve) => require(['@/views/mall/product/attr/attrValue'], resolve),
|
||||
name: 'AttrValue',
|
||||
meta: { title: '商品规格值', icon: '' }
|
||||
}
|
||||
]
|
||||
},{
|
||||
path: '/job',
|
||||
component: Layout,
|
||||
hidden: true,
|
||||
|
|
|
@ -0,0 +1,312 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
|
||||
<!-- 搜索工作栏 -->
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
|
||||
<el-form-item label="规格键" prop="attrKeyId">
|
||||
<el-select v-model="queryParams.attrKeyId" size="small" filterable placeholder="请选择"
|
||||
@change="findByAttrKeyIdGetObject(queryParams.attrKeyId);">
|
||||
<el-option v-for="item in attrKeyList" :key="item.id" :label="item.name" :value="item.id"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="规格值名字" prop="name">
|
||||
<el-input v-model="queryParams.name" placeholder="请输入规格值名字" clearable size="small"
|
||||
@keyup.enter.native="handleQuery"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
|
||||
<el-option v-for="dict in commonStatusDatum" :key="parseInt(dict.value)" :label="dict.label"
|
||||
:value="parseInt(dict.value)"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 操作工具栏 -->
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
|
||||
v-hasPermi="['mall:product-attr-key:create']">新增
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
|
||||
v-hasPermi="['mall:product-attr-key:export']">导出
|
||||
</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<!-- 列表 -->
|
||||
<el-table v-loading="loading" :data="list">
|
||||
<el-table-column label="规格值编号" align="center" prop="id"/>
|
||||
<el-table-column label="规格值名字" align="center" prop="name"/>
|
||||
<el-table-column label="状态" align="center" prop="status">
|
||||
<template slot-scope="scope">
|
||||
<el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1"
|
||||
@change="handleStatusChange(scope.row)"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['mall:product-attr-key:update']">修改
|
||||
</el-button>
|
||||
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
|
||||
v-hasPermi="['mall:product-attr-key:delete']">删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 分页组件 -->
|
||||
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"/>
|
||||
|
||||
<!-- 对话框(添加 / 修改) -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
||||
<el-form-item label="规格键名称">
|
||||
<el-input v-model="this.selectedAttrKeyObject.name" :disabled="true"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="规格值名字" prop="name">
|
||||
<el-input v-model="form.name" placeholder="请输入规格值名字"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-radio-group v-model="form.status">
|
||||
<el-radio v-for="dict in commonStatusDatum" :key="parseInt(dict.value)" :label="parseInt(dict.value)">
|
||||
{{ dict.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
createProductAttrValue,
|
||||
updateProductAttrValue,
|
||||
deleteProductAttrValue,
|
||||
getProductAttrValue,
|
||||
getProductAttrValuePage,
|
||||
exportProductAttrValueExcel, updateProductAttrValueStatus
|
||||
} from "@/api/mall/product/attrValue";
|
||||
import {getAttrKeySimpleList, getProductAttrKey} from "@/api/mall/product/attrKey";
|
||||
import {DICT_TYPE, getDictDatas} from "@/utils/dict";
|
||||
import {SysCommonStatusEnum} from "@/utils/constants";
|
||||
|
||||
export default {
|
||||
name: "AttrValue",
|
||||
components: {},
|
||||
data() {
|
||||
return {
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 商品规格值列表
|
||||
list: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
dateRangeCreateTime: [],
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
attrKeyId: null,
|
||||
name: null,
|
||||
status: null,
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
attrKeyId: [{required: true, message: "规格键编号不能为空", trigger: "blur"}],
|
||||
name: [{required: true, message: "规格值名字不能为空", trigger: "blur"}],
|
||||
status: [{required: true, message: "状态不能为空", trigger: "blur"}],
|
||||
},
|
||||
// 传递过来的规格商品键ID
|
||||
transferAttrKeyId: null,
|
||||
// 选中的商品规格键对象
|
||||
selectedAttrKeyObject: {
|
||||
id: null,
|
||||
name: ''
|
||||
},
|
||||
// 所有的商品规格键列表
|
||||
attrKeyList: null,
|
||||
// 通用状态
|
||||
commonStatusDatum: getDictDatas(DICT_TYPE.SYS_COMMON_STATUS),
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.transferAttrKeyId = this.$route.params && parseInt(this.$route.params.attrId);
|
||||
this.getAttrKeyAllList();
|
||||
this.findByAttrKeyIdGetObject(this.transferAttrKeyId);
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* 根据选中的商品规格键 ID 获取对象
|
||||
*/
|
||||
findByAttrKeyIdGetObject(attrKeyId) {
|
||||
getProductAttrKey(attrKeyId).then(response => {
|
||||
this.selectedAttrKeyObject = response.data;
|
||||
this.queryParams.attrKeyId = this.selectedAttrKeyObject.id;
|
||||
this.getList();
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 查询所有的商品规格键
|
||||
*/
|
||||
getAttrKeyAllList() {
|
||||
getAttrKeySimpleList().then(response => {
|
||||
this.attrKeyList = response.data;
|
||||
})
|
||||
},
|
||||
/** 查询列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
// 处理查询参数
|
||||
let params = {...this.queryParams};
|
||||
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
|
||||
// 执行查询
|
||||
getProductAttrValuePage(params).then(response => {
|
||||
this.list = response.data.list;
|
||||
this.total = response.data.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
/** 取消按钮 */
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
},
|
||||
/** 表单重置 */
|
||||
reset() {
|
||||
this.form = {
|
||||
id: undefined,
|
||||
attrKeyId: this.selectedAttrKeyObject.id,
|
||||
name: undefined,
|
||||
status: undefined,
|
||||
};
|
||||
this.resetForm("form");
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNo = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.dateRangeCreateTime = [];
|
||||
this.resetForm("queryForm");
|
||||
this.queryParams.attrKeyId = this.transferAttrKeyId;
|
||||
this.handleQuery();
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset();
|
||||
this.open = true;
|
||||
this.title = "添加商品规格值";
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.reset();
|
||||
const id = row.id;
|
||||
// this.findByAttrKeyIdGetObject(row.attrKeyId);
|
||||
getProductAttrValue(id).then(response => {
|
||||
this.form = response.data;
|
||||
this.open = true;
|
||||
this.title = "修改商品规格值";
|
||||
});
|
||||
},
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (!valid) {
|
||||
return;
|
||||
}
|
||||
// 修改的提交
|
||||
if (this.form.id != null) {
|
||||
updateProductAttrValue(this.form).then(response => {
|
||||
this.msgSuccess("修改成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
});
|
||||
return;
|
||||
}
|
||||
// 添加的提交
|
||||
createProductAttrValue(this.form).then(response => {
|
||||
this.msgSuccess("新增成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
});
|
||||
});
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const id = row.id;
|
||||
this.$confirm('是否确认删除商品规格值编号为"' + row.name + '"的数据项?', "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function () {
|
||||
return deleteProductAttrValue(id);
|
||||
}).then(() => {
|
||||
this.getList();
|
||||
this.msgSuccess("删除成功");
|
||||
})
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
// 处理查询参数
|
||||
let params = {...this.queryParams};
|
||||
params.pageNo = undefined;
|
||||
params.pageSize = undefined;
|
||||
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
|
||||
// 执行导出
|
||||
this.$confirm('是否确认导出所有商品规格值数据项?', "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function () {
|
||||
return exportProductAttrValueExcel(params);
|
||||
}).then(response => {
|
||||
this.downloadExcel(response, '商品规格值.xls');
|
||||
})
|
||||
},
|
||||
// 商品规格键状态修改
|
||||
handleStatusChange(row) {
|
||||
let text = row.status === SysCommonStatusEnum.ENABLE ? "启用" : "停用";
|
||||
this.$confirm('确认要"' + text + '""' + row.name + '"当前商品规格吗?', "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function () {
|
||||
return updateProductAttrValueStatus(row.id, row.status);
|
||||
}).then(() => {
|
||||
this.msgSuccess(text + "成功");
|
||||
}).catch(function () {
|
||||
row.status = row.status === SysCommonStatusEnum.ENABLE ? SysCommonStatusEnum.DISABLE
|
||||
: SysCommonStatusEnum.ENABLE;
|
||||
});
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,278 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
|
||||
<!-- 搜索工作栏 -->
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
|
||||
<el-form-item label="规格键名称" prop="name">
|
||||
<el-input v-model="queryParams.name" placeholder="请输入规格键名称" clearable size="small"
|
||||
@keyup.enter.native="handleQuery"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
|
||||
<el-option v-for="dict in commonStatusDatum" :key="parseInt(dict.value)" :label="dict.label"
|
||||
:value="parseInt(dict.value)"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="创建时间">
|
||||
<el-date-picker v-model="dateRangeCreateTime" size="small" style="width: 240px" value-format="yyyy-MM-dd"
|
||||
type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 操作工具栏 -->
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
|
||||
v-hasPermi="['mall:product-attr-key:create']">新增
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
|
||||
v-hasPermi="['mall:product-attr-key:export']">导出
|
||||
</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<!-- 列表 -->
|
||||
<el-table v-loading="loading" :data="list">
|
||||
<el-table-column label="编号" align="center" prop="id"/>
|
||||
<el-table-column label="规格键名称" align="center" prop="name">
|
||||
<template v-slot="scope">
|
||||
<router-link :to="'/mall/product-attr-key/' + scope.row.id" class="link-type">
|
||||
<span>{{ scope.row.name }}</span>
|
||||
</router-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" align="center" prop="status">
|
||||
<template slot-scope="scope">
|
||||
<el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1" @change="handleStatusChange(scope.row)" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['mall:product-attr-key:update']">修改
|
||||
</el-button>
|
||||
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
|
||||
v-hasPermi="['mall:product-attr-key:delete']">删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 分页组件 -->
|
||||
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"/>
|
||||
|
||||
<!-- 对话框(添加 / 修改) -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="550px" append-to-body>
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
||||
<el-form-item label="规格键名称" prop="name">
|
||||
<el-input v-model="form.name" placeholder="请输入规格键名称"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-radio-group v-model="form.status">
|
||||
<el-radio v-for="dict in commonStatusDatum" :key="parseInt(dict.value)" :label="parseInt(dict.value)">
|
||||
{{ dict.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
createProductAttrKey,
|
||||
updateProductAttrKey,
|
||||
updateProductAttrKeyStatus,
|
||||
deleteProductAttrKey,
|
||||
getProductAttrKey,
|
||||
getProductAttrKeyPage,
|
||||
exportProductAttrKeyExcel
|
||||
} from "@/api/mall/product/attrKey";
|
||||
import {DICT_TYPE, getDictDatas} from "@/utils/dict";
|
||||
import {SysCommonStatusEnum} from "@/utils/constants";
|
||||
|
||||
export default {
|
||||
name: "ProductAttrKey",
|
||||
components: {},
|
||||
data() {
|
||||
return {
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 商品规格键列表
|
||||
list: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
dateRangeCreateTime: [],
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
name: null,
|
||||
status: null,
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
name: [{required: true, message: "规格键名称不能为空", trigger: "blur"}],
|
||||
status: [{required: true, message: "状态", trigger: "blur"}],
|
||||
},
|
||||
// 通用状态
|
||||
commonStatusDatum: getDictDatas(DICT_TYPE.SYS_COMMON_STATUS),
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
},
|
||||
methods: {
|
||||
/** 查询列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
// 处理查询参数
|
||||
let params = {...this.queryParams};
|
||||
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
|
||||
// 执行查询
|
||||
getProductAttrKeyPage(params).then(response => {
|
||||
this.list = response.data.list;
|
||||
this.total = response.data.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
/** 取消按钮 */
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
},
|
||||
/** 表单重置 */
|
||||
reset() {
|
||||
this.form = {
|
||||
id: undefined,
|
||||
name: undefined,
|
||||
status: undefined,
|
||||
};
|
||||
this.resetForm("form");
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNo = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.dateRangeCreateTime = [];
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset();
|
||||
this.open = true;
|
||||
this.title = "添加商品规格键";
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.reset();
|
||||
const id = row.id;
|
||||
getProductAttrKey(id).then(response => {
|
||||
this.form = response.data;
|
||||
this.open = true;
|
||||
this.title = "修改商品规格键";
|
||||
});
|
||||
},
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (!valid) {
|
||||
return;
|
||||
}
|
||||
// 修改的提交
|
||||
if (this.form.id != null) {
|
||||
updateProductAttrKey(this.form).then(response => {
|
||||
this.msgSuccess("修改成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
});
|
||||
return;
|
||||
}
|
||||
// 添加的提交
|
||||
createProductAttrKey(this.form).then(response => {
|
||||
this.msgSuccess("新增成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
});
|
||||
});
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const id = row.id;
|
||||
this.$confirm('是否确认删除商品规格键编号为"' + id + '"的数据项?', "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function () {
|
||||
return deleteProductAttrKey(id);
|
||||
}).then(() => {
|
||||
this.getList();
|
||||
this.msgSuccess("删除成功");
|
||||
})
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
// 处理查询参数
|
||||
let params = {...this.queryParams};
|
||||
params.pageNo = undefined;
|
||||
params.pageSize = undefined;
|
||||
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
|
||||
// 执行导出
|
||||
this.$confirm('是否确认导出所有商品规格键数据项?', "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function () {
|
||||
return exportProductAttrKeyExcel(params);
|
||||
}).then(response => {
|
||||
this.downloadExcel(response, '商品规格键.xls');
|
||||
})
|
||||
},
|
||||
// 商品规格键状态修改
|
||||
handleStatusChange(row) {
|
||||
let text = row.status === SysCommonStatusEnum.ENABLE ? "启用" : "停用";
|
||||
this.$confirm('确认要"' + text + '""' + row.name + '"当前商品规格吗?', "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function() {
|
||||
return updateProductAttrKeyStatus(row.id, row.status);
|
||||
}).then(() => {
|
||||
this.msgSuccess(text + "成功");
|
||||
}).catch(function() {
|
||||
row.status = row.status === SysCommonStatusEnum.ENABLE ? SysCommonStatusEnum.DISABLE
|
||||
: SysCommonStatusEnum.ENABLE;
|
||||
});
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,368 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
|
||||
<!-- 搜索工作栏 -->
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
|
||||
<el-form-item label="品牌名称" prop="name">
|
||||
<el-input v-model="queryParams.name" placeholder="请输入品牌名称" clearable size="small"
|
||||
@keyup.enter.native="handleQuery"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
|
||||
<el-option v-for="dict in commonStatusDatum" :key="parseInt(dict.value)" :label="dict.label"
|
||||
:value="parseInt(dict.value)"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 操作工具栏 -->
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
|
||||
v-hasPermi="['mall:product-brand:create']">新增
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
|
||||
v-hasPermi="['mall:product-brand:export']">导出
|
||||
</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<!-- 列表 -->
|
||||
<el-table v-loading="loading" :data="list">
|
||||
<el-table-column label="品牌编号" align="center" prop="id"/>
|
||||
<el-table-column label="品牌名称" align="center" prop="name"/>
|
||||
<el-table-column label="品牌描述" align="center" prop="description"/>
|
||||
<el-table-column label="品牌名图片" align="center" prop="picUrl">
|
||||
<template slot-scope="scope">
|
||||
<el-image style="width: 100px; height: 100px"
|
||||
:src="scope.row.picUrl" fit="fit" :preview-src-list="imageList">
|
||||
</el-image>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="状态" align="center" prop="status">
|
||||
<template slot-scope="scope">
|
||||
<el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1"
|
||||
@change="handleStatusChange(scope.row)"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['mall:product-brand:update']">修改
|
||||
</el-button>
|
||||
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
|
||||
v-hasPermi="['mall:product-brand:delete']">删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 分页组件 -->
|
||||
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"/>
|
||||
|
||||
<!-- 对话框(添加 / 修改) -->
|
||||
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body v-loading="formLoading"
|
||||
element-loading-text="提交中,请等候" element-loading-spinner="el-icon-loading">
|
||||
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
|
||||
<el-form-item label="品牌名称" prop="name">
|
||||
<el-input v-model="form.name" placeholder="请输入品牌名称"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="品牌名图片" prop="picUrl">
|
||||
<el-upload ref="upload" action="#"
|
||||
list-type="picture-card" :limit="1" :file-list="uploadList"
|
||||
:before-upload="handleBeforeUpload" :http-request="handleUpload"
|
||||
:on-exceed="handleExceed" :on-preview="handlePictureCardPreview">
|
||||
<i class="el-icon-plus"></i>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-radio-group v-model="form.status">
|
||||
<el-radio v-for="dict in commonStatusDatum" :key="parseInt(dict.value)" :label="parseInt(dict.value)">
|
||||
{{ dict.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="品牌描述" prop="description">
|
||||
<el-input type="textarea" :autosize="{ minRows: 2, maxRows: 4}" v-model="form.description"
|
||||
placeholder="请输入品牌描述"/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
<el-dialog :visible.sync="pictureCardPreviewOpen" append-to-body>
|
||||
<img width="100%" :src="pictureCardPreviewUrl" alt="">
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
createProductBrand,
|
||||
updateProductBrand,
|
||||
updateProductBrandStatus,
|
||||
deleteProductBrand,
|
||||
getProductBrand,
|
||||
getProductBrandPage,
|
||||
exportProductBrandExcel
|
||||
} from "@/api/mall/product/brand";
|
||||
import {DICT_TYPE, getDictDatas} from "@/utils/dict";
|
||||
import {uploadFile} from "@/api/infra/file";
|
||||
import {SysCommonStatusEnum} from "@/utils/constants";
|
||||
|
||||
const defaultBrandForm = {
|
||||
id: null,
|
||||
name: '',
|
||||
description: '',
|
||||
picUrl: '',
|
||||
status: '',
|
||||
createTime: ''
|
||||
}
|
||||
|
||||
export default {
|
||||
name: "ProductBrand",
|
||||
components: {},
|
||||
data() {
|
||||
return {
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 商品品牌列表
|
||||
list: [],
|
||||
// 商品品牌图片列表
|
||||
imageList:[],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
dateRangeCreateTime: [],
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
name: null,
|
||||
description: null,
|
||||
picUrl: null,
|
||||
status: null,
|
||||
},
|
||||
// 表单参数
|
||||
form: JSON.parse(JSON.stringify(defaultBrandForm)),
|
||||
// 表单loading
|
||||
formLoading: false,
|
||||
// 表单loading 文本
|
||||
formLoadingText: '',
|
||||
// 预览图片状态
|
||||
pictureCardPreviewOpen: false,
|
||||
// 预览图片URL
|
||||
pictureCardPreviewUrl: '',
|
||||
// 上传文件列表
|
||||
uploadList: [],
|
||||
// 表单校验
|
||||
rules: {
|
||||
name: [{required: true, message: "品牌名称不能为空", trigger: "blur"}],
|
||||
status: [{required: true, message: "状态不能为空", trigger: "blur"}],
|
||||
picUrl: [{required: true, message: "品牌图片不能为空", trigger: "blur"}],
|
||||
},
|
||||
// 通用状态
|
||||
commonStatusDatum: getDictDatas(DICT_TYPE.SYS_COMMON_STATUS),
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
},
|
||||
methods: {
|
||||
/** 查询列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
// 处理查询参数
|
||||
let params = {...this.queryParams};
|
||||
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
|
||||
// 执行查询
|
||||
getProductBrandPage(params).then(response => {
|
||||
this.list = response.data.list;
|
||||
this.imageList = [];
|
||||
response.data.list.forEach(o => this.imageList.push(o.picUrl));
|
||||
this.total = response.data.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
/** 取消按钮 */
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
},
|
||||
/** 表单重置 */
|
||||
reset() {
|
||||
this.form = {
|
||||
id: undefined,
|
||||
name: undefined,
|
||||
description: undefined,
|
||||
picUrl: undefined,
|
||||
status: undefined,
|
||||
};
|
||||
this.resetForm("form");
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNo = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.dateRangeCreateTime = [];
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset();
|
||||
this.open = true;
|
||||
this.title = "添加商品品牌";
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.reset();
|
||||
const id = row.id;
|
||||
getProductBrand(id).then(response => {
|
||||
this.form = response.data;
|
||||
this.uploadList = [{
|
||||
name: response.data.picUrl,
|
||||
url: response.data.picUrl
|
||||
}];
|
||||
this.title = "修改商品品牌";
|
||||
this.open = true;
|
||||
});
|
||||
},
|
||||
/** 提交按钮*/
|
||||
submitForm() {
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (!valid) {
|
||||
return;
|
||||
}
|
||||
// 修改的提交
|
||||
if (this.form.id != null) {
|
||||
updateProductBrand(this.form).then(response => {
|
||||
this.msgSuccess("修改成功");
|
||||
this.open = false;
|
||||
this.form = JSON.parse(JSON.stringify(defaultBrandForm));
|
||||
this.getList();
|
||||
});
|
||||
return;
|
||||
}
|
||||
// 添加的提交
|
||||
createProductBrand(this.form).then(response => {
|
||||
this.msgSuccess("新增成功");
|
||||
this.open = false;
|
||||
this.form = JSON.parse(JSON.stringify(defaultBrandForm));
|
||||
this.getList();
|
||||
});
|
||||
});
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const id = row.id;
|
||||
this.$confirm('是否确认删除商品品牌编号为"' + id + '"的数据项?', "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function () {
|
||||
return deleteProductBrand(id);
|
||||
}).then(() => {
|
||||
this.getList();
|
||||
this.msgSuccess("删除成功");
|
||||
})
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
// 处理查询参数
|
||||
let params = {...this.queryParams};
|
||||
params.pageNo = undefined;
|
||||
params.pageSize = undefined;
|
||||
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
|
||||
// 执行导出
|
||||
this.$confirm('是否确认导出所有商品品牌数据项?', "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function () {
|
||||
return exportProductBrandExcel(params);
|
||||
}).then(response => {
|
||||
this.downloadExcel(response, '商品品牌.xls');
|
||||
})
|
||||
},
|
||||
// 商品规格键状态修改
|
||||
handleStatusChange(row) {
|
||||
let text = row.status === SysCommonStatusEnum.ENABLE ? "启用" : "停用";
|
||||
// '确认要"' + text + '""' + row.name + '"当前商品品牌吗?'
|
||||
this.$confirm(`确定要[${text}] "${row.name}"当商品品牌吗?`, "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function() {
|
||||
return updateProductBrandStatus(row.id, row.status);
|
||||
}).then(() => {
|
||||
this.msgSuccess(text + "成功");
|
||||
}).catch(function() {
|
||||
row.status = row.status === SysCommonStatusEnum.ENABLE ? SysCommonStatusEnum.DISABLE
|
||||
: SysCommonStatusEnum.ENABLE;
|
||||
});
|
||||
},
|
||||
/**图片超出限制*/
|
||||
handleExceed() {
|
||||
this.$message.warning("图片选择已达上限,请删除后重新选择");
|
||||
},
|
||||
/**图片上传之前的逻辑处理*/
|
||||
handleBeforeUpload(file) {
|
||||
if (file.type.indexOf("image/") === -1) {
|
||||
this.$message.error("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
|
||||
} else {
|
||||
this.formLoading = true;
|
||||
this.formLoadingText = "图片上传中。。。";
|
||||
const reader = new FileReader();
|
||||
reader.readAsDataURL(file);
|
||||
reader.onload = () => {
|
||||
this.form.picUrl = reader.result;
|
||||
};
|
||||
}
|
||||
},
|
||||
/**重新图片上传逻辑*/
|
||||
handleUpload(file) {
|
||||
let formData = new FormData();
|
||||
let path = new Date().getTime() + file.file.name.substring(file.file.name.lastIndexOf("."));
|
||||
formData.append("file", file.file);
|
||||
formData.append("path", path)
|
||||
uploadFile(formData).then(res => {
|
||||
this.form.picUrl = res.data;
|
||||
this.$message.success("图片上传成功");
|
||||
this.formLoading = false;
|
||||
}).catch(error => {
|
||||
this.formLoading = true;
|
||||
this.$message.error(error.msg());
|
||||
})
|
||||
},
|
||||
/**图片预览*/
|
||||
handlePictureCardPreview(file) {
|
||||
this.pictureCardPreviewUrl = file.url;
|
||||
this.pictureCardPreviewOpen = true;
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
|
@ -0,0 +1,401 @@
|
|||
<template>
|
||||
<div class="app-container">
|
||||
|
||||
<!-- 搜索工作栏 -->
|
||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
|
||||
<el-form-item label="父类目名称" prop="pid">
|
||||
<el-select v-model="queryParams.pid" filterable placeholder="请选择" clearable>
|
||||
<el-option v-for="item in rootCategories" :key="parseInt(item.id)" :label="item.name" :value="parseInt(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="分类名称" prop="name">
|
||||
<el-input v-model="queryParams.name" placeholder="请输入分类名称" clearable size="small"
|
||||
@keyup.enter.native="handleQuery"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
|
||||
<el-option v-for="dict in commonStatusDatum" :key="parseInt(dict.value)" :label="dict.label"
|
||||
:value="parseInt(dict.value)"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 操作工具栏 -->
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
|
||||
v-hasPermi="['mall:product-category:create']">新增
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
|
||||
v-hasPermi="['mall:product-category:export']">导出
|
||||
</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<!-- 列表 -->
|
||||
<el-table v-loading="loading" :data="list">
|
||||
<el-table-column label="编号" align="center" prop="id" width="90"/>
|
||||
<el-table-column label="名称" align="center" prop="name" width="360px"/>
|
||||
<el-table-column label="图片" align="center" prop="picUrl" width="100px">
|
||||
<template slot-scope="scope">
|
||||
<el-image style="width: 80px; height: 80px"
|
||||
:src="scope.row.picUrl" fit="fit" :preview-src-list="imageList">
|
||||
</el-image>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="描述" align="center" prop="description" width="150" :show-overflow-tooltip="true"/>
|
||||
<el-table-column label="状态" align="center" prop="status">
|
||||
<template slot-scope="scope">
|
||||
<el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1"
|
||||
@change="handleStatusChange(scope.row)"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="排序" align="center" prop="sort"/>
|
||||
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button size="mini" type="text" icon="el-icon-view" :disabled="scope.row.pid !== 0"
|
||||
@click="handleChildQuery(scope.row)" v-hasPermi="['mall:product-category:query']">查看下级
|
||||
</el-button>
|
||||
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['mall:product-category:update']">修改
|
||||
</el-button>
|
||||
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
|
||||
v-hasPermi="['mall:product-category:delete']">删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 分页组件 -->
|
||||
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"/>
|
||||
|
||||
<!-- 对话框(添加 / 修改) -->
|
||||
<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-item label="分类栏目" prop="pid">
|
||||
<el-select v-model="form.pid" filterable placeholder="请选择" clearable>
|
||||
<el-option :value="parseInt(0)" label="顶级栏目"></el-option>
|
||||
<el-option v-for="item in rootCategories" :key="parseInt(item.id)" :label="item.name" :value="parseInt(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="名称" prop="name">
|
||||
<el-input v-model="form.name" placeholder="请输入分类名称"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="图片" prop="picUrl">
|
||||
<el-upload ref="upload" action="#"
|
||||
list-type="picture-card" :limit="1" :file-list="uploadList"
|
||||
:before-upload="handleBeforeUpload" :http-request="handleUpload"
|
||||
:on-exceed="handleExceed" :on-preview="handlePictureCardPreview">
|
||||
<i class="el-icon-plus"></i>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
<el-form-item label="排序" prop="sort">
|
||||
<el-input v-model="form.sort" placeholder="请输入分类排序"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态" prop="status">
|
||||
<el-radio-group v-model="form.status">
|
||||
<el-radio v-for="dict in commonStatusDatum" :key="parseInt(dict.value)" :label="parseInt(dict.value)">
|
||||
{{ dict.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="描述" prop="description">
|
||||
<el-input type="textarea" :autosize="{ minRows: 2, maxRows: 4}" v-model="form.description"
|
||||
placeholder="请输入品牌描述"/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
createProductCategory,
|
||||
updateProductCategory,
|
||||
updateProductCategoryStatus,
|
||||
deleteProductCategory,
|
||||
getProductCategory,
|
||||
getProductRootCategory,
|
||||
getProductCategoryPage,
|
||||
exportProductCategoryExcel
|
||||
} from "@/api/mall/product/category";
|
||||
import {DICT_TYPE, getDictDatas} from "@/utils/dict";
|
||||
import {uploadFile} from "@/api/infra/file";
|
||||
import {SysCommonStatusEnum} from "@/utils/constants";
|
||||
|
||||
const defaultForm = {
|
||||
id: null,
|
||||
pid: null,
|
||||
name: '',
|
||||
description: '',
|
||||
picUrl: '',
|
||||
sort: null,
|
||||
status: null,
|
||||
};
|
||||
|
||||
export default {
|
||||
name: "ProductCategory",
|
||||
components: {},
|
||||
data() {
|
||||
return {
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 商品分类列表
|
||||
list: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
dateRangeCreateTime: [],
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
pid: null,
|
||||
name: null,
|
||||
description: null,
|
||||
picUrl: null,
|
||||
sort: null,
|
||||
status: null,
|
||||
},
|
||||
// 表单参数
|
||||
form: JSON.parse(JSON.stringify(defaultForm)),
|
||||
// 表单校验
|
||||
rules: {
|
||||
pid: [{required: true, message: "父分类编号不能为空", trigger: "blur"}],
|
||||
name: [{required: true, message: "分类名称不能为空", trigger: "blur"}],
|
||||
sort: [{required: true, message: "分类排序不能为空", trigger: "blur"}],
|
||||
status: [{required: true, message: "状态不能为空", trigger: "blur"}],
|
||||
},
|
||||
// 跟类目分类列表
|
||||
rootCategories: [],
|
||||
// 图片列表
|
||||
imageList: [],
|
||||
// 通用状态
|
||||
commonStatusDatum: getDictDatas(DICT_TYPE.SYS_COMMON_STATUS),
|
||||
// 表单loading
|
||||
formLoading: false,
|
||||
// 表单loading 文本
|
||||
formLoadingText: '',
|
||||
// 预览图片状态
|
||||
pictureCardPreviewOpen: false,
|
||||
// 预览图片URL
|
||||
pictureCardPreviewUrl: '',
|
||||
// 上传文件列表
|
||||
uploadList: [],
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getCategoryRoots();
|
||||
this.getList();
|
||||
},
|
||||
methods: {
|
||||
/** 查询列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
// 处理查询参数
|
||||
let params = {...this.queryParams};
|
||||
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
|
||||
// 执行查询
|
||||
getProductCategoryPage(params).then(response => {
|
||||
this.list = response.data.list;
|
||||
this.imageList = [];
|
||||
response.data.list.forEach(o => this.imageList.push(o.picUrl));
|
||||
this.total = response.data.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
/** 取消按钮 */
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
},
|
||||
/** 表单重置 */
|
||||
reset() {
|
||||
this.form = JSON.parse(JSON.stringify(defaultForm));
|
||||
this.resetForm("form");
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNo = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.dateRangeCreateTime = [];
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset();
|
||||
this.open = true;
|
||||
this.title = "添加商品分类";
|
||||
if (this.queryParams.pid !== null) {
|
||||
this.form.pid = this.queryParams.pid;
|
||||
}
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.reset();
|
||||
const id = row.id;
|
||||
getProductCategory(id).then(response => {
|
||||
this.form = response.data;
|
||||
this.uploadList = [{
|
||||
name: response.data.picUrl,
|
||||
url: response.data.picUrl
|
||||
}];
|
||||
this.open = true;
|
||||
this.title = "修改商品分类";
|
||||
});
|
||||
},
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (!valid) {
|
||||
return;
|
||||
}
|
||||
// 修改的提交
|
||||
if (this.form.id != null) {
|
||||
updateProductCategory(this.form).then(response => {
|
||||
this.msgSuccess("修改成功");
|
||||
this.open = false;
|
||||
this.form = JSON.parse(JSON.stringify(defaultForm));
|
||||
this.getList();
|
||||
});
|
||||
return;
|
||||
}
|
||||
// 添加的提交
|
||||
createProductCategory(this.form).then(response => {
|
||||
this.msgSuccess("新增成功");
|
||||
this.open = false;
|
||||
this.form = JSON.parse(JSON.stringify(defaultForm));
|
||||
this.getList();
|
||||
});
|
||||
});
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const id = row.id;
|
||||
this.$confirm('是否确认删除商品分类编号为"' + id + '"的数据项?', "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function () {
|
||||
return deleteProductCategory(id);
|
||||
}).then(() => {
|
||||
this.getList();
|
||||
this.msgSuccess("删除成功");
|
||||
})
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
// 处理查询参数
|
||||
let params = {...this.queryParams};
|
||||
params.pageNo = undefined;
|
||||
params.pageSize = undefined;
|
||||
this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
|
||||
// 执行导出
|
||||
this.$confirm('是否确认导出所有商品分类数据项?', "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function () {
|
||||
return exportProductCategoryExcel(params);
|
||||
}).then(response => {
|
||||
this.downloadExcel(response, '商品分类.xls');
|
||||
})
|
||||
},
|
||||
/** 获取顶级分类列表 */
|
||||
getCategoryRoots() {
|
||||
getProductRootCategory().then(res => {
|
||||
this.rootCategories = res.data;
|
||||
})
|
||||
},
|
||||
/** 执行修改状态 */
|
||||
handleStatusChange(row) {
|
||||
let text = row.status === SysCommonStatusEnum.ENABLE ? "启用" : "停用";
|
||||
// '确认要"' + text + '""' + row.name + '"当前商品品牌吗?'
|
||||
this.$confirm(`确定要[${text}] "${row.name}"当商品分类吗?`, "警告", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(function() {
|
||||
return updateProductCategoryStatus(row.id, row.status);
|
||||
}).then(() => {
|
||||
this.msgSuccess(text + "成功");
|
||||
}).catch(function() {
|
||||
row.status = row.status === SysCommonStatusEnum.ENABLE ? SysCommonStatusEnum.DISABLE
|
||||
: SysCommonStatusEnum.ENABLE;
|
||||
});
|
||||
},
|
||||
/** 执行子类目搜索 */
|
||||
handleChildQuery(row) {
|
||||
this.queryParams.pid = row.id;
|
||||
this.queryParams.name = '';
|
||||
this.queryParams.status = null;
|
||||
this.getList();
|
||||
},
|
||||
/**图片超出限制*/
|
||||
handleExceed() {
|
||||
this.$message.warning("图片选择已达上限,请删除后重新选择");
|
||||
},
|
||||
/**图片上传之前的逻辑处理*/
|
||||
handleBeforeUpload(file) {
|
||||
if (file.type.indexOf("image/") === -1) {
|
||||
this.$message.error("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
|
||||
} else {
|
||||
this.formLoading = true;
|
||||
this.formLoadingText = "图片上传中。。。";
|
||||
const reader = new FileReader();
|
||||
reader.readAsDataURL(file);
|
||||
reader.onload = () => {
|
||||
this.form.picUrl = reader.result;
|
||||
};
|
||||
}
|
||||
},
|
||||
/**重新图片上传逻辑*/
|
||||
handleUpload(file) {
|
||||
let formData = new FormData();
|
||||
let path = new Date().getTime() + file.file.name.substring(file.file.name.lastIndexOf("."));
|
||||
formData.append("file", file.file);
|
||||
formData.append("path", path)
|
||||
uploadFile(formData).then(res => {
|
||||
this.form.picUrl = res.data;
|
||||
this.$message.success("图片上传成功");
|
||||
this.formLoading = false;
|
||||
}).catch(error => {
|
||||
this.formLoading = true;
|
||||
this.$message.error(error.msg());
|
||||
})
|
||||
},
|
||||
/**图片预览*/
|
||||
handlePictureCardPreview(file) {
|
||||
this.pictureCardPreviewUrl = file.url;
|
||||
this.pictureCardPreviewOpen = true;
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
Loading…
Reference in New Issue