繼上次的購物車,這是第三篇。記錄一下訂單功能。這功能做的時候,走過彎路,很是燒腦,因為思路沒理順,數據庫設計的也不怎么好,做到一半才發現有問題,接著把數據庫重新設計好,理清思路后,終于完成了。
1.先看一下一開始錯的思路。
在購物車點擊下訂單,接著跳到訂單頁:
填好信息后點擊提交訂單,訂單也能完成。但這時,你打開數據庫中的訂單表會發現,訂單表里面只有一個商品。
2.正確的思路
這時我意識到問題的嚴重性,后臺的ADD代碼出了問題,(因為是錯誤的add代碼,就不貼出來了,怕誤導以后的我:D.不過下面會說一說錯在哪了。)數據庫中表設計也錯誤了,不能將訂單信息和訂單詳細信息放在一張表里面,關系是一對多的。接著后來對數據庫進行更改,得到了如下兩張表:
這是訂單詳細信息表,里面除了存放Goods_ID、Goods_Name、等商品信息外,還有一個U_ID.
這是訂單表,里面存放了User_Name、Order_status(訂單狀態)、Method(送貨方式)、Style(付款狀態)以及U_ID。(后面的Goods_Num什么的,有關商品詳細信息的字段忘記刪了,它們沒用。)還有Order_time??梢钥吹?,這兩張表有相同一個U_ID.他是關聯兩張表的重點。
然后的話,還有一張地址表:
這是地址表,存放收貨地址信息的,里面也有一個U_ID。
3.后臺代碼
正確的表設計好后,就將代碼也改了一遍,當你點擊提交訂單后,觸發了button事件,具體如下:
PRotected void Button3_Click(object sender, EventArgs e) { int num; //提交商品 DataTable getGoodsid = bllShopCar.GetList("[ShopUser]='" + Request.Cookies["ShopUser"].Value + "'").Tables[0]; DataSet getnumway = bllShopCar.getnum(Request.Cookies["ShopUser"].Value); num =Int32.Parse(getnumway.Tables[0].Rows[0]["Num"].ToString()); for (i = 0; i < num; i++) { Goodsid = Int32.Parse(getGoodsid.Rows[i]["Goods_ID"].ToString()); //獲取Godos_ID molOrderinfo.Goods_ID = Goodsid; //提交商品ID到Orderinfo Goods_Num = getGoodsid.Rows[i]["Goods_Num"].ToString(); molOrderinfo.Goods_Num = Int32.Parse(Goods_Num); //提交商品數量到Orderinfo DataSet getprice = bllgoods.GetList("Goods_ID=" + Goodsid); In_Storeprice = getprice.Tables[0].Rows[0]["In_store_price"].ToString(); //獲取商品單價 s = Int32.Parse(In_Storeprice) * Int32.Parse(Goods_Num); molOrderinfo.Goods_Money = s; //提交該商品小計到Orderinfo DataSet getallprice = bllShopCar.getAllprice(Request.Cookies["ShopUser"].Value); a = getallprice.Tables[0].Rows[0][0].ToString(); molOrderinfo.Goods_Name = getprice.Tables[0].Rows[0][1].ToString(); //提交商品名稱到Orderinfo molOrderinfo.U_ID = Int32.Parse(sj);//生成一個訂單編號給Oredrinfo bllOrderinfo.Add(molOrderinfo); } molOrder.Money_Sum = Int32.Parse(a); //提交該訂單總價到Order molOrder.User_Name = Request.Cookies["Username"].Value; //提交該訂單主User_name到Order molOrder.Order_status = "已提交"; molOrder.Method = method.Value; molOrder.Style = "待付款"; molOrder.U_ID = Int32.Parse(sj); //生成一個訂單編號給Oredr DateTime dt = DateTime.Now; molOrder.Order_time = dt; bllorder.Add(molOrder); //提交地址 molAddress.User_Name = Request.Cookies["Username"].Value; molAddress.Address_info = TextArea1.Value; molAddress.Zipcode = TextBox3.Text; molAddress.Get_Name = TextBox1.Text; molAddress.Email = TextBox4.Text; molAddress.Phone = TextBox2.Text; molAddress.Method = method.Value; // string sj2 = DateTime.Now.Day.ToString() + DateTime.Now.TimeOfDay.Hours.ToString() + DateTime.Now.TimeOfDay.Minutes.ToString() + DateTime.Now.TimeOfDay.Milliseconds.ToString(); molAddress.U_ID = Int32.Parse(sj); bllAddress.Add(molAddress); Page.ClientScript.RegisterStartupScript(this.GetType(), "alert", "<script>alert('提交成功!');location.href='PersonCenter.aspx'</script>"); bllShopCar.DeleteShopCar(Request.Cookies["ShopUser"].Value); }
首先看第一行,Getlist方法,根據上一篇中說到的ShopUser獲取ShopCar表中的商品ID;第二行,getnum方法獲取在相同ShopUser下的商品的數量,就是select count(*);第三行,把數量給事先設好的變量:num。接著到了最關鍵的地方,add購物車中所有商品,注意是所有,不是一個商品,之前說過,剛開始那個錯誤的思路就是沒有用for循環遍歷出購物車中所有商品,因此只能提交一個商品到訂單。后來就寫了一個for,試了幾次,發現沒問題。for中第一行,條件:循環次數一定是小于num的;接著for內第三行,獲取商品數量,getGoods_id的后面是.Row[i],不是.Row[1],因為它有多條數據,需要遍歷,不是只有一條數據。接著下面都有注釋了。最后for結束,將訂單的詳細信息提交放在for循環內,就是for中最后一行的add(molOrderinfo),這樣就能實現提交多個購物車中商品了。for之后,不需要循環提交的是具有唯一性的訂單總價和訂單人等一些信息以及最后的地址。最后還有一個U_ID:
string sj = DateTime.Now.Day.ToString() + DateTime.Now.TimeOfDay.Hours.ToString() + DateTime.Now.TimeOfDay.Minutes.ToString() + DateTime.Now.TimeOfDay.Milliseconds.ToString();
這就是訂單編號,將三張表關聯,一次訂單只會生成一個,且不會重復。
4.實現后的效果
先看一下數據庫中增添了什么數據:
這是訂單表,可以看到,剛剛的訂單信息已經添加進去了。
這是訂單詳細表,可以看到U_ID是一樣的,兩個商品也在里面。
這是收貨地址表。
最后,看一下個人中心里面的“我的訂單”
確實是剛剛生成的訂單,此時的訂單狀態是待付款。(因為分頁控件的皮膚引用出了點問題,所以有點丑:D)。
接著點擊訂單編號,跳轉到:
這頁將三張表整合,通過U_ID全部讀出來:
public void dataload1() { molOrder = bllOrder.GetModel1(int.Parse(Request["ID"])); lblorderid_text.Text = molOrder.U_ID.ToString(); lblordertime.Text = molOrder.Order_time.ToString(); moladdress = blladdress.GetModel2(int.Parse(Request["ID"])); lblperson.Tex
新聞熱點
疑難解答