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

一、前言

继上次的首页数据列表后,这是第二篇。记录一下购物车这个比较庞大的功能,可能实现的方法跟其他人有点不一样,不过原理都差不多,是将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("请输入数量", "");//将输入的数量赋值给num
                   if(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:这是第二期了,以后还会继续发布的。

时间: 2024-08-10 09:32:34

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

ASP.NET之电子商务系统开发-4(二级分类)

一.前言 继上次的订单,这是第四篇.记录一下分类和筛选.这功能是最后做的,因为我完全不懂其原理.后来通过同学的指导(一位很有天赋的同学,比我牛逼一个层次,同样是高三.:D),终于也是完成了.在写这篇博客之前还有点半懂不懂,经过些许时间的思考,终于全懂了,可以将其写下来. 二.开始 1.先看一下表设计 这是一级类别表,因为是电子商务系统,所以就暂时7个类别. 然后二级类别: GS_ID跟Sort_ID是一样的. 最后商品信息表里面需要这样: 两个ID分别对应Sort1和Sort2. 2.前台 前台

直播系统开发中互动功能必不可少

现在直播互动已经成为大家比较熟知的交流方式,可以通过直播沟通.学习.宣传.商业等,粉丝经济也是很多人加入主播的一个重要原因,展示自己的魅力,技能,知识,让更多的人了解自己.今天,拓幻科技告诉你,如何搭建一套比较完整的直播体系,直播系统开发中都有哪些直播互动功能? 弹幕直播里面基础的功能,可以带动房间的活跃,有的大主播的房间更是可以看到满屏的弹幕,非常震撼.弹幕是采用 go 写的,可以支持非常高的并发和请求下发,采用 websocket 下发消息,写消息是写到 kafka 集群中,下发消息可以根据

ASP.NET用GridView控件实现购物车功能

1. 将test数据库附加到数据库管理系统中:数据库中的book_info包含下列数据: 2. 新建一个网站,将images文件夹复制到网站中: 3. 在Default.aspx中,通过DataList控件展示数据库中的所有数据,以行为主序,每行3列,单击购买按钮时,将商品的ID和数量保存到HashTable中,并将HashTable放置到Session中. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2

《转》适用于开发人员的10个最佳ASP.NET的CMS系统

1) mojoportal mojoPortal 是一个开源的.用 C# 编写的站点框架和内容管理系统,可以运行在 Windows 中的 ASP.NET 和 Linux/Mac OS X 中的 Mono 下. 当前的特性 遵循 XHTML 的内容管理 用 WebParts 个性化自己的页面 博客 论坛 事件日历(Event Calendar ) 图像画廊(Image Gallery ) 文件管理 基于数据库.Active Directory, OpenLDAP, Open ID, 或 Windo

转:国内外著名开源b2c电子商务系统比较包括asp.net和php

from: http://longdick.iteye.com/blog/1122879 国内外著名开源b2c电子商务系统比较包括asp.net和php 博客分类: 电子商务 国内外著名开源b2c电子商务系统,大致情况如下: 一.国内知名B2C系统 1.Shopex国内最大的电子商务系统,有各种辅助工具,php开发,免费但不开源,网店模板众多,较适合有淘宝店的卖家.网址:www.shopex.cn 2.ECshop免费且开源的php系统,当前有很多B2C网店选择了这个系统.网址:http://w

asp.net oa系统开发方案

思道OA开发版 2016下载地址http://www.345oa.com/develop/ 思道OA基于Microsoft .NET/ASP.NET 4.0开发,数据库SQL Server,开发工具Visual Studio 2013. 思道OA提供开放的二次开发系统架构.Web开发的全套环境,是开发管理应用系统的理想平台. 思道OA提供单点登录技术,可于第三方系统集成,提供相关接口.案例源码. 思道OA介绍 1. 基于.NET平台    思道OA是国内最早发布的基于.NET平台的企业OA办公解

web系统开发为什么用asp.net MVC,为什么不用?

向高手咨询下,现在asp.net MVC很流行,但我好像提不起兴趣.企业级Web应用,使用纯HTML+jquery交互+Http Handler(或WebAPI),不是挺好的吗?有很多优点:1.Http Handler虽然是10年时的技术,再10年也不会过时,asp.net mvc每年一个版本2.后端想换其他语言很方便3.代码清晰简洁,不会感觉很碎4.纯html下载快(gzip压缩),而View层即使模板引擎再好也会耗服务端CPU 个人更认同客户端和服务端分开,如果要做移动Web应用也很方便打包

Magento和OpenERP,OPENERP二次开发,openerp电子商务系统,电子商务系统

(方案一) (方案二) Magento:(麦进斗) 是一套专业开源的电子商务系统.Magento设计得非常灵活,具有模块化架构体系和丰富的功能.易于与第三方应用系统无缝集成.其面向企业级应用,可处理各方面的需求,以及建设一个多种用途和适用面的电子商务网站. 包括购物.航运.产品评论等等,充分利用开源的特性,提供代码库的开发,非常规范的标准,易于与第三方应用系统无缝集成. OpenERP:模块有大约2000个,涵盖了各行各业各领域的管理要求.系统的标准安装包中的功能模块有:销售管理(Sales m

关于java&#39; web杂谈(其实是课后作业1)1 网站系统开发需要掌握的技术

1 网站系统开发需要掌握的技术:(借鉴度娘)https://zhidao.baidu.com/question/1701850648247880220.html 需要掌握的有:Java(JavaEE)工程师 .NET软件工程师 外包开发工程师 网站设计和开发工程师 数据库工程师ERP/CRM/OA/B2C开发应用工程师 系统分析设计工程师 文档工程师相关知识,很多人软件专业方向性很强,很抽象,其实也不是这样的,还是由好多知识是集合着的,所以胜任的岗位,就可以说明你要掌握知识的覆盖面,我建议你还是