package com.imooc.sell.repository;
import com.imooc.sell.dataobject.ProductInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* @author GXX
* @data 2018/7/11 21:03
*/
public interface ProductInfoRepository extends JpaRepository<ProductInfo,String> {
List<ProductInfo> findByProductStatus(Integer productStatus);
}
3.生成ProductInfoRepositoryTest.java文件 【Dao 测试类】
package com.imooc.sell.repository;
import com.imooc.sell.dataobject.ProductInfo;
import com.imooc.sell.enums.ProductStatusEnum;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.math.BigDecimal;
import java.util.List;
import static org.junit.Assert.*;
/**
* @author GXX
* @data 2018/7/11 21:05
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProductInfoRepositoryTest {
@Autowired
private ProductInfoRepository repository;
@Test
public void SaveTest(){
ProductInfo productInfo = new ProductInfo();
productInfo.setProductId("123456");
productInfo.setProductName("皮蛋瘦肉粥");
productInfo.setProductPrice(new BigDecimal(3.2));
productInfo.setProductStock(100);
productInfo.setProductDescription("粥饭世家精品");
productInfo.setProductIcon("http://xxx.jpg");
productInfo.setProductStatus(0);
productInfo.setCategoryType(ProductStatusEnum.UP.getCode());
ProductInfo result = repository.save(productInfo);
Assert.assertNotNull(result);
}
@Test
public void findByProductStatus() {
List<ProductInfo> productInfoList = repository.findByProductStatus(0);
Assert.assertNotEquals(0,productInfoList.size());
}
}
4.生成ProductService.java文件 【Service】
package com.imooc.sell.service;
import com.imooc.sell.dataobject.ProductInfo;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author GXX
* @data 2018/7/11 21:12
*/
@Service
public interface ProductService {
ProductInfo save(ProductInfo productInfo);
List<ProductInfo> findAll();
Page<ProductInfo> findAll(Pageable pageable);
ProductInfo findById(String productId);
//加库存
//减库存
}
5.生成ProductServiceImpl.java文件 【ServiceImpl 】
package com.imooc.sell.service.impl;
import com.imooc.sell.dataobject.ProductInfo;
import com.imooc.sell.enums.ProductStatusEnum;
import com.imooc.sell.repository.ProductInfoRepository;
import com.imooc.sell.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author GXX
* @data 2018/7/11 21:15
*/
@Service
public class ProductServiceImpl implements ProductService{
@Autowired
private ProductInfoRepository repository;
@Override
public ProductInfo save(ProductInfo productInfo) {
return repository.save(productInfo);
}
@Override
public List<ProductInfo> findAll() {
return repository.findByProductStatus(ProductStatusEnum.UP.getCode());
}
@Override
public Page<ProductInfo> findAll(Pageable pageable) {
return repository.findAll(pageable);
}
@Override
public ProductInfo findById(String productId) {
return repository.findById(productId).orElse(null);
}
}
6.生成ProductServiceImplTest.java文件 【ServiceImpl 测试类】
package com.imooc.sell.service.impl;
import com.imooc.sell.dataobject.ProductInfo;
import com.imooc.sell.enums.ProductStatusEnum;
import com.imooc.sell.service.ProductService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.test.context.junit4.SpringRunner;
import java.math.BigDecimal;
import java.util.List;
import static org.junit.Assert.*;
/**
* @author GXX
* @data 2018/7/11 21:31
*/
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class ProductServiceImplTest {
@Autowired
private ProductServiceImpl productService;
@Test
public void save() throws Exception{
ProductInfo productInfo = new ProductInfo();
productInfo.setProductId("123457");
productInfo.setProductName("皮皮虾");
productInfo.setProductPrice(new BigDecimal(5.2));
productInfo.setProductStock(100);
productInfo.setProductDescription("粥饭世家极品");
productInfo.setProductIcon("http://xxx.jpg");
productInfo.setProductStatus(0);
productInfo.setCategoryType(ProductStatusEnum.UP.getCode());
ProductInfo result = productService.save(productInfo);
Assert.assertNotNull(result);
}
@Test
public void findAll() throws Exception{
List<ProductInfo> productInfoList = productService.findAll();
Assert.assertNotEquals(0,productInfoList.size());
}
@Test
public void findAll1() throws Exception{
PageRequest result = new PageRequest(0,2);
Page<ProductInfo> productInfo = productService.findAll(result);
log.info(String.valueOf(productInfo.getTotalElements()));
}
@Test
public void findById() {
ProductInfo productInfo = productService.findById("123456");
Assert.assertNotEquals(0,productInfo.getProductId());
}
}
7.生成ProductStatusEnum.java文件 【Enum 枚举 】
package com.imooc.sell.enums;
import lombok.Getter;
/**
* @author GXX
* @data 2018/7/11 21:25
*/
@Getter
public enum ProductStatusEnum {
UP(0,"在架"),
DOWN(1,"下架")
;
private Integer code;
private String message;
ProductStatusEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
}
8.生成ResultVoUtil文件 [json 返回值]
package com.imooc.sell.utils;
import com.imooc.sell.VO.ResultVO;
/**
* @author GXX
* @data 2018/7/11 22:45
*/
public class ResultVOUtil {
public static ResultVO success(Object object){
ResultVO resultVO = new ResultVO();
resultVO.setData(object);
resultVO.setCode(0);
resultVO.setMsg("成功");
return resultVO;
}
public static ResultVO success(){
return success(null);
}
public static ResultVO error(Integer code,String msg){
ResultVO resultVO = new ResultVO();
resultVO.setCode(1);
resultVO.setMsg(msg);
return resultVO;
}
}
9.配置Json格式 ProductInfoVo [json 返回值]
package com.imooc.sell.VO;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* 商品详情
* @author GXX
* @data 2018/7/11 22:08
*/
@Data
public class ProductInfoVO {
@JsonProperty("id")
private String productId;
@JsonProperty("name")
private String productName;
@JsonProperty("price")
private BigDecimal productPrice;
@JsonProperty("description")
private String productDescription;
@JsonProperty("icon")
private String productIcon;
}
9.配置Json格式 ProductVO [json 返回值]
package com.imooc.sell.VO;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.imooc.sell.dataobject.ProductInfo;
import lombok.Data;
import java.util.List;
/**
* 商品包含类目
* @author GXX
* @data 2018/7/11 22:05
*/
@Data
public class ProductVO {
@JsonProperty("name")
private String categoryName;
@JsonProperty("type")
private Integer categoryType;
@JsonProperty("foods")
private List<ProductInfoVO> productInfoVOList;
}
9.配置Json格式 ResultVO [json 返回值]
package com.imooc.sell.VO;
import lombok.Data;
/**
* http请求返回的最外层的结构
* @author GXX
* @data 2018/7/11 21:55
*/
@Data
public class ResultVO<T> {
/** 错误码. */
private Integer code;
/** 提示信息. */
private String msg;
/** 具体内容. */
private T data;
}
10.新建BuyerProductController.java [调用拼装 JSON 格式]
package com.imooc.sell.controller;
import com.imooc.sell.VO.ProductInfoVO;
import com.imooc.sell.VO.ProductVO;
import com.imooc.sell.VO.ResultVO;
import com.imooc.sell.dataobject.ProductCategory;
import com.imooc.sell.dataobject.ProductInfo;
import com.imooc.sell.service.CategoryService;
import com.imooc.sell.service.ProductService;
import com.imooc.sell.utils.ResultVOUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author GXX
* @data 2018/7/11 21:50
*/
@RestController
@RequestMapping("/buyer/product")
public class BuyerProductController {
@Autowired
private ProductService productService;
@Autowired
private CategoryService categoryService;
@GetMapping("/list")
public ResultVO List(){
//1.先查询所有上架商品
List<ProductInfo> productInfoList = productService.findAll();
//2.查询类目分组(一次性查询)
// List<Integer> categoryTypeList = new ArrayList<>();
//传统方法
// for (ProductInfo productInfo: productInfoList){
// categoryTypeList.add(productInfo.getCategoryType());
// }
/**精简方法(java8, lambda)重点 做技术的人不要太念旧了。。。*/
List<Integer> categoryTypeList = productInfoList.stream()
.map(e -> e.getCategoryType())
.collect(Collectors.toList());
List<ProductCategory> productCategoryList = categoryService.findByCategoryTypeIn(categoryTypeList);
//3.数据拼装
List<ProductVO> productVOList = new ArrayList<>();
for (ProductCategory productCategory: productCategoryList){
ProductVO productVO = new ProductVO();
productVO.setCategoryType(productCategory.getCategoryType());
productVO.setCategoryName(productCategory.getCategoryName());
List<ProductInfoVO> productInfoVOList = new ArrayList<>();
for(ProductInfo productInfo:productInfoList){
if(productInfo.getCategoryType().equals(productCategory.getCategoryType())){
ProductInfoVO productInfoVO = new ProductInfoVO();
/**拷贝 productInfo 相同字段. */
BeanUtils.copyProperties(productInfo,productInfoVO);
productInfoVOList.add(productInfoVO);
}
}
productVO.setProductInfoVOList(productInfoVOList);
productVOList.add(productVO);
}
return ResultVOUtil.success(productVOList);
}
}