使用Maypole进行快速Web应用开发:第2部分

作者:佚名来源:网络点击:

当我们"上次":离开我们无畏的web开发者的时候,他已经成功地用11行代码建立了一个在线销售目录。然而现在,他必须接着将这变成一个带有购物车以及相关组件的销售站点。是时候该看些关于我们上星期谈及的可扩展性了;不幸的是,这意谓着我们必须再多写一些代码(事情总不是十全十美的对吧)。

我是谁?

为了把购物车加入站点,我们需要介绍一下当前用户的概念。这将会允许站点的访问者登录并且拥有他们自己的购物车。我们将把二个新的表加入数据库,一个表储存关于用户的详情,一个表代表购物车。我们的表看起来会是这样:

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]

由于我们会在很多地方提及这个用户,所以我们把它作为一

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 验证码: 验证码
查看所有评论
  • 相关文章
  • 广告推荐