一、前言
继上次的购物车,这是第三篇。记录一下订单功能。这功能做的时候,走过弯路,很是烧脑,因为思路没理顺,数据库设计的也不怎么好,做到一半才发现有问题,接着把数据库重新设计好,理清思路后,终于完成了。
二、开始
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.他是关联两张表的重点。
然后的话,还有一张地址表:
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.Text = moladdress.Get_Name; orderway.Text = molOrder.Method; lbladderss.Text = moladdress.Address_info; lblmoney.Text = molOrder.Money_Sum.ToString(); SqlDataSource1.SelectCommand = "select * from [Orderinfo] where U_ID='" + lblorderid_text.Text + "'"; //DataSet ds = bllOrderinfo.GetList("U_ID ='" + Request.QueryString["ID"] + "'"); //RadListView1.DataSource = ds; //RadListView1.DataBind(); }
lblorderid_text就是前面的订单编号。
点击付款后,提示你付款成功,跳转回去,显示:
这个是根据User_Name而更新状态:
protected void Button1_Click(object sender, EventArgs e) { molOrder = bllOrder.GetModel1(int.Parse(Request["ID"])); molOrder.Style = "已付款"; bllOrder.Update(molOrder); Page.ClientScript.RegisterStartupScript(this.GetType(), "alert", "<script>alert('付款成功!');location.href='PersonalOrder.aspx';</script>"); }
当然,可以在后台管理订单。效果如下:
点击查看订单后,进入这个页面:
选择已发货,完成后,就能看到个人中心里面的:
状态是已发货了。
最后当你订单流程结束后,购物车应该是清空状态的。
好了这就是订单的全部内容,希望能给大家还有未来的我有所帮助吧。
ps:这是第三篇,明天会继续更。谢谢大家耐心看到最后!