基于ASP.NET的网上购物系统

更新时间:2024-03-10 作者:用户投稿原创标记本站原创 点赞:3854 浏览:11816

摘 要 :电子商务从企业来看就是将企业的核心商务过程通过网络节点实现以便改善客户怎么写作,减少流通时间,降低流通费用,从有限的资源中得到更多的收获,最终卖出商品.随着怎么写作器端技术(如ASP和ASP.NET)的出现,小型网站在网上提供商品和怎么写作更容易得多,费用也低得多.为了让客户能够选择其要的商品,本系统网提供了商品目录和购物车,客户在购物过程中都有一个可以将商品存储到购物车中.结账时,从购物车中取出这些商品,并将其存储到数据库中,以便以后处理订单.本系统采用了三层架构技术的思想来划分和设计整体功能.同时采用了具有强大开发功能的Visual Studio 2005作为开发环境,利用VB和ASP.NET技术的特性,实现对系统的快速、高效的开发.该文中着重讨论了利用该技术在用户购物流程中的应用,同时给出了部分实现的代码.其中主要功能包括:商品信息浏览、购物车功能、下订单功能和登录/注册.

关 键 词 :网上购物店;三层架构技术;ASP.NET技术

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)26-5882-10

电子商务通常是指是在全球各地广泛的商业贸易活动中,在因特网开放的网络环境下,基于浏览器/怎么写作器应用方式,写卖双方不谋面地进行各种商贸活动,实现消费者的网上购物、商户之间的网上交易和在线电子支付以及各种商务活动、交易活动、金融活动和相关的综合怎么写作活动的一种新型的商业运营模式.

从长远来看,企业对消费者的电子商务将最终在电子商务领域占据重要地位.但是由于各种因素的制约,目前以及比较长的一段时间内,这个层次的业务还只能占比较小的比重.它是以互联网为主要怎么写作提供手段,实现公众消费和提供怎么写作,并保证与其相关的付款方式的电子化.它是随着万维网(WWW)的出现而迅速发展的,可以将其看作是一种电子化的零售.目前,在互联网网上遍布各种类型的商业中心,提供从鲜花、书籍到计算机、汽车等各种消费商品和怎么写作.

而且电子商务是促使Inter发展的最大动力之一.即使是在Inter的早期,很多网站也有网上商城,用户可以通过它商品并获得怎么写作.随着怎么写作器端技术(ASP和ASP.NET)的出现,小型网站在网上提供商品和怎么写作更容易得多,费用也低得多.虽然这些网站提供的商品各不相同,但是它们都有一个共同点.为了让客户能够选择其要的商品,这些网站都提供了商品目录和购物车,客户在购物过程中都有一个可以将商品存储到购物车中.结账时,从购物车中取出这些商品,并将其存储到数据库中,以便以后处理订单.


1.系统总体设计

1.1系统总体设计

系统总体设计的基本目标就是回答“概括地说,系统应该如何实现?”这个问题,因此总体设计又称为概要设计或初步设计.通过这个阶段的工作将划分出组成系统的物理元素——程序、文件、数据库、人工过程和文档等等.

总体设计阶段的另一项重要任务是设计软件的结构,也就是要确定系统中每个程序是由哪些模块组成的以及这些模块相互间的关系.所以在设计过程就要实现模块化、抽象、逐步求精、信息隐藏和局部化和模块独立.

1.2系统划分

本项目按功能划分主要分为如图1所示的几个模块.

总体设计阶段 基本目的就是用比较抽象概括的方式确定系统如何完成预定的任务,也就是说,应该确定系统的物理配置方案,并且进而确定组成系统的每个程序的结构.因此,总体设计阶段主要由两个小阶段组成.首先需要进行系统设计,从数据流图出发设想完成系统功能的若干个合理的物理方案,并从中选取一个最佳方案.然后进行软件结构设计,确定软件由哪些模块组成以及这些模块之间的动态调用关系.

2.数据库设计和数据库访问层(DAL)

2.1 数据关系模型

在网站中很多的操作都要用到后台数据库.该数据库名为Shop.mdf,它存储了有关产品、订单详情和类别的数据信息.在这个数据库中,关系模型比较简单,只含有4个表,它们的关系如图2所示.

详细说明如表1:

每件商品都要与Category表中的一种类别相关联.

客户下订单后,订单数据被存储在2个表中:OrderBase和OrderDetails.OrderBase表中包含针对整个订单的信息,例如日期和下订单的客户.

OrderDetail表中存储了客户的每件商品的信息,该表通过OrderBaseId列关联到OrderBase表.

