清空购物车

第1关:清空购物车

任务描述

本关任务:实现添加商品至购物车功能。

相关知识

为了完成本关任务,你需要掌握:

  1. 添加商品至购物车;
  2. MySql 生成订单编号;
  3. 功能实现。
添加商品至购物车

购物车页面如下:

当我们对购物车中的商品进行结算,即点击页面中的 "去结算" 按钮时;前端会将购物车的所有商品发送给服务器,服务器会将已选中的商品添加至订单表,并将该商品在购物车表中的数据删除。那么我们再次查看购物车时,之前已被选中的商品就被删除了,而订单页面就可以看到之前被选中的商品了,如下:

MySql 生成订单编号
  1. 首先,在数据库中建立一个递增索引表,用于保存递增的六位序列号,附上建表语句,插入一条数据。
     
      
    1. //建表
    2. CREATE TABLE `sequence` (
    3. `name` varchar(32) NOT NULL COMMENT '序列名',
    4. `value` int(11) NOT NULL COMMENT '序列值',
    5. `next` int(11) NOT NULL COMMENT '递增值',
    6. PRIMARY KEY (`name`) USING BTREE
    7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
    8. //插入一条数据
    9. INSERT INTO `sequence` VALUES ('order', '1', '1');
  2. 创建一个取六位序列的函数,如果数据达到‘999999’,下一次自动变为从 0 开始。
     
      
    1. begin
    2. UPDATE sequence SET value=last_insert_id(value+next) WHERE name=seq_name;
    3. RETURN last_insert_id();
    4. end
  3. 创建一个生成 日期+8 位序列的递增序列,生成所需的序列:
     
      
    1. begin
    2. DECLARE getval bigint(24);
    3. SET getval = (SELECT CONCAT(DATE_FORMAT(CURDATE(), '%Y%m%d'), LPAD((SELECT next_trans_num(seq_name)), 8, '0')));
    4. RETURN getval;
    5. end
  4. 调用函数 get_trans_num,测试生成的数据。
     
      
    1. select get_trans_num();
    生成如下的序列号:2022053000000011
功能实现

即删除购物车中的数据,添加订单中的数据。

  1. dao 层查询数据库: OrderDao 查询订单编号并生成订单:

     
      
    1. @Repository
    2. public interface OrderDao {
    3. /*查询订单编号*/
    4. @Select("select get_trans_num('order')")
    5. Long getOrderId();
    6. /*添加订单至订单表*/
    7. @Insert("insert into orders(order_id,user_id,product_id,product_num,product_price,order_time,pay_time,status,pay_status) values(#{order_id},#{user_id},#{product_id},#{product_num},#{product_price},now(),null,1,0)")
    8. void addOrder(Long order_id,int user_id, int product_id, int product_num, BigDecimal product_price);
    9. }

    ShoppingCartDao 删除购物车表中商品:

     
      
    1. /*删除购物车表中商品*/
    2. @Delete("delete from shoppingcart where user_id=#{user_id} and product_id=#{product_id}")
    3. void deleteShoppingCart(int user_id,int product_id);
  2. service 层: OrderService 定义接口:

     
      
    1. //定义接口
    2. Long getOrderId();
    3. void addOrder(Long order_id,int user_id, int product_id, int product_num, BigDecimal product_price);

    ShoppingCartService 定义接口:

     
      
    1. //定义接口
    2. boolean deleteShoppingCart(Integer user_id,Integer product_id);
  3. impl 实现类: OrderServiceImpl:

     
      
    1. @Override
    2. public void addOrder(Long order_id,int user_id, int product_id, int product_num, BigDecimal product_price) {
    3. //调用 dao 层方法,将数据添加至数据库
    4. orderDao.addOrder(order_id,user_id,product_id,product_num,product_price);
    5. }
    6. @Override
    7. public Long getOrderId() {
    8. //调用 dao 层方法,获取订单 id
    9. return orderDao.getOrderId();
    10. }

    ShoppingCartServiceImpl:

     
      
    1. /*删除购物车中的商品*/
    2. @Override
    3. public boolean deleteShoppingCart(Integer user_id, Integer product_id) {
    4. //判断非空
    5. if(null==user_id||null==product_id)
    6. return false;
    7. //调用 dao 层方法,根据 user_id、product_id 删除购物车表中的数据
    8. shoppingCartDao.deleteShoppingCart(user_id,product_id);
    9. return true;
    10. }
  4. controller 层:

     
      
    1. @RequestMapping(value = "/addOrder")
    2. public Map addOrder(@RequestBody Map<String,Object> paramMap){
    3. Integer user_id = Integer.parseInt(String.valueOf(paramMap.get("user_id")));
    4. //获取购物车中的商品
    5. List<Map> products = (List<Map>) paramMap.get("products");
    6. //用户 id 不存在或商品 id 不存在,返回 RespBeanEnum 类的 FIND_ORDER_ERROR 结果集
    7. if(user_id==null||products==null){
    8. return RespBeanEnum.FIND_ORDER_ERROR.getMap();
    9. }else{
    10. //如用户 id 和商品 id 存在,就获取订单 id
    11. Long orderId = orderService.getOrderId();
    12. //循环所有商品
    13. for (Map<String,Object> product : products) {
    14. //如果是选中状态
    15. boolean flag = (Boolean)product.get("check");
    16. if (flag) { //已勾选的商品
    17. //就添加到订单表
    18. int product_id = (int)(product.get("productID"));
    19. BigDecimal product_price = new BigDecimal(String.valueOf(product.get("price")));
    20. int product_num = (int)(product.get("num"));
    21. orderService.addOrder(orderId,user_id,product_id,product_num,product_price); //添加订单
    22. shoppingCartService.deleteShoppingCart(user_id,product_id); //删除购物车
    23. }
    24. }
    25. //返回 RespBeanEnum 类的 CREATE_ORDER_SUCCESS 结果集
    26. return RespBeanEnum.CREATE_ORDER_SUCCESS.getMap();
    27. }
    28. }
  5. 数据库结构如下:

    购物车表:

    字段名称类型备注
    idint(11)NOT NULL AUTO_INCREMENT'购物车id'
    user_idint(11)NOT NULL'用户id'
    product_idint(11)NOT NULL'商品id'
    numint(11)NOT NULL'商品数量'

    订单表:

    字段名称类型备注
    idint(11)NOT NULL AUTO_INCREMENT'购物车id'
    user_idint(11)NOT NULL'用户id'
    product_idint(11)NOT NULL'商品id'
    product_numint(11)NOT NULL'商品数量'
    product_pricedecimal(10,0)NOT NULL'商品价格'
    order_timedatetimeNOT NULL'订单创建时间'
    order_idbigint(20)NOT NULL'订单编号'
    pay_timedatetimeNOT NULL'付款时间'
    pay_statusint(2)NOT NULL'0为未付款,1为已付款'
    statusint(11)NOT NULL'0为失效,1为生效'

编程要求

在右侧编辑器 OrderDao.java、ShoppingCartDao.java、 OrderService.java、ShoppingCartService.java、 OrderServiceImpl.java、ShoppingCartServiceImpl.java、OrderController.java 文件 Begin-End 中根据提示补充代码,实现购物车商品查询功能。

测试说明

平台会对你编写的代码进行测试:发送一个请求检验返回的结果集是否正确。 预期输入:

 
  1. {
  2. "user_id":"1018",
  3. "products":[{"productID":1,"price":1499.00,"num":1,"productImg":"public/imgs/phone/Redmi-k30.png","id":1,"check":true,"maxNum":50.0,"productName":"Redmi K30"},{"productID":2,"price":2599.00,"num":1,"productImg":"public/imgs/phone/Redmi-k30-5G.png","id":2,"check":true,"maxNum":5.0,"productName":"Redmi K30 5G"}]
  4. }

预期输出:

 
  1. {"msg":"创建订单成功","code":"002"}

开始你的任务吧,祝你成功!

OrderDao.java
package com.www.dao;

import org.apache.ibatis.annotations.Insert;

import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;


@Repository
public interface OrderDao {
 /*查询订单编号*/
 @Select("select get_trans_num('order')")
 Long getOrderId();
 /*添加订单至订单表*/
 @Insert("insert into orders(order_id,user_id,product_id,product_num,product_price,order_time,pay_time,status,pay_status) values(#{order_id},#{user_id},#{product_id},#{product_num},#{product_price},now(),null,1,0)")
 void addOrder(Long order_id,int user_id, int product_id, int product_num, BigDecimal product_price);
} 
ShoppingCartDao.java
package com.www.dao;


import org.apache.ibatis.annotations.Delete;
import org.springframework.stereotype.Repository;


@Repository
public interface ShoppingCartDao {
    /***************************Begin***************************/
    /*删除购物车表中商品*/
 @Delete("delete from shoppingcart where user_id=#{user_id} and product_id=#{product_id}")
 void deleteShoppingCart(int user_id,int product_id);
    /***************************End***************************/
}
OrderService.java
package com.www.service;


import org.springframework.stereotype.Component;

import java.math.BigDecimal;



@Component
public interface OrderService {
    /***************************Begin***************************/
    //定义接口
 Long getOrderId();
 void addOrder(Long order_id,int user_id, int product_id, int product_num, BigDecimal product_price);
    /***************************End***************************/
}
ShoppingCartService.java
package com.www.service;


import org.springframework.stereotype.Component;


@Component
public interface ShoppingCartService {
    /***************************Begin***************************/
    //定义接口
 boolean deleteShoppingCart(Integer user_id,Integer product_id); 
    /***************************End***************************/
}
OrderServiceImpl.java
package com.www.service.impl;

import com.www.dao.OrderDao;
import com.www.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import java.math.BigDecimal;



@Service("orderService")
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderDao orderDao;
    

    @Override
 public void addOrder(Long order_id,int user_id, int product_id, int product_num, BigDecimal product_price) {
     //调用 dao 层方法,将数据添加至数据库
     orderDao.addOrder(order_id,user_id,product_id,product_num,product_price);
 }
 @Override
 public Long getOrderId() {
     //调用 dao 层方法,获取订单 id
     return orderDao.getOrderId();
 } 
}
ShoppingCartServiceImpl.java
package com.www.service.impl;


