zoukankan      html  css  js  c++  java
  • Spring Boot 构建电商基础秒杀项目 (十) 交易下单

    SpringBoot构建电商基础秒杀项目 学习笔记

    新建表

    create table if not exists order_info (
        id varchar(32) not null default '',
        user_id int not null default 0,
        item_id int not null default 0,
        item_price double(10, 2) not null default 0,
        amount int not null default 0,
        order_price double(10, 2) default 0,
        primary key (id)
    );
    
    create table if not exists sequence_info (
        name varchar(64) not null default '',
        current_value int not null default 0,
        step int not null default 1,
        primary key (name)
    );
    insert into sequence_info (name, current_value, step) values ('order_info', 1, 1);
    

    新增 OrderModel

    public class OrderModel {
        private String id;
        private Integer userId;
        private Integer itemId;
        private BigDecimal itemPrice;
        private Integer amount;
        private BigDecimal orderPrice;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public Integer getUserId() {
            return userId;
        }
    
        public void setUserId(Integer userId) {
            this.userId = userId;
        }
    
        public Integer getItemId() {
            return itemId;
        }
    
        public void setItemId(Integer itemId) {
            this.itemId = itemId;
        }
    
        public BigDecimal getItemPrice() {
            return itemPrice;
        }
    
        public void setItemPrice(BigDecimal itemPrice) {
            this.itemPrice = itemPrice;
        }
    
        public Integer getAmount() {
            return amount;
        }
    
        public void setAmount(Integer amount) {
            this.amount = amount;
        }
    
        public BigDecimal getOrderPrice() {
            return orderPrice;
        }
    
        public void setOrderPrice(BigDecimal orderPrice) {
            this.orderPrice = orderPrice;
        }
    }
    

    新增 ItemService

    public interface ItemService {
    
        ItemModel createItem(ItemModel itemModel) throws BusinessException;
    
        List<ItemModel> listItem();
    
        ItemModel getItemById(Integer id);
    
        boolean decreaseStock(Integer itemId, Integer amount);
    
        void increaseSales(Integer itemId, Integer amount) throws BusinessException;
    }
    

    新增 ItemServiceImpl

    @Service
    public class ItemServiceImpl implements ItemService {
    
        @Autowired
        private ValidatorImpl validator;
    
        @Autowired
        private ItemDOMapper itemDOMapper;
    
        @Autowired
        private ItemStockDOMapper itemStockDOMapper;
    
        @Override
        @Transactional
        public ItemModel createItem(ItemModel itemModel) throws BusinessException {
    
            ValidationResult result = validator.validate(itemModel);
            if(result.isHasErrors()){
                throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR, result.getErrMsg());
            }
    
            ItemDO itemDO = convertFromModel(itemModel);
            itemDOMapper.insertSelective(itemDO);
    
            itemModel.setId(itemDO.getId());
    
            ItemStockDO itemStockDO = convertItemStockFromModel(itemModel);
            itemStockDOMapper.insertSelective(itemStockDO);
    
            return getItemById(itemModel.getId());
        }
    
        @Override
        public List<ItemModel> listItem() {
            List<ItemDO> itemDOList = itemDOMapper.listItem();
    
            List<ItemModel> itemModelList = itemDOList.stream().map(itemDO -> {
                ItemStockDO itemStockDO = itemStockDOMapper.selectByItemId(itemDO.getId());
                ItemModel itemModel = convertFromDataObject(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 = convertFromDataObject(itemDO, itemStockDO);
    
            return itemModel;
        }
    
        private ItemDO convertFromModel(ItemModel itemModel){
            if(itemModel == null){
                return null;
            }
    
            ItemDO itemDO = new ItemDO();
            BeanUtils.copyProperties(itemModel, itemDO);
    
            itemDO.setPrice(itemModel.getPrice().doubleValue());
    
            return itemDO;
        }
    
        private ItemStockDO convertItemStockFromModel(ItemModel itemModel){
            if(itemModel == null){
                return null;
            }
    
            ItemStockDO itemStockDO = new ItemStockDO();
            itemStockDO.setItemId(itemModel.getId());
            itemStockDO.setStock(itemModel.getStock());
    
            return itemStockDO;
        }
    
        private ItemModel convertFromDataObject(ItemDO itemDO, ItemStockDO itemStockDO){
            if(itemDO == null){
                return null;
            }
    
            ItemModel itemModel = new ItemModel();
            BeanUtils.copyProperties(itemDO, itemModel);
    
            itemModel.setPrice(new BigDecimal(itemDO.getPrice()));
    
            itemModel.setStock(itemStockDO.getStock());
    
            return itemModel;
        }
    
        @Override
        @Transactional
        public boolean decreaseStock(Integer itemId, Integer amount) {
    
            int affectedRow = itemStockDOMapper.decreaseStock(itemId, amount);
    
            return affectedRow > 0;
        }
    
        @Override
        @Transactional
        public void increaseSales(Integer itemId, Integer amount) throws BusinessException {
            itemDOMapper.increaseSales(itemId, amount);
        }
    }
    

    新增 OrderController

    @Controller("order")
    @RequestMapping("/order")
    @CrossOrigin(allowCredentials = "true", allowedHeaders = "*")
    public class OrderController extends BaseController {
    
        @Autowired
        private OrderService orderService;
        @Autowired
        private HttpServletRequest httpServletRequest;
    
        @RequestMapping(value = "/createorder", method = {RequestMethod.POST}, consumes = {CONTENT_TYPE_FORMED})
        @ResponseBody
        public CommonReturnType createOrder(@RequestParam(name="itemId") Integer itemId,
                                            @RequestParam(name="amount") Integer amount)
                throws BusinessException {
    
            Boolean isLogin = (Boolean)httpServletRequest.getSession().getAttribute("LOGIN");
            if(isLogin == null || !isLogin.booleanValue()){
                throw new BusinessException(EmBusinessError.USER_NOT_LOGIN);
            }
    
            UserModel userModel = (UserModel)httpServletRequest.getSession().getAttribute("LOGIN_USER");
    
            OrderModel orderModel = orderService.createOrder(userModel.getId(), itemId, amount);
    
            return CommonReturnType.create(null);
        }
    }
    

    源码:spring-boot-seckill

  • 相关阅读:
    WCF和SOA的简介
    .NET 反射应用
    ASP.NET---如何使用web api创建web服务
    获得N位数字字母随机组合
    git的初步使用
    js贪吃蛇
    python多线程
    2013-12-13
    2012-12-12
    2013-12-5
  • 原文地址:https://www.cnblogs.com/victorbu/p/10585901.html
Copyright © 2011-2022 走看看