當(dāng)我們:離開我們無畏的web開發(fā)者的時(shí)候,他已經(jīng)成功地用11行代碼建立了一個(gè)在線銷售目錄。然而現(xiàn)在,他必須接著將這變成一個(gè)帶有購(gòu)物車以及相關(guān)組件的銷售站點(diǎn)。是時(shí)候該看些關(guān)于我們上星期談及的可擴(kuò)展性了;不幸的是,這意謂著我們必須再多寫一些代碼(事情總不是十全十美的對(duì)吧)。
為了把購(gòu)物車加入站點(diǎn),我們需要介紹一下當(dāng)前用戶的概念。這將會(huì)允許站點(diǎn)的訪問者登錄并且擁有他們自己的購(gòu)物車。我們將把二個(gè)新的表加入數(shù)據(jù)庫(kù),一個(gè)表儲(chǔ)存關(guān)于用戶的詳情,一個(gè)表代表購(gòu)物車。我們的表看起來會(huì)是這樣:
CREATETABLEuser(idintnotnullauto_incrementPRimarykey,first_namevarchar(64),last_namevarchar(64),emailvarchar(255),passWordvarchar(64),address1varchar(255),address2varchar(255),statevarchar(255),postal_codevarchar(64),countryvarchar(64));CREATETABLEcart_item(idintnotnullauto_incrementprimarykey,userint,itemint);
像以前一樣,Maypole會(huì)自動(dòng)為表創(chuàng)建類。我們使用Class::DBI的自動(dòng)關(guān)聯(lián)能力來讓Maypole處理這些新增的表:
ISellIt::User->has_many("cart_items"=>"ISellIt::BasketItem");ISellIt::BasketItem->has_a("user"=>"ISellit::User");ISellIt::BasketItem->has_a("item"=>"ISellit::Product");我們現(xiàn)在需要一個(gè)方法把有關(guān)當(dāng)前用戶的信息告訴我們的應(yīng)用程序。在Maypole文檔中,關(guān)于Maypole的認(rèn)證系統(tǒng)有一段很長(zhǎng)的說明,但是引入當(dāng)前用戶概念最容易的方法之一是使用Maypole::Authentication::UsersessionCookie模塊。
顧名思義,這個(gè)模塊把每個(gè)用戶和一個(gè)session相關(guān)聯(lián),并給用戶的瀏覽器發(fā)送一個(gè)cookie。同時(shí)也負(fù)責(zé)確認(rèn)用戶的登錄憑證,默認(rèn)方法是在一張數(shù)據(jù)庫(kù)表中查找用戶名和密碼;這正是我們想要的!
Maypole提供一個(gè)authenticate方法給我們重載,而且在這里我們會(huì)攔截任何一個(gè)需要合法用戶身份的請(qǐng)求,比如查看購(gòu)物車,把物品加入訂單等等。
subauthenticate{my($self,$r)=@_;unless($r->{table}eq"cart"or$r->{action}eq"buy"){returnOK;}#Elseweneedauser$r->get_user;if(!$r->{user}){$r->template("login");}returnOK;}UserSessionCookie模塊提供的一個(gè)get_user方法,它負(fù)責(zé)所有對(duì)cookie和登陸憑證進(jìn)行設(shè)置的工作。我們唯一需要做的就是告訴它,我們想用用戶的電子郵件地址和密碼作為登錄憑證,而不是一些隨意的用戶名。我們可以在我們的應(yīng)用程序配置中對(duì)這些進(jìn)行指定,如同UserSessionCookie文檔中所述:
ISellIt->{config}->{auth}->{user_field}="email";下一步,我們建立一個(gè)登錄 那么,現(xiàn)在我們得允許用戶查看購(gòu)物車。 這也被證明了是相當(dāng)簡(jiǎn)單的(Maypole中的大多數(shù)事物都是)只需要調(diào)用用戶類的一個(gè)動(dòng)作。我們需要把用戶購(gòu)物車的物品加入我們的Maypole請(qǐng)求對(duì)象中: 然后我們需要制作一個(gè)顯示他們的user/view_cart模板: 再次重申,這里的HTML代碼寫得并不好,但它也提供給了一些東西使得我們能把它交給設(shè)計(jì)人員進(jìn)行很好地設(shè)計(jì)。現(xiàn)在該對(duì)購(gòu)物車結(jié)帳了…… 構(gòu)建一個(gè)電子商務(wù)應(yīng)用程序最困難的部份就是與付款和信用卡結(jié)算服務(wù)的交互。我們將使用"Business::OnlinePayment":http://search.cpan.org/perldoc?Business::OnlinePayment來處理這方面的事情,處理結(jié)算訂單則是簡(jiǎn)單地發(fā)一封電子郵件。 再定義checkout把總額加入我們的模板: 現(xiàn)在我們寫我們的user/checkout模板: 這頁(yè)不需要載入任何對(duì)象,因?yàn)樗皇怯脕盹@示一個(gè)注冊(cè)表單;我們只要把我們的模板加入/user/register:顯示購(gòu)物車
packageISellIt::User;subview_cart:Exported{my($self,$r)=@_;$r->{objects}=[$r->{user}->cart_items];}[PROCESSheader]<h2>YourShoppingCart</h2><TABLE><TR><TH>Product</TH><TH>Price</TH></TR>[SETcount=0;FORitem=objects;SETcount=count 1;"<tr";'class="alternate"'IFcount2;">";]<TD>[item.product.name]</TD><TD>[item.product.price]</TD><TD><FORMACTION="/cart_item/delete/[item.id]"><INPUTTYPE="submit"VALUE="Removefromcart"></FORM></TD></tr>[END]</TABLE><AHREF="/user/checkout">Checkout!</A>
結(jié)帳
真正的結(jié)算頁(yè)面只需要收集信用卡和送貨信息,所以實(shí)際上它不需要任何對(duì)象;事實(shí)上我們接下來唯一需要的對(duì)象是ISellIt::User,它已經(jīng)由認(rèn)證過程納入請(qǐng)求對(duì)象中。無論如何我們的確需要顯示物品總費(fèi)用,所以,為了使事情變得更簡(jiǎn)單,我們會(huì)添加一個(gè)動(dòng)作用Perl來計(jì)算它。我們?yōu)橛脩舻目傎M(fèi)用建立一個(gè)方法,以備后用:packageISellIt::User;useList::Utilqw(sum);subbasket_cost{my$self=shift;summap{$_->item->price}$self->basket_items}subcheckout:Exported{my($self,$r)=@_;$r->{template_args}{total_cost}=$r->{user}->basket_cost;}[PROCESSheader]<h2>Checkout</h2><p>Pleaseenteryourcreditcardanddeliverydetails.</p><formmethod="post"action="https://www.isellit.com/user/do_checkout"><P>Firstname:<inputname="first_name"value="[my.first_name]"><BR>Lastname:<inputname="last_name"value="[my.last_name]"></P><P>Streetaddress:<inputname="address"value="[my.address1]"><BR>City:<inputname="city"value="[my.address2]"><BR>State:<inputname="state"value="[my.state]">Z
[INCLUDEheader]<P>WelcometobuyingwithiSellIt!</P><P>Tosetupyouraccount,weonlyneedafewdetailsfromyou:</P><FORMMETHOD="POST"ACTION="/user/do_register"><P>Yourname:<inputname="first_name"><inputname="last_name"></P><P>Youremailaddress:<inputname="email"></P><P>Pleasechooseapassword:<inputname="password"></P><inputtype="submit"name="Register"value="Register"></FORM>
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注