import com.www.dao.ShoppingCartDao;

import com.www.service.ShoppingCartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


@Service("shoppingCartService")
public class ShoppingCartServiceImpl implements ShoppingCartService {

    @Autowired
    private ShoppingCartDao shoppingCartDao;

    /*删除购物车中的商品*/
 @Override
 public boolean deleteShoppingCart(Integer user_id, Integer product_id) {
     //判断非空
     if(null==user_id||null==product_id)
         return false;
     //调用 dao 层方法,根据 user_id、product_id 删除购物车表中的数据
     shoppingCartDao.deleteShoppingCart(user_id,product_id);
     return true;
 } 
}
OrderController.java
package com.www.controller;


import com.www.service.OrderService;
import com.www.service.ShoppingCartService;
import com.www.vo.RespBeanEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;


@RestController
@RequestMapping(value = "/order")
public class OrderController {

    @Autowired
    private OrderService orderService;
    @Autowired
    private ShoppingCartService shoppingCartService;

    /**
     * 清空购物车,添加订单
     * @param paramMap
     * @return
     */
    @RequestMapping(value = "/addOrder")
 public Map addOrder(@RequestBody Map<String,Object> paramMap){
     Integer user_id = Integer.parseInt(String.valueOf(paramMap.get("user_id")));
     //获取购物车中的商品
     List<Map> products = (List<Map>) paramMap.get("products");
     //用户 id 不存在或商品 id 不存在,返回 RespBeanEnum 类的 FIND_ORDER_ERROR 结果集
     if(user_id==null||products==null){
         return RespBeanEnum.FIND_ORDER_ERROR.getMap();
     }else{
         //如用户 id 和商品 id 存在,就获取订单 id
         Long orderId = orderService.getOrderId();
         //循环所有商品
         for (Map<String,Object> product : products) {
             //如果是选中状态
             boolean flag = (Boolean)product.get("check");
             if (flag) {  //已勾选的商品
                 //就添加到订单表
                 int product_id = (int)(product.get("productID"));
                 BigDecimal product_price = new BigDecimal(String.valueOf(product.get("price")));
                 int product_num = (int)(product.get("num"));
                 orderService.addOrder(orderId,user_id,product_id,product_num,product_price);  //添加订单
                 shoppingCartService.deleteShoppingCart(user_id,product_id);   //删除购物车
             }
         }
         //返回 RespBeanEnum 类的 CREATE_ORDER_SUCCESS 结果集
         return RespBeanEnum.CREATE_ORDER_SUCCESS.getMap();
     }
 } 

}
RespBeanEnum.java
package com.www.vo;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;

import java.util.HashMap;



@Getter
@ToString
@AllArgsConstructor
public enum RespBeanEnum {

    CREATE_ORDER_SUCCESS(new HashMap<String,Object>(){
        {
            put("code","002");
            put("msg","创建订单成功");
        }
    }),

    FIND_ORDER_ERROR(new HashMap<String,Object>(){
        {
            put("code","002");
            put("msg","未找到订单");
        }
    });
    private final HashMap<String,Object> map;

}

加油哦,同学们!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值