订单管理
一、添加订单
控制层
接收前端传入的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格式的时间,如何格式化时间?
- 在后端可以处理-通过日期格式SimpleDateFormat来转化
- 在前端使用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.了解订单详情的功能及处理