要设计一个比较复杂的购物车,使用中要对产品进行大量而且复杂的定制、编辑操作,也就是说维护购物车状态产生的数据量会相当大,而且这些数据还随时需要编辑。
对于这样一个购物车的设计请大家给点建议,
1.购物车状态在那里存储比较好:Session、SQL Server、Cookie或其它什么地方。
2.有没有比较好的实例可以参考。
希望大家给点思路,谢了!
对于这样一个购物车的设计请大家给点建议,
1.购物车状态在那里存储比较好:Session、SQL Server、Cookie或其它什么地方。
2.有没有比较好的实例可以参考。
希望大家给点思路,谢了!
www.chinashawls.com
或者
www.alibaba.com
等等
那里面停好的呀
一是有人永久的记录。
二则比较安全。
读取速度应该不会慢到哪里?
三还可以用数据分析
2、生成一个Guid值,将此值分配给当前cookie(当然,cookie值不为空的时候不做此操作);
3、把上面的cookie和用户定购的产品放入表中;
看看那个BookShop的代码吧,好早就出来了,但是确实一个典型的网上购物的好例子.好多地方有下的。
而对于会员用数据表比较好!
这是书的一些基本信息
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;
}
}
}
}
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
}
}
上面的两个都是写的类文件
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");
}
至于解决自动清空超期未结帐的记录的问题就涉及到编码了
这样做的好处显而易见,用户不会因为以外事件而丢失购物车中的信息,用户每次上线都可以查看,修改,或删除购物车中之信息,或选择结帐.这样不存在因为太多不想结帐的用户而导致数据库记录过大的问题,因为设计代码定时清除超期的信息.
我觉得腾讯公司的QQ秀商城中购物车中的数据可能就是保存在数据库中的,因为每次上线,即使不同的机子,都会看到自己购物车内的信息,且不会遗失.
http://community.csdn.net/Expert/topic/4410/4410364.xml?temp=4.741848E-03
放在数据库应该是个不错的选择,www.dangdang.com应该就是存在数据库中的。