ASP.NET之电子商务系统开发-3(订单)
一、前言
继上次的购物车,这是第三篇。记录一下订单功能。这功能做的时候,走过弯路,很是烧脑,因为思路没理顺,数据库设计的也不怎么好,做到一半才发现有问题,接着把数据库重新设计好,理清思路后,终于完成了。
二、开始
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[];
DataSet getnumway = bllShopCar.getnum(Request.Cookies["ShopUser"].Value);
num =Int32.Parse(getnumway.Tables[].Rows[]["Num"].ToString());
for (i = ; 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[].Rows[]["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[].Rows[][].ToString();
molOrderinfo.Goods_Name = getprice.Tables[].Rows[][].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:这是第三篇,明天会继续更。谢谢大家耐心看到最后!
ASP.NET之电子商务系统开发-3(订单)的更多相关文章
- ASP.NET之电子商务系统开发-4(二级分类)
一.前言 继上次的订单,这是第四篇.记录一下分类和筛选.这功能是最后做的,因为我完全不懂其原理.后来通过同学的指导(一位很有天赋的同学,比我牛逼一个层次,同样是高三.:D),终于也是完成了.在写这篇博 ...
- ASP.NET之电子商务系统开发-1(数据列表)
一.前言 首先声明的是,这是我第一个与别人合作的.net项目,另一个人做的是后台管理,我做的前台,这是一个电子商务的系统,主要实现的功能是查看商品以及购物功能. 二.开始 首先看一下我截取的项目部分商 ...
- ASP.NET之电子商务系统开发-2(购物车功能)
一.前言 继上次的首页数据列表后,这是第二篇.记录一下购物车这个比较庞大的功能,可能实现的方法跟其他人有点不一样,不过原理都差不多,是将cookie存数据库里面的. 二.开始 首先看一下购物车流程及对 ...
- 基于Mvc3,Ef,领域驱动电子商务系统的EShop开发
分享自己从代码小工一步步走向搭架子,ING... 简单了解UnitOfWork 摘要: UnitOfWorkUnit Of Work模式,即工作单元,它是一种数据访问模式.它是用来维护一个由已经被业务 ...
- 转:国内外著名开源b2c电子商务系统比较包括asp.net和php
from: http://longdick.iteye.com/blog/1122879 国内外著名开源b2c电子商务系统比较包括asp.net和php 博客分类: 电子商务 国内外著名开源b2c ...
- [课程设计]Scrum 2.3 多鱼点餐系统开发进度 (订单一览设计)
Scrum 2.3 多鱼点餐系统开发进度 (订单一览设计) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系统 ...
- 如何在ASP.NET大型应用系统的模块化开发实现多版本程序集并存支持[转载]
如何在ASP.NET大型应用系统的模块化开发实现多版本程序集并存支持 这是我最近碰到的一个问题,有一家企业.NET程序员有80多人,产品线很多也很复杂.对于这样的产品,他们采用了模块化开发来实现复用与 ...
- ecshop二次开发 使用ecshop电子商务系统的100个小问题
自己从事B4C电子商务开发一段时间了,特别对ecshop深有体会,刚接触的时候不容易理解,下面将根据自己的经验,来总结100条关于操作ecshop电子商务系统的小问题. 1:如何修改网站"欢 ...
- 基于jeesite+android开发 电子商务系统免费教程
下载地址: jeesite免费教程 基于jeesite+android开发 电子商务系统免费教程 基于jeesite+android开发 电子商务系统免费教程 这个教程已经录制完很久了,一直没有公开, ...
随机推荐
- smtp cmd 测试 smtp发送邮件 cmd发送邮件
无账户MAIL FROM:<test@rmvbdy.com>RCPT TO:2850965781@qq.comDATASubject: test messagetest body . 有账 ...
- 如何在Delphi中调用VC6.0开发的COM
上次写了如何在VC6.0下对Delphi写的COM进行调用,原本想马上写如何在Delphi中调用VC6.0开发的COM时,由于在写事例程序中碰到了个很怪的问题,在我机子上用VC写的接口程序编译能通过. ...
- Android中pendingIntent的深入理解
pendingIntent字面意义:等待的,未决定的Intent.要得到一个pendingIntent对象,使用方法类的静态方法 getActivity(Context, int, Intent, i ...
- ZooKeeper源码阅读(二):客户端
源代码: http://svn.apache.org/repos/asf/zookeeper/trunk/ 导入eclipse: 在包含build.xml目录下执行ant eclipse将产生.cla ...
- 整理Linux查看系统日志的一些经常使用命令
整理Linux查看系统日志的一些经常使用命令 last -a 把从何处登入系统的主机名称或ip地址,显示在最后一行. -d 指定记录文件.指定记录文件.将IP地址转换成主机名称. -f <记录文 ...
- Eclipse debug ‘Source not found’
用Eclispe进行Debug时一直被一个问题所困扰:Source not found. 问题产生的原因是调试进入了一个没有源代码的jar包里. 简短说明: Edit Source Lookup Pa ...
- UML的基本图(一)
A class diagram shows a set of classes, interfaces, and collaborations and their relationships. T ...
- Windows下安装storm-0.9.1
Windows下安装storm-0.9.1的详细步骤如下: 1.确定已经正确安装JDK1.6或JDK1.7(具体安装步骤略) 2.安装Python2.7版本(测试storm-starter proje ...
- C#按钮客户端验证
OnClientClick="return confirm('是否确定排除?');"
- Problem G: If We Were a Child Again
Problem G: If We Were a Child AgainTime Limit: 1 Sec Memory Limit: 128 MBSubmit: 18 Solved: 14[Submi ...