数据访问层中的代码不直接使用嵌入的SQL语句来访问数据库中的数据,而是在数据库中为相关的操作(入插入、更新等)提供了存储的方法.这使得更容易在其他项目中部分重用这些代码,还使得更容易对数据库结构作重大修改(当然了,肯定不希望这种事情发生!),这样只需修改存储过程,而无需修改数据访问层的众多方法.在本项目中Shop使用的存储过程都非常简单,其中大部分都只是插入单条记录或检索一条或多条记录.

2.2 ShopManagerDB

由于Shop应用的规模较小,因此将所有数据库的访问代码都集中放在一个类中,这个类就是ShopManagerDB.就Shope而言,这将导致出现非常多的小的类,如ProductManagerDB、CategoryManagerDB和CustomerManagerDB等,其中每个类只有一两个方法.由于出于简化的目的,Shop项目在业务层使用ShopManager类,而在数据访问层使用ShopManagerDB类,如图.就像在现实世界中的商店经理一样,这些类负责导购(显示商品目录中的商品)、将商品放到货架上(在管理部分维护商品目录)以完成客户的订单.

ShopManagerDB类只有共享方法,而没有属性.因此用通过声明私有并将其构造函数隐藏起来.这个类的其他方法分为两类:第一在网站前端商品的方法,第二在管理部分对商品目录的商品进行管理的方法.下表列出了ShopManagerDB类的6个重要方法. 3 系统详细设计

3.1 页面设计和表示层(PT)

表示层:是系统的PT部分,负责使用者与整个系统的交互.在这一层中,理想的状态是不应包括系统的业务逻辑.表示层中的逻辑代码,仅与界面元素有关.在EShop项目中,是利用ASP.Net来设计的,因此包含了许多Web控件和相关逻辑.

3.1.1 MasterPage.master(母版页)

使用 ASP.NET 母版页可以为应用程序中的页创建一致的布局.单个母版页可以为应用程序中的所有页(或一组页)定义所需的外观和标准行为.然后可以创建包含要显示的内容的各个内容页.当用户请求内容页时,这些内容页与母版页合并以将母版页的布局与内容页的内容组合在一起输出.

Login

Logout

Logout | Admin

ESHop项目的母版页定义了所有页面的外观.该母版页引用了全局CSS文件Core.css,它还包含了一个名为MainMenu的用户控件,它包含了很多标签,它们连接到各个主要部分的入口页面.通过使用LoginView控件,对未认证的用户隐藏了某些连接.以如下方式决定显示Login还是Logout按钮以及隐藏还是显示Admin按钮.

除LoginView控件外,还可以使用LoginStatus控件来提供Login和Logout链接,该控件根用户的登录状态决定显示链接Login还是Logout.

母版页的最后一部分是ContentPlaceHolder,它定义了使用该母版页的页面可以显示其自定义内容的区域.

3.1.2 Web.config

和所有ASP.Net应用程序一样,EShop也有一个Web.config文件,其中包含对应用程序至关重要的设置. 节点设置Profiles提供程序.用户配置(Profile)是一种快速存储用户信息(如姓名、地址和喜好等)的不错方式.存储和检索这些信息是由ASP.NET框架透明的完成,不需要编写自定义代码,开发人员只需要在Web.config文件中配置节点.元素包含几个子元素,有必要解析一下.下面是完整的:

元素告诉ASP.NET运行环境应该使用哪个Profile.在文件Machine.config——怎么写作器中的所有用户配置的基类,配置了一个默认的提供程序,它使用本地连接字符串和一个名为aspdb.mdf的数据库.由于Eshop使用自己的数据库,因此使用元素将继承的Profile设置删除.接下,元素添加一个新的提供程序,它与原来的提供程序极其相似,但是属性connectionStringName被设置为数据库EShop.mdf 在Web.config文件的最后是两个节点,用于限制对文件夹Management和页面CheckOut.aspx的访问.只有被赋予Adminstrator角色用户才能访问文件夹Management内的页面,而所有未验证的用户 都不能够访问页面CheckOut.aspx.

3.1.3 Login.aspx

Login.aspx负责处理与用户登录相关的所有问题,它包含ASP.Net 2.0新增的3个登录控件,每个都放在各自的Html控件,以便将它们分开.下表列出了这些控件及其用途.

PassWordRecovery控件在默认情况下根据用户名检索用户的.可是有许多用户却忘记类用户名,但是还记得E-Mail地址.因此需要根据用户的E-Mail来自动地获取该用户名,因此使用下述方法检索用户名:

Protected Sub PasswordRecovery1_VerifyingUser(ByVal sender As Object, ByVal e As _

System.Web.UI.WebControls.LoginCancelEventArgs)

Handles PasswordRecovery1.VerifyingUser

PasswordRecovery1.UserName 等于 _

Membership.GetUserNameBy(PasswordRecovery1.UserName)

End Sub

这样,用户可以提供E-mail地址.而在后台根据用户名来指定新的.

3.1.4 UserDetails.aspx

UserDetails.aspx页面让用户能够提供诸如姓名和送货地址等信息.该页面包含6个文本框,每个用Profile中的一个属性.该页面加载时,系统将用户配置中的用户详细信息填入这些控件.用户单击“保存”按钮后,这些控件中的值将被存储到用户配置中.该页面使用验证控件确保每个字段不为空.

3.2业务逻辑层(BLL)

业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关.以本EShop项目为例,业务逻辑层的相关设计,均和网上购物商城特有的逻辑相关,例如浏览商品,下订单,添加商品到购物车和登陆等等.如果涉及到数据库的访问,则调用数据访问层.在EShop的业务层包含有5个类,详细介绍如下

3.2.1 Product类

Product类(如图3 所示)表示显示在网站中的相关商品,而不表示客户可将其加入购物车中的实际的商品,虽然这两者之间的关系密切.

Product类本身没有定义行为,换句话说,它没有属性,除了默认的构造函数外也没有其他的方法.所有与商品进行交互的行为,如获取商品列表或Product实例都是有ShopManager类所完成的.除了属性Id、Price和Description外,Product类还有许多个PictureURL属性,它们分别在商品目录、商品详细信息页面和购物车中显示商品.表列出了Product类的8个属性并描述了它们的用途.

3.2.2 OrderedProduct类

图4是OrderedProduct的类图,其中包含很多Product类中也有的属性.因此OrderedProduct和Product有很多相似之处.为避免重复Product的功能以及每当用户将商品加入到购物车时都将Product对象的信息复制到OrderedProduct对象中,OrderedProduct包含一个类型为Product的私有成员.新创建的OrderedProduct实例时,将把一个Product实例传递类其构造函数,然后将其存储到_theProduct中.获取OrderedProduct的Description和PictureUrlSmall等属性的时候,将通过其内部的Product对象来获取这些属性的实际值.

3.2.3 ShoppingCart类

顾名思义,ShoppingCart类(如图5)用于集中存储OrderedProdcut.在一个简单的会话变量中存储了一个Shopping实例,通过ShopManager的一个属性可以访问该变量的值.这样,网站中的所有页面和其他类都能够访问购物车.

ShoppingCart类包含一个由得商品组成的列表以及用于添加、更新和删除商品的方法.他还包括了可以用于访问购物车中的商品、获取商品数量以及获取订单总金额的属性.最后.它还有一个不接受任何参数的默认构造函数,用于创建ShoppingCart的实例.

为了方便处理购物车中商品,ShoppingCart可以调用方法有:Add添加商品(增加商品数量),Clear删除所有商品,Remove删除选定的商品,Update更新指定商品数量.

3.2.4 ShopManager类

ShopManager类(如图6所示)是该应用处理的中心实体,负责处理Product和OrderedProduct.在该应用的两部分都使用了它:在前端用户访问购物车,在后台让管理员能够管理商品目录中的商品.

除了ShoppingCart属性(其类型为前面说介绍过的ShoppingCart)外,ShopManager类还包含如下几个方法,如表9 .

3.2.5 Customer类

EShop使用Membership提供程序和Profile类来存储有关用户的信息,如用户名、和详细地址等等.

在EShop 中.Customer类用于提供用户在购写时的详细信息.从安全的角度考虑,最好在购写完成后禁止用户修改其详细信息,如送货地址.这样使得将不能够在客户支付订单后修改送货地址,使得商品被送到其他地方而不是原来的客户. Customer包含有7个公有属性和一个方法(构造函数).

其中大多数属性都非常简单,无需再详细说明.唯一要说明的是CustomerId属性,该ID的类型为Guid,它不是Customer类生成的,而是从MembershipUser类的ProviderUseKey属性中检索得到的.由于Membership和Profile提供程序存储的数据位于该应用的其他部分使用的数据库中,因此重用该主键,以便以后根据他检索用户的详细信息是合理的.

Customer类的所有属性都是只读的,要设置它们的初始值,必须将这些传递给Customer类的构造函数.

在业务层的5个类中,只有ShopManager包含需要访问数据库已读取和写入数据的方法.这种数据库访问是由ShopManagerDB类来完成的.

4.系统实现

4.1购物时主要流程

