帶你逐步深入瞭解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 //服務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(
1. 今日計劃
1、 SSM框架整合
2、 mybatis逆向工程
3、 商品列表
4、 商品列表分頁處理
2. SSM框架整合
2.1. 後臺系統所用的技術
框架:Spring + SpringMVC +Mybatis
前端:EasyUI
資料庫:mysql
1. 課程計劃
完成商品新增功能
1、商品類目選擇
2、圖片上傳
3、圖片伺服器搭建
4、kindEditor富文字編輯器的使用
5、商品新增功能
2. 實現商品類目選擇功能
2.1. 需求
1. 專案總結
總結淘淘商城中用到的技術點:
1.1. 專案工程搭建。
1、使用maven構建工程。Maven的繼承、聚合、依賴管理。
2、Svn的使用,svn上傳下載程式碼。
1.2. ssm框
1 今日大綱
1、 實現淘淘商城的購物車功能
2、 實現訂單系統。
2 購物車功能
2.1 功能說明
1、商品加入購物車時,不是必須要求登入。
2、計算購物車中商品的總價。當商品數量發
1. 課程計劃
1、 Redis服務搭建
2、 為功能新增快取功能
2. redis介紹
2.1. 什麼是redis
Redis是用C語言開發的一個開源的高效能鍵值對(k
1. 課程計劃
l 商品詳情頁實現
1、商品查詢服務事項
2、商品詳情展示
3、新增快取
2. 實現商品詳情頁功能
2.1. 功能分析
1、Taotao-portal
1. 課程計劃
1、 實現單點登入系統
2、 實現使用者的登入功能
3、 實現使用者的註冊功能
2. 單點登入系統分析
2.1. 什麼是SSO
SSO英文全稱Single Sign On
1 SpringMVC架構
1.1 Spring web mvc介紹
Spring web mvc和Struts2都屬於表現層的框架,它是Spring框架的一部分,我們可以從Spring的整體結構中看得出來:
1.2
.
今天內容介紹
SSH三大框架整合
(1)struts2
(2)hibernate5.x
.
今天內容
1 struts2概述
(1)應用在web層
2 struts2入門案例
3 struts2底層執行過程
4 struts2相關配置
(1)struts.xml配置
- packa
在日常工作中,經常會用到正則操作。但是對於大多數人來說,操作正則表示式簡直就是抓瞎。
本篇文章主要整理了正則表示式匹配的規則,使用中的一些要點,以及用圖形化的方式列舉出一些常見的正則表示式,希望能給大家帶來一定的幫助,能在以後的工作中,用上正則,愛上正則。
PS:不同語言中的正則表示式的規則
使用ssm框架搭建網上圖書商場專案,主體功能已經實現。截圖:下載地址匯入sql檔案後,還需修改專案中資料庫的使用者名稱密碼。此外,還需配置eclipse的虛擬路徑,內含上傳檔案功能,虛擬路徑檢視工具類的UploadUtils.java類。都配置好後,使用管理員賬號admin1 # 專案說明
該電商專案類似於京東商城,主要模組有驗證、使用者、第三方登入、首頁廣告、商品、購物車、訂單、支付以及後臺管理系統。
專案開發模式採用前後端不分離的模式,為了提高搜尋引擎排名,頁面整體重新整理採用jinja2模板引擎實現,區域性重新整理採用vue.js實現。
**專案執行機制如下:**
![fi after ges efault origin 登錄功能 通過 default 路徑 第三方賬號登錄 系列教程《一步步帶你做vue後臺管理框架》第三課
github地址:vue-framework-wz
線上體驗地址:立即體驗
《一步步帶你做vue後臺管理框架》第一
這次我們翻譯了一篇Unity官方部落格上的文章,原文題目為AN INTRODUCTION TO IL2CPP INTERNALS ,作者是從事Unity軟體開發的Joshua Peterson。文章的看點在於,它是以IL2CPP內部開發人員的角度來講述的,所以對於開發者來說非常有參考價值。
如果 1.專案背景
初始階段
業務方訂單稽核通過後,會有離線任務不斷輪訓向支付中心發起呼叫,支付中心打款處理完成後會返回ifSuccess(是否落庫),state,code,error Message等。如果落庫且code為打款成功,訂單業務狀態會修改為打款成功。
發展階段
為了配合業務發展,會增加各種活動來拉動訂
目錄
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中有不明白推薦加入交流群 &n
5年碼農一枚,一直在傳統行業,現在的工作輕鬆卻無趣,打算給自己3個月時間年前換個有挑戰性的工作。之前工作中沒有太注重理論知識的學習,對新技術也沒有深入瞭解。以此為界,從《深入理解Java虛擬機器》開始,以換高薪工作為目的,將自己這段時間所學記錄下來,作為一個總 |