第1关:清空购物车
任务描述
本关任务:实现添加商品至购物车功能。
相关知识
为了完成本关任务,你需要掌握:
- 添加商品至购物车;
- MySql 生成订单编号;
- 功能实现。
添加商品至购物车
购物车页面如下:
当我们对购物车中的商品进行结算,即点击页面中的 "去结算" 按钮时;前端会将购物车的所有商品发送给服务器,服务器会将已选中的商品添加至订单表,并将该商品在购物车表中的数据删除。那么我们再次查看购物车时,之前已被选中的商品就被删除了,而订单页面就可以看到之前被选中的商品了,如下:
MySql 生成订单编号
- 首先,在数据库中建立一个递增索引表,用于保存递增的六位序列号,附上建表语句,插入一条数据。
//建表
CREATE TABLE `sequence` (
`name` varchar(32) NOT NULL COMMENT '序列名',
`value` int(11) NOT NULL COMMENT '序列值',
`next` int(11) NOT NULL COMMENT '递增值',
PRIMARY KEY (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
//插入一条数据
INSERT INTO `sequence` VALUES ('order', '1', '1');
- 创建一个取六位序列的函数,如果数据达到‘999999’,下一次自动变为从 0 开始。
begin
UPDATE sequence SET value=last_insert_id(value+next) WHERE name=seq_name;
RETURN last_insert_id();
end
- 创建一个生成 日期+8 位序列的递增序列,生成所需的序列:
begin
DECLARE getval bigint(24);
SET getval = (SELECT CONCAT(DATE_FORMAT(CURDATE(), '%Y%m%d'), LPAD((SELECT next_trans_num(seq_name)), 8, '0')));
RETURN getval;
end
- 调用函数 get_trans_num,测试生成的数据。
select get_trans_num();
功能实现
即删除购物车中的数据,添加订单中的数据。
-
dao 层查询数据库: OrderDao 查询订单编号并生成订单:
@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 删除购物车表中商品:
/*删除购物车表中商品*/
@Delete("delete from shoppingcart where user_id=#{user_id} and product_id=#{product_id}")
void deleteShoppingCart(int user_id,int product_id);
-
service 层: OrderService 定义接口:
//定义接口
Long getOrderId();
void addOrder(Long order_id,int user_id, int product_id, int product_num, BigDecimal product_price);
ShoppingCartService 定义接口:
//定义接口
boolean deleteShoppingCart(Integer user_id,Integer product_id);
-
impl 实现类: OrderServiceImpl:
@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:
/*删除购物车中的商品*/
@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;
}
-
controller 层:
@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();
}
}
-
数据库结构如下:
购物车表:
字段名称 类型 备注 id
int(11) NOT NULL AUTO_INCREMENT '购物车id' user_id
int(11) NOT NULL '用户id' product_id
int(11) NOT NULL '商品id' num
int(11) NOT NULL '商品数量' 订单表:
字段名称 类型 备注 id
int(11) NOT NULL AUTO_INCREMENT '购物车id' user_id
int(11) NOT NULL '用户id' product_id
int(11) NOT NULL '商品id' product_num
int(11) NOT NULL '商品数量' product_price
decimal(10,0) NOT NULL '商品价格' order_time
datetime NOT NULL '订单创建时间' order_id
bigint(20) NOT NULL '订单编号' pay_time
datetime NOT NULL '付款时间' pay_status
int(2) NOT NULL '0为未付款,1为已付款' status
int(11) NOT NULL '0为失效,1为生效'
编程要求
在右侧编辑器 OrderDao.java、ShoppingCartDao.java、 OrderService.java、ShoppingCartService.java、 OrderServiceImpl.java、ShoppingCartServiceImpl.java、OrderController.java 文件 Begin-End 中根据提示补充代码,实现购物车商品查询功能。
测试说明
平台会对你编写的代码进行测试:发送一个请求检验返回的结果集是否正确。 预期输入:
{
"user_id":"1018",
"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"}]
}
预期输出:
{"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;
}
加油哦,同学们!