秒杀之创建商品模型(一)

商品创建

1.优先考虑对应的产品经理提出的需求,而不是先去创建数据库。先设计领域模型,想好对应的商品模型

建一个ItemModel.java

引入商品属性

import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;

public class ItemModel {
    private Integer id;
    //商品名称
    @NotBlank(message = "商品名称不能为空")
    private String title;
    
    //商品价格
    @NotNull(message = "商品价格不能为空")
    @Min(value = 0,message = "商品价格必须大于0")
    private BigDecimal price;
    
    //商品库存(不多)
    @NotNull(message = "库存不能不填")
    private Integer stock;
    
    //商品描述
    @NotBlank(message = "商品描述信息不能为空")
    private String description;
    
    //商品销量
    private Integer sales;
    
    //商品描述的图片
    @NotBlank(message = "商品图片信息不能为空")
    private String imgUrl;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public Integer getStock() {
        return stock;
    }

    public void setStock(Integer stock) {
        this.stock = stock;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getSales() {
        return sales;
    }

    public void setSales(Integer sales) {
        this.sales = sales;
    }

    public String getImgUrl() {
        return imgUrl;
    }

    public void setImgUrl(String imgUrl) {
        this.imgUrl = imgUrl;
    }
}

 做数据库设计

库存 stock 和商品是一对一的关系 为了数据库性能设计考虑 

库存表

 

 使用mybatis-generator 生成所想要的Mapper和Dao文件以及data object对象

(1)在pom.xml中 将true改为false 不允许覆盖

(2)在mybatis-generator中添加表

 <table tableName="item" domainObjectName="ItemDO"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false"></table>
        <table tableName="item_stock" domainObjectName="ItemStockDO"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false"></table>
        

运行

⚠出现bug 

mybatis-generator-maven-plugin 版本原来为1.3.5 换为 1.3.1后成功

奇怪的是 先前也是因为版本而报错 调试成功后 这次又报错

(3)在ItemDOMapper.xml进行修改

 <insert id="insert" parameterType="com.miaoshaproject.dataobject.ItemDO" useGeneratedKeys="true" keyProperty="id">
 <insert id="insertSelective" parameterType="com.miaoshaproject.dataobject.ItemDO" useGeneratedKeys="true" keyProperty="id">

 (4)在ItemStockDOMapper.xml进行修改

 <insert id="insert" parameterType="com.miaoshaproject.dataobject.ItemStockDO" useGeneratedKeys="true" keyProperty="id">
<insert id="insertSelective" parameterType="com.miaoshaproject.dataobject.ItemStockDO" useGeneratedKeys="true" keyProperty="id">

 2.创建ItemService接口

import com.miaoshaproject.service.model.ItemModel;

import java.util.List;

public interface ItemService {
    //创建商品
    ItemModel creatItem(ItemModel itemModel);
    //商品列表浏览
    List<ItemModel> listItem();
    //商品详情浏览
    ItemModel getItemById(Integer id);
}

ItemServiceImpl实现类

import com.miaoshaproject.dao.ItemDOMapper;
import com.miaoshaproject.dao.ItemStockDOMapper;
import com.miaoshaproject.dataobject.ItemDO;
import com.miaoshaproject.dataobject.ItemStockDO;
import com.miaoshaproject.error.BusinessException;
import com.miaoshaproject.error.EmBusinessError;
import com.miaoshaproject.service.ItemService;
import com.miaoshaproject.service.model.ItemModel;
import com.miaoshaproject.validator.ValidationResult;
import com.miaoshaproject.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;


@Service
public class ItemServiceImpl implements ItemService {
    @Autowired
    private ValidatorImpl validator;

    @Autowired(required = false)
    private ItemDOMapper itemDOMapper;

    @Autowired(required = false)
    private ItemStockDOMapper itemStockDOMapper;

    private ItemDO convertItemDOFromItemModel(ItemModel itemModel){
        if(itemModel == null){
            return null;
        }
        ItemDO itemDO = new ItemDO();
        BeanUtils.copyProperties(itemModel,itemDO);
        //手动设置price类型
        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
    @Transactional//在同一个事务当中
    public ItemModel createItem(ItemModel itemModel) throws BusinessException {
        //创建item信息
        //入户前的校验入参
        ValidationResult result=validator.validate(itemModel);
                if(result.isHasErrors()){
                    throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,result.getErrMsg());
                }
        //转化itemmodel->dataobject
            ItemDO itemDO=this.convertItemDOFromItemModel(itemModel);
        //写入数据库
        //创建了一个item对象 并且成功入库
        itemDOMapper.insertSelective(itemDO);
        itemModel.setId(itemDO.getId());

        ItemStockDO itemStockDO=this.convertItemStockDOFromItemModel(itemModel);
        itemStockDOMapper.insertSelective(itemStockDO);
        //返回创建完成的对象

        return this.getItemById(itemModel.getId());
    }

    @Override
    public List<ItemModel> listItem() {
        return null;
    }

    @Override
    public ItemModel getItemById(Integer id) {
        ItemDO itemDO = itemDOMapper.selectByPrimaryKey(id);
        if(itemDO == null){
            return null;
        }
        //操作获得库存数量
        ItemStockDO itemStockDO=itemStockDOMapper.selectByItemId(itemDO.getId());


        //将dataobject->model
        ItemModel itemModel =convertModelFromDataObject(itemDO,itemStockDO);

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

    }
}

ItemStockDOMapper.xml 中 添加 selectByItemId方法

<select id="selectByItemId" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Sat Feb 11 11:35:13 CST 2023.
    -->
    select
    <include refid="Base_Column_List" />
    from item_stock
    where item_id = #{itemId,jdbcType=INTEGER}
  </select>

ItemStockDOMapper接口中声明方法

⚠在ItemServiceImpl实现类中使用selectByItemId 一直划红线 原因是没有在此接口中声明

