Controller层设计
1.前端设计api:这个api是前端给后端的
商品列表
GET /sell/buyer/product/list
参数
无
返回
{
"code": 0,
"msg": "成功",
"data": [
{
"name": "热榜",
"type": 1,
"foods": [
{
"id": "123456",
"name": "皮蛋粥",
"price": 1.2,
"description": "好吃的皮蛋粥",
"icon": "http://xxx.com",
}
]
},
{
"name": "好吃的",
"type": 2,
"foods": [
{
"id": "123457",
"name": "慕斯蛋糕",
"price": 10.9,
"description": "美味爽口",
"icon": "http://xxx.com",
}
]
}
]
}
开发的时候基本都是后端定义api,这里的api是前端定义的,有get请求,有返回值
2.创建一个BuyerProductController
3.根据分析,返回的数据中应该包含三个对象
4.创建一个VO(viewObject)包,约定返回前端的类都使用这个包下面的东西
@Data
public class ResultVO<T> {
/** 错误码 */
private Integer code;
/** 提示信息 */
private String msg;
/** 具体内容 */
private T data;
}
ProductVo类,这里的@JsonProperty,指的是序列化之后传到前台是标签中的名字
@Data
public class ProductVO {
@JsonProperty("name")
private String categoryName;
@JsonProperty("type")
private Integer categoryType;
@JsonProperty("foods")
private List<ProductInfoVO> productInfoVOList;
}
@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;
}
Controller中操作一下可以显示成下图:
@GetMapping("/list")
@ResponseBody
public ResultVO list(){
ResultVO resultVO = new ResultVO();
resultVO.setCode(0);
resultVO.setMsg("成功");
ProductVO productVO = new ProductVO();
ProductInfoVO productInfoVO = new ProductInfoVO();
productVO.setProductInfoVOList(Arrays.asList(productInfoVO));
resultVO.setData(Arrays.asList(productVO));
return resultVO;
}
5.将这些类组装成api中需求的json格式,并且只查询数据库一次。
6.封装一个返回的工具类ResultVOUtils
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(code);
resultVO.setMsg(msg);
return resultVO;
}
}
controller代码:
@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.findUpAll();
//2.查询类目(一次性查询)
/* 传统方法
List<Integer> categoryTypeList = new ArrayList<>();
for (ProductInfo productInfo:productInfoList){
categoryTypeList.add(productInfo.getCategoryType());
}*/
//精简方法(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();
BeanUtils.copyProperties(productInfo,productInfoVO); //(1,2)将1拷贝到2;不用挨个用set方法
productInfoVOList.add(productInfoVO);
}
}
productVO.setProductInfoVOList(productInfoVOList);
productVOList.add(productVO);
}
return ResultVOUtil.success(productVOList);
}
}
结果: