!!儘可能地讓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;
}
}