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

新建数据表

create table if not exists item (
id int not null auto_increment,
title varchar(64) not null default '',
price double(10, 0) not null default 0,
description varchar(500) null default '',
sales int not null default 0,
img_url varchar(200) null default '',
primary key (id)
); create table if not exists item_stock (
id int not null auto_increment,
stock int not null default 0,
item_id int not null default 0,
primary key (id)
);

mybatis-generator.xml 添加

        <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>

Run 'mybatis-generator'

新增 ItemModel

public class ItemModel {
private Integer id;
@NotBlank(message = "商品名称不能为空")
private String title;
@NotNull(message = "商品价格不能为空")
@Min(value = 0, message = "商品价格必须大于0")
private BigDecimal price;
@NotNull(message = "库存不能为空")
@Min(value = 0, message = "库存必须大于0")
private Integer stock;
@NotNull(message = "商品表述信息不能为空")
private String description;
private Integer sales;
@NotNull(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;
}
}

新增 ItemVO

public class ItemVO {
private Integer id;
private String title;
private BigDecimal price;
private Integer stock;
private String description;
private Integer sales;
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;
}
}

新增 ItemService

public interface ItemService {

    ItemModel createItem(ItemModel itemModel) throws BusinessException;

    List<ItemModel> listItem();

    ItemModel getItemById(Integer id);
}

新增 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() {
return null;
} @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;
}
}

新增 ItemController

@Controller("item")
@RequestMapping("/item")
@CrossOrigin(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 createItem(@RequestParam(name="title") String title,
@RequestParam(name="price") BigDecimal price,
@RequestParam(name="description") String description,
@RequestParam(name="stock") Integer stock,
@RequestParam(name="imgUrl") String imgUrl) throws BusinessException { ItemModel itemModel = new ItemModel();
itemModel.setTitle(title);
itemModel.setPrice(price);
itemModel.setDescription(description);
itemModel.setStock(stock);
itemModel.setImgUrl(imgUrl); itemModel = itemService.createItem(itemModel); ItemVO itemVO = convertFromModel(itemModel); return CommonReturnType.create(itemVO);
} @RequestMapping(value = "/get", method = {RequestMethod.GET})
@ResponseBody
public CommonReturnType getItem(@RequestParam(name="id") Integer id){
ItemModel itemModel = itemService.getItemById(id); ItemVO itemVO = convertFromModel(itemModel); return CommonReturnType.create(itemVO);
} private ItemVO convertFromModel(ItemModel itemModel){
if(itemModel == null){
return null;
} ItemVO itemVO = new ItemVO();
BeanUtils.copyProperties(itemModel, itemVO); return itemVO;
}
}

新增 createitem.html

<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head> <body>
<div id="app">
<el-row>
<el-col :span="8" :offset="8">
<h3>创建商品</h3>
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="商品名">
<el-input v-model="form.title"></el-input>
</el-form-item>
<el-form-item label="商品描述">
<el-input v-model="form.description"></el-input>
</el-form-item>
<el-form-item label="价格">
<el-input v-model="form.price"></el-input>
</el-form-item>
<el-form-item label="图片">
<el-input v-model="form.imgUrl"></el-input>
</el-form-item>
<el-form-item label="库存">
<el-input v-model="form.stock"></el-input>
</el-form-item> <el-form-item>
<el-button type="primary" @click="onSubmit">提交</el-button>
</el-form-item>
</el-form>
</el-col>
</el-row>
</div>
</body> <script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://cdn.bootcss.com/axios/0.18.0/axios.min.js"></script>
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
form: {
title: '',
price: 0,
description: '',
stock: 1,
imgUrl: '',
}
},
methods: {
onSubmit(){ // https://www.cnblogs.com/yesyes/p/8432101.html
axios({
method: 'post',
url: 'http://localhost:8080/item/create',
data: this.form,
params: this.form,
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
withCredentials: true,
})
.then(resp=>{
if(resp.data.status == 'success'){
this.$message({
message: '创建成功',
type: 'success'
});
}else{
this.$message.error('创建失败,原因为:' + resp.data.data.errMsg);
}
})
.catch(err =>{
this.$message.error('创建失败,原因为:' + err.status + ', ' + err.statusText);
});
},
}, });
</script> </html>

源码:spring-boot-seckill

