電商秒殺項目-商品模塊

!!儘可能地讓controller層簡單 讓service複雜
在做任何一個功能之前,首先不要去動數據庫,優先考慮領域模型是要做成什麼樣的,先設計領域模型,再設計表
先建立model,分析它的模型行爲。
在這個項目中把銷量放在item表裏面,當用戶發生交易行爲後,通過異步的方式給對應的item的銷量值+1,而不會影響下單主鏈路,因此暫時把銷量表放在這。
創建model-設計表結構並創建表和實體-寫service和控制器-寫頁面功能-頁面美化

商品創建
1.封裝service請求用來創建商品
service中
1.校驗入參
2.轉化itemmodel->dataobject
3.寫入數據庫
4.返回創建完成的對象
2.返回service創建完成的對象

商品列表
修改mapping.xml中的語句查詢商品list,然後在controller中調用這個方法,返回list,通過stream().map把model轉化爲vo再返回

商品詳情
調用service中的方法返回model,再轉成vo返回給前端。service中根據id查詢iteminfo,再創建一個根據itemid查詢stock的方法,在service中調用,查詢轉成model後一起返回。

controller

package com.miaosha3.controller;

import com.miaosha3.controller.viewobject.ItemVO;
import com.miaosha3.error.BusinessException;
import com.miaosha3.response.CommonReturnType;
import com.miaosha3.service.ItemService;
import com.miaosha3.service.model.ItemModel;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;

@Controller("/items")
@RequestMapping("/items")
@CrossOrigin(origins = {"*"},allowCredentials = "true",allowedHeaders = "*") //跨域
public class ItemController extends BaseController {

    @Autowired
    private ItemService itemService;

    //創建商品
    @RequestMapping(value = "/create",method = {RequestMethod.POST},consumes = {CONTENT_TYPE_FORMED})
    @ResponseBody
    public CommonReturnType create(@RequestParam(name = "title")String title,
                                   @RequestParam(name = "price")BigDecimal price,
                                   @RequestParam(name = "stock")Integer stock,
                                   @RequestParam(name = "description")String description,
                                   @RequestParam(name = "imgUrl")String imgUrl) throws BusinessException {
        //驗證

        //封裝service請求用來創建商品
        ItemModel itemModel = new ItemModel();
        itemModel.setTitle(title);
        itemModel.setPrice(price);
        itemModel.setStock(stock);
        itemModel.setDescription(description);
        itemModel.setImgUrl(imgUrl);
        ItemModel itemModelReturn = itemService.createItem(itemModel);

        ItemVO itemVO = convertVOFromModel(itemModelReturn);

        return CommonReturnType.create(itemVO);

    }
    private ItemVO convertVOFromModel(ItemModel itemModel){
        //在許多企業級應用裏面 viewobject的定義和model的定義是完全不一樣的,
        //而且許多都會用到聚合操作
        if (itemModel==null){
            return null;
        }
        ItemVO itemVO = new ItemVO();
        BeanUtils.copyProperties(itemModel,itemVO);
        return itemVO;
    }

    //商品詳情頁瀏覽
    @RequestMapping(value = "/get",method = {RequestMethod.GET},consumes = {CONTENT_TYPE_FORMED})
    @ResponseBody
    public CommonReturnType getItems(@RequestParam(name = "id")Integer id){
        ItemModel itemModel = itemService.getItemById(id);
        ItemVO itemVO = convertVOFromModel(itemModel);
        return CommonReturnType.create(itemVO);
    }

    //商品列表瀏覽
    @RequestMapping(value = "/listitem",method = {RequestMethod.GET},consumes = {CONTENT_TYPE_FORMED})
    @ResponseBody
    public CommonReturnType listItem(){
        List<ItemModel> itemModelList = itemService.listItem();
        List<ItemVO> itemVOList = itemModelList.stream().map(itemModel -> {
            ItemVO itemVO = convertVOFromModel(itemModel);
            return itemVO;
        }).collect(Collectors.toList());
        return CommonReturnType.create(itemVOList);
    }

}

service

package com.miaosha3.service;

