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:这是第二期了,以后还会继续发布的。
、
ASP.NET之电子商务系统开发-2(购物车功能)的更多相关文章
- ASP.NET之电子商务系统开发-4(二级分类)
一.前言 继上次的订单,这是第四篇.记录一下分类和筛选.这功能是最后做的,因为我完全不懂其原理.后来通过同学的指导(一位很有天赋的同学,比我牛逼一个层次,同样是高三.:D),终于也是完成了.在写这篇博 ...
- ASP.NET之电子商务系统开发-1(数据列表)
一.前言 首先声明的是,这是我第一个与别人合作的.net项目,另一个人做的是后台管理,我做的前台,这是一个电子商务的系统,主要实现的功能是查看商品以及购物功能. 二.开始 首先看一下我截取的项目部分商 ...
- ASP.NET之电子商务系统开发-3(订单)
一.前言 继上次的购物车,这是第三篇.记录一下订单功能.这功能做的时候,走过弯路,很是烧脑,因为思路没理顺,数据库设计的也不怎么好,做到一半才发现有问题,接着把数据库重新设计好,理清思路后,终于完成了 ...
- java web开发_购物车功能实现
java web开发_购物车功能实现 之前没有接触过购物车的东东,也不知道购物车应该怎么做,所以在查询了很多资料,总结一下购物车的功能实现. 查询的资料,找到三种方法: 1.用cookie实现购物车: ...
- 零售CRM系统开发的核心功能
在零售行业中,客户关系管理系统是一个包含销售,市场营销和客户服务流程的中央枢纽.它为企业所有者提供了一种可以结合所有与销售有关的问题并管理销售流程的有效工具.零售CRM可以留住客户,提供个性化的一流客 ...
- 基于Mvc3,Ef,领域驱动电子商务系统的EShop开发
分享自己从代码小工一步步走向搭架子,ING... 简单了解UnitOfWork 摘要: UnitOfWorkUnit Of Work模式,即工作单元,它是一种数据访问模式.它是用来维护一个由已经被业务 ...
- 转:国内外著名开源b2c电子商务系统比较包括asp.net和php
from: http://longdick.iteye.com/blog/1122879 国内外著名开源b2c电子商务系统比较包括asp.net和php 博客分类: 电子商务 国内外著名开源b2c ...
- 如何在ASP.NET大型应用系统的模块化开发实现多版本程序集并存支持[转载]
如何在ASP.NET大型应用系统的模块化开发实现多版本程序集并存支持 这是我最近碰到的一个问题,有一家企业.NET程序员有80多人,产品线很多也很复杂.对于这样的产品,他们采用了模块化开发来实现复用与 ...
- ecshop二次开发 使用ecshop电子商务系统的100个小问题
自己从事B4C电子商务开发一段时间了,特别对ecshop深有体会,刚接触的时候不容易理解,下面将根据自己的经验,来总结100条关于操作ecshop电子商务系统的小问题. 1:如何修改网站"欢 ...
随机推荐
- SQL Server 一些重要视图3
1. sys.dm_tran_locks; 为每一把锁返回一行.request_session_id 可以与sys.dm_tran_session_transactions \sys.dm_exec_ ...
- SQL Server 一些重要视图2
1. sys.dm_tran_session_transactions 为每一个没有关闭的事务返回一行.session_id 可以与sys.dm_exec_connections.session_id ...
- Qt中各个widget前后位置的设定(在Qt中,所有问题都要一分为二,QWidget体系和QGraphicsWidget体系)
这两天在总结一些以往project中遇到的问题,正好别组有同事问我关于Qt中各个widget窗口的前后位置是如何定义的,这里就总结一下: 在Qt中,所有问题都要一分为二,讨论两种不同的情况:一个是最常 ...
- git配置别名
配置别名 有没有经常敲错命令?比如git status?status这个单词真心不好记. 如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的. 我们只需要 ...
- JS 之 offsetWidth\offsetleft
- 限制div高度当内容多了溢出时显示滚动条
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type"content= ...
- Swift学习之十四:闭包(Closures)
* 闭包(Closures) * 闭包是自包含的功能代码块,可以在代码中使用或者用来作为参数传值. * 在Swift中的闭包与C.OC中的blocks和其它编程语言(如Python)中的lambdas ...
- BigDecimal类的简单使用方法
一提到Java里面的商业计算,我们都知道不能用float和double,由于他们无法进行精确计算.可是Java的设计者给编程人员提供了一个非常实用的类BigDecimal,他能够完好float和dou ...
- hdu3507
题意: 给n(n<=10^6)个非负数字,放在一个数组num中,再给一个特殊值m.求将这个数组分成任意多个区间,每个区间[a,b]的值定义为( sigma(num[i] | (a<=i&l ...
- [iOS开发]TextKit之动态改变样式
在iOS中有一项功能,就是用户可以自定义设备的字体大小,粗体和其他一些样式.具体可以选择 “设置” ---- “通用” ---- “字体大小“ / “辅助功能”, 重新调整文本字体的样式. 如何使ap ...