購物車的實現(xiàn)原理
購物車相當(dāng)于現(xiàn)實中超市的購物車,不同的是一個是實體車复隆,一個是虛擬車而已晃琳。用戶可以在購物網(wǎng)站的不同頁面之間跳轉(zhuǎn)讯检,以選購自己喜愛的商品琐鲁,點擊購買時卫旱,該商品就自動保存到你的購物車中,重復(fù)選購后围段,最后將選中的所有商品放在購物車中統(tǒng)一到付款臺結(jié)賬顾翼,這也是盡量讓客戶體驗到現(xiàn)實生活中購物的感覺。服務(wù)器通過追蹤每個用戶的行動奈泪,以保證在結(jié)賬時每件商品都物有其主适贸。
購物車的功能包括以下幾項:
- 把商品添加到購物車灸芳,即訂購
- 刪除購物車中已定購的商品
- 修改購物車中某一本圖書的訂購數(shù)量
- 清空購物車
- 顯示購物車中商品清單及數(shù)量、價格
實現(xiàn)購物車的關(guān)鍵在于服務(wù)器識別每一個用戶并維持與他們的聯(lián)系拜姿。但是HTTP協(xié)議是一種“無狀態(tài)(Stateless)”的協(xié)議烙样,因而服務(wù)器不能記住是誰在購買商品,當(dāng)把商品加入購物車時蕊肥,服務(wù)器也不知道購物車?yán)镌扔行┦裁蹿嘶瘢沟糜脩粼诓煌撁骈g跳轉(zhuǎn)時購物車無法“隨身攜帶”,這都給購物車的實現(xiàn)造成了一定的困難壁却。
目前購物車的實現(xiàn)主要是通過cookie批狱、session或結(jié)合數(shù)據(jù)庫的方式。下面分析一下它們的機制及作用展东。
1. cookie
cookie是由服務(wù)器產(chǎn)生赔硫,存儲在客戶端的一段信息。它定義了一種Web服務(wù)器在客戶端存儲和返回信息的機制盐肃,cookie文件它包含域爪膊、路徑、生存期砸王、和由服務(wù)器設(shè)置的變量值等內(nèi)容惊完。
當(dāng)用戶以后訪問同一個Web服務(wù)器時,瀏覽器會把cookie原樣發(fā)送給服務(wù)器处硬。通過讓服務(wù)器讀取原先保存到客戶端的信息小槐,網(wǎng)站能夠為瀏覽者提供一系列的方便,例如在線交易過程中標(biāo)識用戶身份荷辕、安全要求不高的場合避免用戶重復(fù)輸入名字和密碼凿跳、門戶網(wǎng)站的主頁定制、有針對性地投放廣告等等疮方。利用cookie的特性控嗜,大大擴展了WEB應(yīng)用程序的功能,不僅可以建立服務(wù)器與客戶機的聯(lián)系骡显,因為cookie可以由服務(wù)器定制疆栏,因此還可以將購物信息生成cookie值存放在客戶端,從而實現(xiàn)購物車的功能惫谤。
用基于cookie的方式實現(xiàn)服務(wù)器與瀏覽器之間的會話或購物車壁顶,有以下特點:
- cookie存儲在客戶端,且占用很少的資源溜歪,瀏覽器允許存放300個cookie若专,每個cookie的大小為4KB,足以滿足購物車的要求蝴猪,同時也減輕了服務(wù)器的負荷调衰;
- cookie為瀏覽器所內(nèi)置膊爪,使用方便。即使用戶不小心關(guān)閉了瀏覽器窗口嚎莉,只要在cookie定義的有效期內(nèi)米酬,購物車中的信息也不會丟失;
- cookie不是可執(zhí)行文件趋箩,所以不會以任何方式執(zhí)行淮逻,因此也不會帶來病毒或攻擊用戶的系統(tǒng);
- 基于cookie的購物車要求用戶瀏覽器必須支持并設(shè)置為啟用cookie阁簸,否則購物車則失效爬早;
- 存在著關(guān)于cookie侵犯訪問者隱私權(quán)的爭論,因此有些用戶會禁止本機的cookie功能启妹。
2. session
session是實現(xiàn)購物車的另一種方法筛严。session提供了可以保存和跟蹤用戶的狀態(tài)信息的功能,使當(dāng)前用戶在session中定義的變量和對象能在頁面之間共享饶米,但是不能為應(yīng)用中其他用戶所訪問桨啃,它與cookie最重大的區(qū)別是,session將用戶在會話期間的私有信息存儲在服務(wù)器端檬输,提高了安全性照瘾。在服務(wù)器生成session后,客戶端會生成一個sessionid識別號保存在客戶端丧慈,以保持和服務(wù)器的同步析命。這個sessionid是只讀的,如果客戶端禁止cookie功能逃默,session會通過在URL中附加參數(shù)鹃愤,或隱含在表單中提交等其他方式在頁面間傳送。因此利用session實施對用戶的管理則更為安全完域、有效软吐。
同樣,利用session也能實現(xiàn)購物車吟税,這種方式的特點是:
- session用新的機制保持與客戶端的同步凹耙,不依賴于客戶端設(shè)置;
- 與cookie相比肠仪,session是存儲在服務(wù)器端的信息肖抱,因此顯得更為安全,因此可將身份標(biāo)示藤韵,購物等信息存儲在session中虐沥;
- session會占用服務(wù)器資源熊经,加大服務(wù)器端的負載泽艘,尤其當(dāng)并發(fā)用戶很多時欲险,會生成大量的session,影響服務(wù)器的性能匹涮;
- 因為session存儲的信息更敏感天试,而且是以文件形式保存在服務(wù)器中,因此仍然存在著安全隱患然低。
3. 結(jié)合數(shù)據(jù)庫的方式
這也是目前較普遍的模式喜每,在這種方式中,數(shù)據(jù)庫承擔(dān)著存儲購物信息的作用雳攘,session或cookie則用來跟蹤用戶带兜。這種方式具有以下特點:
數(shù)據(jù)庫與cookie分別負責(zé)記錄數(shù)據(jù)和維持會話,能發(fā)揮各自的優(yōu)勢吨灭,使安全性和服務(wù)器性能都得到了提高刚照;
每一個購物的行為,都要直接建立與數(shù)據(jù)庫的連接喧兄,直至對表的操作完成后无畔,連接才釋放。當(dāng)并發(fā)用戶很多時吠冤,會影響數(shù)據(jù)庫的性能浑彰,因此,這對數(shù)據(jù)庫的性能提出了更高的要求拯辙;
使cookie維持會話有賴客戶端的支持郭变。
各種方式的選擇:
雖然cookie可用來實現(xiàn)購物車,但必須獲得瀏覽器的支持涯保,再加上它是存儲在客戶端的信息饵较,極易被獲取,所以這也限制了它存儲更多遭赂,更重要的信息循诉。所以一般cookie只用來維持與服務(wù)器的會話,例如國內(nèi)最大的當(dāng)當(dāng)網(wǎng)絡(luò)書店就是用cookie保持與客戶的聯(lián)系撇他,但是這種方式最大的缺點是如果客戶端不支持cookie就會使購物車失效茄猫。
session 能很好地與交易雙方保持會話,可以忽視客戶端的設(shè)置困肩。在購物車技術(shù)中得到了廣泛的應(yīng)用划纽。但session的文件屬性使其仍然留有安全隱患。
結(jié)合數(shù)據(jù)庫的方式雖然在一定程度上解決了上述的問題锌畸,但從上面的例子可以看出:在這種購物流程中涉及到對數(shù)據(jù)庫表的頻繁操作勇劣,尤其是用戶每選購一次商品,都要與數(shù)據(jù)庫進行連接,當(dāng)用戶很多的時候就加大了服務(wù)器與數(shù)據(jù)庫的負荷
電子商務(wù)網(wǎng)站購物車處理
- 不過不提倡使用session比默,這貨占用服務(wù)器資源幻捏,還有過期時間,客戶關(guān)掉瀏覽器時session即消失命咐,下次再上來篡九,又得重新選產(chǎn)品。
- cookie這東西不錯醋奠,放在客戶端的榛臼,給個一年的過期時間,只要客戶不清掉窜司,每次來都能記得上次的購物車信息沛善。大家可以看看京東,
在購物車cookie中存了不少東西塞祈,有產(chǎn)品編碼和購買的數(shù)量等信息路呜,如京東:yCartOrderLogic={&TheSkus&:[{&Id&:437741$&Num&:2}]},
原來凡客的cookie中也以JSON的形式存了很多信息织咧。
所以胀葱,我以學(xué)習(xí)的心態(tài),將產(chǎn)品編碼笙蒙,價格抵屿,名稱,類型和數(shù)量等購物信息做成一個對象捅位,然后對象序列化成JSON轧葛,存在客戶端的COOKIE中,
在讀取cookie時艇搀,在剛開始的時候很好用尿扯,反序列化cookie值成購物車條目對象就可以了,但是當(dāng)產(chǎn)品類型多起來之后焰雕,而且有套裝那種多件產(chǎn)品時衷笋,
甚至產(chǎn)品不是來自同一個數(shù)據(jù)表時,比如普通首飾和鉆石矩屁,表的結(jié)構(gòu)都不一樣了辟宗,還得到不同的表格中去取,當(dāng)然首先你得判斷產(chǎn)品類型
這時候一個購物條目對象已經(jīng)有多條子對象吝秕,往往一個查詢中嵌套著兩重以上的循環(huán)加上多個switch case泊脐,當(dāng)購物車中有十個復(fù)雜的條目時,讀取速度
將超過十秒烁峭,不管怎么優(yōu)化容客,速度就擺在那里秕铛,不快不慢。缩挑。但两。而且你不能保證客戶不下100個或更多的復(fù)雜購物車記錄,最重要的是cookie是有存儲大小限制的调煎,這種做法有產(chǎn)品很復(fù)雜時是不利的镜遣,果斷放棄己肮! - 數(shù)據(jù)庫這東西好啊士袄,不會像cookie那種容易丟失,也沒有客戶端的限制谎僻,你想怎么存娄柳,存多少都行。
購物車數(shù)據(jù)存數(shù)據(jù)庫好處有很多艘绍,可以分析購買行為赤拒,可以為客戶保存購買信息(不會因為瀏覽器關(guān)閉而丟失)等。
還需要考慮的一個問題是用戶是否登錄诱鞠,淘寶使用的就是cookie記錄挎挖,你可以試試,未登錄時可以加20個商品航夺,登錄后可以加50個蕉朵,這就是因為cookie客戶端的限制。我這里因為產(chǎn)品線的復(fù)雜性阳掐,所有購物車條目都保存在數(shù)據(jù)庫中始衅。
購物車數(shù)據(jù)庫設(shè)計成兩個關(guān)聯(lián)表
- Basket,購物車主表
基本字段有:BasketId, AddTime, UserId, AddressId, Payment, Status等缭保,不解釋了汛闸,看英文意思就行 - BasketDetail,購物車條目表
基本字段有:BasketDetailId, BasketId, Type, Code, Qty, ParentId等艺骂,ParentId用作子行標(biāo)識诸老,其它不解釋
兩個表之間使用BasketId做為關(guān)聯(lián)
當(dāng)用戶登錄狀態(tài)時,添加產(chǎn)品到購物時钳恕,查看Basket中是否有Status為True的購物車孕锄,沒有則添加一條新的Basket記錄,并將產(chǎn)品信息相關(guān)數(shù)據(jù)添加至BasketDetail表中
當(dāng)用戶未登錄時苞尝,使用cookie記錄一個BasketId值畸肆,不往Basket表中插入數(shù)據(jù),只往BasketDetail插入數(shù)據(jù)宙址,其中的BasketId值使用cookie中的BasketId值轴脐,當(dāng)用戶登錄后,查看Basket中是否有Status為True的購物車記錄,有則合并(更新cookie和BasketDetail中的BasketId為查詢出來的Basket表中的BasketId值)大咱,無則添加一條新的Basket記錄恬涧,并將BasketId值置為Cookie中記錄的basketid值
購物車C#對象也設(shè)計兩個(主要用于獲取數(shù)據(jù))
- BasketModel,大體如下:
public class BasketModel: Basket {
public decimal TotalPrice{get;set;}
public int TotalMP{get;set;}
public List<BasketDetailModel> BasketDetailModels{get;set;}
}
- BasketDetailModel碴巾,大體如下:(這里的ViewBasketDetail是一個視圖溯捆,上面BasketDetail設(shè)計中沒有產(chǎn)品價格,用視圖關(guān)聯(lián)到相關(guān)的表厦瓢,獲取價格提揍,為什么不設(shè)計價格字段,不解釋煮仇。劳跃。。)
public class BasketDetailModel {
public ViewBasketDetail Detail{get;set;}
public List<ViewBasketDetail> SubDetails{get;set;}
}
購物車起源
對于大部分B2C網(wǎng)站來說浙垫,購物車是網(wǎng)站的咽喉之地刨仑,訂單是白花花的銀子,所有銀子都必然流經(jīng)購物車夹姥,購物車不能有失杉武。
優(yōu)秀的購物車設(shè)計至少需要完成兩項使命:
一是方便用戶多買貨多掏銀子;
二是幫用戶保管好待購的貨品,方便下次接著掏銀子辙售。
購物車是個較復(fù)雜的系統(tǒng)轻抱,一般會跟訂單、商品圾亏、庫存十拣、會員和促銷等模塊有曖昧關(guān)系,也算是牽一發(fā)而動全身志鹃。所以夭问,在不了解購物車前,不宜輕易的指揮你的程序員修改購物車曹铃。
傳統(tǒng)的購物車一般指超市中顧客去結(jié)算前暫時存放所選商品的一種手推車缰趋。1937年6月美國人Sylvan Goldman 發(fā)明了第一輛購物車,隨后購物車風(fēng)行各國賣場陕见。在中國秘血,大家熟知的是以“沃爾瑪“為代表的“美式購物車”和以“7-Eleven”為代表的“日式購物車”。
購物車存在的價值是:
- 便于客戶在選購商品到結(jié)算完成前存儲商品评甜,解放客戶的手灰粮。實際上是讓用戶多購買商品,提高客單價忍坷。
- 不僅可存放選購好的商品粘舟,還附帶了嬰兒車的功能熔脂,讓帶小孩的父母方便購物。
- 沃爾瑪在2007年率先于超市中采用無線射頻技術(shù)(RFID)柑肴,每件商品打上電子標(biāo)簽霞揉,放入購物車中的商品能被追蹤,結(jié)算時無需掃描每件商品晰骑,購物車經(jīng)過特殊的掃描裝置后即可計算出最終的總價格适秩。
購物車被廣泛用于分析用戶的購買行為。
在線購物車硕舆,這里是指用戶點擊按鈕“加入購物車(add to shopping cart)”到點擊“去結(jié)算(check out)”按鈕之間的過程秽荞。值得注意的是,購物車不僅僅指“shopping cart page”!
大概在傳統(tǒng)購物車被發(fā)明60年后岗宣,1995年蚂会,美國人Mark Mumma (web site designer)發(fā)明了第一個Online Shopping Cart(這里指的是購物系統(tǒng))淋样,而至于本文提到的購物車的在線購物車的發(fā)明者耗式,沒有考證出來。1999年4月趁猴,又是美國人Juliette Harrington 發(fā)明了一項專利:虛擬購物車刊咳,該技術(shù)使在線用戶能夠用一個通用的虛擬購物車從不同的網(wǎng)站采購商品和服務(wù),最后僅僅在一個地方付款(沒記錯的話儡司,2008年亞馬遜網(wǎng)站使用了該項專利娱挨,具體可以查看:https://payments.amazon.com/sdui/sdui/business/cba/shoppingcart#features)。
在線購物車主要作用在于:
- 和傳統(tǒng)賣場類似捕犬,方便用戶一次選擇多件商品去結(jié)算跷坝。
- 充當(dāng)臨時收藏夾的功能。
- 對于商家來說碉碉,購物車是向用戶推銷的最佳場所之一柴钻。
什么時候可以考慮不要購物車?
在傳統(tǒng)的的小超市和商店是沒有購物車(或購物籃)的,因為距離短垢粮、空間小等原因贴届。電器城、電腦城也沒購物車吧?因為代送貨&顧客東西買得少吧? 和在線購物車對應(yīng)的另一個功能是“立即購買”蜡吧,也就是一次只能選擇一件或一套商品去支付毫蚓。理論上沒有購物車是能走通流程的,現(xiàn)在的ebay和當(dāng)年的淘寶是只有“立即購買”沒有購物車的昔善。
以下情況可以考慮用“立即購買”代替購物車:
- SKU數(shù)少元潘,當(dāng)年的減肥產(chǎn)品“綠瘦”的官網(wǎng)很典型;
- 商品結(jié)構(gòu)單一,比如只賣杯子君仆,不賣其它產(chǎn)品翩概,你的用戶大部分情況下也就只會買一個杯子(當(dāng)然啸澡,你可以通過套裝功能組合銷售賣多件,但不需要購物車)氮帐。
- 通過數(shù)據(jù)分析嗅虏,發(fā)現(xiàn)用戶訂單平均商品數(shù)無限接近1(當(dāng)然這有關(guān)聯(lián)銷售不力的可能)。
- 你非常期望你的用戶每次只買一件商品就滾蛋上沐,不要磨蹭!
購物車入口有哪些?
購物車入口是指把商品加入購物車的途徑皮服。常見的有:在商品詳情頁把商品加入購物車、在收藏夾把商品加入購物車参咙、在已購買成功的訂單把商品加入購物車龄广、在已取消的訂單把商品加入購物車、把購物車頁面的關(guān)聯(lián)推薦商品直接加入購物車蕴侧。
由于購物車直接跟庫存和促銷有關(guān)系择同,所以不同的入口,存在不同的處理邏輯净宵。這里舉2個例子敲才,拋磚引玉,我不展開寫:
- 對已成功完成的訂單择葡,點擊“重新購買”或“重新加入購物車”紧武,若部分或全部商品沒有庫存該如何處理? 原來送贈品現(xiàn)在不送了,該如何處理?
- 同理用在已取消的訂單上敏储,若有商品被刪除或下架了阻星,如何處理? 若目前可供購買的數(shù)量小于原訂單,該如何處理?
同時已添,我們還需考慮不同的購物車入口的交互方式妥箕。如在商品詳情頁,商品加入購物車后更舞,是直接進入購物車?迷你購物車下拉提示? 彈出層讓用戶選擇去購物車or繼續(xù)購買? 哪種做法適合你的網(wǎng)站?購物車的入口處理我暫時寫到這里畦幢,提供一篇很精彩的文章供大家繼續(xù)研究:http://blog.csdn.net/youshandeyang/article/details/5316568yixieshi
購物車的出口
有入口必然有出口,我把購物車的出口解釋為:商品移除購物車的途徑疏哗。常見的方式有三種呛讲。
- 購物車商品被攜帶去結(jié)算,并成功提交訂單; 這是最常見的方式這里需要重點考慮一個問題:若登錄前商品A被加入購物車返奉,實際上登錄狀態(tài)下用戶的購物車保存了商品B和C贝搁。在購物車點擊“去結(jié)算”,要求用戶登錄芽偏,登錄后被攜帶去結(jié)算的商品是A雷逆,還是A+B+C? 或者讓用戶自己選擇(shopex的做法)?
- 購物車商品被刪除;
- 購物車商品被加入收藏夾。若購物車中商品能被加入收藏夾么?加入收藏夾后污尉,購物車中該商品記錄要被同時刪除么?
下面進入解說具體功能的階段膀哲,設(shè)計功能前得明白產(chǎn)品的核心功能是什么往产,擴展功能是什么? 核心功能上可以做哪些延展,擴展功能又能做哪些延伸某宪。先理解購物車的主要作用:1仿村、方便用戶攜帶多件商品一起去結(jié)算;2、臨時商品儲存地兴喂。而購物車次要作用有:1蔼囊、讓用戶多買東西,提高客單價(網(wǎng)站價值觀不同衣迷,有的網(wǎng)站期望用戶趕緊進入下一步去結(jié)算)畏鼓。
購物車核心功能&延展功能
見下圖,由用戶需求推導(dǎo)出購物車核心功能需求壶谒。下圖是一個購物車應(yīng)該滿足的功能需求云矫,當(dāng)然,根據(jù)自身網(wǎng)站情況可增減汗菜。
購物車擴展功能&延展功能 互聯(lián)網(wǎng)的一些事
文字懶得寫了让禀,還是畫圖快。呵俏。
購物車的狀態(tài)
這是一個較容易被忽略的點堆缘,一般情況滔灶,用戶常見到的購物車狀態(tài)是登錄前或登錄后購物車有商品普碎。實際上還包括登錄前或登錄后購物車為空、登錄前或登錄后購物車有商品(部分或全部)被下架录平、庫存為零等狀態(tài)麻车。
- 登錄前購物車有商品:這是一種很好理解的狀態(tài),對于有會員等級還享受會員折扣的站點斗这,要考慮的問題是登錄前和登錄后商品的價格可能不一致动猬,如果在購物車使用優(yōu)惠券,登錄前能否使用?
- 登錄后購物車有商品:這種狀態(tài)是最常見的表箭,就不說了
-
登錄前購物車為空:首先要考慮的一點是赁咙,如果購物車沒有商品,是否允許用戶點擊進入購物車頁面? 如果允許免钻,購物車要做的工作有哪幾件? 我總結(jié)了下彼水,常見的提示有:
1)告訴用戶購物車為空,并給出返回首頁繼續(xù)購物的快捷鏈接
2)告訴用戶未登錄可能導(dǎo)致購物車為空极舔,提示用戶登錄;
3)推薦商品給用戶凤覆。 -
登錄后購物車為空:參照登錄前為空的第2和第3點
登錄前或登錄后購物車商品全部或部分被下架或庫存為零:這是一種非常特殊的狀態(tài),至少得解決2個問題:
1)告訴用戶有商品被下架或庫存為零;
2)用戶是否能繼續(xù)去結(jié)算?如果阻止用戶去結(jié)算拆魏,用戶需要做什么?
購物車數(shù)據(jù)的保存方式
這段是稍偏技術(shù)的話題盯桦,但仔細看看也較好理解慈俯。在看這段文字前,你需要簡單理解“cookie拥峦、session和數(shù)據(jù)庫”三個概念贴膘。當(dāng)然,這里我就不解釋了略号,自己去google一下吧步鉴。購物車數(shù)據(jù)的保存是一個非常細節(jié)的體驗,但同樣非常重要璃哟,實際上數(shù)據(jù)的保存方式直接影響用戶收藏商品的體驗氛琢。用戶常會有這么3個疑問:
- 網(wǎng)站A,為什么我加入購物車的商品随闪,第二次登陸該網(wǎng)站后阳似,商品消失卻消失了?
- 網(wǎng)站B,為什么我換一臺電腦铐伴,購物車中的商品卻沒了?
- 網(wǎng)站C撮奏,我沒有往購物車添加商品呀,誰用了我的電腦呀? 互聯(lián)網(wǎng)的一些事
根據(jù)每個網(wǎng)站實際情況当宴,一般需要考慮以下情況:
- 登錄前畜吊,往購物車添加了商品,商品數(shù)據(jù)該保存在哪?cookie or 會話方式?
- 登錄后户矢,往購物車添加了商品玲献,商品數(shù)據(jù)該保存在哪?cookie or 會話方式 or 數(shù)據(jù)庫?保存多久?
- 未登錄狀態(tài)下往購物車添加了商品,保存方式為A梯浪,后來登錄了捌年,保存方式為B。A和B應(yīng)該是怎樣一種關(guān)系挂洛。用戶退出登錄后A和B又怎樣一種關(guān)系礼预、怎樣一種處理邏輯?
- 如果在使用cookie保存數(shù)據(jù),假設(shè)用戶瀏覽器禁用了cookie虏劲,如何處理?
- 假設(shè)用cookie保存數(shù)據(jù)托酸,什么情況下cookie保存的數(shù)據(jù)會被系統(tǒng)清除(注意是系統(tǒng)而不是人為)?
- 假設(shè)用數(shù)據(jù)庫保存購物車數(shù)據(jù),什么情況下數(shù)據(jù)庫保存的數(shù)據(jù)會被系統(tǒng)清除?
再同時柒巫,可以結(jié)合數(shù)據(jù)的保存方式励堡,考慮購物車數(shù)據(jù)營銷:
- 某A注冊用戶放棄購物車了,是否可以考慮一個星期后觸發(fā)郵件提醒對方?
- 如果購物車數(shù)據(jù)要被系統(tǒng)清除吻育,在這之前念秧,是否考慮郵件提醒用戶?
- 如果用戶對你的郵件提醒無動于衷,是否考慮給點優(yōu)惠勾引?如給優(yōu)惠券布疼,給折扣!
迷你購物車
較多的是考慮交互摊趾、信息組織和界面問題币狠,此處略。
最后砾层,送一副心智圖漩绵,歡迎傳播