完成了 迷你购物车 和 购物车 功能

原本界面准备一直是模仿联想商城的,后来感觉联想商城的布局不够大气。
后来思量再三,准备用整体的蓝色来模仿京东商城,现在看来感觉还不错。
 
先来看看京东商城的:
minicart
最终效果图,感觉我的比它好吧!^_^,各个栏目标明的都比较清楚:
2009-04-04_120909
思路:
分析了下京东商城迷你购物车,主要功能如下:
  1. 【最新加入的商品】有图片显示;
  2. 【您购物车中的其它物品】商品按时间顺序先后排序,且不包含最新加入的商品;
  3. 再点击购买其它商品后,【最新加入的商品】显示刚加入的商品,而原先的移动到【其它物品中】
  4. 当删除购物车中的最新加入的商品后,【最新加入的商品】无商品再显示
实现方法:
  1. 【最新加入的商品】,由cookie中取出商品ID,然后显示。所以在点击购买商品时就要将该商品的ID写入cookie中。
  2. 由于【其它商品】不显示最新加入的商品,所以只取数据库中对应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)
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名称价格,购买数量,以及小计
 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
------------------------
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
 -- 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
GO
exec proc_CartLastestItem 'bc7ca3b2-5e42-4ef4-9a71-de273fc93afb','10'
----------------------------------------------
遇到的问题:
  1. 购物车中仅只有一条记录时,迷你购物车也会有记录一条出来。然后我测试过当购物车中的记录大于1条时,是完全没问题的。难道是当@count=0时,SET rowcount @count没起作用了?
    那在SET rowcount @count前加跳判断语句,if @count = 0 return ,不行这样以来总金额和总数量就没了 break也不能用只能在while中。
    查了下,用goto不错。ok!
  2. 2.最新加入的商品数量明明只有1件,竟然显示9件!。后来找了找,发现了原因:在SQL中少加了一个判断条件,@CartId;以至于现在取出了对应ID存在于数据库中的第一条记录。如下图所示,它取出了PrId =13 第一次出现的那条记录,而它的数量正是9200904041240388v-scaj45dudgyhh

=====================================

又花了一下午,将一些BUG修补了下

1.在删除购物车中的最后一条记录时,将cookie中的对应值清除,不然的话,迷你购物车中【最新加入的商品】栏还是显示删除以前的商品

2.新增了,当cookie中无值时,【最新加入的商品】栏显示最近购买的商品(从数据库中读取),对应上面第2条SQL语句。

3.购物车无商品时,隐藏迷你购物车

转自http://gaga.yo2.cn/articles/to-achieve-the-mini-cars-and-functions-to-cart.html

原文地址:https://www.cnblogs.com/luckyboy/p/2238994.html