    ItemStockDO selectByItemId(Integer itemId);

3.前端界面

createitem.html

<html>
<head>
    <meta charset="UTF-8">
    <link href="static/assets/global/plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css"/>
    <link href="static/assets/global/css/components.css" rel="stylesheet" type="text/css"/>
    <link href="static/assets/admin/pages/css/login.css" rel="stylesheet" type="text/css"/>
    <script src="static/assets/global/plugins/jquery-1.11.0.min.js" type="text/javascript"></script>
    <title>Title</title>
</head>
<body class="login">
<div class="content">
    <h3 class="form-title">创建商品</h3>
    <div class="form-group">
        <label class="control-label">商品名</label>
        <div>
            <input class="form-control" type="text"  name="title" id="title"/>
        </div>
    </div>
    <div class="form-group">
        <label class="control-label">商品描述</label>
        <div>
            <input class="form-control" type="text"  name="description" id="description"/>
        </div>
    </div>
    <div class="form-group">
        <label class="control-label">价格</label>
        <div>
            <input class="form-control" type="text" name="price" id="price"/>
        </div>
    </div>
    <div class="form-group">
        <label class="control-label">图片</label>
        <div>
            <input class="form-control" type="text" name="imgUrl" id="imgUrl"/>
        </div>
    </div>
    <div class="form-group">
        <label class="control-label">库存</label>
        <div>
            <input class="form-control" type="text" name="stock" id="stock"/>
        </div>
    </div>
    <div class="form-actions">
        <button class="btn blue" id="create" type="submit">
            提交创建
        </button>
    </div>
</div>

</body>

<script>
    jQuery(document).ready(function () {

        //绑定register按钮的click事件
        $("#create").on("click",function () {

            var title=$("#title").val();
            var description=$("#description").val();
            var price=$("#price").val();
            var imgUrl=$("#imgUrl").val();
            var stock=$("#stock").val();

            if (title==null || title=="") {
                alert("商品名不能为空");
                return false;
            }
            if (description==null || description=="") {
                alert("商品描述不能为空");
                return false;
            }
            if (price==null || price=="") {
                alert("价格不能为空");
                return false;
            }
            if (imgUrl==null || imgUrl=="") {
                alert("图片不能为空");
                return false;
            }
            if (stock==null || stock=="") {
                alert("库存不能为空");
                return false;
            }

            //映射到后端/create
            $.ajax({
                type:"POST",
                contentType:"application/x-www-form-urlencoded",
                url:"http://localhost:8090/item/create",
                data:{
                    "title":title,
                    "description":description,
                    "price":price,
                    "imgUrl":imgUrl,
                    "stock":stock
                },
                //允许跨域请求
                xhrFields:{withCredentials:true},
                success:function (data) {
                    if (data.status=="success") {
                        alert("创建成功");
                    }else {
                        alert("创建失败,原因为" + data.data.errMsg);
                    }
                },
                error:function (data) {
                    alert("创建失败,原因为"+data.responseText);
                }
            });
            return false;
        });
    });
</script>
</html>

运行后报错

解决: 异常:java.lang.IllegalArgumentException: Result Maps collection already contains value_KyrieCao的博客-CSDN博客UserDOMapper.xml 和UserPasswordDOMapper.xml出现同样的BaseResultMap

 结果是失败

无论是本地还是we打开都是失败

 不会解决

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的ThinkPHP秒杀商品的示例代码: 1. 首先,在数据库中创建一个秒杀商品表(seckill_product),包含商品ID、商品名称、商品数量、商品价格、秒杀开始时间、秒杀结束时间等字段。 2. 在ThinkPHP的控制器中,编写一个秒杀商品的方法,例如: ``` public function seckill() { // 获取秒杀商品信息 $seckillProduct = M('seckill_product')->find($productId); // 判断秒杀是否已经开始 if ($seckillProduct['start_time'] > time()) { $this->error('秒杀还未开始'); } // 判断秒杀是否已经结束 if ($seckillProduct['end_time'] < time()) { $this->error('秒杀已经结束'); } // 判断商品数量是否足够 if ($seckillProduct['quantity'] < 1) { $this->error('商品已经售罄'); } // 生成订单 $orderData = array( 'product_id' => $seckillProduct['id'], 'product_name' => $seckillProduct['name'], 'price' => $seckillProduct['price'], 'quantity' => 1, 'total_price' => $seckillProduct['price'], 'create_time' => time(), ); M('order')->add($orderData); // 更新商品数量 M('seckill_product')->where(array('id' => $seckillProduct['id']))->setDec('quantity'); $this->success('秒杀成功!'); } ``` 在上述代码中,首先根据商品ID获取秒杀商品信息,然后判断秒杀是否已经开始、是否已经结束、商品数量是否足够等条件。如果条件满足,就生成一个订单,然后更新商品数量。 需要注意的是,在实际应用中,还需要考虑并发访问的问题,例如使用Redis进行分布式锁等方式来防止并发访问导致的数据不一致问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值