µ±ÎÒÃÇ
ÎÒÊÇË£¿
ΪÁ˰ѹºÎï³µ¼ÓÈëÕ¾µã£¬ÎÒÃÇÐèÒª½éÉÜһϵ±Ç°Óû§µÄ¸ÅÄî¡£Õ⽫»áÔÊÐíÕ¾µãµÄ·ÃÎÊÕߵǼ²¢ÇÒÓµÓÐËûÃÇ×Ô¼ºµÄ¹ºÎï³µ¡£ÎÒÃǽ«°Ñ¶þ¸öеıí¼ÓÈëÊý¾Ý¿â£¬Ò»¸ö±í´¢´æ¹ØÓÚÓû§µÄÏêÇ飬һ¸ö±í´ú±í¹ºÎï³µ¡£ÎÒÃÇµÄ±í¿´ÆðÀ´»áÊÇÕâÑù£º
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»á×Ô¶¯Îª±í´´½¨Àà¡£ÎÒÃÇʹÓÃClass::DBIµÄ×Ô¶¯¹ØÁªÄÜÁ¦À´ÈÃMaypole´¦ÀíÕâЩÐÂÔöµÄ±í£º
ISellIt::User->has_many("cart_items"=>"ISellIt::BasketItem");ISellIt::BasketItem->has_a("user"=>"ISellit::User");ISellIt::BasketItem->has_a("item"=>"ISellit::Product");ÎÒÃÇÏÖÔÚÐèÒªÒ»¸ö·½·¨°ÑÓйص±Ç°Óû§µÄÐÅÏ¢¸æËßÎÒÃǵÄÓ¦ÓóÌÐò¡£ÔÚMaypoleÎĵµÖУ¬¹ØÓÚMaypoleµÄÈÏ֤ϵͳÓÐÒ»¶ÎºÜ³¤µÄ˵Ã÷£¬µ«ÊÇÒýÈ뵱ǰÓû§¸ÅÄî×îÈÝÒ׵ķ½·¨Ö®Ò»ÊÇʹÓÃMaypole::Authentication::UserSessionCookieÄ£¿é¡£
¹ËÃû˼Ò壬Õâ¸öÄ£¿é°Ñÿ¸öÓû§ºÍÒ»¸ösessionÏà¹ØÁª£¬²¢¸øÓû§µÄä¯ÀÀÆ÷·¢ËÍÒ»¸öcookie¡£Í¬Ê±Ò²¸ºÔðÈ·ÈÏÓû§µÄµÇ¼ƾ֤£¬Ä¬ÈÏ·½·¨ÊÇÔÚÒ»ÕÅÊý¾Ý¿â±íÖвéÕÒÓû§ÃûºÍÃÜÂ룻ÕâÕýÊÇÎÒÃÇÏëÒªµÄ£¡
MaypoleÌṩһ¸öauthenticate·½·¨¸øÎÒÃÇÖØÔØ£¬¶øÇÒÔÚÕâÀïÎÒÃÇ»áÀ¹½ØÈκÎÒ»¸öÐèÒªºÏ·¨Óû§Éí·ÝµÄÇëÇó,±ÈÈç²é¿´¹ºÎï³µ£¬°ÑÎïÆ·¼ÓÈë¶©µ¥µÈµÈ¡£
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Ä£¿éÌṩµÄÒ»¸öget_user·½·¨£¬Ëü¸ºÔðËùÓжÔcookieºÍµÇ½ƾ֤½øÐÐÉèÖõŤ×÷¡£ÎÒÃÇΨһÐèÒª×öµÄ¾ÍÊǸæËßËü£¬ÎÒÃÇÏëÓÃÓû§µÄµç×ÓÓʼþµØÖ·ºÍÃÜÂë×÷ΪµÇ¼ƾ֤£¬¶ø²»ÊÇÒ»Ð©ËæÒâµÄÓû§Ãû¡£ÎÒÃÇ¿ÉÒÔÔÚÎÒÃǵÄÓ¦ÓóÌÐòÅäÖÃÖжÔÕâЩ½øÐÐÖ¸¶¨£¬ÈçͬUserSessionCookieÎĵµÖÐËùÊö£º
ISellIt->{config}->{auth}->{user_field}="email";ÏÂÒ»²½£¬ÎÒÃǽ¨Á¢Ò»¸öµÇ¼ģ°å£¬ÓÃÀ´ÏÔʾһ¸ö±íµ¥¸øÓû§Ìá½»ËûÃÇµÄÆ¾Ö¤£»ÔÚMaypoleÊÖ²áRequestÕ½ÚÖоÍÓÐÒ»¸ö£¬ÎÒÃÇ¿ÉÒÔ¼ÓÒÔÐÞ¸ÄÒÔÊʺÏÎÒÃǵÄÐèÒª£º
[INCLUDEheader]<h2>Youneedtologinbeforebuyinganything</h2><DIVclass="login">[IFlogin_error]<FONTCOLOR="#FF0000">[login_error]</FONT>[END]<FORMACTION="/[request.path]"METHOD="post">EmailAddress:<INPUTTYPE="text"NAME="email"><BR>Password:<INPUTTYPE="password"NAME="password"><BR><INPUTTYPE="submit"></FORM></DIV>
ÄÇôÏÖÔڵǼµÄÎÊÌâ½â¾öÁË£»Èç¹ûÒ»¸öÓû§Ìá½»ÁËÕýÈ·µÄƾ֤£¬get_user½«»á°ÑÓû§µÄISellIt::User¶ÔÏó×÷Ϊ$r->{user}·Å½øMaypoleÇëÇó¶ÔÏóÖÐ,È»ºó¼ÌÐø´¦ÀíÓû§µÄÇëÇó¡£
ÒòΪÏÖÔÚÎÒÃÇÓÐÁËÒ»¸ö¿ÉÓõÄÓû§¶ÔÏ󣬵±È»¾Í¿ÉÒÔÔÚÆäËûµØ·½Ê¹ÓÃÕâ¸öÓû§µÄÐÅÏ¢£º
[IFrequest.user]<DIVclass="messages">Welcomeback,[request.user.first_name]!</DIV>[END]
ÓÉÓÚÎÒÃÇ»áÔÚºÜ¶àµØ·½Ìá¼°Õâ¸öÓû§£¬ËùÒÔÎÒÃǰÑËü×÷Ϊһ¸ö¶îÍâµÄ²ÎÊýmy´«¸øÄ£°å¡£MaypoleÓÐÒ»¸öºÜÅ£µÄhook·½·¨additional_data£¬·Ç³£ÊʺÏÓÃÀ´×öÕâ¸ö¡£
subadditional_data{my$r=shift;$r->{template_args}{my}=$r->{user};}ÎÒÃǸøËüÈ¡ÃûΪmy£¬¾ÙÀýÀ´ËµÎÒÃÇ¿ÉÒÔÕâÑùµ÷ÓÃËü£º
<DIVclass="messages">Welcomeback,[my.first_name]!</DIV>
ËùÒÔÏÖÔÚÎÒÃÇÓÐÒ»¸öÓû§¡£ÎÒÃÇ¿ÉÒÔÔö¼ÓÒ»¸öÐµĶ¯×÷order£¬°ÑÒ»¸öÎïÆ·¼ÓÈëÓû§µÄ¹ºÎï³µ£º
packageISellIt::Product;suborder:Exported{my($self,$r,$product)=@_;$r->{user}->add_to_cart_items({item=>$product});$r->{template}="view";}Õâ»áÔÚcart_item±íÀïÌí¼ÓÒ»¸öÌõÄ¿£¬°ÑÎïÆ·ºÍÓû§¹ØÁªÆðÀ´£¬È»ºóÈÃÎÒÃÇ·µ»ØÏÈǰµÄÒ³ÃæÀ´²é¿´ÎïÆ·¡£
ÎÒÃÇÒѾ°ÑÎÒÃǵÄÓû§ËÍ»ØÁËÏÈǰµÄÒ³Ãæ£¬µ«Ã»ÓÐÌáʾ˵ÎÒÃǸղÅȷʵ°ÑÒ»¸öÎïÆ·¼ÓÈëÁËËûµÄ¹ºÎï³µ£»ÎÒÃÇÄÜͨ¹ý°ÑÐÅÏ¢´«½øÄ£°åÀ´¸ø³öÕâÑùµÄÌáʾ£º
suborder:Exported{my($self,$r,$product)=@_;$r->{user}->add_to_cart_items({item=>$product});$r->{template}="view";$r->{template_args}{bought}=1;}È»ºóÏÔʾËü£º
[IFbought]<DIVclass="messages">Wevejustaddedthisitemtoyourshoppingcart.Tocompleteyourtransaction,please<AHREF="/user/view_cart">viewyourcart</A>andcheckout.</DIV>[END]
ÄÇô£¬ÏÖÔÚÎÒÃǵÃÔÊÐíÓû§²é¿´¹ºÎï³µ¡£
ÏÔʾ¹ºÎï³µ
ÕâÒ²±»Ö¤Ã÷ÁËÊÇÏ൱¼òµ¥µÄ£¨MaypoleÖеĴó¶àÊýÊÂÎï¶¼ÊÇ£©Ö»ÐèÒªµ÷ÓÃÓû§ÀàµÄÒ»¸ö¶¯×÷¡£ÎÒÃÇÐèÒª°ÑÓû§¹ºÎï³µµÄÎïÆ·¼ÓÈëÎÒÃǵÄMaypoleÇëÇó¶ÔÏóÖУº
packageISellIt::User;subview_cart:Exported{my($self,$r)=@_;$r->{objects}=[$r->{user}->cart_items];}È»ºóÎÒÃÇÐèÒªÖÆ×÷Ò»¸öÏÔʾËûÃǵÄuser/view_cartÄ£°å£º
[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>
ÔÙ´ÎÖØÉ꣬ÕâÀïµÄHTML´úÂëдµÃ²¢²»ºÃ£¬µ«ËüÒ²Ìṩ¸øÁËһЩ¶«Î÷ʹµÃÎÒÃÇÄܰÑËü½»¸øÉè¼ÆÈËÔ±½øÐкܺõØÉè¼Æ¡£ÏÖÔڸöԹºÎï³µ½áÕÊÁË¡¡
½áÕÊ
¹¹½¨Ò»¸öµç×ÓÉÌÎñÓ¦ÓóÌÐò×îÀ§ÄѵIJ¿·Ý¾ÍÊÇÓ븶¿îºÍÐÅÓÿ¨½áËã·þÎñµÄ½»»¥¡£ÎÒÃǽ«Ê¹ÓÃ"Business::OnlinePayment":http://search.cpan.org/perldoc?Business::OnlinePaymentÀ´´¦ÀíÕâ·½ÃæµÄÊÂÇ飬´¦Àí½áËã¶©µ¥ÔòÊǼòµ¥µØ·¢Ò»·âµç×ÓÓʼþ¡£
ÕæÕýµÄ½áËãÒ³ÃæÖ»ÐèÒªÊÕ¼¯ÐÅÓÿ¨ºÍËÍ»õÐÅÏ¢£¬ËùÒÔʵ¼ÊÉÏËü²»ÐèÒªÈκζÔÏó£»ÊÂʵÉÏÎÒÃǽÓÏÂÀ´Î¨Ò»ÐèÒªµÄ¶ÔÏóÊÇISellIt::User£¬ËüÒѾÓÉÈÏÖ¤¹ý³ÌÄÉÈëÇëÇó¶ÔÏóÖС£ÎÞÂÛÈçºÎÎÒÃǵÄÈ·ÐèÒªÏÔʾÎïÆ·×Ü·ÑÓã¬ËùÒÔ£¬ÎªÁËʹÊÂÇé±äµÃ¸ü¼òµ¥£¬ÎÒÃÇ»áÌí¼ÓÒ»¸ö¶¯×÷ÓÃPerlÀ´¼ÆËãËü¡£ÎÒÃÇΪÓû§µÄ×Ü·ÑÓý¨Á¢Ò»¸ö·½·¨£¬ÒÔ±¸ºóÓãº
packageISellIt::User;useList::Utilqw(sum);subbasket_cost{my$self=shift;summap{$_->item->price}$self->basket_items}ÔÙ¶¨Òåcheckout°Ñ×ܶî¼ÓÈëÎÒÃǵÄÄ£°å£º
subcheckout:Exported{my($self,$r)=@_;$r->{template_args}{total_cost}=$r->{user}->basket_cost;}ÏÖÔÚÎÒÃÇдÎÒÃǵÄuser/checkoutÄ£°å£º
[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]">Zip:<inputname="zip"value="[my.postal_code]"></P><P>Cardtype:<selectname="type"><option>Visa</option><option>Mastercard</option>...</select>Cardnumber:<inputname="card_number">Expiration:<inputname="expiration"><BR>Total:$[total_price]</P><P>Pleaseclick<B>once</B>andwaitforthepaymenttobeauthorised....<inputtype="submit"value="order"></form>
µ±ÕâЩÊý¾Ý±»Ìá½»¸ødo_checkout¶¯×÷ʱ»á·¢ÉúÊ²Ã´ÄØ£¿£¨Äã»á×¢Òâµ½ÕâÊÇͨ¹ýSSLÁ¬½ÓµÄ£©¡£ÎÒÃǽ«»áÏȼì²éÓû§ÊÇ·ñÒѾÊäÈëµØÖ·ÏêÇ飬¶øÇÒÈç¹ûÊǵϰ£¬°ÑËüÃÇ´æ½øÊý¾Ý¿â¡£Ò²ÐíÕâÔÚä¯ÀÀÆ÷ÄÜ×Ô¶¯Ìîд±íµ¥µÄ½ñÌìÏÔµÃûʲô±ØÒª£¬²»¹ýÈÔ²»Ê§ÎªÒ»Ïî±ãÀûµÄ´ëÊ©¡£Maypole°ÑPOST¹ýÀ´µÄ²ÎÊý´¢´æÔÚparamsÖУº
subdo_checkout:Exported{my($self,$r)=@_;myparams={$r->{params}};my$user=$r->{user};$user->address1($params{address})unless$user->address1;$user->address2($params{city})unless$user->address2;$user->state($params{state})unless$user->state;$user->postal_code($params{zip})unless$user->postal_code;ÎÒÃÇÐèÒª½èÖúBusiness::OnlinePayment¹¹ÔìÒ»¸ö·¢Ë͸øÍⲿ֧¸¶Íø¹ØµÄÇëÇó£»Ì«¸ÐлÁË£¬ÎÒÃǽÓÊÕµ½µÄ±íµ¥²ÎÊý½«ÕýºÃÊÇOnlinePaymentÐèÒªµÄ¸ñʽ£¬¸ÐлÕâôÌåÌùµÄ±íµ¥Éè¼Æ¡£ËùÓÐÎÒÃÇÐèÒª×öµÄ¾ÍÊDzåÈëÎÒÃǵÄÕÊ»§Ã÷ϸºÍ×ܶ
my$tx=newBusiness::OnlinePayment("TCLink");$tx->content(params,type=>"cc",login=>VENDOR_LOGIN,password=>VENDOR_PASSWORD,action=>NormalAuthorizationamount=>$r->{user}->basket_total);ÏÖÔÚÎÒÃÇÄÜÌá½»Õ˵¥£¬È»ºó¿´ÓÐʲô·¢Éú¡£Èç¹ûÓÐÎÊÌ⣬ÎÒÃÇ»á°ÑÒ»¸öÏûÏ¢¼ÓÈëÄ£°å£¬¶øÇÒÔÙÒ»´Î°ÑÓû§ËÍ»ØÏÈǰµÄÒ³Ãæ£º
$tx->submit;if(!$tx->is_success){$r->{template_args}{message}="Therewasaproblemauthorizingyourtransaction:".$tx->error_message;$r->{template}="checkout";return;}ûÓÐÎÊÌâµÄ»°£¬ÎÒÃǾÍÄܵõ½Ö§¸¶¸øÎÒÃǵÄÇ®£»ÏÖÔÚÎÒÃǵðÑËü¸æËß·¢»õÔ±£¬·ñÔòÎÒÃÇ»áºÜ¿ìʧȥ¿Í»§£º
fulfill_order(address_details=>$r->{params},order_details=>[map{$_->item}$r->{user}->cart_items],cc_auth=>$tx->authorization);ÄÇôÏÖÔÚÎÒÃÇÇå¿Õ¹ºÎï³µ£¬°ÑÓû§ËÍÉÏ·£º
$_->deletefor$r->{user}->cart_items;$r->{template}="frontpage";}Íê³É£¡ÎÒÃÇÒÑ´øÓû§Íê³ÉÁ˵ǽ£¬°ÑÉÌÆ·¼ÓÈ빺Îï³µ£¬ÑéÖ¤ÐÅÓÿ¨¼°½áÕʵĹý³Ì¡£µ«ÊÇ¡¡ÉԵȡ£Æð³õÎÒÃÇÔõÑùµÃµ½Óû§ÄØ£¿
×¢²áÓû§
ÎÒÃDZØÐëÕÒÒ»¸ö·½·¨À´ÈÃÓû§×¢²á¡£Êµ¼ÊÉÏÕâ²¢²»ÔõôÄÑ£¬ÌرðÊÇÒòΪÎÒÃÇÄÜʹÓÃMaypoleÊÖ²áÖÐFloxµÄÀý×Ó¡£Ê×ÏÈ£¬ÎÒÃǽ«»á°ÑÒ»¸ö"×¢²á"Á´½Ó¼ÓÈëÎÒÃǵĵǼģ°å£º
<P>Newuser?<AHREF="/user/register">Signup!</A></P>
ÕâÒ³²»ÐèÒªÔØÈëÈκζÔÏó£¬ÒòΪËüÖ»ÊÇÓÃÀ´ÏÔʾһ¸ö×¢²á±íµ¥£»ÎÒÃÇÖ»Òª°ÑÎÒÃǵÄÄ£°å¼ÓÈë/user/register£º
[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>
ÏñÒÔǰһÑù£¬ÎÒÃÇÐèÒªÏò
ISellIt::User->untaint_columns(printable=>[qw/first_namelast_namepassword/],email=>[qw/email/],);
ÏÖÔÚÎÒÃÇÄÜдÎÒÃǵÄdo_registerʼþÁË£¬Ê¹ÓÃFromCGIµÄÐÎʽ£º
subdo_register:Exported{my($self,$r)=@_;my$h=CGI::Untaint->new({$r->{params}});my$user=$self->create_from_cgi($h);Èç¹û»¹ÓÐÎÊÌ⣬ÎÒÃǰÑËûÃÇÖØÐÂËÍ»Ø×¢²á±íµ¥£º
if(myerrors=$obj->cgi_update_errors){$r->{template_args}{cgi_params}=$r->{params};$r->{template_args}{errors}=\errors;$r->{template}="register";return;}·ñÔò£¬ÎÒÃÇÏÖÔÚ¾ÍÓÐÁËÒ»¸öÓû§£»ÎÒÃǾÍÐèÒª·¢ËÍcookie¸ø¸ÃÓû§£¬Ê¹ËûÃDZ£³ÖÕý³£µÇ½µÄ״̬¡£ÕâÊÇUserSessionCookieÔÙÒ»´Î¸øÎÒÃÇ·½±ãµÄµØ·½ÁË£º
$r->{user}=$user;$r->login_user($user->id);×îºóÎÒÃÇÔÙÒ»´Î°ÑÓû§ËÍÉÏ·£º
$r->{template}="frontpage";}ÖÁ´Ë£ºÏÖÔÚÎÒÃÇ¿ÉÒÔ´´½¨ÐµÄÓû§£»Ìṩһ¸öÕÒ»ØÃÜÂ빦ÄܾÍ×÷Ϊһ¸öÁ·Ï°Áô¸ø¸ÐÐËȤµÄ¶ÁÕß¡£
MaypoleÕªÒª
ÏÖÔÚÎÒÃÇÒѾÍê³ÉÁË¡ª¡ªÔÚÒ»¸öºÜ¶ÌµÄʱ¼äÀÓÃ×îÉÙÁ¿µÄ´úÂ룬ÎÒÃÇÒѾ´´½¨ÁËÒ»¸öÔÚÏßÉ̵ꡣÎÒϲ»¶MaypoleµÄÔÒòÖ®Ò»¾ÍÊÇÄãÖ»ÐèҪרÐıàд´¦ÀíÉÌÒµÂß¼Á÷³ÌµÄ´úÂë¾ÍÐУ»ËùÓÐÆäËûµÄÏÔʾģ°å¶¼¿ÉÒÔ¡°½è¼ø¡±Ò»Ï±ðÈ˵ģ¬ÔÙ¸ø×¨ÒµÈËʿȥ´¦Àí£¬¶øÇÒÓàÏµĹ¤×÷¶¼±»MaypoleÔÚÄ»ºóħÊõ°ãµØ´¦ÀíÁË¡£
¸ÐлTPF»ù½ð¶ÔMaypoleµÄÖ§³Ö£¬ÎÒÃÇÏÖÔÚÓÐÁËÒ»·ÝÏ꾡ÇÒ¸½ÓÐһЩ°¸Àý·ÖÎö£¨°üÀ¨Õâ¸ö£©µÄÓû§ÊֲᣬÒÔ¼°Ò»¸ö»îÔ¾µÄÓû§ºÍ¿ª·¢ÕßÉçÇø¡£ÎÒÏ£ÍûÄãºÜ¿ìÒ²»á¼ÓÈ룡
ÎÄÕÂÕûÀí£ºÕ¾³¤Ìì¿Õ ÍøÖ·£ºhttp://www.z6688.com/
ÒÔÉÏÐÅÏ¢ÓëÎÄÕÂÕýÎÄÊDz»¿É·Ö¸îµÄÒ»²¿·Ö,Èç¹ûÄúÒª×ªÔØ±¾ÎÄÕÂ,Çë±£ÁôÒÔÉÏÐÅÏ¢£¬Ð»Ð»!




