订单管理

一、添加订单

控制层

接收前端传入的aid,总金额,到达控制层再得到uid

public String createOrder(HttpServletRequest request, HttpServletResponse response){
    //获取参数,及通过凭证获取uid
    String aid = request.getParameter("aid");
    String sum = request.getParameter("sum");
    User u = (User) request.getSession().getAttribute(ConstUtils.LOGIN);
    int res = orderService.createOrder(aid,sum,u.getU_id()); //创建订单
    return "OK";
}

业务层处理

在业务层添加订单和详情

public int createOrder(String aid, String sum, int u_id) {
    int res = 0;
    try{
        //1.添加订单
        Orders order = new Orders();
        String oid = RandomUtils.createOrderId(); //获取oid
        order.setO_id(oid); //设置oid
        order.setA_id(Integer.parseInt(aid));  //设置aid
        order.setO_count(new BigDecimal(sum)); //设置总金额
        order.setO_state(1);  //订单状态 未支付
        order.setU_id(u_id);   //用户id
        order.setO_time(new Date()); //创建订单时间
        res = orderDao.addOrder(order);  //添加订单
        System.out.println("添加:"+res);
        //2.添加订单详情--批处理
        List<Item> items = new ArrayList<>();
        //详情的数据,可以从购物车中封装过来
        List<Cart> carts = cartDao.selectCarts(u_id);
        for(Cart c:carts){ //循环遍历购物车,将数据装到详情中
            Item it = new Item(0,oid,c.getP_id(),c.getC_count(),c.getC_num());
            items.add(it);
        }
        res = orderDao.batchItems(items);  //批处理详情
        System.out.println("详情批处理:"+res);
    }catch (Exception e){
        e.printStackTrace();
    }
    return 0;
}

DAO层处理

在DAO层进行批处理数据封装

@Override
public int batchItems(List<Item> items) throws SQLException {
    String sql = "insert into item(o_id,p_id,i_count,i_num) values(?,?,?,?)";
    Object[][] obs = new Object[items.size()][]; //创建二维数组
    for(int i=0;i<items.size();i++){
        Item it = items.get(i);  //获取item对象
        //里面的值由sql的占位符决定
        obs[i] = new Object[]{it.getO_id(),it.getP_id(),it.getI_count(),it.getI_num()};
    }
    return runner.batch(sql,obs).length;
}

二、展示订单

展示页面

先查看orderList.jsp展示页面中需要得到的数据,拿到订单集合,且里面包含了地址信息

<c:forEach items="${orderList}" var="order" varStatus="i">
    <tr>
        <th>${i.count}</th>
        <th>${order.o_id}</th>
        <th>${order.o_count}</th>
        <th>
            <font color="red">
                <c:if test="${order.o_state eq 1 }">
                    未支付
         ...           

在订单中需要包含地址,所以订单实体类中需要加入地址属性

public class Orders {
  //...
  private Address addr; //每个订单中由一条地址信息
}

控制层

根据uid获取到订单的集合,并返回到前端

//展示订单
public String show(HttpServletRequest request, HttpServletResponse response){
    User u = (User) request.getSession().getAttribute(ConstUtils.LOGIN);
    //根据uid获取订单的集合,订单中包含地址
    List<Orders> list = orderService.showOrders(u.getU_id());  //获取订单集合
    request.setAttribute("orderList",list);
    return ConstUtils.FOR+"/orderList.jsp";
}

DAO层封装

订单表与地址表的关联查询,并注入数据到实体中

public List<Orders> selectOrders(int u_id) throws InvocationTargetException, IllegalAccessException, SQLException {
    //需要关联订单表与地址表--关联查询
    String sql = "select * from orders o inner join address a on o.a_id=a.a_id and a.u_id=?";
    List<Map<String, Object>> query = runner.query(sql, new MapListHandler(), u_id);
    List<Orders> list = new ArrayList<>();
    for(Map<String, Object> m:query){ //循环遍历List集合
        Orders o = new Orders();
        BeanUtils.populate(o,m);
        Address addr = new Address();
        BeanUtils.populate(addr,m);
        o.setAddr(addr);
        list.add(o);
    }
    return list;
}

日期格式处理

订单展示页面中,显示了Date格式的时间,如何格式化时间?

  1. 在后端可以处理-通过日期格式SimpleDateFormat来转化
  2. 在前端使用JSTL的格式化转换(推荐)
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>  //引入格式库

<fmt:formatDate value="${order.o_time}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate>

三、总结与作业

总结

1.添加订单
在业务层添加订单与详情--共用同一个oid
在DAO层需要对详情进行批处理--传二维数组(重点)
2.展示订单
根据页面回传数据,得到控制层需要回传的数据(订单集合-里面包含地址)
DAO层封装-关联订单表和地址表查询及注入数据(重点)
日期格式处理-格式库

作业

1.整理项目的所有模块,进行梳理
2.了解订单详情的功能及处理