diff --git a/mall-portal/src/main/java/com/macro/mall/portal/controller/PmsPortalProductController.java b/mall-portal/src/main/java/com/macro/mall/portal/controller/PmsPortalProductController.java new file mode 100644 index 0000000..0d173a8 --- /dev/null +++ b/mall-portal/src/main/java/com/macro/mall/portal/controller/PmsPortalProductController.java @@ -0,0 +1,60 @@ +package com.macro.mall.portal.controller; + +import com.macro.mall.common.api.CommonPage; +import com.macro.mall.common.api.CommonResult; +import com.macro.mall.model.PmsProduct; +import com.macro.mall.portal.domain.PmsPortalProductDetail; +import com.macro.mall.portal.domain.PmsProductCategoryNode; +import com.macro.mall.portal.service.PmsPortalProductService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 前台商品管理Controller + * Created by macro on 2020/4/6. + */ +@Controller +@Api(tags = "PmsPortalProductController", description = "前台商品管理") +@RequestMapping("/product") +public class PmsPortalProductController { + + @Autowired + private PmsPortalProductService portalProductService; + + @ApiOperation(value = "综合搜索、筛选、排序") + @ApiImplicitParam(name = "sort", value = "排序字段:0->按相关度;1->按新品;2->按销量;3->价格从低到高;4->价格从高到低", + defaultValue = "0", allowableValues = "0,1,2,3,4", paramType = "query", dataType = "integer") + @RequestMapping(value = "/search", method = RequestMethod.GET) + @ResponseBody + public CommonResult> search(@RequestParam(required = false) String keyword, + @RequestParam(required = false) Long brandId, + @RequestParam(required = false) Long productCategoryId, + @RequestParam(required = false, defaultValue = "0") Integer pageNum, + @RequestParam(required = false, defaultValue = "5") Integer pageSize, + @RequestParam(required = false, defaultValue = "0") Integer sort) { + List productList = portalProductService.search(keyword, brandId, productCategoryId, pageNum, pageSize, sort); + return CommonResult.success(CommonPage.restPage(productList)); + } + + @ApiOperation("以树形结构获取所有商品分类") + @RequestMapping(value = "/categoryTreeList", method = RequestMethod.GET) + @ResponseBody + public CommonResult> categoryTreeList() { + List list = portalProductService.categoryTreeList(); + return CommonResult.success(list); + } + + @ApiOperation("获取前台商品详情") + @RequestMapping(value = "/detail/{id}", method = RequestMethod.GET) + @ResponseBody + public CommonResult detail(@PathVariable Long id) { + PmsPortalProductDetail productDetail = portalProductService.detail(id); + return CommonResult.success(productDetail); + } +} diff --git a/mall-portal/src/main/java/com/macro/mall/portal/controller/PortalBrandController.java b/mall-portal/src/main/java/com/macro/mall/portal/controller/PortalBrandController.java new file mode 100644 index 0000000..5f976ce --- /dev/null +++ b/mall-portal/src/main/java/com/macro/mall/portal/controller/PortalBrandController.java @@ -0,0 +1,54 @@ +package com.macro.mall.portal.controller; + +import com.macro.mall.common.api.CommonPage; +import com.macro.mall.common.api.CommonResult; +import com.macro.mall.model.PmsBrand; +import com.macro.mall.model.PmsProduct; +import com.macro.mall.portal.service.PortalBrandService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 首页品牌推荐管理Controller + * Created by macro on 2020/5/15. + */ +@Controller +@Api(tags = "PortalBrandController", description = "前台品牌管理") +@RequestMapping("/brand") +public class PortalBrandController { + + @Autowired + private PortalBrandService homeBrandService; + + @ApiOperation("分页获取推荐品牌") + @RequestMapping(value = "/recommendList", method = RequestMethod.GET) + @ResponseBody + public CommonResult> recommendList(@RequestParam(value = "pageSize", defaultValue = "6") Integer pageSize, + @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) { + List brandList = homeBrandService.recommendList(pageNum, pageSize); + return CommonResult.success(brandList); + } + + @ApiOperation("获取品牌详情") + @RequestMapping(value = "/detail/{brandId}", method = RequestMethod.GET) + @ResponseBody + public CommonResult detail(@PathVariable Long brandId) { + PmsBrand brand = homeBrandService.detail(brandId); + return CommonResult.success(brand); + } + + @ApiOperation("分页获取品牌相关商品") + @RequestMapping(value = "/productList", method = RequestMethod.GET) + @ResponseBody + public CommonResult> productList(@RequestParam Long brandId, + @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, + @RequestParam(value = "pageSize", defaultValue = "6") Integer pageSize) { + CommonPage result = homeBrandService.productList(brandId,pageNum, pageSize); + return CommonResult.success(result); + } +} diff --git a/mall-portal/src/main/java/com/macro/mall/portal/dao/PortalProductDao.java b/mall-portal/src/main/java/com/macro/mall/portal/dao/PortalProductDao.java index 0e3a296..9a68d3a 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/dao/PortalProductDao.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/dao/PortalProductDao.java @@ -1,5 +1,6 @@ package com.macro.mall.portal.dao; +import com.macro.mall.model.SmsCoupon; import com.macro.mall.portal.domain.CartProduct; import com.macro.mall.portal.domain.PromotionProduct; import org.apache.ibatis.annotations.Param; @@ -13,4 +14,5 @@ import java.util.List; public interface PortalProductDao { CartProduct getCartProduct(@Param("id") Long id); List getPromotionProductList(@Param("ids") List ids); + List getAvailableCouponList(@Param("productId") Long productId,@Param("productCategoryId")Long productCategoryId); } diff --git a/mall-portal/src/main/java/com/macro/mall/portal/domain/PmsPortalProductDetail.java b/mall-portal/src/main/java/com/macro/mall/portal/domain/PmsPortalProductDetail.java new file mode 100644 index 0000000..10eeb20 --- /dev/null +++ b/mall-portal/src/main/java/com/macro/mall/portal/domain/PmsPortalProductDetail.java @@ -0,0 +1,33 @@ +package com.macro.mall.portal.domain; + +import com.macro.mall.model.*; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * 前台商品详情 + * Created by macro on 2020/4/6. + */ +@Getter +@Setter +public class PmsPortalProductDetail{ + @ApiModelProperty("商品信息") + private PmsProduct product; + @ApiModelProperty("商品品牌") + private PmsBrand brand; + @ApiModelProperty("商品属性与参数") + private List productAttributeList; + @ApiModelProperty("手动录入的商品属性与参数值") + private List productAttributeValueList; + @ApiModelProperty("商品的sku库存信息") + private List skuStockList; + @ApiModelProperty("商品阶梯价格设置") + private List productLadderList; + @ApiModelProperty("商品满减价格设置") + private List productFullReductionList; + @ApiModelProperty("商品可用优惠券") + private List couponList; +} diff --git a/mall-portal/src/main/java/com/macro/mall/portal/domain/PmsProductCategoryNode.java b/mall-portal/src/main/java/com/macro/mall/portal/domain/PmsProductCategoryNode.java new file mode 100644 index 0000000..053009e --- /dev/null +++ b/mall-portal/src/main/java/com/macro/mall/portal/domain/PmsProductCategoryNode.java @@ -0,0 +1,17 @@ +package com.macro.mall.portal.domain; + +import com.macro.mall.model.PmsProductCategory; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * 商品分类,包含子分类 + * Created by macro on 2020/4/6. + */ +@Getter +@Setter +public class PmsProductCategoryNode extends PmsProductCategory { + private List children; +} diff --git a/mall-portal/src/main/java/com/macro/mall/portal/service/PmsPortalProductService.java b/mall-portal/src/main/java/com/macro/mall/portal/service/PmsPortalProductService.java new file mode 100644 index 0000000..fdf3dea --- /dev/null +++ b/mall-portal/src/main/java/com/macro/mall/portal/service/PmsPortalProductService.java @@ -0,0 +1,28 @@ +package com.macro.mall.portal.service; + +import com.macro.mall.model.PmsProduct; +import com.macro.mall.portal.domain.PmsPortalProductDetail; +import com.macro.mall.portal.domain.PmsProductCategoryNode; + +import java.util.List; + +/** + * 前台商品管理Service + * Created by macro on 2020/4/6. + */ +public interface PmsPortalProductService { + /** + * 综合搜索商品 + */ + List search(String keyword, Long brandId, Long productCategoryId, Integer pageNum, Integer pageSize, Integer sort); + + /** + * 以树形结构获取所有商品分类 + */ + List categoryTreeList(); + + /** + * 获取前台商品详情 + */ + PmsPortalProductDetail detail(Long id); +} diff --git a/mall-portal/src/main/java/com/macro/mall/portal/service/PortalBrandService.java b/mall-portal/src/main/java/com/macro/mall/portal/service/PortalBrandService.java new file mode 100644 index 0000000..256db28 --- /dev/null +++ b/mall-portal/src/main/java/com/macro/mall/portal/service/PortalBrandService.java @@ -0,0 +1,28 @@ +package com.macro.mall.portal.service; + +import com.macro.mall.common.api.CommonPage; +import com.macro.mall.model.PmsBrand; +import com.macro.mall.model.PmsProduct; + +import java.util.List; + +/** + * 前台品牌管理Service + * Created by macro on 2020/5/15. + */ +public interface PortalBrandService { + /** + * 分页获取推荐品牌 + */ + List recommendList(Integer pageNum, Integer pageSize); + + /** + * 获取品牌详情 + */ + PmsBrand detail(Long brandId); + + /** + * 分页获取品牌关联商品 + */ + CommonPage productList(Long brandId, Integer pageNum, Integer pageSize); +} diff --git a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/PmsPortalProductServiceImpl.java b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/PmsPortalProductServiceImpl.java new file mode 100644 index 0000000..d29eaa0 --- /dev/null +++ b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/PmsPortalProductServiceImpl.java @@ -0,0 +1,142 @@ +package com.macro.mall.portal.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.github.pagehelper.PageHelper; +import com.macro.mall.mapper.*; +import com.macro.mall.model.*; +import com.macro.mall.portal.dao.PortalProductDao; +import com.macro.mall.portal.domain.PmsPortalProductDetail; +import com.macro.mall.portal.domain.PmsProductCategoryNode; +import com.macro.mall.portal.service.PmsPortalProductService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 前台订单管理Service实现类 + * Created by macro on 2020/4/6. + */ +@Service +public class PmsPortalProductServiceImpl implements PmsPortalProductService { + @Autowired + private PmsProductMapper productMapper; + @Autowired + private PmsProductCategoryMapper productCategoryMapper; + @Autowired + private PmsBrandMapper brandMapper; + @Autowired + private PmsProductAttributeMapper productAttributeMapper; + @Autowired + private PmsProductAttributeValueMapper productAttributeValueMapper; + @Autowired + private PmsSkuStockMapper skuStockMapper; + @Autowired + private PmsProductLadderMapper productLadderMapper; + @Autowired + private PmsProductFullReductionMapper productFullReductionMapper; + @Autowired + private PortalProductDao portalProductDao; + + @Override + public List search(String keyword, Long brandId, Long productCategoryId, Integer pageNum, Integer pageSize, Integer sort) { + PageHelper.startPage(pageNum, pageSize); + PmsProductExample example = new PmsProductExample(); + PmsProductExample.Criteria criteria = example.createCriteria(); + criteria.andDeleteStatusEqualTo(0); + if (StrUtil.isNotEmpty(keyword)) { + criteria.andNameLike("%" + keyword + "%"); + } + if (brandId != null) { + criteria.andBrandIdEqualTo(brandId); + } + if (productCategoryId != null) { + criteria.andProductCategoryIdEqualTo(productCategoryId); + } + //1->按新品;2->按销量;3->价格从低到高;4->价格从高到低 + if (sort == 1) { + example.setOrderByClause("id desc"); + } else if (sort == 2) { + example.setOrderByClause("sale desc"); + } else if (sort == 3) { + example.setOrderByClause("price asc"); + } else if (sort == 4) { + example.setOrderByClause("price desc"); + } + return productMapper.selectByExample(example); + } + + @Override + public List categoryTreeList() { + PmsProductCategoryExample example = new PmsProductCategoryExample(); + List allList = productCategoryMapper.selectByExample(example); + List result = allList.stream() + .filter(item -> item.getParentId().equals(0L)) + .map(item -> covert(item, allList)).collect(Collectors.toList()); + return result; + } + + @Override + public PmsPortalProductDetail detail(Long id) { + PmsPortalProductDetail result = new PmsPortalProductDetail(); + //获取商品信息 + PmsProduct product = productMapper.selectByPrimaryKey(id); + result.setProduct(product); + //获取品牌信息 + PmsBrand brand = brandMapper.selectByPrimaryKey(product.getBrandId()); + result.setBrand(brand); + //获取商品属性信息 + PmsProductAttributeExample attributeExample = new PmsProductAttributeExample(); + attributeExample.createCriteria().andProductAttributeCategoryIdEqualTo(product.getProductAttributeCategoryId()); + List productAttributeList = productAttributeMapper.selectByExample(attributeExample); + result.setProductAttributeList(productAttributeList); + //获取商品属性值信息 + if(CollUtil.isNotEmpty(productAttributeList)){ + List attributeIds = productAttributeList.stream().map(PmsProductAttribute::getId).collect(Collectors.toList()); + PmsProductAttributeValueExample attributeValueExample = new PmsProductAttributeValueExample(); + attributeValueExample.createCriteria().andProductIdEqualTo(product.getId()) + .andProductAttributeIdIn(attributeIds); + List productAttributeValueList = productAttributeValueMapper.selectByExample(attributeValueExample); + result.setProductAttributeValueList(productAttributeValueList); + } + //获取商品SKU库存信息 + PmsSkuStockExample skuExample = new PmsSkuStockExample(); + skuExample.createCriteria().andProductIdEqualTo(product.getId()); + List skuStockList = skuStockMapper.selectByExample(skuExample); + result.setSkuStockList(skuStockList); + //商品阶梯价格设置 + if(product.getPromotionType()==3){ + PmsProductLadderExample ladderExample = new PmsProductLadderExample(); + ladderExample.createCriteria().andProductIdEqualTo(product.getId()); + List productLadderList = productLadderMapper.selectByExample(ladderExample); + result.setProductLadderList(productLadderList); + } + //商品满减价格设置 + if(product.getPromotionType()==4){ + PmsProductFullReductionExample fullReductionExample = new PmsProductFullReductionExample(); + fullReductionExample.createCriteria().andProductIdEqualTo(product.getId()); + List productFullReductionList = productFullReductionMapper.selectByExample(fullReductionExample); + result.setProductFullReductionList(productFullReductionList); + } + //商品可用优惠券 + result.setCouponList(portalProductDao.getAvailableCouponList(product.getId(),product.getProductCategoryId())); + return result; + } + + + /** + * 初始对象转化为节点对象 + */ + private PmsProductCategoryNode covert(PmsProductCategory item, List allList) { + PmsProductCategoryNode node = new PmsProductCategoryNode(); + BeanUtils.copyProperties(item, node); + List children = allList.stream() + .filter(subItem -> subItem.getParentId().equals(item.getId())) + .map(subItem -> covert(subItem, allList)).collect(Collectors.toList()); + node.setChildren(children); + return node; + } +} diff --git a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/PortalBrandServiceImpl.java b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/PortalBrandServiceImpl.java new file mode 100644 index 0000000..a95bebf --- /dev/null +++ b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/PortalBrandServiceImpl.java @@ -0,0 +1,50 @@ +package com.macro.mall.portal.service.impl; + +import com.github.pagehelper.PageHelper; +import com.macro.mall.common.api.CommonPage; +import com.macro.mall.mapper.PmsBrandMapper; +import com.macro.mall.mapper.PmsProductMapper; +import com.macro.mall.model.PmsBrand; +import com.macro.mall.model.PmsProduct; +import com.macro.mall.model.PmsProductExample; +import com.macro.mall.portal.dao.HomeDao; +import com.macro.mall.portal.service.PortalBrandService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 前台品牌管理Service实现类 + * Created by macro on 2020/5/15. + */ +@Service +public class PortalBrandServiceImpl implements PortalBrandService { + @Autowired + private HomeDao homeDao; + @Autowired + private PmsBrandMapper brandMapper; + @Autowired + private PmsProductMapper productMapper; + + @Override + public List recommendList(Integer pageNum, Integer pageSize) { + int offset = (pageNum - 1) * pageSize; + return homeDao.getRecommendBrandList(offset, pageSize); + } + + @Override + public PmsBrand detail(Long brandId) { + return brandMapper.selectByPrimaryKey(brandId); + } + + @Override + public CommonPage productList(Long brandId, Integer pageNum, Integer pageSize) { + PageHelper.startPage(pageNum,pageSize); + PmsProductExample example = new PmsProductExample(); + example.createCriteria().andDeleteStatusEqualTo(0) + .andBrandIdEqualTo(brandId); + List productList = productMapper.selectByExample(example); + return CommonPage.restPage(productList); + } +} diff --git a/mall-portal/src/main/resources/application.yml b/mall-portal/src/main/resources/application.yml index f217199..bccd783 100644 --- a/mall-portal/src/main/resources/application.yml +++ b/mall-portal/src/main/resources/application.yml @@ -29,6 +29,8 @@ secure: - /actuator/** - /sso/** - /home/** + - /product/** + - /brand/** # 自定义redis key redis: diff --git a/mall-portal/src/main/resources/dao/PortalProductDao.xml b/mall-portal/src/main/resources/dao/PortalProductDao.xml index c5d4607..6ba886a 100644 --- a/mall-portal/src/main/resources/dao/PortalProductDao.xml +++ b/mall-portal/src/main/resources/dao/PortalProductDao.xml @@ -72,4 +72,31 @@ #{id} + \ No newline at end of file