微信點餐系統(五)-買家端商品


章節感悟:

1.jpa的使用,分頁,之前寫過的jpa的使用方法需要拿出來多看看

2.枚舉類型的使用

3.api的規范以及使用方式

4.組成一個json類型對象返回給前台

5.設置url路徑

6.序列化前端和數據庫的映射之間的異同

7.提取出ResultVOUtils工具類的使用,resultful接口實現前后端對應

8.設置本機Ip和域名,虛擬機Ip和域名,以及nginx的使用

 買家端商品

Dao層設計

1.創建實體類ProductInfo

2.創建持久層ProductInfoRepository接口

關於jpa的各種操作可以查看之前的博客,jpa的使用

3.單元測試

Service層設計

1.創建接口ProductInfoService,接口中聲明幾個方法

/**
 * 查找一件商品信息
 * @param productId
 * @return
 */
ProductInfo findOne(String productId);

/**
 * 查詢所有在架商品列表
 * @return
 */
List<ProductInfo> findUpAll();

/**
 * 查找所有商品分頁顯示
 * @param pageable
 * @return
 */
Page<ProductInfo> findAll(Pageable pageable);

/**
 * 保存一個商品信息
 * @param productInfo
 * @return
 */
ProductInfo save(ProductInfo productInfo);
View Code

這里運用到了jpa自帶的分頁

2.創建ProductInfoServiceImpl類,實現接口

3.創建一個productStatus枚舉類型,即上架(0),下架(1),包含進來

@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;
    }
}
View Code

然后在service中插入狀態時則可以,如下寫這樣

productInfoRepository.findByProductStatus(ProductStatusEnum.UP.getCode());
View Code

視頻中用pageRequest來創建pageable對象,IDEA自動檢查出了過時提醒

PageRequest request = PageRequest.of(0, 2);
View Code

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",
                }
            ]
        }
    ]
}
View Code

開發的時候基本都是后端定義api,這里的api是前端定義的,有get請求,有返回值

2.創建一個BuyerProductController

  打上@Controller和路徑@RequestMapping(“/buyer/product”)

  然后在application.yml中配置項目上下文路徑名:

server:
  servlet:
    context-path: /sell
View Code

3.根據分析,返回的數據中應該包含三個對象

4.創建一個VOviewObject)包,約定返回前端的類都使用這個包下面的東西

  為什么不用原有的dataObject類呢?因為原有的DataObject類中包含很多隱私,比如庫存量之內的,保密所以重新創建類。

  ResultVo類,這里我們是用了泛型,因為這個具體內容可能是很多種類型

@Data
public class ResultVO<T> {
    /** 錯誤碼 */
    private Integer code;
    /** 提示信息 */
    private String msg;
    /** 具體內容 */
    private T data;
}
View Code

  ProductVo類,這里的@JsonProperty,指的是序列化之后傳到前台是標簽中的名字

/**
 * 商品類目
 * @author Xiong YuSong
 * 2019/1/17 17:56
 */
@Data
public class ProductVO {
    @JsonProperty("name")
    private String categoryName;
    @JsonProperty("type")
    private Integer categoryType;
    @JsonProperty("foods")
    private List<ProductInfoVO> productInfoVOList;
}
View Code

  ProductInfoVO,原有的DataObject類中包含很多隱私,比如庫存量之內的,保密所以重新創建類.

/**
 * 商品詳情
 * @author Xiong YuSong
 * 2019/1/17 17:56
 */
@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;
}
View Code

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;
}
View Code

5.將這些類組裝成api中需求的json格式,並且只查詢數據庫一次。進行組裝的時候可以用算法減少時間復雜度。

  1)查詢所有商品

  2)通過商品查詢響應的類目

  3)拼裝

@Autowired
private ProductInfoServiceImpl productInfoService;
@Autowired
private ProductCategoryServiceImpl productCategoryService;

@GetMapping("/list")
@ResponseBody
public ResultVO list() {
    // 1)查詢所有上架商品
    List<ProductInfo> productInfoList = productInfoService.findUpAll();
    // 2)通過商品查詢響應的類目
    List<Integer> categoryTypeList = productInfoList.stream().map(x -> x.getCategoryType()).collect(Collectors.toList());
    List<ProductCategory> productCategoryList = productCategoryService.findByCategoryTypeIn(categoryTypeList);
    // 3)拼裝成對應的json
    List<ProductVO> productVOList = new ArrayList<>();
    for(ProductCategory productCategory:productCategoryList){
        ProductVO productVO = new ProductVO();
        productVO.setCategoryName(productCategory.getCategoryName());
        productVO.setCategoryType(productCategory.getCategoryType());
        List<ProductInfoVO> productInfoVOList = new ArrayList<>();
        for(ProductInfo productInfo:productInfoList){
            if(productCategory.getCategoryType().equals(productInfo.getCategoryType()) ){
                ProductInfoVO productInfoVO = new ProductInfoVO();
                BeanUtils.copyProperties(productInfo,productInfoVO);
                productInfoVOList.add(productInfoVO);
            }
        }
        productVO.setProductInfoVOList(productInfoVOList);
        productVOList.add(productVO);
    }

    ResultVO resultVO = new ResultVO();
    resultVO.setCode(0);
    resultVO.setMsg("成功");
    resultVO.setData(productVOList);
    return resultVO;
}
View Code

6.封裝一個返回的工具類ResultVOUtils

public class ResultVOUtils {

    public static ResultVO success(Object object){
        ResultVO resultVO = new ResultVO();
        resultVO.setData(object);
        resultVO.setMsg("成功");
        resultVO.setCode(0);
        return resultVO;
    }

    public static ResultVO success(){
        return success(null);
    }

    public static  ResultVO error(Integer code ,String msg){
        ResultVO resultVO = new ResultVO();
        resultVO.setMsg(msg);
        resultVO.setCode(code);
        return  resultVO;
    }
}
View Code

7.設置虛擬機的url的域名,ip地址映射,本地域名和本地IP地址映射

 

此時請求的是虛擬機的地址,但是后端業務是在本地地址,所以無法獲取數據,修改虛擬機中的nginx配置(Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。其特點是占有內存少,並發能力強,事實上nginx的並發能力確實在同類型的網頁服務器中表現較好。)

修改對應IP地址以及域名

修改本機對應域名

document.cookie="openid=aaaaa"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM