您的位置:首页 > 运维架构 > 网站架构

[电子商务网站设计] 之 购物车

2008-09-30 09:02 435 查看
作为电子商务网站的基础之一,购物车使用十分广泛。本文只是粗略讲述购物车的实现方式和注意事项。

1. 购物车对象

没错,任何时候都不要将一堆零散的商品数据扔到 Session 或者 Cookie 里面,然后在某个 ShoppingCart.aspx 中去显示购物车。我们需要一个购物车对象,基于设计理论,这个对象和页面完全无关。

作为购物车对象,最根本的功能是存储用户所购买商品信息。另外,还应该有购买种类、数量以及金额的统计。当然少不了修改商品数量、删除商品等方法。

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Collections;

using System.Collections.Generic;

namespace myec

{

  [Serializable]

  public class CartItem

  {

    private string id;

    /// <summary>

    /// 商品编号

    /// </summary>

    public string Id

    {

      get { return id; }

      set { id = value; }

    }

    private string name;

    /// <summary>

    /// 商品名称

    /// </summary>

    public string Name

    {

      get { return name; }

      set { name = value; }

    }

    private float price;

    /// <summary>

    /// 商品价格

    /// </summary>

    public float Price

    {

      get { return price; }

      set { price = value; }

    }

    private int quantity;

    /// <summary>

    /// 商品数量

    /// </summary>

    public int Quantity

    {

      get { return quantity; }

      set { quantity = value; }

    }

  }

  [Serializable]

  public class ShoppingCart

  {

    private IList<CartItem> items;

    public ShoppingCart()

    {

      items = new List<CartItem>();

    }

    /// <summary>

    /// 种类统计

    /// </summary>

    public int Count

    {

      get

      { 

      }

    }

    /// <summary>

    /// 统计金额

    /// </summary>

    public int Total

    {

      get

      { 

      }

    }

    /// <summary>

    /// 添加商品

    /// </summary>

    /// <param name="item"></param>

    public virtual void Add(CartItem item)

    { 

    }

    /// <summary>

    /// 添加商品

    /// </summary>

    /// <param name="itemId"></param>

    public virtual void Add(string itemId)

    { 

    }

    /// <summary>

    /// 移除商品

    /// </summary>

    /// <param name="itemId"></param>

    public virtual void Remove(string itemId)

    { 

    }

    /// <summary>

    /// 设置商品数量

    /// </summary>

    /// <param name="itemId"></param>

    /// <param name="quantity"></param>

    public virtual void SetQuantity(string itemId, int quantity)

    { 

    }

  }

}

上面是一个购物车对象的不完整代码。

多数时候,我们会专门创建一个 CartItem 对象用来存储购物车内的商品信息,尽管已经有了 Product 之类的商品对象,但我们还是建议使用 CartItem,原因包括:

(1) Product 类不包含 Quantity 属性,无法存储数量。

(2) Product 太多无相关的信息会造成不必要的干扰。

(3) 某些复杂的商务系统中,我们还要存储诸如折扣、抢购等数据,Product 类显然不合适。

另外需要注意的是,有些时候我们可能需要提供两个数量统计属性,分别是种类统计和数量统计。因为某种商品我们可能会购买多个。这类统计数据建议使用 get{} 动态计算获取。

2. 购物车存储

购物车有几种存储方式,包括 Session 和数据库。

Session 的好处是效率较高,但相对内存占用会较多,尤其是访问量比较大的网站;而数据库的效率显然也是个问题。很多时候我们会从业务角度来综合使用这两种方式。

(1) 只有在用户选择 "添加商品到购物车" 时才创建购物车对象。要知道大多数的用户都处于浏览状态,尤其是那些搜索引擎的爬虫们,为每个光临的用户都自动创建一个购物车显然是不明智的。

(2) 将购物车临时存储到 Session 中有个好处就是,我们可以为没有登录的用户提供购物车服务,只有在用户进行结算的时候才需要登录。当然,我们也可以使用 Session ID 作为唯一识别符将购物车存储到数据库中。

(3) 对于已经登录的用户,如果他的购物车不为空,我们会在 Session 过期时将他的购物车数据存储到数据库中。这样用户下次进入网站的时候就可以持有上次挑选的商品进行一次结算,这种人性化的方式更加吸引用户。不过这里面有个陷阱就是折扣的问题,因为很多促销活动中,商品的价格和日期有关,因此这种方式可能带来商品价格上的混乱。当然这些数据还应该有个失效期,总不能让用户在时隔几个月后还能看到那些“历史数据”吧。

3. 购物车和订单的关系

很多人会将购物车和订单作为一个对象处理,或者干脆将订单作为购物车使用,我认为这是不合理的。购物车只是一个临时的商品信息容器,它仅负责记录,同时提供几个状态统计属性。而订单则负责交易记录,除了商品信息以外,还包括折扣、VIP、套装、返点等诸多商业逻辑,对订单而言,它的商品信息是只读的。购物车作为一个临时的数据载体,随着订单的创建而消失。

4. 补充功能

很多网站会在每一页的某个区域显示购物车状态,诸如 "您当前购买了 n 类商品,价值 n 元。"。这个功能本身是个不错的设计,通过单击该链接,用户也能迅速打开购物车页面。但需要注意的是该代码一定要判断 Session 中购物车对象是否为空,如果设计中会自动创建购物车对象,那么就完蛋了,所有的用户进来都会自动拥有一个购物车,包括纯浏览用户和爬虫。这显然和上面我们的设计相冲突。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: