章節感悟:
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);
這里運用到了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; } }
然后在service中插入狀態時則可以,如下寫這樣
productInfoRepository.findByProductStatus(ProductStatusEnum.UP.getCode());
視頻中用pageRequest來創建pageable對象,IDEA自動檢查出了過時提醒
PageRequest request = PageRequest.of(0, 2);
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
打上@Controller和路徑@RequestMapping(“/buyer/product”)
然后在application.yml中配置項目上下文路徑名:
server:
servlet:
context-path: /sell
3.根據分析,返回的數據中應該包含三個對象

4.創建一個VO(viewObject)包,約定返回前端的類都使用這個包下面的東西
為什么不用原有的dataObject類呢?因為原有的DataObject類中包含很多隱私,比如庫存量之內的,保密所以重新創建類。
ResultVo類,這里我們是用了泛型,因為這個具體內容可能是很多種類型
@Data public class ResultVO<T> { /** 錯誤碼 */ private Integer code; /** 提示信息 */ private String msg; /** 具體內容 */ private T data; }
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; }
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; }
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格式,並且只查詢數據庫一次。進行組裝的時候可以用算法減少時間復雜度。
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; }

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; } }
7.設置虛擬機的url的域名,ip地址映射,本地域名和本地IP地址映射

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

修改對應IP地址以及域名


修改本機對應域名
document.cookie="openid=aaaaa"
