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 是商品信息表,看一下表設計:

)Z5Q39($2P432O%NTBMT{CQ這是Shopcar,

 

8A`4)EH(@P1VA}$)~_1}2KR這是GoodsInfo。其中ShopCar中的ShopUser存放的是一個cookie,當你選中商品加入購物車時,除了商品信息會插入ShopCar,還有一個ShopUser會插入:

}ROWA76}D`%8W[OM7JKY`9Q

其代碼是在后台創建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,這是購物車中有商品的層,顯示出來差不多是這樣

F%5AQCJ%)EY%J_[F}X~PC2B

2.一些細節

首先,用一台電腦購物時,存放在ShopUser的cookie值是一樣的,比如我這台電腦,將兩個商品加入購物車:

FFY88GBQ1S){TNETCSDR[KF

只要是同一台電腦,他的ShopUser都是一樣的,但是Goods_ID,不可能相同,如過你添加同一個商品到購物車就會這樣:

7)0}2$(~`T)~%L@_WG%5{$S

這是相同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實現了。

T1%FBUCHF8B~]Z9481M[M6C

這方法不像那種淘寶里面的,直接+/-,那方法至今沒搞懂怎么獲取值。這方法當你輸入數量后,點擊確定,他就根據數量修改該商品小計和下面的合計金額。在代碼中,他會首先獲取輸入的值,只需要在前台寫一個簡單的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:這是第二期了,以后還會繼續發布的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM