这里再记录订单管理的开发步骤。看看订单的POJO
里面包含了四个非数据库字段
private List<OrderItem> orderItems;
private User user;
private float total;
private int totalNumber;
1.orderItems是指订单项,每个订单项都有一个oid字段,表示对应某个订单,可以根据oid来查出这个订单下有哪些订单项
2.user订单归属的用户
3.total是总价格,所有产品的价格
4.totalNumber是订单总共有几件
5.getStatusDesc方法,用于把英文表达的Status信息转换为中文
Order.java
package com.how2java.tmall.pojo;
import com.how2java.tmall.service.OrderService;
import java.util.Date;
import java.util.List;
public class Order {
private Integer id;
private String orderCode;
private String address;
private String post;
private String receiver;
private String mobile;
private String userMessage;
private Date createDate;
private Date payDate;
private Date deliveryDate;
private Date confirmDate;
private Integer uid;
private String status;
/*如下是非数据库字段*/
private List<OrderItem> orderItems;
private User user;
private float total;
private int totalNumber;
public String getStatusDesc(){
String desc ="未知";
switch(status){
case OrderService.waitPay:
desc="待付款";
break;
case OrderService.waitDelivery:
desc="待发货";
break;
case OrderService.waitConfirm:
desc="待收货";
break;
case OrderService.waitReview:
desc="等评价";
break;
case OrderService.finish:
desc="完成";
break;
case OrderService.delete:
desc="刪除";
break;
default:
desc="未知";
}
return desc;
}
/*****/
setter and getter
/****/
}
再看看orderItem这个类
这个类下面有个Product类,我们可以根据OrderItem类下的pid查出这个product,就查出这条订单项的产品信息了
package com.how2java.tmall.pojo;
public class OrderItem {
private Integer id;
private Integer pid;
private Integer oid;
private Integer uid;
private Integer number;
/*非数据库字段*/
private Product product;
/***/
setter and getter
/***/
}
因为Order类里面有List orderItems这个属性,所以我们就得在orderItemService中加入方法,提供一个可以根据oid查询出orderitem的接口
OrderItemService
package com.how2java.tmall.service;
import java.util.List;
import com.how2java.tmall.pojo.Order;
import com.how2java.tmall.pojo.OrderItem;
public interface OrderItemService {
void add(OrderItem c);
void delete(int id);
void update(OrderItem c);
OrderItem get(int id);
List list();
void fill(List<Order> os);
void fill(Order o);
}
OrderItemServiceImpl
OrderItemServiceImpl实现OrderItemService,提供CRUD一套方法的实现。
同时还提供fill(Order order)和fill(List<Order> orders), 先说fill(Order order) :
为什么要提供这个方法呢? 因为在订单管理界面,首先是遍历多个订单,然后遍历这个订单下的多个订单项。 而由MybatisGenerator逆向工程所创建的一套自动生成代码,是不具备一对多关系的,需要自己去二次开发。 这里就是做订单与订单项的一对多关系。
在fill(Order order)中:
1. 根据订单id查询出其对应的所有订单项
2. 通过setProduct为所有的订单项设置Product属性
3. 遍历所有的订单项,然后计算出该订单的总金额和总数量
4. 最后再把订单项设置在订单的orderItems属性上。
在fill(List<Order> orders) 中,就是遍历每个订单,然后挨个调用fill(Order order)。
package com.how2java.tmall.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.how2java.tmall.mapper.OrderItemMapper;
import com.how2java.tmall.pojo.Order;
import com.how2java.tmall.pojo.OrderItem;
import com.how2java.tmall.pojo.OrderItemExample;
import com.how2java.tmall.pojo.Product;
import com.how2java.tmall.service.OrderItemService;
import com.how2java.tmall.service.ProductService;
@Service
public class OrderItemServiceImpl implements OrderItemService {
@Autowired
OrderItemMapper orderItemMapper;
@Autowired
ProductService productService;
@Override
public void add(OrderItem c) {
orderItemMapper.insert(c);
}
@Override
public void delete(int id) {
orderItemMapper.deleteByPrimaryKey(id);
}
@Override
public void update(OrderItem c) {
orderItemMapper.updateByPrimaryKeySelective(c);
}
@Override
public OrderItem get(int id) {
OrderItem result = orderItemMapper.selectByPrimaryKey(id);
setProduct(result);
return result;
}
public List<OrderItem> list(){
OrderItemExample example =new OrderItemExample();
example.setOrderByClause("id desc");
return orderItemMapper.selectByExample(example);
}
@Override
public void fill(List<Order> os) {
for (Order o : os) {
fill(o);
}
}
public void fill(Order o) {
OrderItemExample example =new OrderItemExample();
example.createCriteria().andOidEqualTo(o.getId());
example.setOrderByClause("id desc");
List<OrderItem> ois =orderItemMapper.selectByExample(example);
setProduct(ois);
float total = 0;
int totalNumber = 0;
for (OrderItem oi : ois) {
total+=oi.getNumber()*oi.getProduct().getPromotePrice();
totalNumber+=oi.getNumber();
}
o.setTotal(total);
o.setTotalNumber(totalNumber);
o.setOrderItems(ois);
}
public void setProduct(List<OrderItem> ois){
for (OrderItem oi: ois) {
setProduct(oi);
}
}
private void setProduct(OrderItem oi) {
Product p = productService.get(oi.getPid());
oi.setProduct(p);
}
;
}
OrderService
package com.how2java.tmall.service;
import java.util.List;
import com.how2java.tmall.pojo.Order;
public interface OrderService {
String waitPay = "waitPay";
String waitDelivery = "waitDelivery";
String waitConfirm = "waitConfirm";
String waitReview = "waitReview";
String finish = "finish";
String delete = "delete";
void add(Order c);
void delete(int id);
void update(Order c);
Order get(int id);
List list();
}
OrderServiceImpl
package com.how2java.tmall.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.how2java.tmall.mapper.OrderMapper;
import com.how2java.tmall.pojo.Order;
import com.how2java.tmall.pojo.OrderExample;
import com.how2java.tmall.pojo.User;
import com.how2java.tmall.service.OrderService;
import com.how2java.tmall.service.UserService;
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
OrderMapper orderMapper;
@Autowired
UserService userService;
@Override
public void add(Order c) {
orderMapper.insert(c);
}
@Override
public void delete(int id) {
orderMapper.deleteByPrimaryKey(id);
}
@Override
public void update(Order c) {
orderMapper.updateByPrimaryKeySelective(c);
}
@Override
public Order get(int id) {
return orderMapper.selectByPrimaryKey(id);
}
public List<Order> list(){
OrderExample example =new OrderExample();
example.setOrderByClause("id desc");
List<Order> result =orderMapper.selectByExample(example);
setUser(result);
return result;
}
public void setUser(List<Order> os){
for (Order o : os)
setUser(o);
}
public void setUser(Order o){
int uid = o.getUid();
User u = userService.get(uid);
o.setUser(u);
}
}
查询功能
当我们访问http://127.0.0.1:8080/tmall_ssm/admin_order_list时,就会导致OrderController.list()方法被调用
1. 获取分页对象
2. 查询订单集合
3. 获取订单总数并设置在分页对象上
4. 借助orderItemService.fill()方法为这些订单填充上orderItems信息
5. 把订单集合和分页对象设置在model上
6. 服务端跳转到admin/listOrder.jsp页面
7. 在listOrder.jsp借助c:forEach把订单集合遍历出来
8. 遍历订单的时候,再把当前订单的orderItem订单项集合遍历出来
@RequestMapping("admin_order_list")
public String list(Model model, Page page){
PageHelper.offsetPage(page.getStart(),page.getCount());
List<Order> os= orderService.list();
int total = (int) new PageInfo<>(os).getTotal();
page.setTotal(total);
orderItemService.fill(os);
model.addAttribute("os", os);
model.addAttribute("page", page);
return "admin/listOrder";
}
发货功能
当订单状态是waitDelivery的时候,就会出现发货按钮
1. 发货按钮链接跳转到admin_order_delivery
2. OrderController.delivery()方法被调用
2.1 注入订单对象
2.2 修改发货时间,设置发货状态
2.3 更新到数据库
2.4 客户端跳转到admin_order_list页面
@RequestMapping("admin_order_delivery")
public String delivery(Order o) throws IOException {
o.setDeliveryDate(new Date());
o.setStatus(OrderService.waitConfirm);
orderService.update(o);
return "redirect:admin_order_list";
}
OrderController.java完整代码
package com.how2java.tmall.controller;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.how2java.tmall.pojo.Order;
import com.how2java.tmall.service.OrderItemService;
import com.how2java.tmall.service.OrderService;
import com.how2java.tmall.util.Page;
@Controller
@RequestMapping("")
public class OrderController {
@Autowired
OrderService orderService;
@Autowired
OrderItemService orderItemService;
@RequestMapping("admin_order_list")
public String list(Model model, Page page){
PageHelper.offsetPage(page.getStart(),page.getCount());
List<Order> os= orderService.list();
int total = (int) new PageInfo<>(os).getTotal();
page.setTotal(total);
orderItemService.fill(os);
model.addAttribute("os", os);
model.addAttribute("page", page);
return "admin/listOrder";
}
@RequestMapping("admin_order_delivery")
public String delivery(Order o) throws IOException {
o.setDeliveryDate(new Date());
o.setStatus(OrderService.waitConfirm);
orderService.update(o);
return "redirect:admin_order_list";
}
}
最后,在JSP上显示出来,就完成了订单管理的开发
listOrder.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@include file="../include/admin/adminHeader.jsp"%>
<%@include file="../include/admin/adminNavigator.jsp"%>
<script>
$(function(){
$("button.orderPageCheckOrderItems").click(function(){
var oid = $(this).attr("oid");
$("tr.orderPageOrderItemTR[oid="+oid+"]").toggle();
});
});
</script>
<title>订单管理</title>
<div class="workingArea">
<h1 class="label label-info" >订单管理</h1>
<br>
<br>
<div class="listDataTableDiv">
<table class="table table-striped table-bordered table-hover1 table-condensed">
<thead>
<tr class="success">
<th>ID</th>
<th>状态</th>
<th>金额</th>
<th width="100px">商品数量</th>
<th width="100px">买家名称</th>
<th>创建时间</th>
<th>支付时间</th>
<th>发货时间</th>
<th>确认收货时间</th>
<th width="120px">操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${os}" var="o">
<tr>
<td>${o.id}</td>
<td>${o.statusDesc}</td>
<td>¥<fmt:formatNumber type="number" value="${o.total}" minFractionDigits="2"/></td>
<td align="center">${o.totalNumber}</td>
<td align="center">${o.user.name}</td>
<td><fmt:formatDate value="${o.createDate}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td><fmt:formatDate value="${o.payDate}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td><fmt:formatDate value="${o.deliveryDate}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td><fmt:formatDate value="${o.confirmDate}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td>
<button oid=${o.id} class="orderPageCheckOrderItems btn btn-primary btn-xs">查看详情</button>
<c:if test="${o.status=='waitDelivery'}">
<a href="admin_order_delivery?id=${o.id}">
<button class="btn btn-primary btn-xs">发货</button>
</a>
</c:if>
</td>
</tr>
<tr class="orderPageOrderItemTR" oid=${o.id}>
<td colspan="10" align="center">
<div class="orderPageOrderItem">
<table width="800px" align="center" class="orderPageOrderItemTable">
<c:forEach items="${o.orderItems}" var="oi">
<tr>
<td align="left">
<img width="40px" height="40px" src="img/productSingle/${oi.product.firstProductImage.id}.jpg">
</td>
<td>
<a href="foreproduct?pid=${oi.product.id}">
<span>${oi.product.name}</span>
</a>
</td>
<td align="right">
<span class="text-muted">${oi.number}个</span>
</td>
<td align="right">
<span class="text-muted">单价:¥${oi.product.promotePrice}</span>
</td>
</tr>
</c:forEach>
</table>
</div>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<div class="pageDiv">
<%@include file="../include/admin/adminPage.jsp" %>
</div>
</div>
<%@include file="../include/admin/adminFooter.jsp"%>