用户在主页中单击菜单项Shop时,将进入文件夹Shop中的Default.aspx页面.使用一个HTML表将该页分成了两部分,左边一栏包含有一个ASP.NET Repeater控件,显示所有的商品类别.类别时通过ObjectDataSource控件加入到Repeater中的,该数据源控件通过ShopManager类的GetProductCategories方法一DataSet的方式返回类别.用户单击某个类别时,右边的商品列表将刷新,只是显示属于该类别的商品.如图8.

商品是由一个DataList控件显示的,该控件的RepeatColumn被设置为2,因此将在每行并排显示两件商品.在DataList的下方是两个HyperLink控件,用于在商品列表中前后移动.

4.1.2 将商品加入到购物车中

ProductList页面中的GridView包含HyperLink控件,它链接到ProductDetails.aspx.在该页面中,用户可以查看有关商品的更多信息以及将其加入到购物车中.该页面的代码与ProductLIst页面十分相似,但使用的是一个DetailsView控件而不是GridView控件,该控件使用一个ObjectDataSource绑定到GetPrduct方法返回的值.该页面被加载时,ObjectDataSource调用业务层中的方法,获取查询字符串中的ID指定的商品.然后使用DatailVIew控件将该商品显示到页面中.

用户单击 加入到购物车 按钮时,将创建一个新的Product实例,并将其加入到购物车中:

Dim productId As Integer

productId 等于 Convert.ToInt32(Requet.QueryString.Get(“Id”))

Dim myProduct As Product 等于 ShopManager.GetProduct(productId)

ShopManager.AddProductToCart(myProduct)

Response.Redirect(“ShoppingCart.aspx”)

Product实例时使用GetProduct方法创建的.这也是ObjectDataSource控件将商品显示到页面中使用的方法.然后该实例被传递给AddProductToCart方法,后者调用ShoppingCart的Add方法:

Public Shared Sub AddProductToCart ( ByVal theProduct As Product )

ShopManager.ShoppingCart.Add( theProduct )

End Sub

通过ShopManager类的ShoppingCart共享属性可以访问用户的购物车:

Public Shared ReadOnly Property ShoppingCart ( ) As ShoppingCart

Get

If HttpContext.Current.Session(“ ShoppingCart”) Is Nothing Then

HttpContext.Current .Session(“ShoppingCart”)等于 New ShoppingCart( )

End If

Return CType( HttpContext.Current.Session( “ShoppingCart ”),ShoppingCart )

End Get

End Property

该属性被首次访问时,将创建一个新的ShoppingCart实例,将其存储到一个会话变量中,然后返回给调用代码.以后再访问该属性时,将返回会话状态中的ShoppingCart.这样.购物车总是可用的.

Public Sub Add(ByVal theProduct As Product)

For Each existingProduct As OrderedProduct In _items

If theProduct.Id 等于 existingProduct.ProductId Then

existingProduct.Quantity +等于 1

Exit Sub

End If

Next

Dim myOrderedProduct As OrderedProduct 等于 New OrderedProduct(theProduct, 1) _items.Add(myOrderedProduct)

End Sub

如果购物车中已经有ID相同的OrderedProduct时,则将该商品的数量加1.OrderedProduct的构造函数接受一个Product实例作为参数,将其存储到私有变量_theProduct中,并将Quantity属性的初始值设置为1.然后将该OrderedProduct实例加入到表示用户购物车的_items列表中

5.结论

本项目EShop包含了电子商务的所有元素,包括商品目录,购物车以及将订单存储到数据库.利用ASP.NET和三层架构技术来开发动态网页.其中关键部分包括了:

1)建立了业务逻辑层和数据访问层,以检索有关商品和类别信息.

2)重点开发了一个购物车,它将OrderedProduct存储到会话状态中,以便在用户会话的整个阶段内都可以使用它们.

3)使用访问代码SqlTransaction对象,以确保多个数据库操作要么全部完成, 要么全部撤销(其中一个操作失败时).

4)使用ASP.NET2.0Profile提供程序将用户信息的详细信息存储到数据库中.这样,只需要在文件Web,Config中添加几项设置,并通过Profile类的公有属性来访问它们,而不需要编写自定义代码在数据库检索它们.

5)管理商品添加图片部分,管理员只需要上传一张图片,系统就自动修辨率分别把图像插入到商品目录、商品详细信息和购物车中,使得用户在整个阶段都能够看到自己所选择的商品.

在完成系统全部设计和测试时,也发现了许多不足的地方,主要是网站功能上还不够完善如数据库的设计、系统人性化不足,这是系统以后应该改进的地方.