1.1 展示购物车列表
需要展示购物车页面,没有参数,只需要从cookie中把商品列表取出来,展示到页面即可。
1.1.1 Service
从cookie中把购物车列表取出来,没有参数,返回购物车中的商品列表。
@Override public List<CartItem> getCartItemList(HttpServletRequestrequest, HttpServletResponseresponse) { List<CartItem> itemList = getCartItemList(request); returnitemList; } |
调用Service取购物车商品列表,把购物车商品传递给jsp。在购物车页面展示商品列表。
请求的url:http://localhost:8082/cart/cart.html
返回jsp页面:cart.jsp
@RequestMapping("/cart") public String showCart(HttpServletRequestrequest, HttpServletResponseresponse, Model model) { List<CartItem> list =cartService.getCartItemList(request,response); model.addAttribute("cartList",list); return"cart"; } |
1.2 购物车商品数量修改
<c:setvar="totalPrice"value="0"></c:set>
<c:forEachitems="${cartList}"var="cart">
<c:setvar="totalPrice" value="${ totalPrice + (cart.price * cart.num)}"/> 计算购物车总金额
购物车加操作
<ahref="javascript:void(0);"id="increment">+</a>
1.3 删除购物车商品
在购物车页面中点击删除连接,接收要删除的商品id,从cookie中把商品找到删除,重新写入cookie,重新展示购物车页面。
/** 从购物车删除该商品 */
@Override
public TaotaoResultdeleteCartItemById(longitemId,HttpServletRequestrequest, HttpServletResponse response) {
//取购物车商品列表
List<CartItem>itemList= getItemList(request);
for (CartItemcItem :itemList) {
// 从商品列表里删除该商品
if (cItem.getId() ==itemId) {
itemList.remove(cItem);
break;
}
}
//把购物车信息重新写到cookie中
CookieUtils.setCookie(request,response,"TT_CART",JsonUtils.objectToJson(itemList));
return TaotaoResult.ok();
}
1.3.2 Controller
接收商品id,调用Service删除购物车商品,返回购物车页面。
请求的url:/cart/delete/${cart.id}.html
@RequestMapping("/delete/{itemId}")
public String delete(@PathVariablelongitemId,
HttpServletRequestrequest,HttpServletResponseresponse,Modelmodel){
catItemService.deleteCartItemById(itemId,request,response);
//删除后重定向到我的购物车
return"redirect:/cart/cart.html";
}
2.1 创建订单系统
2.2 框架整合
Mybatis
Spring
Springmvc
Jedis
可以参考taotao-rest工程整合
<servlet-mapping>
<servlet-name>taotao-order</servlet-name>
<url-pattern>/order/*</url-pattern>
</servlet-mapping>
2.3 创建订单接口
2.1.1 接口说明
用户使用portal创建订单、android、ios、微信商城提交订单时使用。
请求方法 | POST |
URL | http://order.taotao.com/order/create |
功能:接收三个参数,三个pojo 补全参数 插入到数据库
采用毫秒+随机数。
缺点:仍然有重复的可能。不建议采用此方案。在没有更好的解决方案之前可以使用[2] 可读性好,不能太长。一般订单都是全数字的。可以使用redis的incr命令生成订单号。
优点:可读性好,不会重复
缺点:需要搭建redis服务器。
/** 创建订单 */
@Override
public TaotaoResult createOrder(TbOrder order,List<TbOrderItem>itemList, TbOrderShipping orderShipping) {
//向订单表中插入记录
//获得订单号 订单号初始值1000
String val = redisClientMapper.get(ORDER_GEN_KEY);
if (StringUtils.isBlank(val)) {
redisClientMapper.set(ORDER_GEN_KEY,ORDER_INIT_VALUE);
}
long orderId = redisClientMapper.incr(ORDER_GEN_KEY);
//补全pojo的属性
order.setOrderId(orderId +"");
//状态:1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭
order.setStatus(1);
Datedate= newDate();
order.setCreateTime(date);
order.setUpdateTime(date);
order.setBuyerRate(0); // 未评价
orderMapper.insert(order);
//向订单明细表中插入记录
//插入订单明细
for (TbOrderItemorderItem : itemList) {
orderItem.setOrderId(orderId +"");
orderItem.setId(redisClientMapper.incr(ORDERITEM_INIT_VALUE)+"");
orderItemMapper.insert(orderItem);
}
//插入物流表
//补全物流表的属性
orderShipping.setOrderId(orderId +"");
orderShipping.setCreated(date);
orderShipping.setUpdated(date);
shippingMapper.insert(orderShipping);
return TaotaoResult.ok(orderId);
}
2.1.3 Controller层
接收一个json格式的字符串作为参数。需要使用@RequestBody注解。
因为入参没有与之对应的pojo ,需要使用一个pojo接收参数。创建一个对应json格式的pojo。
@RequestMapping(value="/create",method=RequestMethod.POST)
@ResponseBody
public TaotaoResult create(@RequestBody Orderorder) {
try {
TaotaoResultresult= orderService.createOrder
(order, order.getOrderItems(), order.getOrderShipping());
returnresult;
}catch(Exceptione) {
e.printStackTrace();
return TaotaoResult.build(400,ExceptionUtil.getStackTrace(e));
}
}
测试
这个是因为redis没有启动
2.2 根据订单ID查询订单
请求方法 | GET |
URL | http://order.taotao.com/order/info/{orderId} |
@RequestMapping("/info/{orderId}")
@ResponseBody
public TaotaoResult create(@PathVariable Long orderId) {
try {
TaotaoResultresult=orderService.findOrderById(orderId);
returnresult;
}catch(Exceptione) {
e.printStackTrace();
return TaotaoResult.build(400,ExceptionUtil.getStackTrace(e));
}
}
【注意】 从一个bean里copy属性到另一个bean
/** 根据订单号查询订单 */
@Override
public TaotaoResultfindOrderById(longorderId) {
Orderorder=newOrder();
TbOrdertbOrder=orderMapper.selectByPrimaryKey(orderId+"");
if (null ==tbOrder) {
return TaotaoResult.build(400,"根据订单号没有查询到订单信息");
}
TbOrderItemExampleorderItemExample=newTbOrderItemExample();
Criteriacriteria=orderItemExample.createCriteria();
criteria.andOrderIdEqualTo(orderId +"");
List<TbOrderItem>orderItems=orderItemMapper.selectByExample(orderItemExample);
TbOrderShippingExampleshippingExample=newTbOrderShippingExample();
com.taotao.pojo.TbOrderShippingExample.Criteriacriteria2=shippingExample.createCriteria();
criteria2.andOrderIdEqualTo(orderId +"");
List<TbOrderShipping>shippings=shippingMapper.selectByExample(shippingExample);
TbOrderShippingorderShipping=shippings.get(0);
order.setOrderItems(orderItems);
order.setOrderShipping(orderShipping);
//拷贝属性 source ,和目标
BeanUtils.copyProperties(tbOrder,order);
return TaotaoResult.ok(order);
}
3 在前台系统生成订单
在taotao-portal系统中添加商品至购物车后,点击提交订单调用taotao-order的服务生成订单。向用户展示订单号。提示创建订单成功。
@RequestMapping("/order-cart")
public StringshowOrderCart(HttpServletRequestrequest,
HttpServletResponseresponse,Modelmodel){
List<CartItem>cartItemList=cartItemService.getCartItemList(request,response);
model.addAttribute("cartList",cartItemList);
return"order-cart";
}
3.1 订单确认页面
1、要求用户登录。
2、根据用户id查询用户的收货地址列表。
3、在此页面展示购物车的商品列表。
4、需要计算订单的总金额(包括运费)展示给用户。
3.1.1 要求用户登录
修改springmvc.xml拦截所有以:/order/**形式的url
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截订单类请求 -->
<mvc:mappingpath="/order/**"/>
<beanclass="com.taotao.portal.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
3.1.2 根据用户id查询用户的收货地址列表。
在实际的商城中是必须有此功能,需要taotao-rest发布服务,由taotao-portal根据用户查询用户的收货地址列表。
在此,使用静态数据模拟。
3.1.3 展示购物车的商品列表
需要从cookie中把购物车商品列表取出,传递给order-cart.jsp。
可以直接使用购物车服务。
调用service 方法List<CartItem>cartItemList= cartItemService.getCartItemList(request, response);
3.5 提交订单
点击“提交订单”按钮把用户已经确认的订单信息,提交给后台。提交一个隐藏的表单,其中包含订单基本信息,订单名称以及配送信息。需要使用一个包装的pojo接收表单中的内容。
<button type="submit" id="order-submit" onclick="$('#orderForm').submit()">
提交订单
</button>
<form id="orderForm" class="hide"action="/order/create.html" method="post">
接收参数使用包装类
@RequestMapping("/create")
public String createOrder(Order order, Model model) {
String orderId = orderService.createOrder(order);
model.addAttribute("orderId", orderId);
model.addAttribute("payment", order.getPayment());
model.addAttribute("date", newDateTime().plusDays(3).toString("yyyy-MM-dd"));
return"success";
}
jsp页面需要展示三个参数 ${date} ${payment}元/** 创建订单返回订单号 */
@Override
public String createOrder(Order order) {
// 请求的参数是json 使用PostJson
//调用taotao-order的服务提交订单。
Stringjson= HttpClientUtil.doPostJson(ORDER_BASE_URL + CREATE_ORDER,JsonUtils.objectToJson(order));
//把json转换成taotaoResult
TaotaoResulttaotaoResult= TaotaoResult.format(json);
if (taotaoResult.getStatus() ==200) {
ObjectorderId= taotaoResult.getData();
return orderId.toString();
}
return "";
}