一、前言

继上次的购物车,这是第三篇。记录一下订单功能。这功能做的时候,走过弯路,很是烧脑,因为思路没理顺,数据库设计的也不怎么好,做到一半才发现有问题,接着把数据库重新设计好,理清思路后,终于完成了。

二、开始

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(订单)的更多相关文章

  1. ASP.NET之电子商务系统开发-4(二级分类)

    一.前言 继上次的订单,这是第四篇.记录一下分类和筛选.这功能是最后做的,因为我完全不懂其原理.后来通过同学的指导(一位很有天赋的同学,比我牛逼一个层次,同样是高三.:D),终于也是完成了.在写这篇博 ...

  2. ASP.NET之电子商务系统开发-1(数据列表)

    一.前言 首先声明的是,这是我第一个与别人合作的.net项目,另一个人做的是后台管理,我做的前台,这是一个电子商务的系统,主要实现的功能是查看商品以及购物功能. 二.开始 首先看一下我截取的项目部分商 ...

  3. ASP.NET之电子商务系统开发-2(购物车功能)

    一.前言 继上次的首页数据列表后,这是第二篇.记录一下购物车这个比较庞大的功能,可能实现的方法跟其他人有点不一样,不过原理都差不多,是将cookie存数据库里面的. 二.开始 首先看一下购物车流程及对 ...

  4. 基于Mvc3,Ef,领域驱动电子商务系统的EShop开发

    分享自己从代码小工一步步走向搭架子,ING... 简单了解UnitOfWork 摘要: UnitOfWorkUnit Of Work模式,即工作单元,它是一种数据访问模式.它是用来维护一个由已经被业务 ...

  5. 转:国内外著名开源b2c电子商务系统比较包括asp.net和php

    from: http://longdick.iteye.com/blog/1122879 国内外著名开源b2c电子商务系统比较包括asp.net和php 博客分类: 电子商务   国内外著名开源b2c ...

  6. [课程设计]Scrum 2.3 多鱼点餐系统开发进度 (订单一览设计)

    Scrum 2.3 多鱼点餐系统开发进度  (订单一览设计) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系统 ...

  7. 如何在ASP.NET大型应用系统的模块化开发实现多版本程序集并存支持[转载]

    如何在ASP.NET大型应用系统的模块化开发实现多版本程序集并存支持 这是我最近碰到的一个问题,有一家企业.NET程序员有80多人,产品线很多也很复杂.对于这样的产品,他们采用了模块化开发来实现复用与 ...

  8. ecshop二次开发 使用ecshop电子商务系统的100个小问题

    自己从事B4C电子商务开发一段时间了,特别对ecshop深有体会,刚接触的时候不容易理解,下面将根据自己的经验,来总结100条关于操作ecshop电子商务系统的小问题. 1:如何修改网站"欢 ...

  9. 基于jeesite+android开发 电子商务系统免费教程

    下载地址: jeesite免费教程 基于jeesite+android开发 电子商务系统免费教程 基于jeesite+android开发 电子商务系统免费教程 这个教程已经录制完很久了,一直没有公开, ...

随机推荐

  1. Oracle单个数据文件超过32G后扩容

    Oracle单个数据文件超过32G后扩容   表空间数据文件容量与DB_BLOCK_SIZE的设置有关,而这个参数在创建数据库实例的时候就已经指定.DB_BLOCK_SIZE参数可以设置为4K.8K. ...

  2. wifi相关协议

    IEEE 802.11Wi-Fi 协议摘要 协议 频率 信号 最大,数据率 传统802.11 2.4GHz FHSS或DSSS 2Mbps 802.11a 5GHz OFDM 54Mbps 802.1 ...

  3. 【Windows 8 Store App】学习:目录

    原文http://www.cnblogs.com/java-koma/archive/2013/05/22/3093302.html 写在前面:我之前从事java开发,对MS的一整套东西还没入门哈,难 ...

  4. 转:web前端面试题合集 (Javascript相关)(js异步加载详解)

    1. HTTP协议的状态消息都有哪些? 1**:请求收到,继续处理2**:操作成功收到,分析.接受3**:完成此请求必须进一步处理4**:请求包含一个错误语法或不能完成5**:服务器执行一个完全有效请 ...

  5. 面向对象程序设计-C++_课时14对象组合_课时15继承

    对象组合,就是一个类的对象作为另外一个类的成员,涉及类的对象,对象是实体,玩实 继承,涉及类,类是概念,玩虚 public: 所有人都可以接触 private: 数据放private protecte ...

  6. 网易云课堂_C语言程序设计进阶_第5周:链表

    5.1可变数组 5.2链表 5.1可变数组 Resizable Array Think about a set of functions that provide a mechanism of res ...

  7. #include <memory>

    1 auto_ptr 2 unique_ptr 1 auto_ptr C++的auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理. 使用std::auto_ptr,要#inc ...

  8. kafka学习(四)-Topic & Partition

    topic中partition存储分布 Topic在逻辑上可以被认为是一个queue.每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里.为了使得 Kafka的吞吐 ...

  9. java中的上传下载----ajaxFileUpload+struts2

    文件上传在项目中应该是非常常见的,而且很多时候,上传文件都只是一个小页面中的一个功能,要求在实现文件上传的前提下不刷新页面.而一般情况下将客户端的文件包装成网络地址传递到服务器端然后通过流来进行文件传 ...

  10. k8s之scheduler

    一.概述 调度器是kubernetes中独特而又重要的一个模块,独特是因为scheduler是唯一一个以plugin形式存在的组件,重要是因为kubernetes中最重要的基础单元pod的部署是通过s ...