繼上次的首頁數(shù)據(jù)列表后,這是第二篇。記錄一下購物車這個比較龐大的功能,可能實現(xiàn)的方法跟其他人有點不一樣,不過原理都差不多,是將cookie存數(shù)據(jù)庫里面的。
首先看一下購物車流程及對應代碼。
1.如果購物車為空,就顯示
其方法是創(chuàng)建兩個大的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會插入:
其代碼是在后臺創(chuàng)建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存到后臺并且這個值會放入數(shù)據(jù)庫中。再回到上面的方法,方法里面將這兩張表根據(jù)ShopUser,select了一下。然后下一行是if判斷,如果數(shù)據(jù)庫里面沒有數(shù)據(jù),nocarbox的值就是true,其中nocarbox 就是上面的層,顯示的是“您的購物車還是空的”;如果有數(shù)據(jù),havegoodsbox1 的值就是true,這是購物車中有商品的層,顯示出來差不多是這樣
2.一些細節(jié)
首先,用一臺電腦購物時,存放在ShopUser的cookie值是一樣的,比如我這臺電腦,將兩個商品加入購物車:
只要是同一臺電腦,他的ShopUser都是一樣的,但是Goods_ID,不可能相同,如過你添加同一個商品到購物車就會這樣:
這是相同ShopUser下,Goods_ID不能相同,還有一種就是不同ShoUser情況的,Goods_ID可以相同,也就是不同電腦添加相同商品不會產(chǎn)生沖突問題。具體添加商品的判斷語句如下:
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,因此你要是修改商品的信息,例如數(shù)量,就會顯的非常麻煩,琢磨了好久之后終于用js實現(xiàn)了。
這方法不像那種淘寶里面的,直接+/-,那方法至今沒搞懂怎么獲取值。這方法當你輸入數(shù)量后,點擊確定,他就根據(jù)數(shù)量修改該商品小計和下面的合計金額。在代碼中,他會首先獲取輸入的值,只需要在前臺寫一個簡單的js就可以了,代碼如下:
function change(js_shopcarid) { var goodsnum = prompt("請輸入數(shù)量", "");//將輸入的數(shù)量賦值給num if(goodsnum < 0 ) { alert("請輸入正確數(shù)值"); } else if (goodsnum) { alert("修改成功!"); document.cookie = "jsshopcarid=" + js_shopcarid; document.cookie = "goodsnum=" + goodsnum; var btn = document.getElementById("Button3"); btn.click();
新聞熱點
疑難解答