From 029fb6432e0a4a1c24476a9ef23d3344c478b822 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E5=B0=8F=E5=A2=A8?= <2291200076@qq.com> Date: Sat, 5 Mar 2022 16:48:37 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=92=E6=9D=80=EF=BC=88SpringBoot=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E7=94=B5=E5=95=86=E5=9F=BA=E7=A1=80=E7=A7=92=E6=9D=80?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=20=E5=9F=BA=E7=A1=80=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=AE=8C=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Others/README.md | 4 +- Others/sql/flashsale.sql | 7 +- frontend/getitem.html | 1 + .../flashsale/controller/ItemController.java | 2 +- .../flashsale/controller/OrderController.java | 5 +- .../flashsale/dao/OrderDOMapper.java | 12 ++-- .../flashsale/dataobject/OrderDO.java | 69 ++++++++++++++----- .../flashsale/service/OrderService.java | 2 +- .../service/impl/OrderServiceImpl.java | 24 +++++-- .../flashsale/service/model/OrderModel.java | 15 +++- src/main/resources/mapping/OrderDOMapper.xml | 39 +++++++---- 11 files changed, 128 insertions(+), 52 deletions(-) diff --git a/Others/README.md b/Others/README.md index e32f54a..6233534 100644 --- a/Others/README.md +++ b/Others/README.md @@ -1,3 +1,5 @@ MavenRepo: 不存在的Maven依赖,需要手动复制到本地Maven仓库中 -sql: 项目数据库文件 \ No newline at end of file +sql: 项目数据库文件 + +课程:https://www.imooc.com/video/18469 \ No newline at end of file diff --git a/Others/sql/flashsale.sql b/Others/sql/flashsale.sql index daac562..7910f4c 100644 --- a/Others/sql/flashsale.sql +++ b/Others/sql/flashsale.sql @@ -11,7 +11,7 @@ Target Server Version : 50726 File Encoding : 65001 - Date: 05/03/2022 15:19:32 + Date: 05/03/2022 16:32:52 */ SET NAMES utf8mb4; @@ -93,6 +93,7 @@ CREATE TABLE `order_info` ( `item_price` decimal(10, 2) NOT NULL, `amount` int(255) NOT NULL, `order_price` decimal(10, 2) NOT NULL, + `promo_id` int(11) NOT NULL DEFAULT 0, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; @@ -114,7 +115,7 @@ CREATE TABLE `promo_info` ( PRIMARY KEY (`id`) USING BTREE, INDEX `item_id`(`item_id`) USING BTREE, CONSTRAINT `promo_info_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `item_info` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT -) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of promo_info @@ -135,7 +136,7 @@ CREATE TABLE `sequence_info` ( -- ---------------------------- -- Records of sequence_info -- ---------------------------- -INSERT INTO `sequence_info` VALUES ('order_info', 0, 1); +INSERT INTO `sequence_info` VALUES ('order_info', 5, 1); -- ---------------------------- -- Table structure for user_info diff --git a/frontend/getitem.html b/frontend/getitem.html index 2d14603..a9469be 100644 --- a/frontend/getitem.html +++ b/frontend/getitem.html @@ -108,6 +108,7 @@ data: { "itemId": g_itemVO.id, "amount": 1, // 暂时写死,买1件 + "promoId": g_itemVO.promoId, }, xhrFields: {withCredentials: true}, success: function (data) { diff --git a/src/main/java/com/cxyxiaomo/flashsale/controller/ItemController.java b/src/main/java/com/cxyxiaomo/flashsale/controller/ItemController.java index 6af77bf..1e5e7c4 100644 --- a/src/main/java/com/cxyxiaomo/flashsale/controller/ItemController.java +++ b/src/main/java/com/cxyxiaomo/flashsale/controller/ItemController.java @@ -82,7 +82,7 @@ public class ItemController extends BaseController { if (itemModel.getPromoModel() != null) { // 有正在进行或即将进行的秒杀活动 itemVO.setPromoStatus(itemModel.getPromoModel().getStatus()); - itemVO.setPromoId(itemModel.getId()); + itemVO.setPromoId(itemModel.getPromoModel().getId()); itemVO.setStartDate(itemModel.getPromoModel().getStartDate().toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"))); itemVO.setPromoPrice(itemModel.getPromoModel().getPromoPrice()); } else { diff --git a/src/main/java/com/cxyxiaomo/flashsale/controller/OrderController.java b/src/main/java/com/cxyxiaomo/flashsale/controller/OrderController.java index 6b6b529..bb7e0cc 100644 --- a/src/main/java/com/cxyxiaomo/flashsale/controller/OrderController.java +++ b/src/main/java/com/cxyxiaomo/flashsale/controller/OrderController.java @@ -27,7 +27,8 @@ public class OrderController extends BaseController { @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 { + @RequestParam(name = "amount") Integer amount, + @RequestParam(name = "promoId", required = false) Integer promoId) throws BusinessException { // 获取用户登陆状态 Boolean isLogin = (Boolean) httpServletRequest.getSession().getAttribute("IS_LOGIN"); if (isLogin == null || !isLogin.booleanValue()) { @@ -36,7 +37,7 @@ public class OrderController extends BaseController { // 获取用户的登录信息 UserModel userModel = (UserModel) httpServletRequest.getSession().getAttribute("LOGIN_USER"); - OrderModel orderModel = orderService.createOrder(userModel.getId(), itemId, amount); + OrderModel orderModel = orderService.createOrder(userModel.getId(), itemId, promoId, amount); return CommonReturnType.create(null); } diff --git a/src/main/java/com/cxyxiaomo/flashsale/dao/OrderDOMapper.java b/src/main/java/com/cxyxiaomo/flashsale/dao/OrderDOMapper.java index 0de7dcb..7b7aa0f 100644 --- a/src/main/java/com/cxyxiaomo/flashsale/dao/OrderDOMapper.java +++ b/src/main/java/com/cxyxiaomo/flashsale/dao/OrderDOMapper.java @@ -7,7 +7,7 @@ public interface OrderDOMapper { * This method was generated by MyBatis Generator. * This method corresponds to the database table order_info * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ int deleteByPrimaryKey(String id); @@ -15,7 +15,7 @@ public interface OrderDOMapper { * This method was generated by MyBatis Generator. * This method corresponds to the database table order_info * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ int insert(OrderDO record); @@ -23,7 +23,7 @@ public interface OrderDOMapper { * This method was generated by MyBatis Generator. * This method corresponds to the database table order_info * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ int insertSelective(OrderDO record); @@ -31,7 +31,7 @@ public interface OrderDOMapper { * This method was generated by MyBatis Generator. * This method corresponds to the database table order_info * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ OrderDO selectByPrimaryKey(String id); @@ -39,7 +39,7 @@ public interface OrderDOMapper { * This method was generated by MyBatis Generator. * This method corresponds to the database table order_info * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ int updateByPrimaryKeySelective(OrderDO record); @@ -47,7 +47,7 @@ public interface OrderDOMapper { * This method was generated by MyBatis Generator. * This method corresponds to the database table order_info * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ int updateByPrimaryKey(OrderDO record); } \ No newline at end of file diff --git a/src/main/java/com/cxyxiaomo/flashsale/dataobject/OrderDO.java b/src/main/java/com/cxyxiaomo/flashsale/dataobject/OrderDO.java index f85f7e9..15d4bef 100644 --- a/src/main/java/com/cxyxiaomo/flashsale/dataobject/OrderDO.java +++ b/src/main/java/com/cxyxiaomo/flashsale/dataobject/OrderDO.java @@ -8,7 +8,7 @@ public class OrderDO { * This field was generated by MyBatis Generator. * This field corresponds to the database column order_info.id * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ private String id; @@ -17,7 +17,7 @@ public class OrderDO { * This field was generated by MyBatis Generator. * This field corresponds to the database column order_info.user_id * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ private Integer userId; @@ -26,7 +26,7 @@ public class OrderDO { * This field was generated by MyBatis Generator. * This field corresponds to the database column order_info.item_id * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ private Integer itemId; @@ -35,7 +35,7 @@ public class OrderDO { * This field was generated by MyBatis Generator. * This field corresponds to the database column order_info.item_price * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ private BigDecimal itemPrice; @@ -44,7 +44,7 @@ public class OrderDO { * This field was generated by MyBatis Generator. * This field corresponds to the database column order_info.amount * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ private Integer amount; @@ -53,17 +53,26 @@ public class OrderDO { * This field was generated by MyBatis Generator. * This field corresponds to the database column order_info.order_price * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ private BigDecimal orderPrice; + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column order_info.promo_id + * + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 + */ + private Integer promoId; + /** * This method was generated by MyBatis Generator. * This method returns the value of the database column order_info.id * * @return the value of order_info.id * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ public String getId() { return id; @@ -75,7 +84,7 @@ public class OrderDO { * * @param id the value for order_info.id * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ public void setId(String id) { this.id = id == null ? null : id.trim(); @@ -87,7 +96,7 @@ public class OrderDO { * * @return the value of order_info.user_id * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ public Integer getUserId() { return userId; @@ -99,7 +108,7 @@ public class OrderDO { * * @param userId the value for order_info.user_id * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ public void setUserId(Integer userId) { this.userId = userId; @@ -111,7 +120,7 @@ public class OrderDO { * * @return the value of order_info.item_id * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ public Integer getItemId() { return itemId; @@ -123,7 +132,7 @@ public class OrderDO { * * @param itemId the value for order_info.item_id * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ public void setItemId(Integer itemId) { this.itemId = itemId; @@ -135,7 +144,7 @@ public class OrderDO { * * @return the value of order_info.item_price * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ public BigDecimal getItemPrice() { return itemPrice; @@ -147,7 +156,7 @@ public class OrderDO { * * @param itemPrice the value for order_info.item_price * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ public void setItemPrice(BigDecimal itemPrice) { this.itemPrice = itemPrice; @@ -159,7 +168,7 @@ public class OrderDO { * * @return the value of order_info.amount * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ public Integer getAmount() { return amount; @@ -171,7 +180,7 @@ public class OrderDO { * * @param amount the value for order_info.amount * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ public void setAmount(Integer amount) { this.amount = amount; @@ -183,7 +192,7 @@ public class OrderDO { * * @return the value of order_info.order_price * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ public BigDecimal getOrderPrice() { return orderPrice; @@ -195,9 +204,33 @@ public class OrderDO { * * @param orderPrice the value for order_info.order_price * - * @mbg.generated Thu Mar 03 22:04:45 CST 2022 + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 */ public void setOrderPrice(BigDecimal orderPrice) { this.orderPrice = orderPrice; } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column order_info.promo_id + * + * @return the value of order_info.promo_id + * + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 + */ + public Integer getPromoId() { + return promoId; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column order_info.promo_id + * + * @param promoId the value for order_info.promo_id + * + * @mbg.generated Sat Mar 05 15:52:04 CST 2022 + */ + public void setPromoId(Integer promoId) { + this.promoId = promoId; + } } \ No newline at end of file diff --git a/src/main/java/com/cxyxiaomo/flashsale/service/OrderService.java b/src/main/java/com/cxyxiaomo/flashsale/service/OrderService.java index 2b2f06a..713c88f 100644 --- a/src/main/java/com/cxyxiaomo/flashsale/service/OrderService.java +++ b/src/main/java/com/cxyxiaomo/flashsale/service/OrderService.java @@ -11,5 +11,5 @@ public interface OrderService { * @param amount 购买商品数量 * @return */ - OrderModel createOrder(Integer userId, Integer itemId, Integer amount) throws BusinessException; + OrderModel createOrder(Integer userId, Integer itemId, Integer promoId, Integer amount) throws BusinessException; } diff --git a/src/main/java/com/cxyxiaomo/flashsale/service/impl/OrderServiceImpl.java b/src/main/java/com/cxyxiaomo/flashsale/service/impl/OrderServiceImpl.java index 9c0fe18..21f325f 100644 --- a/src/main/java/com/cxyxiaomo/flashsale/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/cxyxiaomo/flashsale/service/impl/OrderServiceImpl.java @@ -39,7 +39,7 @@ public class OrderServiceImpl implements OrderService { @Override @Transactional - public OrderModel createOrder(Integer userId, Integer itemId, Integer amount) throws BusinessException { + public OrderModel createOrder(Integer userId, Integer itemId, Integer promoId, Integer amount) throws BusinessException { // 1. 校验下单状态 // 下单的商品是否存在;用户是否合法;购买数量是否正确 ItemModel itemModel = itemService.getItemById(itemId); @@ -56,7 +56,18 @@ public class OrderServiceImpl implements OrderService { throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR, "数量信息不正确"); } - // 2. 落单减库存 / 支付减库存(有可能超卖) + // 校验活动信息 + if (promoId != null) { + if (promoId.intValue() != itemModel.getPromoModel().getId()) { + // (1) 校验对应活动是否存在这个适用商品 + throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR, "活动信息不正确"); + } else if (itemModel.getPromoModel().getStatus() != 2) { + // (2) 校验活动是否进行中 + throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR, "不在活动时间内"); + } + } + + // 2. 落单减库存 boolean result = itemService.decreaseStock(itemId, amount); if (!result) { throw new BusinessException(EmBusinessError.STOCK_NOT_ENOUGH); @@ -67,8 +78,13 @@ public class OrderServiceImpl implements OrderService { orderModel.setUserId(userId); orderModel.setItemId(itemId); orderModel.setAmount(amount); - orderModel.setItemPrice(itemModel.getPrice()); - orderModel.setOrderPrice(itemModel.getPrice().multiply(new BigDecimal(amount))); + if (promoId != null) { + orderModel.setItemPrice(itemModel.getPromoModel().getPromoPrice()); + } else { + orderModel.setItemPrice(itemModel.getPrice()); + } + orderModel.setPromoId(promoId); + orderModel.setOrderPrice(orderModel.getItemPrice().multiply(new BigDecimal(amount))); // 生成交易流水号(订单号) orderModel.setId(generateOrderNo()); diff --git a/src/main/java/com/cxyxiaomo/flashsale/service/model/OrderModel.java b/src/main/java/com/cxyxiaomo/flashsale/service/model/OrderModel.java index f054175..00a9f34 100644 --- a/src/main/java/com/cxyxiaomo/flashsale/service/model/OrderModel.java +++ b/src/main/java/com/cxyxiaomo/flashsale/service/model/OrderModel.java @@ -14,13 +14,16 @@ public class OrderModel { // 购买的商品Id private Integer itemId; - // 购买商品的单价 + // 若非空,则表示是以秒杀商品方式下单 + private Integer promoId; + + // 购买商品的单价(若promoId非空,则表示秒杀商品价格) private BigDecimal itemPrice; // 购买数量 private Integer amount; - // 购买金额 + // 购买金额(若promoId非空,则表示秒杀商品价格) private BigDecimal orderPrice; public String getId() { @@ -47,6 +50,14 @@ public class OrderModel { this.itemId = itemId; } + public Integer getPromoId() { + return promoId; + } + + public void setPromoId(Integer promoId) { + this.promoId = promoId; + } + public BigDecimal getItemPrice() { return itemPrice; } diff --git a/src/main/resources/mapping/OrderDOMapper.xml b/src/main/resources/mapping/OrderDOMapper.xml index 8a48298..e8f2a07 100644 --- a/src/main/resources/mapping/OrderDOMapper.xml +++ b/src/main/resources/mapping/OrderDOMapper.xml @@ -5,7 +5,7 @@ @@ -13,20 +13,21 @@ + - id, user_id, item_id, item_price, amount, order_price + id, user_id, item_id, item_price, amount, order_price, promo_id