Compare commits

...

6 Commits

Author SHA1 Message Date
chen quan ac54a32dd5 完成商品管理模块下的 商品分类管理,完成单元测试 2022-02-04 12:55:15 +08:00
chen quan cc6b7f1bb1 Merge remote-tracking branch 'origin/master' into mall_extension
# Conflicts:
#	sql/ruoyi-vue-pro.sql
#	yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysDictTypeConstants.java
#	yudao-admin-server/src/main/resources/application-local.yaml
#	yudao-admin-server/src/test/resources/sql/clean.sql
#	yudao-admin-server/src/test/resources/sql/create_tables.sql
#	yudao-admin-ui/src/router/index.js
#	yudao-admin-ui/src/utils/dict.js
2022-02-03 09:23:05 +08:00
chen quan c54fdbc35c 完成商品管理模块下的 商品品牌管理,完成单元测试 2022-01-27 15:58:36 +08:00
chen quan 4b495bc7da Merge remote-tracking branch 'origin/master' into mall_extension
# Conflicts:
#	sql/ruoyi-vue-pro.sql
#	yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysDictTypeConstants.java
#	yudao-admin-server/src/main/resources/application-local.yaml
#	yudao-admin-server/src/test/resources/sql/clean.sql
#	yudao-admin-server/src/test/resources/sql/create_tables.sql
#	yudao-admin-ui/src/utils/dict.js
2022-01-25 14:03:50 +08:00
YunaiV 75464ca79b code review 商品模块 2022-01-04 23:53:42 +08:00
chen quan 022a1046f1 创建商城模块,完成商品管理模块下的 商品规格键值管理,完成单元测试 2022-01-03 17:09:33 +08:00
83 changed files with 5315 additions and 31 deletions

40
sql/mall/mall-menu.sql Normal file
View File

@ -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);

View File

@ -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);

View File

@ -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));
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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 {
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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 {
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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 {
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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 {
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -0,0 +1,6 @@
/**
* 提供 POJO 类的实体转换
*
* 目前使用 MapStruct 框架
*/
package cn.iocoder.yudao.adminserver.modules.mall.convert;

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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"));
}
}

View File

@ -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));
}
}

View File

@ -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"));
}
}

View File

@ -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));
}
}

View File

@ -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, "当前商品分类存在子分类,无法删除");
}

View File

@ -0,0 +1,15 @@
package cn.iocoder.yudao.adminserver.modules.mall.enums;
/**
* 商品类别常量枚举
*
* @author aquan
*/
public interface MallProductCategoryConstants {
/**
* 分类根 PID
*/
Long CATEGORY_ROOT_PID = 0L;
}

View File

@ -0,0 +1,7 @@
/**
* mall 包下我们放商城相关模块
* 例如说商品spusku分类规格)订单正向交易逆向退款)营销营销活动优惠劵等等
*
* 缩写mall
*/
package cn.iocoder.yudao.adminserver.modules.mall;

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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));
}
}

View File

@ -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";

View File

@ -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 = '商品分类表'

View File

@ -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({

View File

@ -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'
})
}

View File

@ -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'
})
}

View File

@ -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'
})
}

View File

@ -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'
})
}

View File

@ -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,

View File

@ -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>

View File

@ -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>

View File

@ -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("文件格式错误,请上传图片类型,如JPGPNG后缀的文件。");
} 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>

View File

@ -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("文件格式错误,请上传图片类型,如JPGPNG后缀的文件。");
} 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>