完成了 迷你购物车 和 购物车 功能
原本界面准备一直是模仿联想商城的,后来感觉联想商城的布局不够大气。
后来思量再三,准备用整体的蓝色来模仿京东商城,现在看来感觉还不错。
先来看看京东商城的:
![minicart minicart](http://olds.blogcn.com/wp-content/uploads/228/22878/2009/04/minicart.png)
最终效果图,感觉我的比它好吧!^_^,各个栏目标明的都比较清楚:
![2009-04-04_120909 2009-04-04_120909](http://olds.blogcn.com/wp-content/uploads/228/22878/2009/04/2009-04-04_120909.png)
思路:
分析了下京东商城迷你购物车,主要功能如下:
- 【最新加入的商品】有图片显示;
- 【您购物车中的其它物品】商品按时间顺序先后排序,且不包含最新加入的商品;
- 再点击购买其它商品后,【最新加入的商品】显示刚加入的商品,而原先的移动到【其它物品中】
- 当删除购物车中的最新加入的商品后,【最新加入的商品】无商品再显示
实现方法:
- 【最新加入的商品】,由cookie中取出商品ID,然后显示。所以在点击购买商品时就要将该商品的ID写入cookie中。
- 由于【其它商品】不显示最新加入的商品,所以只取数据库中对应CartId的前N-1条,即最新加入的不取出
SQL语句:(ASP。NET代码略)
1.================================2009-04-04 11:25:32
-------------------------------------------------------------------------------
-- 项目名称:NSMS(网络购物管理系统)
-- 过程名称:proc_CartSelect
-- 功能描述:取出购物车中的商品,(为了实现我要的功能,这里有两种情况
--1.不选取最后一条记录,即最新加入的,为迷你购物车提供数据
--2.全选,为完整的购物车提供数据
-- 创建时间:2009-03-31 20:53:54
-- 修改时间:2009-04-02 21:53:30(当购物车中只有一条记录时,mini购物车也会一条有记录?)
-- 作者姓名:chenyihao
-------------------------------------------------------------------------------
ALTER PROCEDURE proc_CartSelect
@CartId char(36),
@Flag varchar(![8)](http://static.blogcn.com/wp-includes/images/smilies/icon_cool.gif)
AS
-------------------------------------------------------------------------------
-- 项目名称:NSMS(网络购物管理系统)
-- 过程名称:proc_CartSelect
-- 功能描述:取出购物车中的商品,(为了实现我要的功能,这里有两种情况
--1.不选取最后一条记录,即最新加入的,为迷你购物车提供数据
--2.全选,为完整的购物车提供数据
-- 创建时间:2009-03-31 20:53:54
-- 修改时间:2009-04-02 21:53:30(当购物车中只有一条记录时,mini购物车也会一条有记录?)
-- 作者姓名:chenyihao
-------------------------------------------------------------------------------
ALTER PROCEDURE proc_CartSelect
@CartId char(36),
@Flag varchar(
![8)](http://static.blogcn.com/wp-includes/images/smilies/icon_cool.gif)
AS
IF @Flag = 'MiniCart'
BEGIN
declare @count int
select @count=count(*)-1 from Cart where CartId = @CartId
if @count = 0 goto goon
if @count>0 SET rowcount @count --好方法
END
--取出购物车ID,商品ID名称价格,购买数量,以及小计
BEGIN
declare @count int
select @count=count(*)-1 from Cart where CartId = @CartId
if @count = 0 goto goon
if @count>0 SET rowcount @count --好方法
END
--取出购物车ID,商品ID名称价格,购买数量,以及小计
SELECT c.CartId,c.PrId,p.PrName,p.SalePrice,c.Quantity,p.SalePrice * c.Quantity AS Subtotal
from Cart as c INNER JOIN Product as p
ON c.PrId = p.PrId
where c.CartId = @CartId
Order By AddTime
goon: return
GO
from Cart as c INNER JOIN Product as p
ON c.PrId = p.PrId
where c.CartId = @CartId
Order By AddTime
goon: return
GO
------------------------
2.通过下面这条SQL,可以弥补京东商城迷你购物车的缺陷,当cookie中无值时,还能显示最近一次购买的商品
-------------------------------------------------------------------------------
-- 项目名称:NSMS(网络购物管理系统)
-- 过程名称: proc_CartLastestItem
-- 功能描述:最新加入购物的商品,带图片
-- 创建时间:2009-04-03 15:58:24
--添加了,当cookie中无商品Id时,从数据库中读取最后一条商品(即最新加入商品)
-- 作者姓名:chenyihao
-------------------------------------------------------------------------------
ALTER PROCEDURE proc_CartLastestItem
-- Add the parameters for the stored procedure here
@CartId char(36),
@PrId varchar(50)= null
AS
-- 项目名称:NSMS(网络购物管理系统)
-- 过程名称: proc_CartLastestItem
-- 功能描述:最新加入购物的商品,带图片
-- 创建时间:2009-04-03 15:58:24
--添加了,当cookie中无商品Id时,从数据库中读取最后一条商品(即最新加入商品)
-- 作者姓名:chenyihao
-------------------------------------------------------------------------------
ALTER PROCEDURE proc_CartLastestItem
-- Add the parameters for the stored procedure here
@CartId char(36),
@PrId varchar(50)= null
AS
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
if @PrId is null
BEGIN
declare @time datetime
select @time = max(AddTime) from Cart where CartId = @CartId
-- Insert statements for procedure here
select p.PrId,p.PrName,p.PrPic,p.SalePrice,c.Quantity
from Product as p INNER JOIN Cart as c
on p.PrId = c.PrId
where c.AddTime = @time AND c.CartId = @CartId
END
else
BEGIN
select p.PrId,p.PrName,p.PrPic,p.SalePrice,c.Quantity
from Product as p INNER JOIN Cart as c
on p.PrId = c.PrId
where c.PrId = @PrId AND c.CartId = @CartId
END
-- interfering with SELECT statements.
SET NOCOUNT ON;
if @PrId is null
BEGIN
declare @time datetime
select @time = max(AddTime) from Cart where CartId = @CartId
-- Insert statements for procedure here
select p.PrId,p.PrName,p.PrPic,p.SalePrice,c.Quantity
from Product as p INNER JOIN Cart as c
on p.PrId = c.PrId
where c.AddTime = @time AND c.CartId = @CartId
END
else
BEGIN
select p.PrId,p.PrName,p.PrPic,p.SalePrice,c.Quantity
from Product as p INNER JOIN Cart as c
on p.PrId = c.PrId
where c.PrId = @PrId AND c.CartId = @CartId
END
GO
exec proc_CartLastestItem 'bc7ca3b2-5e42-4ef4-9a71-de273fc93afb','10'
----------------------------------------------
遇到的问题:
- 购物车中仅只有一条记录时,迷你购物车也会有记录一条出来。然后我测试过当购物车中的记录大于1条时,是完全没问题的。难道是当@count=0时,SET rowcount @count没起作用了?
那在SET rowcount @count前加跳判断语句,if @count = 0 return ,不行这样以来总金额和总数量就没了 break也不能用只能在while中。
查了下,用goto不错。ok! - 2.最新加入的商品数量明明只有1件,竟然显示9件!。后来找了找,发现了原因:在SQL中少加了一个判断条件,@CartId;以至于现在取出了对应ID存在于数据库中的第一条记录。如下图所示,它取出了PrId =13 第一次出现的那条记录,而它的数量正是9
=====================================
又花了一下午,将一些BUG修补了下
1.在删除购物车中的最后一条记录时,将cookie中的对应值清除,不然的话,迷你购物车中【最新加入的商品】栏还是显示删除以前的商品
2.新增了,当cookie中无值时,【最新加入的商品】栏显示最近购买的商品(从数据库中读取),对应上面第2条SQL语句。
3.购物车无商品时,隐藏迷你购物车
转自http://gaga.yo2.cn/articles/to-achieve-the-mini-cars-and-functions-to-cart.html