B2C商城11 订单和购物车2

1.1  展示购物车列表

需要展示购物车页面,没有参数,只需要从cookie中把商品列表取出来,展示到页面即可。


1.1.1   Service

从cookie中把购物车列表取出来,没有参数,返回购物车中的商品列表。

@Override

      public List<CartItem> getCartItemList(HttpServletRequestrequest, HttpServletResponseresponse) {

            List<CartItem> itemList = getCartItemList(request);

            returnitemList;

      }


1.1.2 controller 

调用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 购物车商品数量修改

jsp页面

循环展示购物车

<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工程整合


web.xml

<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


service

功能:接收三个参数,三个pojo 补全参数 插入到数据库


【注意】订单号生成( 使用数字 )
[1]   日期+随机数 

采用毫秒+随机数。

缺点:仍然有重复的可能。不建议采用此方案。在没有更好的解决方案之前可以使用

[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>cartItemListcartItemService.getCartItemList(requestresponse);




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 "";

   }





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值