一、前言

继上次的首页数据列表后,这是第二篇。记录一下购物车这个比较庞大的功能,可能实现的方法跟其他人有点不一样,不过原理都差不多,是将cookie存数据库里面的。

二、开始

首先看一下购物车流程及对应代码。

1.如果购物车为空,就显示

其方法是创建两个大的div层,当你没有购买商品时,就显示这层,里面啥都没有,如果你点击了一个商品加入购物车,就会将这层隐藏,显示存放刚放入购物车商品信息的那一层,其控制方法如下:

DataSet ds = bllShopCar.ShopCarQT(Request.Cookies["ShopUser"].Value);if (ds.Tables[0].Rows.Count > 0){havegoodsbox1.Visible = true;RadListView1.DataSource = ds;RadListView1.DataBind();}else{nocarbox.Visible = true;}

第一行先dataset一下,ShopCarQT是一个方法:

public DataSet ShopCarQT(string strWhere){StringBuilder strSql = new StringBuilder();strSql.Append("select * from ShopCar left join GoodsInfo on [ShopCar].[Goods_ID] = [GoodsInfo].[Goods_ID] where [ShopUser] = '");if (strWhere.Trim() != ""){strSql.Append(strWhere + "'");}return DbHelperSQL.Query(strSql.ToString());}

Shopcar是购物车表,GoodsInfo 是商品信息表,看一下表设计:

这是Shopcar,

这是GoodsInfo。其中ShopCar中的ShopUser存放的是一个cookie,当你选中商品加入购物车时,除了商品信息会插入ShopCar,还有一个ShopUser会插入:

其代码是在后台创建cookie:

if (Request.Cookies["ShopUser"] == null || Request.Cookies["ShopUser"].Value == ""){Response.Cookies["ShopUser"].Value = DateTime.Now.ToString("yyyyMMddhhmmssfff");Response.Cookies["ShopUser"].Expires = DateTime.Now.AddYears(1);}

接着ShopUser会生成一个cookie存到后台并且这个值会放入数据库中。再回到上面的方法,方法里面将这两张表根据ShopUser,select了一下。然后下一行是if判断,如果数据库里面没有数据,nocarbox的值就是true,其中nocarbox 就是上面的层,显示的是“您的购物车还是空的”;如果有数据,havegoodsbox1 的值就是true,这是购物车中有商品的层,显示出来差不多是这样

2.一些细节

首先,用一台电脑购物时,存放在ShopUser的cookie值是一样的,比如我这台电脑,将两个商品加入购物车:

只要是同一台电脑,他的ShopUser都是一样的,但是Goods_ID,不可能相同,如过你添加同一个商品到购物车就会这样:

这是相同ShopUser下,Goods_ID不能相同,还有一种就是不同ShoUser情况的,Goods_ID可以相同,也就是不同电脑添加相同商品不会产生冲突问题。具体添加商品的判断语句如下:

if (bllshopcar.GetRecordCount2("[Goods_ID] = " + Request["id"] , "[ShopUser] = " + Request.Cookies["ShopUser"].Value) !=0 ){Page.ClientScript.RegisterStartupScript(this.GetType(), "alert", "<script>alert('不能添加重复商品!');location.replace(location.href);</script>");}else{molshopcar.ShopUser = Request.Cookies["ShopUser"].Value;molshopcar.Goods_ID =Int32.Parse((Request["id"]));int Money;Money = Convert.ToInt32(this.qty_item_1.Text) * Convert.ToInt32(this.lblgoods_GBprice.Text);molshopcar.Goods_Money = Money;molshopcar.Goods_Name = lblgoods_name.Text;molshopcar.Goods_Num = Convert.ToInt32(qty_item_1.Text);bllshopcar.Add(molshopcar);Page.ClientScript.RegisterStartupScript(this.GetType(), "alert", "<script>alert('加入购物车成功!'); </script>");}

其中GetRecordCount2 是一个方法,相同IP,也就是ShopUser相同的情况下,商品是否重复:

/// <summary>
/// 判断购物车商品是否重复
/// </summary> public int GetRecordCount2(string str1,string str2){StringBuilder strSql = new StringBuilder();strSql.Append("select count(1) FROM ShopCar ");if (str1.Trim() != "" || str2.Trim() != ""){strSql.Append(" where " + str1 + "and " + str2);}object obj = DbHelperSQL.GetSingle(strSql.ToString());if (obj == null){return 0;}else{return Convert.ToInt32(obj);}}

如果全部成功,就add一下,到ShopCar表中。

3.购物车中商品信息修改

这块我弄了很久,因为在Radlistview 中(其实不止Radlistview,其他像什么Gridview估计也是这种情况),所有官方控件比如button,textbox之类的,全部失效,后台获取不到它们的ID,因此你要是修改商品的信息,例如数量,就会显的非常麻烦,琢磨了好久之后终于用js实现了。