Spring Boot 构建电商基础秒杀项目 (八) 商品创建的更多相关文章

  1. Spring Boot 构建电商基础秒杀项目 (九) 商品列表 & 详情

    SpringBoot构建电商基础秒杀项目 学习笔记 ItemDOMapper.xml 添加 <select id="listItem" resultMap="Bas ...

  2. Spring Boot 构建电商基础秒杀项目 (一) 项目搭建

    SpringBoot构建电商基础秒杀项目 学习笔记 Spring Boot 其实不是什么新的框架,它默认配置了很多框架的使用方式,就像 maven 整合了所有的 jar 包, Spring Boot ...

  3. Spring Boot 构建电商基础秒杀项目 (十二) 总结 (完结)

    SpringBoot构建电商基础秒杀项目 学习笔记 系统架构 存在问题 如何发现容量问题 如何使得系统水平扩展 查询效率低下 活动开始前页面被疯狂刷新 库存行锁问题 下单操作步骤多,缓慢 浪涌流量如何 ...

  4. Spring Boot 构建电商基础秒杀项目 (十一) 秒杀

    SpringBoot构建电商基础秒杀项目 学习笔记 新建表 create table if not exists promo ( id int not null auto_increment, pro ...

  5. Spring Boot 构建电商基础秒杀项目 (十) 交易下单

    SpringBoot构建电商基础秒杀项目 学习笔记 新建表 create table if not exists order_info ( id varchar(32) not null defaul ...

  6. Spring Boot 构建电商基础秒杀项目 (七) 自动校验

    SpringBoot构建电商基础秒杀项目 学习笔记 修改 UserModel 添加注解 public class UserModel { private Integer id; @NotBlank(m ...

  7. Spring Boot 构建电商基础秒杀项目 (六) 用户登陆

    SpringBoot构建电商基础秒杀项目 学习笔记 userDOMapper.xml 添加 <select id="selectByTelphone" resultMap=& ...

  8. Spring Boot 构建电商基础秒杀项目 (五) 用户注册

    SpringBoot构建电商基础秒杀项目 学习笔记 UserService 添加 void register(UserModel userModel) throws BusinessException ...

  9. Spring Boot 构建电商基础秒杀项目 (四) getotp 页面

    SpringBoot构建电商基础秒杀项目 学习笔记 BaseController 添加 public static final String CONTENT_TYPE_FORMED = "a ...

随机推荐

  1. Luogu 3793 由乃救爷爷

    \(\verb|Luogu 3793 由乃救爷爷|\) rmq,数据随机 \(n,\ m\leq 2\times10^7\) lxl ST表 分块,大小设为 \(x\) 预处理每个块两端到块内每个点的 ...

  2. 数组复制的五种方式(遍历循环一一赋值、System.arraycopy、地址赋值、克隆clone()、Arrays.copyof())

    package com.Summer_0424.cn; import java.util.Arrays; import java.util.concurrent.CopyOnWriteArrayLis ...

  3. 【mongoDB查询进阶】聚合管道(三)--表达式操作符

    https://segmentfault.com/a/1190000010910985 管道操作符的分类 管道操作符可以分为三类: 阶段操作符(Stage Operators) 表达式操作符(Expr ...

  4. Java多线程(九)—— interrupt()和线程终止方式

    一.interrupt() 说明 interrupt()的作用是中断本线程.本线程中断自己是被允许的:其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限.这有可 ...

  5. EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的

    我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...

  6. 使用keras的LSTM进行预测----实战练习

    代码 import numpy as np from keras.models import Sequential from keras.layers import Dense from keras. ...

  7. 【Qt】Qt Quick 之 QML 与 C++ 混合编程详解

    Qt Quick 之 QML 与 C++ 混合编程详解 - CSDN博客   专栏:Qt Quick简明教程 - CSDN博客   .

  8. Maven 多模块引用版本的问题 java.lang.NoSuchMethodError

    环境:Junit测试用例 java.lang.NoSuchMethodError 很明显的错误,肯定是jar版本的问题 前提 Maven 打包并没有这个的问题,估计是做了优化处理 原测试代码 @Run ...

  9. ASP.Net Core 运行错误 Http Error 502.5 解决办法

    Http Error 502.5 - Process Failure 如果你看到上面这张图片了的话,说明你在本地运行的时候报错了. 尤其好多都是我的群友,说下情况. 这个一般是本地的.NET Core ...

  10. abbix通过JMX监控Tomcat(被监控端安装Tomat的服务器防火墙策略iptables配置)

    原文地址:http://jaychang.iteye.com/blog/2214830 一.目前的环境 被监控端192.168.153.191 /usr/local/tomcat 下载了catalin ...