1. 程式人生 > >帶你逐步深入瞭解SSM框架——淘淘商城專案之購物車+訂單實現

帶你逐步深入瞭解SSM框架——淘淘商城專案之購物車+訂單實現

1   今日大綱

1、  實現淘淘商城的購物車功能

2、  實現訂單系統。

2   購物車功能

2.1  功能說明

1、商品加入購物車時,不是必須要求登入。

2、計算購物車中商品的總價。當商品數量發生變化時需要重新計算。

3、使用者可以刪除購物車中的商品。

4、使用者下單後,刪除購物車的功能。

2.2  功能分析

1、在使用者不登陸的清空下也可以使用購物車,那麼就需要把購物車資訊放入cookie中。

2、可以把商品資訊,存放到pojo中,然後序列化成json存入cookie中。

3、取商品資訊可以從cookie中把json資料取出來,然後轉換成java物件即可。

4、此功能只需要操作cookie不需要資料庫的支援,所以只需要在taotao-portal中實現即可。

5、購物車分有四種動作

a)        新增商品

b)        修改商品數量

c)        刪除購物車中的商品

d)        展示購物車商品列表

2.3  新增購物車商品

2.3.1  service

功能:

1、接收controller傳遞過來的商品id,根據商品id查詢商品資訊。

2、從cookie中取出購物車資訊,轉換成商品pojo列表。

3、把商品資訊新增到商品列表中。

引數:

1、商品id

2、Request

3、response

返回值:

TaoTaoResult

@Service

public class CartServiceImpl implements

CartService {

      //服務url

      @Value("${REST_BASE_URL}")

      private String REST_BASE_URL;

      //商品服務url

      @Value("${ITEMS_ITEM_URL}")

      private String ITEMS_ITEM_URL;

      //COOKIE中購物車商品對應的key

      @Value("${CART_ITEMS_LIST_KEY}")

      private String CART_ITEMS_LIST_KEY;

      //購物車cookie

生存期

      @Value("${CART_ITEMS_EXPIRE_TIME}")

      private Integer CART_ITEMS_EXPIRE_TIME;

      /**

       * 新增購物車商品

       * <p>Title: addItem</p>

       * <p>Description: </p>

       * @param itemId

       * @param request

       * @param response

       * @return

       * @see com.taotao.portal.service.CartService#addItem(java.lang.Long, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

       */

      @Override

      public TaotaoResult addItem(Long itemId, HttpServletRequest request, HttpServletResponse response) {

           //根據商品id查詢商品資訊

           Item item = getItemById(itemId);

           if (item == null) return TaotaoResult.build(400, "未查詢到該商品資訊");

           //取cookie中購物車商品列表

           List<Item> cartItems = getItemListFromCookie(request);

           //判斷該商品是否存在於購物車中

           boolean itemExists = false;

           for (Item i : cartItems) {

                 if (i.getId().longValue() == itemId.longValue()) {

                      //購物車中有此商品

                      i.setNum(i.getNum() + 1);

                      itemExists = true;

                      break;

                 }

            }

           //如果商品不存在於購物車則向購物車商品列表中新增一個商品

           if (! itemExists) {

                 //設定數量為1

                 item.setNum(1);

                 //把商品新增到購物車

                 cartItems.add(item);

           }

           //把購物車資訊寫入cookie

           CookieUtils.setCookie(request, response, CART_ITEMS_LIST_KEY, JsonUtils.objectToJson(cartItems), CART_ITEMS_EXPIRE_TIME, true);

           return TaotaoResult.ok(cartItems);

      }

      private Item getItemById(Long itemId) {

           //根據商品id查詢商品資訊

           String resultStr = HttpClientUtil.doGet(REST_BASE_URL + ITEMS_ITEM_URL + itemId);

           //轉換成taotaoResult

           TaotaoResult result = TaotaoResult.formatToPojo(resultStr, Item.class);

           //取商品資訊

           Item item  = null;

           if (result.getStatus() == 200) {

                 item = (Item) result.getData();

           }

           return item;

      }

      private List<Item> getItemListFromCookie(HttpServletRequest request) {

           //取cookie中購物車商品列表

           String cartItemsStr = CookieUtils.getCookieValue(request, CART_ITEMS_LIST_KEY, true);

           //如果不為空那麼就轉換成java物件

           List<Item> cartItems = null;

           if (!StringUtils.isBlank(cartItemsStr)) {

                 cartItems = JsonUtils.jsonToList(cartItemsStr, Item.class);

           } else {

                 cartItems = new ArrayList<>();

           }

           return cartItems;

      }

}

