微信点餐之买家商品(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/#/

posted @ 2020-04-01 14:31  努力的校长  阅读(186)  评论(0编辑  收藏  举报