微信点餐之买家商品(4)
创建javabean
com\imooc\vo\admin\ProductInfo.java
package com.imooc.vo.admin;
import lombok.Data;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author: menghaibin
* @create: 2020-02-09 22:27
* @description: 商品实体类(后台使用)
**/
Entity /*jpa 数据库映射成对象*/
Data /*需要pom引入lombok插件以及idea安装此插件,自动会有get set tostring方法*/
@DynamicUpdate /*动态的更新修改时间*/
@Table(name = "product_info")
public class ProductInfo {
@Id
@Column(name = "product_id")
private String productId;
/*商品名称*/
@Column(name = "product_name")
private String productName;
/*商品单价*/
@Column(name = "product_price")
private BigDecimal productPrice;
/*商品库存*/
@Column(name = "product_stock")
private Integer productStock;
/*商品描述*/
@Column(name = "product_description")
private String productDescription;
/*商品小图路径*/
@Column(name = "product_icon")
private String productIcon;
/*商品状态 0正常 1下架*/
@Column(name = "product_status")
private Integer productStatus;
/*类目编号*/
@Column(name = "category_type")
private Integer categoryType;
/*创建时间*/
@Column(name = "create_time")
private Date createTime;
/*修改时间*/
@Column(name = "update_time")
private Date updateTime;
}
创建dao层接口
com\imooc\dao\ProductInfoDao.java
package com.imooc.dao;
import com.imooc.vo.admin.ProductInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* @author: menghaibin
* @create: 2020-02-08 22:12
* @description: 商品数据操作层
**/
public interface ProductInfoDao extends JpaRepository<ProductInfo,String>{
/*查询上架的商品*/
List<ProductInfo> findByProductStatus(Integer ProductStatus);
}
创建service层接口
com\imooc\service\ProductInfoService.java
package com.imooc.service;
import com.imooc.dto.CartDTO;
import com.imooc.vo.admin.ProductInfo;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.List;
public interface ProductInfoService {
/*查询单个产品*/
ProductInfo findOne(String ProductId);
/*查询上架的商品列表*/
List<ProductInfo> findUpAll();
/*查询所有产品 Pageable:分页*/
Page<ProductInfo> findAll(Pageable pageable);
/*更新或者添加商品*/
ProductInfo save(ProductInfo productInfo);
}
实现service层接口
定义商品状态枚举类:生成商品状态常量
com\imooc\vo\enums\ProductStatusEnum.java
创建类型【enum】
package com.imooc.vo.enums;
import lombok.Getter;
/**
* 商品状态(枚举)
* Created by Administrator on 2020/2/9.
*/
@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;
}
}
实现service层接口
com\imooc\service\imp\ProductInfoServiceImp.java
package com.imooc.service.imp;
import com.imooc.dao.ProductInfoDao;
import com.imooc.service.ProductInfoService;
import com.imooc.vo.admin.ProductInfo;
import com.imooc.vo.enums.ProductStatusEnum;
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: menghaibin
* @create: 2020-02-09 23:05
* @description: 商品实现类
**/
@Service/*service注解*/
public class ProductInfoServiceImp implements ProductInfoService{
/*注入dao层依赖*/
@Autowired
private ProductInfoDao productInfoDao;
/*查询单个产品*/
@Override
public ProductInfo findOne(String ProductId) {
return productInfoDao.findOne(ProductId);
}
/*查询上架的商品列表,参数使用枚举定义的常量*/
@Override
public List<ProductInfo> findUpAll() {
return productInfoDao.findByProductStatus(ProductStatusEnum.up.getCode());
}
/*查询所有产品 Pageable:分页*/
@Override
public Page<ProductInfo> findAll(Pageable pageable) {
return productInfoDao.findAll(pageable);
}
/*更新或者添加商品*/
@Override
public ProductInfo save(ProductInfo productInfo) {
return productInfoDao.save(productInfo);
}
}
创建controller层
买家端商品展示效果图:
前端请求:GET请求 /sell/buyer/product/list
参数:无
返回值:JSON
JSON数据分析:三层数据,第三层为商品list、第二层为类目对应的商品,也是一个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",
}
]
}
]
}
首先定义第一层的返回对象
com\imooc\vo\front\ResultVo.java
package com.imooc.vo.front;
import lombok.Data;
/**
* @author: menghaibin
* @create: 2020-02-10 11:11
* @description: 前台商品数据返回对象
**/
@Data
public class ResultVo<T> {
/*返回码*/
private Integer code;
/*提示信息*/
private String msg;
/*具体内容*/
private T data;
}
然后定义第二层的返回对象
com\imooc\vo\front\ResultProductVo.java
package com.imooc.vo.front;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
/**
* @author: menghaibin
* @create: 2020-02-10 11:18
* @description: 查询买家商品
**/
@Data
public class ResultProductVo {
@JsonProperty("name") /*以name的名字返回给前台*/
/*类目名称*/
private String categoryName;
@JsonProperty("type") /*以type的名字返回给前台*/
/*类目编号*/
private Integer categoryType;
@JsonProperty("foods")/*以foods的名字返回给前台*/
/*商品集合*/
private List<ProductInfoVo> productInfoVoList;
}
最后定义第三层的返回对象(虽然可以用ProductInfo,但返回的字段比较少,为了安全 所以还是分开)
com\imooc\vo\front\ProductInfoVo.java
package com.imooc.vo.front;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author: menghaibin
* @create: 2020-02-10 11:24
* @description: 前台商品查询的对象(不暴露多于字段)
**/
@Data
public class ProductInfoVo {
@JsonProperty("id")/*以id的名字返回给前台*/
private String productId;
/*商品名称*/
@JsonProperty("name")/*以name的名字返回给前台*/
private String productName;
/*商品单价*/
@JsonProperty("price")/*以price的名字返回给前台*/
private BigDecimal productPrice;
/*商品描述*/
@JsonProperty("description")/*以description的名字返回给前台*/
private String productDescription;
/*商品小图路径*/
@JsonProperty("icon")/*以icon的名字返回给前台*/
private String productIcon;
}
创建controller访问层
com\imooc\controller\BuyerProductController.java
package com.imooc.controller;
import com.imooc.service.ProductCategoryService;
import com.imooc.service.ProductInfoService;
import com.imooc.vo.admin.ProductCategory;
import com.imooc.vo.admin.ProductInfo;
import com.imooc.vo.front.ProductInfoVo;
import com.imooc.vo.front.ResultProductVo;
import com.imooc.vo.front.ResultVo;
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.List;
/**
* @author: menghaibin
* @create: 2020-02-10 10:43
* @description: 买家商品展示
**/
@RestController
@RequestMapping("/buyer/product")
public class BuyerProductController {
/*注入商品service注解*/
@Autowired
private ProductInfoService productInfoService;
/*注入商品类目注解*/
@Autowired
private ProductCategoryService productCategoryService;
@GetMapping("/list")
public ResultVo list(){
/*1:查询所有上架的商品*/
List<ProductInfo> productInfoList =productInfoService.findUpAll();
/*2:根据上架的商品查询所属类目*/
List<Integer> cateoryTypeList = new ArrayList<>();
//cateoryTypeList取值
for(ProductInfo productInfo : productInfoList){
cateoryTypeList.add(productInfo.getCategoryType());
}
/*如果cateoryTypeList里面有重复的,用in查询的时候会排重*/
/*查询出已上架产品对应的类目对象*/
List<ProductCategory> productCategoryList =productCategoryService.findByCategoryTypeIn(cateoryTypeList);
/* 封装第二层类目对应商品的list*/
List<ResultProductVo> resultProductVoList = new ArrayList<>();
//遍历查询得到的类目
for(ProductCategory productCategory : productCategoryList){//遍历类目
ResultProductVo resultProductVo = new ResultProductVo();
//
resultProductVo.setCategoryType(productCategory.getCategoryType());//得到类目id
resultProductVo.setCategoryName(productCategory.getCategoryName());//得到类目名称
// 封装第三层商品list
List<ProductInfoVo> productInfoVoList = new ArrayList<>();
for(ProductInfo productInfo : productInfoList){//遍历所有上线的商品
//判断商品的类目是否和类目结果相等
if(productInfo.getCategoryType().equals(productCategory.getCategoryType())){
//定义要返回的商品结果,把上线的商品信息ProductInfo重新封装到ProductInfoVo
ProductInfoVo productInfoVo = new ProductInfoVo();
productInfoVo.setProductId(productInfo.getProductId());
productInfoVo.setProductName(productInfo.getProductName());
productInfoVo.setProductPrice(productInfo.getProductPrice());
productInfoVo.setProductDescription(productInfo.getProductDescription());
productInfoVo.setProductIcon(productInfo.getProductIcon());
productInfoVoList.add(productInfoVo);//封装成商品信息list
}
}
//把商品信息list给resultProductVo对象
resultProductVo.setProductInfoVoList(productInfoVoList);
resultProductVoList.add(resultProductVo);
}
//最终返回第一层数据 页面的resultvo对象
ResultVo resultVo = new ResultVo();
resultVo.setCode(0);
resultVo.setMsg("成功");
resultVo.setData(resultProductVoList);
return resultVo;
}
}
测试访问:
http://127.0.0.1/sell/buyer/product/list
买家端界面通讯
1:进入虚拟机 修改nginx配置文件 把代理转发配置成应用所在的服务器ip
编辑命令:vim /usr/local/nginx/conf/nginx.conf
重启nginx:/usr/local/nginx/sbin/nginx -s reload
2:设置cookie(由于还未开发微信授权的功能,所以需要手动设置一个cookie)
【192.168.1.106为虚拟机的ip】
http://192.168.1.106/#/order
document.cookie='openid=abc'
cookie设置成功以后,访问:http://192.168.1.106/#/