2.3.2  商品pojo

商品pojo需要使用taotao-portal中的Item。此pojo在反序列化時會拋異常。需要做如下修改:

2.3.3  Controller

@Controller

@RequestMapping("/cart")

public class CartController {

      @Autowired

      private CartService cartService;

      @RequestMapping("/add/{itemId}")

      public String addItem(@PathVariable Long itemId,

                 HttpServletRequest request, HttpServletResponse response, Model model) {

           //新增商品資訊

           TaotaoResult result = cartService.addItem(itemId, request, response);

           //錯誤資訊

           if (result.getStatus() != 200) {

                 model.addAttribute("message", result.getMsg());

                 return "error/exception";

           }

           //把購物車中的商品傳遞給頁面

           model.addAttribute("cartList", result.getData());

           return "cart";

      }

}

2.4  展示購物車商品

使用者點選“我的購物車”展示購物車資訊

2.4.1  Service

/**

       * 取購物車列表

       * <p>

       * Title: getCartItemsList

       * </p>

       * <p>

       * Description:

       * </p>

       * @return

       * @see com.taotao.portal.service.CartService#getCartItemsList()

       */

      @Override

      public List<Item> getCartItemsList(HttpServletRequest request) {

           // 從cookie中取商品列表

           List<Item> itemsList = getItemListFromCookie(request);

           return itemsList;

      }

2.4.2  Controller

      @RequestMapping("/cart")

      public String showCart(HttpServletRequest request, Model mode) {

           //取購物車資訊

           List<Item> list = cartService.getCartItemsList(request);

           mode.addAttribute("cartList", list);

           return "cart";

      }

2.5  修改商品數量

當點選購物車商品的“+”、“-”號時增加或減少商品數量。減少商品數量時,如果數量為“1”則不繼續減少。

2.5.1  Service

/**

       * 修改指定商品的數量

       * <p>Title: changeItemNum</p>

       * <p>Description: </p>

       * @param itemId

       * @param num

       * @param request

       * @param response

       * @return

       * @see com.taotao.portal.service.CartService#changeItemNum(long, int, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

       */

      @Override

      public TaotaoResult changeItemNum(long itemId, int num, HttpServletRequest request, HttpServletResponse response) {

           //從cookie中取商品列表

           List<Item> list = getItemListFromCookie(request);

           //從商品列表中找到要修改數量的商品

           for (Item item : list) {

                 if (item.getId() == itemId) {

                      //找到商品,修改數量

                      item.setNum(num);

                      break;

                 }

           }

           //把商品資訊寫入cookie

           CookieUtils.setCookie(request, response, CART_ITEMS_LIST_KEY, JsonUtils.objectToJson(list), CART_ITEMS_EXPIRE_TIME, true);

           return TaotaoResult.ok();

      }

2.5.2  Controller

@RequestMapping("/update/num/{itemId}/{num}")

      @ResponseBody

      public TaotaoResult updateNumById(@PathVariable Long itemId, @PathVariable Integer num,

                 HttpServletRequest request, HttpServletResponse response) {

           TaotaoResult result = cartService.changeItemNum(itemId, num, request, response);

           return result;

      }

2.6  刪除購物車商品

2.6.1  Service

