1、订单模块的分析
2、订单模块的实现
2.1、创建订单模块的数据库表
drop table if exists t_order;
create table t_order(
order_id varchar(50) primary key,
create_time datetime,
price decimal(11,2),
count int,
status int,
user_id int,
foreign key(user_id) references t_user(id)
);
drop table if exists t_order_item
create table t_order_item(
id int primary key auto_increment,
`name` varchar(100),
`count` int,
price decimal(11,2);
total_price decimal(11,2),
order_id varchar(50),
foreign key(`order_id`) references t_order(`order_id`)
);
2.2、创建订单模块的数据模型
订单:
public class Order {
private String orderId;//订单编号
private Date createTime;//创建订单时间
private BigDecimal price;//订单价格
// 0未发货,1已发货,2表示已签收
private Integer status = 0;//订单状态
private Integer userId;//该订单是哪个用户的,用户的ID
private Integer count;//订单里商品数量
订单项:
public class OrderItem {
private Integer id;
private String name;
private Integer count;
private BigDecimal price;
private BigDecimal totalPrice;
private String orderId;
2.3、编写生成订单(去结账)模块的 Dao 程序和测试
OrderDao 接口 :
/**
* 保存订单
* @param order 保存订单的数据
*/
int saveOrder(Order order);
OrderDao 实现 :
public class OrderDaoImpl extends BaseDao implements OrderDao {
@Override
public int saveOrder(Order order) {
String sql = "insert into t_order(order_id,create_time,price,count,status,user_id) values (?,?,?,?,?,?)";
return upDate(sql,order.getOrderId(),order.getCreateTime(),order.getPrice(),order.getCount(),order.getStatus(),order.getUserId());
}
OrderDaoTest:
public class OrderDaoTest {
private OrderDao orderDao = new OrderDaoImpl();
@Test
public void saveOrder() {
orderDao.saveOrder(new Order("123456",new Date(),new BigDecimal(100),0,1));
}
OrderItemDao 接口 :
public interface OrderItemDao {
/**
* 保存订单项(订单明细
* @param orderItem
* @return
*/
int saveOrderItem(OrderItem orderItem);
OrderItemDao 实现 :
public class OrderItemDaoImpl extends BaseDao implements OrderItemDao {
@Override
public int saveOrderItem(OrderItem orderItem) {
String sql = "insert into t_order_item(`name`,`count`,`price`,`total_price`,`order_id`) values(?,?,?,?,?)";
return upDate(sql,orderItem.getName(),orderItem.getCount(),orderItem.getPrice(),orderItem.getTotalPrice(),orderItem.getOrderId());
}
OrderItemDaoTest:
public class OrderItemDaoTest {
OrderItemDao orderItemDao = new OrderItemDaoImpl();
@Test
public void saveOrderItem() {
orderItemDao.saveOrderItem(new OrderItem(null,"安徒生童话",1,new BigDecimal(29.9),new BigDecimal(29.9),"123456"));
orderItemDao.saveOrderItem(new OrderItem(null,"java从入门到精通",1,new BigDecimal(29.9),new BigDecimal(29.9),"123456"));
orderItemDao.saveOrderItem(new OrderItem(null,"javaScript从入门到精通",1,new BigDecimal(29.9),new BigDecimal(29.9),"123456"));
orderItemDao.saveOrderItem(new OrderItem(null,"Netty入门",1,new BigDecimal(29.9),new BigDecimal(29.9),"123456"));
}
2.4、编写生成订单(去结账)模块的 Service 和测试
OrderService 接口:
public interface OrderService {
/**
* 生成订单
* @param cart 由哪个购物车生成
* @param userId 由哪个用户生成
* @return
*/
String creatOrder(Cart cart,Integer userId);
}
OrderService 实现类 :
public class OrderServiceImpl implements OrderService {
private OrderDao orderDao = new OrderDaoImpl();
private OrderItemDao orderItemDao = new OrderItemDaoImpl();
private BookDao bookDao = new BookDaoImpl();
@Override
public String creatOrder(Cart cart, Integer userId) {
// 订单号===唯一性
String orderId = System.currentTimeMillis() + "" + userId;
// 创建一个订单对象
Order order = new Order(orderId,new Date(),cart.getTotalPrice(),0,userId,cart.getTotalCount());
// 保存订单
orderDao.saveOrder(order);
// 遍历购物车中每一个商品项转换成为订单项保存到数据库
for (Map.Entry<Integer, CartItem> entry : cart.getItems().entrySet()) {
// 获取每一个购物车中的商品项
CartItem cartItem = entry.getValue();
// 转换为每一个订单项
OrderItem orderItem = new OrderItem(null,cartItem.getName(),cartItem.getCount(),cartItem.getPrice(),cartItem.getTotalPrice(),orderId);
// 保存订单项到数据库
orderItemDao.saveOrderItem(orderItem);
// 更新库存和销量
Book book = bookDao.queryBookById(cartItem.getId());
book.setSales(book.getSales() + cartItem.getCount());
book.setStock(book.getStock() - cartItem.getCount());
bookDao.updateBook(book);
}
// 清空购物车
cart.clear();
return orderId;
}
}
测试 :
public class OrderServiceTest {
private OrderService orderService = new OrderServiceImpl();
@Test
public void creatOrder() {
Cart cart = new Cart();
cart.addItem(new CartItem(1, "java从入门到精通", 1, new BigDecimal(1000),new BigDecimal(1000)));
cart.addItem(new CartItem(1, "java从入门到精通", 1, new BigDecimal(1000),new BigDecimal(1000)));
cart.addItem(new CartItem(2, "数据结构与算法", 1, new BigDecimal(100),new BigDecimal(100)));
String orderId = orderService.creatOrder(cart, 1);
System.out.println("该订单编号是:" + orderId);
}
2.5、编写订单模块的 web 层和页面联调
ClientOrderServlet 程序:
public class OrderServlet extends BaseServlet {
private OrderService orderService = new OrderServiceImpl();
/**
* 生成订单,结账
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void createOrder(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 先获取Cart购物车对象
Cart cart = (Cart) req.getSession().getAttribute("cart");
// 获取Userid
User loginUser = (User) req.getSession().getAttribute("user");
// if(loginUser == null){
// req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp);
// return;
// }
Integer userId = loginUser.getId();
// 调用orderService.createOrder(Cart,Userid);生成订单
String orderId = orderService.creatOrder(cart, userId);
req.getSession().setAttribute("orderId",orderId);
resp.sendRedirect(req.getContextPath() + "/pages/cart/checkout.jsp");
}
}
web配置:
<!-- 我的订单模块的配置-->
<servlet>
<servlet-name>ClientOrderServlet</servlet-name>
<servlet-class>loey.web.ClientOrderServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ClientOrderServlet</servlet-name>
<url-pattern>/client/orderServlet</url-pattern>
</servlet-mapping>
修改 pages/cart/cart.jsp 页面,结账的请求地址:
<span class="cart_span"><a id="payOrder" href="javascript:void(0)">去结账</a></span>
//给去结账绑定单击事件
$("#payOrder").click(function () {
if(${empty sessionScope.user}){
alert("你还未登录,请先登录~");
this.href = "http://localhost:8080/MyBookStore/pages/user/login.jsp";
}else{
this.href = "http://localhost:8080/MyBookStore/client/orderServlet?action=createOrder";
}
});
修改 pages/cart/checkout.jsp 页面,输出订单号:
<h1>你的订单已结算,订单号为${sessionScope.orderId}</h1>