项目阶段六:订单模块的数据库准备与dao、service层

本文档详细介绍了如何设计并实现一个在线购物系统的订单模块,包括创建订单所需的数据库表结构,定义数据模型,编写DAO层操作,实现Service层业务逻辑,以及在Web层与前端页面的交互。通过示例展示了从购物车结账到生成订单的全过程,涉及到订单状态管理、库存更新以及订单详情的持久化存储。
摘要由CSDN通过智能技术生成

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>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值