/**

       * 刪除購物車中的商品

       * <p>

       * Title: deleteItem

       * </p>

       * <p>

       * Description:

       * </p>

       *

       * @param itemId

       * @param request

       * @param response

       * @return

       * @see com.taotao.portal.service.CartService#deleteItem(java.lang.Long,

       *      javax.servlet.http.HttpServletRequest,

       *      javax.servlet.http.HttpServletResponse)

       */

      @Override

      public List<Item> deleteItem(Long itemId, HttpServletRequest request, HttpServletResponse response) {

           List<Item> itemsList = getCartItemsList(request);

           // 找到購物車中的商品,並刪除之

           for (Item item : itemsList) {

                 if (item.getId().longValue() == itemId.longValue()) {

                      itemsList.remove(item);

                      break;

                 }

           }

           // 更新cookie中的購物車資料

           CookieUtils.setCookie(request, response, CART_ITEMS_LIST_KEY, JsonUtils.objectToJson(itemsList), CART_ITEMS_EXPIRE_TIME, true);

           returnitemsList;

      }

2.6.2  Controller

@RequestMapping("/delete/{itemId}")

      public String deleteItemById(@PathVariable Long itemId,

                 HttpServletRequest request, HttpServletResponse response,

                 Model model) {

           List<Item> list = cartService.deleteItem(itemId, request, response);

           model.addAttribute("cartList", list);

           return "cart";

      }

3   訂單系統實現

3.1  系統架構

3.2  訂單表結構

訂單表:

 

訂單商品表:

 

物流表:

 

3.3  介面

參見:淘淘商城-訂單系統介面.docx

3.4  建立訂單系統taotao-order

系統配置參考taotao-sso系統。

3.5  實現建立訂單介面

3.5.1  service

@Service

public class OrderServiceImpl implements OrderService {

      @Autowired

      private TbOrderMapper orderMapper;

      @Autowired

      private TbOrderItemMapper orderItemMapper;

      @Autowired

      private TbOrderShippingMapper orderShippingMapper;

      //redis中的訂單key

      @Value("${ORDER_ID_KEY}")

      private String ORDER_ID_KEY;

      @Value("${ORDER_BEGIN_ID}")

      private Long ORDER_BEGIN_ID;

      @Autowired

      private JedisCluster jedisCluster;

      @Override

      public TaotaoResult createOrder(TbOrder order, List<TbOrderItem> itemList, TbOrderShipping orderShipping) {

           //訂單表

           //生成訂單號

           String orderIdStr = jedisCluster.get(ORDER_ID_KEY);

           Long orderId = null;

           if (StringUtils.isBlank(orderIdStr)) {

                 //如果redis中沒有訂單號使用初始訂單號初始化

                 jedisCluster.set(ORDER_ID_KEY, ORDER_BEGIN_ID.toString());

                 orderId = ORDER_BEGIN_ID;

           } else {

                 //生成訂單號

                 orderId = jedisCluster.incr(ORDER_ID_KEY);

           }

           //設定訂單號

           order.setOrderId(orderId.toString());

           Date date = new Date();

           //訂單建立時間

           order.setCreateTime(date);

           //訂單更新時間

           order.setUpdateTime(date);

           //插入訂單表

           orderMapper.insert(order);

           //插入訂單商品表

           for (TbOrderItem tbOrderItem : itemList) {

                 //取訂單商品id

                 Long orderItemId = jedisCluster.incr("ORDER_ITEM_ID");

                 tbOrderItem.setId(orderItemId.toString());

                 tbOrderItem.setOrderId(orderId.toString());

                 //新增到訂單商品表

                 orderItemMapper.insert(tbOrderItem);

           }

           //插入物流表

           orderShipping.setOrderId(orderId.toString());

           orderShipping.setCreated(date);

           orderShipping.setUpdated(date);

           orderShippingMapper.insert(orderShipping);

           return TaotaoResult.ok(orderId.toString());

      }

}

3.5.2  Controller

3.5.2.1        Pojo

public class Order extends TbOrder{

      private List<TbOrderItem> orderItems;

      private TbOrderShipping orderShipping;

}

3.5.2.2        controller

@Controller

@RequestMapping("/order")

public class OrderController {

      @Autowired

      private OrderService orderService;

      @RequestMapping(value = "/create", method=RequestMethod.POST)

      @ResponseBody