这方法不像那种淘宝里面的,直接+/-,那方法至今没搞懂怎么获取值。这方法当你输入数量后,点击确定,他就根据数量修改该商品小计和下面的合计金额。在代码中,他会首先获取输入的值,只需要在前台写一个简单的js就可以了,代码如下:

function change(js_shopcarid){var goodsnum = prompt("请输入数量", "");//将输入的数量赋值给numif(goodsnum < 0 ){alert("请输入正确数值");}else  if (goodsnum){alert("修改成功!");document.cookie = "jsshopcarid=" + js_shopcarid;document.cookie = "goodsnum=" + goodsnum;var btn = document.getElementById("Button3");btn.click();}else{alert("您取消了修改数量!");}                     }

这里做的比较简单:获取值给num后,创建两个js的cookie(js的cookie在后台可以获取的)分别是”jsshopcarid”和”goodsnum”,分别存放商品ID和商品数量,接着触发一个隐藏button,这button在后台有一个事件:

protected void Button3_Click(object sender, EventArgs e){bllShopCar.Updatagoods(Int32.Parse( Request.Cookies["goodsnum"].Value),Int32.Parse(Request.Cookies["jsshopcarid"].Value));DataSet getGoodsid = bllShopCar.GetList("ShopCarID=" + Int32.Parse(Request.Cookies["jsshopcarid"].Value));  Goodsid = getGoodsid.Tables[0].Rows[0]["Goods_ID"].ToString();   //获取Godos_ID
DataSet getprice = bllgoods.GetList("Goods_ID=" + Goodsid);     In_Storeprice = getprice.Tables[0].Rows[0][4].ToString(); //获取商品单价
s = Int32.Parse(In_Storeprice) * Int32.Parse(Request.Cookies["goodsnum"].Value); //计算小计bllShopCar.Updatemoney(s, Int32.Parse(Request.Cookies["jsshopcarid"].Value));//总价DataSet getallprice =  bllShopCar.getAllprice(Request.Cookies["ShopUser"].Value);a = getallprice.Tables[0].Rows[0][0].ToString();Allprice.Text = a;Page.ClientScript.RegisterStartupScript(this.GetType(), "alert", "<script>location.replace(location.href);</script>");}

先来看第一行,Updatagoods是一个方法,将刚刚输入的商品数量按照前面js获取的商品ID”jsshopcarid”更新到数据库。接着第二行,dataset一下;GetList——一个方法,根据”jsshopcarid”获取商品ID。第三行:将商品ID给Goods_ID;下一行:dataset一下,根据前面的Goods_ID 获取GoodsInfo表中的对应商品数据。下一行就是获取商品单价了。到此位置,就有了商品单价,接着计算小计就简单多了,用前面js的cookie”goodsnum” * 刚获取的商品单价 In_Storeprice得到小计。接下来,就可以根据”jsshopcarid”Update一下。最后计算总价,之前说过,一个电脑只有一个ShopUser,因此你只需要根据ShopUser获取一下购物车表中的相同ShopUser的商品数据,就可以算出购物车中商品的总价。正如第八行:getAllprice是一个方法.

/// <summary>
/// 计算总价
/// </summary>public DataSet getAllprice(string str2){return DbHelperSQL.Query("select sum ([Goods_Money]) from [ShopCar] where [ShopUser] =" + str2);}

得到总价后,就将值直接给前台的label了.

4.删除商品

删除商品我用的方法是URL传值到新页面,这是购物车页的代码:

<a href="deletepage.aspx?Goods_ID=<%#Eval("Goods_ID")%>" style="text-decoration:none;color:black;">删除</a>

点击删除后转到deletepage 页面,在这页面中后台写着如下代码:

bllShopCar.Delete( Convert.ToInt32(Request.QueryString["Goods_ID"]));Page.ClientScript.RegisterStartupScript(this.GetType(), "alert", "<script>alert('删除成功!');location.href='ShoppingCar.aspx'; </script>");

直接将Goods_ID删除就可以了。如果全部删除光了,就会显示上面第一张图片“您的购物车还是空的”。到此购物车功能全部结束。

最后要说的是,在做这购物车功能之前,还不懂网购的流程,然后不断访问天猫淘宝,购物车流程试了一遍又一遍,再在网上看了一下大致实现方法,懂了一些原理。接着做这个的时候,很不如意,最闹心的就是控件不可以用,因此你会看到这个购物车中没有选择性下订单,也就是每个商品前的选择按钮,所以呢,要下就是一起下定单。很想知道天猫那种购物车的功能是怎么实现的,希望会的大牛能教教我,谢谢!

ps:这是第二期了,以后还会继续发布的。

转载于:https://www.cnblogs.com/JJDJJ/p/4152671.html

ASP.NET之电子商务系统开发-2(购物车功能)相关推荐

  1. 基于J2EE的B2C电子商务系统开发- 新闻发布与系统管理子系统设计与实现

    设计(论文)题目: 基于J2EE的B2C电子商务系统开发 - 新闻发布与系统管理子系统设计与实现 学院.专业 学生姓名 指导教师姓名 下发日期 (任务起止日期: 20 年 月 日 至 20 年 月 日 ...

  2. 基于J2EE的B2C电子商务系统开发(论文+系统+开题报告+文献综述+任务书+答辩PPT+中期报表+外文文献+说明书)

    设计(论文)题目: 基于J2EE的B2C电子商务系统开发 - 新闻发布与系统管理子系统设计与实现 学院.专业 学生姓名 指导教师姓名 下发日期 (任务起止日期: 20 年 月 日 至 20 年 月 日 ...

  3. [导入]Asp.net 2.0 自定义控件开发[实现自动计算功能(AutoComputeControl)][示例代码下载]...

    Asp.net 2.0 自定义控件开发[实现自动计算功能(AutoComputeControl)][重点推荐控件][示例代码下载] 文章来源:http://blog.csdn.net/chengkin ...

  4. 竞拍秒购电商系统开发需求和功能架构分析

    以下是竞拍秒购电商系统开发相关的功能模块和解析.市面上类似竞拍电商平台有这些品牌.例如:盒格速M,太爱速M,众城优选,贝源拍,美里生活,恩家拾惠都属于这些类型. 竞拍秒购电商系统的功能有这些: 会员系 ...

  5. 多用户电商分销系统开发多商户入驻分销商城系统开发的基本功能

    移动互联时代,微商城是商家淘金的利器,能为企业拓展无限商机.不同于以往企业独立的微信商城,现在拥有更为先进的分销模式和完善的营销功能的多商城系统了.多商户入驻分销商城系统开发的基本功能有哪些? 多商家 ...

  6. 自建跨境电商系统平台,多语言跨境电子商务系统开发搭建,建站方案

    电子商务系统建站开发需做好方案与搭配,以下是方案的选择与搭建部署的建议 首先是什么是跨境电商?跨境电商是指企业利用互联网技术和电子商务平台,进行跨国贸易活动,实现不同国家之间的商品交易.跨境电商系统需 ...

  7. 基于J2EE的B2C电子商务系统开发与实现

    摘要 当今社会,科学技术突飞猛进,知识经济初见端倪.电子商务作为一种新型的贸易方式,极大地促进了全球经济贸易的发展,同时也正在改变人们的生活方式和思想观念.电子商务是指整个贸易活动实现电子化,交易各方 ...

  8. 教育直播系统开发的基础功能

    目前,网络直播系统应用领域非常广泛,例如教育行业.电子商务.企业员工培训.直播游戏等都能寻找到视频直播系统的踪迹.特别是在新冠疫情的影响下,线上教学方式受到了各种高等院校及其培训学校的欢迎,缩短了老师 ...

  9. php购物车数据表,PHP开发简单购物车功能创建数据库表

    前面的章节我们分别介绍了javascript和jquery实现购物车功能. 本章节我们将通过php代码来为朋友们讲解购物车功能实现思路. 方法是把从数据库中获取的商品存入数组,对数组进行操作,数组中的 ...

最新文章

  1. android DrawerLayout 改变系统默认的灰色
  2. 试编写一个汇编语言程序,大写---小写 要求对键盘输入的大写字母用小写字母显示出来。
  3. 【 FPGA 】虚拟时钟
  4. 支持高并发的IIS Web服务器常用设置
  5. 基于MATLAB的波速形成仿真
  6. FAGLFLEXA 表和 BSEG 表有什么区别
  7. 【快乐水题】747. 至少是其他数字两倍的最大数
  8. Django 如何实现 如下 联表 JOIN 查询?
  9. Jdk 和 jre 的 关系和区别
  10. eureka注册中心HA集群搭建
  11. Centos7下配置安装mysql5.5主从复制(一主两从)
  12. mysql一列数据转为一行_最最完整的 MySQL 规范都在这了
  13. 实验假设与分析方法(参数与非参检验)
  14. javax.servlet.http.HttpServlet response 解决jsp中中文乱码
  15. java代码反编译 工具下载及注意事项 xjad下载
  16. UE4开发五:人物模型和摄像机
  17. 百度网盘web登录页-原生js实现
  18. python分析链家二手房信息----数据分析实战(一)
  19. STM32+EC20实现4G无线通信
  20. 第九届蓝桥杯单片机完整程序

热门文章

  1. 解析法多元线性回归的实现
  2. iPhone使用smb查看Windows共享文件夹
  3. Ruby字符串处理函数
  4. 【谷歌日历同步】如何删除安卓手机上的谷歌日历同步记录?删除中国节假日同步?
  5. 第43讲 Android Camera2 API AF自动对焦 第二部分
  6. Emiya 家今天的饭(CSP 2019 D2 T1)
  7. 微软和苹果、Google站在一起:HTML5才是互联网的未来
  8. Android之父安迪·鲁宾:乔布斯羡慕嫉妒恨的人
  9. vs2010安装完vc助手之后字体变成斜体如何解决?
  10. 碧桂园何以超越周期?