import com.miaosha3.error.BusinessException;
import com.miaosha3.service.model.ItemModel;

import java.util.List;

public interface ItemService {
    //創建商品
    ItemModel createItem(ItemModel itemModel) throws BusinessException;

    //商品列表瀏覽
    List<ItemModel> listItem();

    //商品詳情瀏覽
    ItemModel getItemById(Integer id);
}

Ipml
package com.miaosha3.service.Impl;

import com.miaosha3.dao.ItemDOMapper;
import com.miaosha3.dao.ItemStockDOMapper;
import com.miaosha3.dataobject.ItemDO;
import com.miaosha3.dataobject.ItemStockDO;
import com.miaosha3.error.BusinessException;
import com.miaosha3.error.EmBusinessError;
import com.miaosha3.service.ItemService;
import com.miaosha3.service.model.ItemModel;
import com.miaosha3.validator.ValidationResult;
import com.miaosha3.validator.ValidatorImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class ItemImpl implements ItemService {

@Autowired
private ValidatorImpl validator;

@Autowired
private ItemDOMapper itemDOMapper;

@Autowired
private ItemStockDOMapper itemStockDOMapper;

@Override
@Transactional
public ItemModel createItem(ItemModel itemModel) throws BusinessException{
    //校驗入參
   /* ValidationResult validationResult = validator.validate(itemModel);
    if (validationResult.isHasError()){
        throw new BusinessException(EmBusinessError.PAEAMETER_VALIDATION_ERROR,validationResult.getErrMsg());
    }*/

    //轉化itemmodel->dataobject
    ItemDO itemDO = convertItemDOFromItemModel(itemModel);


    //寫入數據庫
    itemDOMapper.insertSelective(itemDO);
    itemModel.setId(itemDO.getId());

    ItemStockDO itemStockDO = convertItemStockDOFromItemModel(itemModel);
    itemStockDOMapper.insertSelective(itemStockDO);

    //返回創建完成的對象
    return getItemById(itemModel.getId());
}

private ItemDO convertItemDOFromItemModel(ItemModel itemModel){
    if (itemModel==null){
        return null;
    }
    ItemDO itemDO = new ItemDO();
    BeanUtils.copyProperties(itemModel,itemDO);
    itemDO.setPrice(itemModel.getPrice().doubleValue());
    return itemDO;

}

private ItemStockDO convertItemStockDOFromItemModel(ItemModel itemModel){
    if (itemModel==null){
        return null;
    }
    ItemStockDO itemStockDO = new ItemStockDO();
    itemStockDO.setItemId(itemModel.getId());
    itemStockDO.setStock(itemModel.getStock());
    return itemStockDO;
}
@Override
public List<ItemModel> listItem() {
    List<ItemDO> itemDOList = itemDOMapper.listItem();
    //將裏面的每一個itemDO  map成一個itemmodel
    List<ItemModel> itemModelList = itemDOList.stream().map(itemDO -> {
        ItemStockDO itemStockDO = itemStockDOMapper.selectByItemId(itemDO.getId());
        ItemModel itemModel = convertItemModelFromItemDO(itemDO,itemStockDO);
        return itemModel;
    }).collect(Collectors.toList());
    return itemModelList;
}

@Override
public ItemModel getItemById(Integer id) {
    ItemDO itemDO = itemDOMapper.selectByPrimaryKey(id);
    if (itemDO==null){
        return null;
    }
    ItemStockDO itemStockDO = itemStockDOMapper.selectByItemId(itemDO.getId());

    ItemModel itemModel = convertItemModelFromItemDO(itemDO,itemStockDO);
    return itemModel;
}

private ItemModel convertItemModelFromItemDO(ItemDO itemDO,ItemStockDO itemStockDO){
    if (itemDO==null){
        return null;
    }
    ItemModel itemModel = new ItemModel();
    BeanUtils.copyProperties(itemDO,itemModel);
    itemModel.setPrice(BigDecimal.valueOf(itemDO.getPrice()));
    itemModel.setStock(itemStockDO.getStock());
    return itemModel;
}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章