要设计一个比较复杂的购物车,使用中要对产品进行大量而且复杂的定制、编辑操作,也就是说维护购物车状态产生的数据量会相当大,而且这些数据还随时需要编辑。
    对于这样一个购物车的设计请大家给点建议,
    1.购物车状态在那里存储比较好:Session、SQL Server、Cookie或其它什么地方。
    2.有没有比较好的实例可以参考。
    希望大家给点思路,谢了!

解决方案 »

  1.   

    可以看一下
    www.chinashawls.com
    或者
    www.alibaba.com
    等等
      

  2.   

    建议你看看Duwamish7.0
    那里面停好的呀
      

  3.   

    我觉得放在cookie里面,毕竟sessionr容易丢失,如果sql server多次需要查询数据库也要提交给数据库查询,另外放在cookie里面的话也方便下次访问的时候读取。pet shop可以
      

  4.   

    购物状态放在SQL server里
    一是有人永久的记录。
    二则比较安全。
    读取速度应该不会慢到哪里?
    三还可以用数据分析
      

  5.   

    用户第一次浏览时候,建立一个cookies,分配一个cart_id给用户,保存到cookies。用户购物的记录保存到数据库。
      

  6.   

    建议采用petshop或者duwamish的类似方法:1、建表;
    2、生成一个Guid值,将此值分配给当前cookie(当然,cookie值不为空的时候不做此操作);
    3、把上面的cookie和用户定购的产品放入表中;
      

  7.   

    这种东西一般都是用cookie来处理,一般的实际情况用cookie主键和子键配合很方便的可以达到要求了.
    看看那个BookShop的代码吧,好早就出来了,但是确实一个典型的网上购物的好例子.好多地方有下的。
      

  8.   

    匿名购物存在的话还是用cookie比较好,
    而对于会员用数据表比较好!
      

  9.   

    建一张表用户即使意外地关闭了IE,或者换了一台机器,购物车里的数据也同样不会丢失,而且编辑也很方便,用datagrid就能实现.
      

  10.   

    用hashtable做
    这是书的一些基本信息
    using System;
    namespace ClassData
    {
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    public class Book
    {
    public Book()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    string bookGuid;
    string bookTitle;
    decimal Price;
    decimal favourPrice;
    int num; public string BookGuid
    {
    set
    {
    this.bookGuid=value;
    }
    get
    {
    return this.bookGuid;
    }
    } public string BookTitle
    {
    set
    {
    this.bookTitle=value;
    }
    get
    {
    return this.bookTitle;
    }
    } public decimal FavourPrice
    {
    set
    {
    this.favourPrice=value;
    this.favourSum=this.favourPrice*num;
    }
    get
    {
    return this.favourPrice;
    }
    }
    public decimal MarkPrice
    {
    set
    {
    this.Price=value;
    this.Sum=this.Price*num;
    }
    get
    {
    return this.Price;
    }
    } public int Num
    {
    set
    {
    this.num=value;
    this.Sum=this.Price*num;
    this.favourSum=this.favourPrice*num;
    }
    get
    {
    return this.num;
    }
    }
    decimal Sum=0;
    decimal favourSum=0;
    public decimal MarkSum
    {
    set
    {
    this.Sum=value;
    }
    get
    {
    return this.Sum;
    }
    }
    public decimal FavourSum
    {
    set
    {
    this.favourSum=value;
    }
    get
    {
    return this.favourSum;
    }
    }
    }
    }
      

  11.   

    利用HASHTABLE存储会员说定购的信息
    using System;
    using System.Collections;
    namespace ClassData
    {
    /// <summary>
    /// Books 的摘要说明。
    /// </summary>
    public class Books:IEnumerable
    {
    Hashtable ht=null;
    public Books()
    {
    ht=new Hashtable();
    }
    public Books(int count)
    {
    ht=new Hashtable(count);
    }

    public void Add(Book b)
    {
    if(ht.ContainsKey(b.BookGuid))
    {
    ((Book)ht[b.BookGuid]).Num=((Book)ht[b.BookGuid]).Num+b.Num;
    }
    else
    {
    ht.Add(b.BookGuid,b);
    }
    }
    public void Remove(string bookguid)
    {
    if(ht.ContainsKey(bookguid))
    {
    ht.Remove(bookguid);
    }
    } public int Count
    {
    get
    {
    return ht.Count;
    }
    } public void Clear()
    {
    ht.Clear();
    } public Book this[string bookid]
    {
    get
    {
    if(ht.ContainsKey(bookid))
    return (Book)ht[bookid];
    return null;
    }
    }
    #region IEnumerable 成员 public IEnumerator GetEnumerator()
    {
    // TODO:  添加 Books.GetEnumerator 实现
    return ht.Values.GetEnumerator();
    //return null;
    } #endregion
    }
    }
    上面的两个都是写的类文件
      

  12.   

    这断代码是点击了DATAGRID中的书的信息,把书的信息保存到购物车里
    try
    {
    // if(this.Request.Cookies["UserName"]!=null)
    // {
    string bookguid=this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString();
    Book b=new Book();
    Books bs=(Books)Session["MyCart"];
    b.Num=1;
    b.BookGuid=bookguid;
    if(e.Item.ItemType==ListItemType.Item)
    {
    b.MarkPrice=Convert.ToDecimal(((Label)e.Item.FindControl("lblMarkPrice")).Text);
    b.FavourPrice=Convert.ToDecimal(((Label)e.Item.FindControl("lblFavourPrice")).Text);
    b.BookTitle=((Label)e.Item.FindControl("lblBookTitle")).Text;
    }
    else if(e.Item.ItemType==ListItemType.AlternatingItem)
    {
    b.MarkPrice=Convert.ToDecimal(((Label)e.Item.FindControl("lblMarkPrice")).Text);
    b.FavourPrice=Convert.ToDecimal(((Label)e.Item.FindControl("lblFavourPrice")).Text);
    b.BookTitle=((Label)e.Item.FindControl("lblBookTitle")).Text;
    }
    bs.Add(b);
    Session["MyCart"]=bs;
    Response.Redirect("Shopping.aspx");
    // }
    // else
    // {
    // Response.Write("<script>alert('你还没有登录,请登录后操作')</script>");
    // //Response.Redirect("UserLogin.aspx");
    // }
    }
    catch
    {}这段代码是把同样书的价格合计,总价格的合计,还有就是删除书籍,编辑书籍等
    private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    ListItemType itemType = e.Item.ItemType;
    if (itemType == ListItemType.Footer) 
    {
    decimal MarkSum=0;
    decimal FavourSum=0;
    foreach(DataGridItem item in this.DataGrid1.Items)
    {
    decimal p=Convert.ToDecimal(((Label) item.FindControl("lblMarkPrice")).Text);
    int n=Convert.ToInt16(((TextBox) item.FindControl("txtNum")).Text);

    MarkSum+=p*n;
    decimal p1=Convert.ToDecimal(((Label) item.FindControl("lblFavourPrice")).Text);
    FavourSum+=p1*n;
    }
    ((TextBox)e.Item.FindControl("txtMarkSum")).Text=MarkSum.ToString();
    ((TextBox)e.Item.FindControl("txtFavourSum")).Text=FavourSum.ToString();
    }
    } private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    Books bs=(Books)Session["MyCart"];
    if(e.CommandName=="EditBook")
    {
    int Num=Convert.ToInt16(((TextBox)e.Item.FindControl("txtNum")).Text);
    if(Num<=0)
    {
    bs.Remove(this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString());
    }
    else
    {
    decimal p=Convert.ToDecimal(((Label)e.Item.FindControl("lblMarkPrice")).Text);
    bs[this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString()].MarkSum=p*Num;

    decimal p1=Convert.ToDecimal(((Label)e.Item.FindControl("lblFavourPrice")).Text);
    bs[this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString()].FavourSum=p1*Num; bs[this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString()].Num=Num;
    }
    }
    else if(e.CommandName=="DelBook")
    {
    bs.Remove(this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString());
    }
    this.DataGrid1.DataSource=bs;
    this.DataBind();
    Session["MyCart"]=bs;
    } private void ibtnGo_Click(object sender, System.Web.UI.ImageClickEventArgs e)
    {
    Response.Redirect("index.aspx");
    } private void ibtnClear_Click(object sender, System.Web.UI.ImageClickEventArgs e)
    {
    Books bs=(Books)Session["MyCart"];
    bs.Clear();
    this.DataGrid1.DataSource=bs;
    this.DataBind();
    Response.Redirect("Shopping.aspx");
    }
      

  13.   

    本人不建议把任何购物车信息放在数据库里,这相当于商场没有必要开设一个仓库专门放一些这次不想结帐的顾客的购物车。建议把其状态存放于SEESION中,因为ASP.NET
      

  14.   

    本人不建议把任何购物车信息放在数据库里,这相当于商场没有必要开设一个仓库专门放一些这次不想结帐的顾客的购物车。建议把其状态存放于SEESION中,因为ASP.NET的SESSION能存放对象,你应该编写一个购物车CLASS,然后把状态和内容记录到对象信息存储在这个SESSION中,至于不让SESSION死掉的解决方法就像所有网站判断客户在线那样,用个IFRAME定时回传小页面。COOKIE只能存储文本信息而不能存储对象,实现起来太麻烦
      

  15.   

    本人认为还是放在数据库里面比较好,表不用太多,一个就OK,一个表保存所有注册会员的购物车里的信息,至于那些不想结帐的顾客,可以这样解决:想一个策略,如果从商品加入到购物车后算起多少时间内没有结帐,系统应该清空超期的购物车内的记录.初步设想了一下,数据表字段大致可以定义如下:(中文)ID,用户ID,商品ID,数量,加入购物车的时间(时间的加入主要是为了程序中判断过期否)
     至于解决自动清空超期未结帐的记录的问题就涉及到编码了
     这样做的好处显而易见,用户不会因为以外事件而丢失购物车中的信息,用户每次上线都可以查看,修改,或删除购物车中之信息,或选择结帐.这样不存在因为太多不想结帐的用户而导致数据库记录过大的问题,因为设计代码定时清除超期的信息.
       我觉得腾讯公司的QQ秀商城中购物车中的数据可能就是保存在数据库中的,因为每次上线,即使不同的机子,都会看到自己购物车内的信息,且不会遗失.
      

  16.   

    这是偶写的购物车类,呵呵...帮忙找找问题.谢谢.
    http://community.csdn.net/Expert/topic/4410/4410364.xml?temp=4.741848E-03
      

  17.   

    cookie 也不大好,如果客户换了太电脑,比如在家里购物但并没当场结帐,然后上班去了(不要以传统的思想去考虑购物车,如果还像现实生活中这样必须当场结帐的话,那么网络的优势体现在哪里?),到了公司打开电脑,购物车因为使用了cookie而不复存在,这样的话。
      

  18.   

    cookie好象还有容量的限制。
    放在数据库应该是个不错的选择,www.dangdang.com应该就是存在数据库中的。