      public TaotaoResult createOrder(@RequestBody Order order) {

           TaotaoResult result = null;

           try {

                 result = orderService.createOrder(order, order.getOrderItems(), order.getOrderShipping());

            } catch (Exception e) {

                 e.printStackTrace();

                 return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));

           }

           return result;

      }

}

3.6  其他介面

4   前端系統實現下單功能

4.1  下單流程

4.2  訂單結算頁面

4.2.1  Controller

@Controller

@RequestMapping("/order")

public class OrderController {

      @Autowired

      private OrderService orderService;

      @Autowired

      private CartService cartService;

      /**

       * 顯示訂單確認畫面

       * <p>Title: showOrderCart</p>

       * <p>Description: </p>

       * @param request

       * @param model

       * @return

       */

      @RequestMapping("/order-cart")

      public String showOrderCart(HttpServletRequest request, TbUser user, Model model) {

           //根據使用者資訊,取出使用者的收貨地址列表

           //本專案中使用靜態資料模擬。。。。

           //從cookie中把商品列表取出來

           List<Item> itemsList = cartService.getCartItemsList(request);

           model.addAttribute("cartList", itemsList);

           return"order-cart";

      }

}

4.3  提交訂單處理

4.3.1  建立訂單Service

@Srvice

public class OrderServiceImpl implements OrderService {

      @Value("${ORDER_BASE_URL}")

      private String ORDER_BASE_URL;

      @Value("${ORDER_CREATE_URL}")

      private String ORDER_CREATE_URL;

      @Override

      public TaotaoResult createService(Order order) {

           //pojo轉換成json資料

           String json = JsonUtils.objectToJson(

相關推薦

逐步深入瞭解SSM框架——商城專案框架整合,後臺系統搭建

1.  今日計劃 1、  SSM框架整合 2、  mybatis逆向工程 3、  商品列表 4、  商品列表分頁處理 2.  SSM框架整合 2.1. 後臺系統所用的技術 框架:Spring + SpringMVC +Mybatis 前端:EasyUI 資料庫:mysql

逐步深入瞭解SSM框架——商城專案實現商品新增

1.  課程計劃 完成商品新增功能 1、商品類目選擇 2、圖片上傳 3、圖片伺服器搭建 4、kindEditor富文字編輯器的使用 5、商品新增功能 2.  實現商品類目選擇功能 2.1. 需求

逐步深入瞭解SSM框架——商城專案專案總結

1.  專案總結 總結淘淘商城中用到的技術點: 1.1. 專案工程搭建。 1、使用maven構建工程。Maven的繼承、聚合、依賴管理。 2、Svn的使用,svn上傳下載程式碼。 1.2. ssm框

逐步深入瞭解SSM框架——商城專案購物車+訂單實現

1   今日大綱 1、  實現淘淘商城的購物車功能 2、  實現訂單系統。 2   購物車功能 2.1  功能說明 1、商品加入購物車時,不是必須要求登入。 2、計算購物車中商品的總價。當商品數量發

逐步深入瞭解SSM框架——商城專案redis快取

1.  課程計劃 1、  Redis服務搭建 2、  為功能新增快取功能 2.  redis介紹 2.1. 什麼是redis          Redis是用C語言開發的一個開源的高效能鍵值對(k

逐步深入瞭解SSM框架——商城專案商品詳情頁面實現

1.  課程計劃 l  商品詳情頁實現    1、商品查詢服務事項       2、商品詳情展示    3、新增快取 2.  實現商品詳情頁功能 2.1. 功能分析 1、Taotao-portal

逐步深入瞭解SSM框架——商城專案單點登入系統實現

1.  課程計劃 1、  實現單點登入系統 2、  實現使用者的登入功能 3、  實現使用者的註冊功能 2.  單點登入系統分析 2.1. 什麼是SSO SSO英文全稱Single Sign On

逐步深入瞭解SSM框架——SpringMVC框架詳解

1      SpringMVC架構 1.1    Spring web mvc介紹 Spring web mvc和Struts2都屬於表現層的框架,它是Spring框架的一部分,我們可以從Spring的整體結構中看得出來:   1.2 

逐步深入瞭解SSH框架——ssh框架整合

. 今天內容介紹 SSH三大框架整合 (1)struts2 (2)hibernate5.x                                                    

逐步深入瞭解SSH框架——struts2入門

. 今天內容 1 struts2概述 (1)應用在web層 2 struts2入門案例 3 struts2底層執行過程 4 struts2相關配置 (1)struts.xml配置 - packa

阿里程式設計師全面深入瞭解正則表示式

在日常工作中,經常會用到正則操作。但是對於大多數人來說,操作正則表示式簡直就是抓瞎。 本篇文章主要整理了正則表示式匹配的規則,使用中的一些要點,以及用圖形化的方式列舉出一些常見的正則表示式,希望能給大家帶來一定的幫助,能在以後的工作中,用上正則,愛上正則。 PS:不同語言中的正則表示式的規則

ssm框架完成圖書商城專案

使用ssm框架搭建網上圖書商場專案,主體功能已經實現。截圖:下載地址匯入sql檔案後,還需修改專案中資料庫的使用者名稱密碼。此外,還需配置eclipse的虛擬路徑,內含上傳檔案功能,虛擬路徑檢視工具類的UploadUtils.java類。都配置好後,使用管理員賬號admin1

python框架Django實戰商城專案工程搭建

# 專案說明 該電商專案類似於京東商城,主要模組有驗證、使用者、第三方登入、首頁廣告、商品、購物車、訂單、支付以及後臺管理系統。 專案開發模式採用前後端不分離的模式,為了提高搜尋引擎排名,頁面整體重新整理採用jinja2模板引擎實現,區域性重新整理採用vue.js實現。 **專案執行機制如下:** ![fi

一步步做vue後臺管理框架(三)——登錄功能

after ges efault origin 登錄功能 通過 default 路徑 第三方賬號登錄 系列教程《一步步帶你做vue後臺管理框架》第三課 github地址:vue-framework-wz 線上體驗地址:立即體驗 《一步步帶你做vue後臺管理框架》第一

用Unity做遊戲,需要深入瞭解一下IL2CPP

這次我們翻譯了一篇Unity官方部落格上的文章,原文題目為AN INTRODUCTION TO IL2CPP INTERNALS ,作者是從事Unity軟體開發的Joshua Peterson。文章的看點在於,它是以IL2CPP內部開發人員的角度來講述的,所以對於開發者來說非常有參考價值。 如果

一步步瞭解業務測打款系統的建立

1.專案背景 初始階段 業務方訂單稽核通過後,會有離線任務不斷輪訓向支付中心發起呼叫,支付中心打款處理完成後會返回ifSuccess(是否落庫),state,code,error Message等。如果落庫且code為打款成功,訂單業務狀態會修改為打款成功。 發展階段 為了配合業務發展,會增加各種活動來拉動訂

手把手教整合最優雅SSM框架 SpringMVC + Spring + MyBatis

                        &nbs

手把手教搭建與整合SSM框架(文末附原始碼)(Spring MVC + Spring + MyBatis)

目錄 1.匯入jar包 2.專案目錄總覽 3.配置Spring IoC容器 4.連線資料庫配置 5.整合mybatis環境 5.1配置對映器  5.2建立Mapper介面 5.3建立資料庫表和實體類 6.整合Spring MVC 6.1配置&nb

如果未曾深入瞭解python,請先看看這篇python簡史!

  python與人工智慧緊緊的聯絡在一起,現在很多年輕的開發者都開始學習Python,文章清晰且幽默的講述了python的發展史,希望對還在自學python的你有些幫助,或重拾自學python的激情。 學習Python中有不明白推薦加入交流群   &n

深入理解Java虛擬機器

5年碼農一枚,一直在傳統行業,現在的工作輕鬆卻無趣,打算給自己3個月時間年前換個有挑戰性的工作。之前工作中沒有太注重理論知識的學習,對新技術也沒有深入瞭解。以此為界,從《深入理解Java虛擬機器》開始,以換高薪工作為目的,將自己這段時間所學記錄下來,作為一個總