网上书店管理信息系统设计计划书.doc_第1页
网上书店管理信息系统设计计划书.doc_第2页
网上书店管理信息系统设计计划书.doc_第3页
网上书店管理信息系统设计计划书.doc_第4页
网上书店管理信息系统设计计划书.doc_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网上书店管理信息系统设计计划书 1、 系统目标 书籍被认为是最适合在Internet上销售的商品之一,这主要是因为购书的金额比较少,也不用像买衣服那样需要货比三家,用户坐在家中就可以查询到需要的书籍,并决定是否需要购买.1.11用户行为分析在实现系统之前,首先需要站在用户的角度上进行行为分析,进而确定系统的目标.网络用户在使用电子商务选购图书时,其典型行为如图1.1所示.购书者浏览、查询图书显示图书列表选择图书确认购书购物篮管理显示详细信息是用户管理网上支付模块姓名密码邮编地址停继续购物图1.1 用户购书流程1.1系统目标在用户行为分析的基础上,下一步确定本系统所要实现的基本功能,如下。图书查询、浏览功能用户购买图书功能用户购物篮管理功能会员管理功能 另外,除了站在用户的角度上,系统还将以管理者的身份来考虑系统的功能,完成以下功能.图书管理功能图书销量统计功能2、 系统预览 在开发系统之前,为了给读者一个直观的印象,首先以一个用户的身份,来展现如何使用这个系统,去购买心仪的图书.1.21浏览、查询图书 就像进入一个普通的书店一样,当进入网上书店后,无需登录,就可以浏览图书.而电子书店还可以提供一个更好的功能:即通过图书名称、类别等信息从浩瀚的书海中迅速找到喜欢的书,如图1.2所示.图1.2 浏览、查阅图书1.22查看图书详细信息 通过图书列表找到中意的图书之后,就像逛普通的书店一样,可以查看其详细信息,这可以通过单击图中的详细信息超级链接来查看,如图1.3所示.图1.3查看图书详细信息 单击返回按钮,便可以重新回到浏览、查询图书页面.1.23购买图书 在确定了想要购买的图书之后,可以通过图书前面的复选框将其选中,并可设置所要购买的数量,然后通过浏览数量页面的放入购物篮实现购买,如图所示. 如果在没有做任何选择之前就单击放入购物篮按钮,系统则会给出警告信息,如图1.5所示.图9.4 将图书放入购物篮图9.5 未选择图片警告1.24用户登录、注册在用户购买图书时,系统将判断其是否已经登录,如果没有,则转向登录页面,如图1.6所示.在登录后,系统还将转向原来用户浏览的页面. 图1.6登录系统1.25购物篮管理 用户登录之后,就可以把图书放入购物篮中了.通过页面上方的我的购物篮链接,可以对购物篮进行管理,包括修改所购图书数量、删除图书等,如图1.7所示.图1.7购物篮管理单击继续选购按钮可以回到图书列表,而单击去结算中心则将跳转到网络支付模块.网络支付模块涉及到多个方面的协作,如图1.8所示,电子商务系统的开发者可以直接使用银行或者认证机构发行的支付模块,而不必单独开发.因此,本书对网上支付模块也将不作详细的介绍. 图1.8网络支付流程1.26图书信息管理 上面的几个步骤,是站在用户的角度上,完成了购买图书的步骤.另外,系统将站在系统管理者的角度,实现图书管理功能. 通过系统菜单的添加图书链接,将跳转到添加图书页面,如图9.9所示.在添加图书时,将进行数据检查,如果输入的数据不满足要求(包括是否必填,以及数据类型是否正确),则给出提示.图9.9添加图书信息另外,添加图书还具有上传图片的功能,通过页面中的浏览按钮,可以选择所要上传的图片,如图9.10所示.图1.10 选择图书上传图片 为图书上传图片后,在查看图书的详细信息时,将会出现这副图片.1.27图书销售统计 作为商家,系统管理者自然非常关心图书的销量统计,了解哪一类的图书是畅销的.本系统实现了图书销量统计功能,并用饼状图的形式直观地显示出来,如图1.11所示. 通过统计方式下拉框,可以 选择根据哪 一项指标进行统计. 图1.11图书销量统计 1.28工程文件一览 整个工程实现后的文件列表以及层次结构,如图1.12所示;命名空间以及各个空间中的类层次结构,如图1.13所示.图1.12 MyBookShop多层体系结构78图9.13 MyBookShop 工程文件以及命名空间三 数据库设计下面介绍网上书店系统的数据库设计.1.31设计数据库网上书店数据库(MyBookShop)数据表模式如图1.14所示.图1.14 MyBookShop 数据库模式 包含的数据表如下.(1) 【用户表】(用户编号,登录名,用户姓名,口令.联系地址,邮政编码)(2) 【图书表】(图书编号,图书名,类别号,单价,出版社,出版日期,作者,页数,图片路径,简介,销售量)(3) 【图书分类表】(类别编号,类别名)(4) 【购物篮表】(购物篮编号,购买者编号,图书编号,图书数量) 其中,用下划线标出的属性为表的主键属性.各个表的模式如表1.1-1.4所示.表1.1 User(用户)表字段名数据类型备注UserIdInt IDENTITY(11)NOT NULL用户ID,自动增加,主键LoginNameVarchar(50)NOT NULL用户登录名UserNameVarchar(50)NOT NULL用户姓名PasswordVarchar(50)NOT NULL用户密码AddressVarchar(100)NULL用户地址Zipchar(10)用户邮编 表1.2 Book(图书)表字段名数据类型备注BookIdInt IDENTITY(11)NOT NULL图书ID,自动增加,主键BookNameVarchar(50)NOT NULL图书名CategoryIDint图书类别编号Pricefloat图书价格PublisherVarchar(100)出版社PublishDatedatetime出版日期AuthorVarchar(50)作者PageNumint页数PictureUrlVarchar(50)图片名Descriptiontext简介SaleCountint销售量表1.3 Category(图书类别)表字段名数据类型备注CategoryIDInt IDENTITY(11)NOT NULL类别编号,自动增加,主键CategoryNameVarchar(50)类别名 表1.4 Cart(购物篮)表字段名数据类型备注CartIdInt IDENTITY(11)NOT NULL购物篮ID,自动增加,主键UserIdInt用户编号BookIdInt图书编号AmountInt购买数量1.32实现数据库 下面给出数据库实现的SQL命令(在SQL Server2005中执行通过).(1) 创建User表CREATE TABLE dbo.User (UserId int IDENTITY (1, 1) NOT NULL ,LoginName varchar (50) COLLATE Chinese_PRC_CI_AS NULL ,UserName varchar (50) COLLATE Chinese_PRC_CI_AS NULL ,Password varchar (50) COLLATE Chinese_PRC_CI_AS NULL ,Address varchar (100) COLLATE Chinese_PRC_CI_AS NULL ,Zip char (10) COLLATE Chinese_PRC_CI_AS NULL ) ON PRIMARY(2) 创建Book表CREATE TABLE dbo.Book (BookId int IDENTITY (1, 1) NOT NULL ,BookName varchar (50) COLLATE Chinese_PRC_CI_AS NULL ,CategoryID int NULL ,Price float NULL ,Publisher varchar (100) COLLATE Chinese_PRC_CI_AS NULL ,PublishDate datetime NULL ,Author varchar (50) COLLATE Chinese_PRC_CI_AS NULL ,PageNum int NULL ,PictureUrl varchar (50) COLLATE Chinese_PRC_CI_AS NULL ,Description text COLLATE Chinese_PRC_CI_AS NULL ,SaleCount int NULL ) ON PRIMARY TEXTIMAGE_ON PRIMARY(3) 创建Category表CREATE TABLE dbo.Category (CategoryID int IDENTITY (1, 1) NOT NULL ,CategoryName varchar (50) COLLATE Chinese_PRC_CI_AS NULL ) ON PRIMARY初始化一些图书种类数据Insert Into Category(CategoryName) Values (中外文学)Insert Into Category(CategoryName) Values (政治经济)Insert Into Category(CategoryName) Values (学术名著)Insert Into Category(CategoryName) Values (IT技术)(4) 创建Cart表CREATE TABLE dbo.Cart (CartId int IDENTITY (1, 1) NOT NULL ,UserId int NULL ,BookId int NULL ,Amount int NULL ) ON PRIMARY四 数据访问层 同上一章介绍的聊天室的数据访问层类似,本系统只包括一个类Database,但本节给出的类增加了更多的方法,可以完成更强大的数据操作功能.1.41配置数据库连接 本例中,在Web.config文件中指定了数据库连接字符串配置信息,具体实现为,在Web.config文件中添加如下代码: 1.42数据库类实现 Database类的类图如图1.15所示.图1.15 Database 类图 五 数据访问接口层 数据访问接口层(DataAccessHelper),包括两个类:GetSafeData和SqlStringFormat.这两个类分别能够完成获取安全数据和构造SQL语句的功能.1.51获取安全数据 GetSafeData类包含一系列从DataRow和SqlDataReader对象中安全获取数据的静态方法,具体如图1.16所示.图1.16 GetSafeData 类的类图 其中,从DataRow中获取安全数据的4个方法ValidateDataRow_*同前面相似,不作重述.从SqlDataReader中获取安全数据的4个方法ValidateDataReader_*功能如表1.5所示表1.5 GetSafeData类的ValidateDataReader_*方法说明属性/方法功能说明ValidateDataReader_S从SqlDataReader当前行获取字符串,数据为空返回System.String.Empty对象ValidateDataReader_N从SqlDataReader当前行获取整数,数据为空返回System.Int32.MinValue对象ValidateDataReader_F从SqlDataReader当前行获取浮点数,数据为空返回System.Double.MinValueValidateDataReader_T从SqlDataReader当前行获取时间,数据为空返回System.DateTime.MinValue因为这4个方法的实现非常类似,不必一一重复介绍.下面,就以ValidateDataRow_S为例,说明其实现过程.代码1-1 ValidateDataReader_S:DataAccessHelperGetSafeData.cs/ / 从SqlDataReader中安全获取数据/ / 数据读取器SqlDataReader/ 列名/ 列中的字符串数据,如果为空,则返回System.String.Emptypublic static stringValidateDataReader_S(SqlDataReader reader,string colname)if(reader.GetValue(reader.GetOrdinal(colname)!=DBNull.Value)return reader.GetString(reader.GetOrdinal(colname);elsereturn System.String.Empty;第11行利用了SqlDateReader的两个方法.(1) GetOrdinal:根据SqlDataReader中的列名获取列索引.(2) GetValue:根据列的索引获取SqlDataReader当前行中的数据. 获取了数据之后,利用DBNull类来判断数据源中的数据是否为空,如果不为空,则返回字符串类型的数据;否则,就返回System.String.Empty对象.1.52构造SQL语句 SqlStringConstructor类具有两个方法,如图1.17所示.图 1.17 SqlStringConstructor类图(1)GetQuotedString:将字符串加上SQL语句中常用的单引号“”。(2)GetConditionClause:构造SQL语句中的条件子句,这个方法接收一个哈希参数,利用哈希表中的每一项都是一个DictionaryEntry对象的对的特征,构造SQL语句中的条件子句。GetConditionClause方法的实现流程如图1.18所示。queryItems(Hashtable)循环读取每一个哈希键值对第一项?返回串+=“Where”返回串+=“And”是字符串或时间?返回串+=“Key Like %value%”返回串+=“key=value”结束图1.18 SqlStringConstructor.GetConditionClause 方法流程实现代码如下。 代码1-2 GetConditionClause:DataAccessHelperSqlStringFormat.cs1./ 2./ 根据条件哈希表,构造SQL语句中的条件子句3./ 4./ 条件哈希表5./ 条件子句6. public static String GetConditionClause(Hashtable queryItems)7.8.9. int Count = 0;10String Where = ;1112/根据哈希表,循环生成条件子句13foreach(DictionaryEntry item in queryItems)1415if (Count = 0)16Where = Where ;17else18Where += And ;1920/根据查询列的数据类型,决定是否加单引号21 if(item.Value.GetType().ToString()=System.String | item.Value.GetType().ToString()=System.DateTime)2223Where += + item.Key.ToString() + 24+ Like 25+SqlStringConstructor.GetQuotedString(%26+ item.Value.ToString()27+ %);2829else3031Where += + item.Key.ToString() + + = + item.Value.ToString();3233Count +;3435return Where;36第1334行循环读取哈希表中的每一项,生成WHERE 子句。1518行,利用计数变量Count.判断所处理的项是否是第一项,如果是,则构造WHERE子句的开头“WHERE”,否则,构造多个“与”查询的“And关键字。 第2032行构造单个查询条件,并根据查询列的数据类型,来判断是否应该用单引号将其括起来。本例中,使用了模糊查询关键字”Like”,以及通过配符“%”。第35行返回构造的WHERE子句。下面给出一个具体的示例,直观说明该方法的功能。假设方法输入的查询哈希表如表9.6所示。表9.6 查询Hashtable示例keyvalueBookName红楼Publisher人民文学出版社CategoryId1.则方法的输入将为WHERE子句,如下。Where BookName Like %红楼梦%And Publisher Like %人民文学出版社%And CategoryId=1利用这个方法,将很容易地根据页面上用户的输入,查询出满足条件的数据,读者将在Book类的Query方法、以及Book List页面的查询功能中体会到这一点。6、 业务逻辑层业务逻辑层(BusinessLogicLayer)包括User类、Book类、Category类,以及chart类,下面对其一一介绍。1.61用户类 User用户类模拟了一个电子书店的客户,位于MyBookShop.BussinessLogicLayer空间中,其类图如图1.19所示。 图1.19 User类的类图1.62图书类Book1.Book类的功能Book 类的模拟了图书对象,位于MyBookShop.BussinessLogicLayer空间中,类图如图1.20所示。其中,各个属性的含义与数据表Book中的含义相似。不再介绍,方法的说明如表1.7所示。图1.20 Book类的类图表1.7 Book类的成员说明属性/方法功能说明Add将一个图书信息添加到数据库中Update修改图书的内容Delete删除掉图书LoadData根据图书编号,获取图书的详细信息QuryBooks静态方法,查询满足一定条件的图书GetSaleByCategory静态方法,根据类别查询销售量GetSaleByPrice静态方法,根据价格查询销售量GetSaleByPulisher静态方法,根据出版社查询销售量2.实现Add、Update、Delete方法 (1) Add方法向数据库添加一本图书,图书信息都放在一个哈希表对象中,利用Database类的Insert方法来实现数据的插入。代码1-3 Boo.Add方法:BussinessLogicLayerBook.cs1 / 2 / 向数据库添加一本图书3/ 4/ 图书信息哈希表5public void Add(Hashtable bookInfo)67Database db=new Database();/实例化一个Database类8 db.Insert(Book,bookInfo );/利用Database类的Inser方法,插入数据9 (2) Update 方法同样接受一个哈希表对象,该对象存储了图书新的信息,然后利用Database类的Update方法实现数据的修改。代码1-4 Book.Update方法:BussinessLogicLayerBook.cs1 / 2/ 修改图书内容3/ 4/ 新的图书信息哈希5/ Update的Where子句6public void Update(Hashtable newBookInfo)78Database db=new Database();9string condition = Where BookID = +this._bookId;10db.Update(Book,newBookInfo,condition);11 (3) 删除图书则直接利用Database的ExecuteSQL方法即可。代码1-5 Book.Delete 方法:BussinessLogicLayerBook.cs/ / 删除图书/ public void Delete()Database db=new Database();string strSql=Delete From Book Where BookID = +this._bookId;db.ExecuteSQL(strSql);3. LoadData方法 LoadData方法根据参数 bookID,获取图书详细信息,并赋予对象的属性,实现流程如图1.21所示。BookId(int) 输入:实例化一个Database类Select * from Book WHERE BookId=bookId利用Database类的GetDataRow方法查询数据记录存在?利用bookId参数,构造查询语句该Book不存在将记录各个字段,赋予Book对象的成员该Book存在结束图1.21 Book.LoadData方法流程实现代码参考如下。代码1-6 Book.LoadData方法:BussinessLogicLayerBook.cs/ / 根据参数bookID,获取图书详细信息/ / 图书IDpublic void LoadData(int bookID)Database db=new Database();/实例化一个Database类string sql=;sql=Select * from Book where BookID = + bookID ;DataRow dr=db.GetDataRow(sql);/利用Database类的GetDataRow方法查询用户数据/根据查询得到的数据,对成员赋值if(dr!=null)this._bookId=GetSafeData.ValidateDataRow_N(dr,BookID);this._bookName=GetSafeData.ValidateDataRow_S(dr,BookName);this._categoryId=GetSafeData.ValidateDataRow_N(dr,CategoryId);this._price=GetSafeData.ValidateDataRow_F(dr,Price);this._publisher=GetSafeData.ValidateDataRow_S(dr,Publisher);this._publishDate=GetSafeData.ValidateDataRow_T(dr,PublishDate);this._author=GetSafeData.ValidateDataRow_S(dr,Author);this._pageNum=GetSafeData.ValidateDataRow_N(dr,PageNum);this._pictureUrl=GetSafeData.ValidateDataRow_S(dr,PictureUrl);this._description=GetSafeData.ValidateDataRow_S(dr,Description);this._saleCount=GetSafeData.ValidateDataRow_N(dr,SaleCount);this._exist=true;elsethis._exist=false;该方法的实现同User类的LoadData方法类似。4. QueryBooks静态方法 QueryBooks方法根据一个查询条件哈希表对象,查询满足一定条件的图书数据,它具有两个重载形式。(1) QueryBooks(Hashtable):仅根据查询条件哈希表对象查询数据。代码1-7 Boo.QueryBooks(Hashtable):BussinessLogicLayerBooks.cs/ / 查询图书信息/ / 查询条件哈希表/ 查询结果集public static DataTable QueryBooks(Hashtable queryItems)string where=SqlStringConstructor.GetConditionClause(queryItems);string sql=Select * From Book +where;Database db = new Database();return db.GetDataTable(sql); 代码利用SqlStringConstructor的GetConditionClause方法,从哈希表中获取了查询条件子句,然后构造查询语句sql,最后用Database的GetDataTable方法进行查询,并把查询结果以DataTable的形式返回.(2) QueryBooks(Hashtable,string,string):根据查询条件哈希对象,并结合排序语句(Order By)查询数据.代码1-8 Book.QueryBooks(Hashtable,string,string):BussinessLogicLayerBook.cs1/ 2/ 按某个属性,升序或者降序获取所有的图书信息3/ 4/ 排序属性5/ 可取desc,asc,分别代表降序、升序6/ 查询结果集7 public static DataTable QueryBooks(Hashtable queryItems,string sortedColumn,string sortType)89 if(sortType.ToUpper()!=DESC & sortType.ToUpper()!=ASC & sortType!=)10return null;1112string where=SqlStringConstructor.GetConditionClause(queryItems);13string constrains= Order By +sortedColumn+ +sortType;14string sql=Select * From Book +where+constrains;1516Database db = new Database();17return db.GetDataTable(sql);18第9行对输入参数sortType进行控制,如果不是“DESC”、“ASC”,或者为空串,则返回空对象null.第12行利用SqlStringConstructor类的GetConditionClause方法构造Where子句,第13行则利用方法的输入参数构造了“Order by”子句,然后在第14行利用它们连接成完整的SQL查询命令。第16、17行用Database的GetDataTable方法进行查询,并把查询结果以DataTable的形式返回。5.GetSaleCountByCategory静态方法 GetSaleCountByCategory方法按照图书的类别,分别统计各个类的销售总量,并用DataTable对象返回。 代码1-9 Book.GetSaleCountByCategory 方法:Book.cs1 / 2/ 按照类别查询图书的销售量3/ 4/ 各个类别的销售总量DataTable5public static DataTable GetSaleCountByCategory()67string sql=Select Category.CategoryName,sum(SaleCount) as SaleCount From Book,Category +Where Book.CategoryId=Category.CategoryId +Group By Category.CategoryName;89Database db=new Database();10DataTable dt=db.GetDataTable(sql);11return dt;12代码的重点在于第7行SQL语句的构造,该SQL命令利用SUM函数,获取销售量的和,并利用Group By 子句,按CategoryName分别进行求和。最后,利用Database的GetDataTable查询数据并返回。6 GetSaleCountByPublisher静态方法GetSaleCountByPublisher方法按照价格分别统计各个类的销售总量,并用DataTable对象返回。代码9-10 Book.GetSaleCountByPublisher方法:Book.cs1 / 2/ 按照出版社查询图书的销售量3/ 4/ 5public static DataTable GetSaleCountByPublisher()67string sql=Select Publisher,sum(SaleCount) as SaleCount From Book+Group By Publisher;89Database db=new Database();10DataTable dt=db.GetDataTable(sql);11return dt;12第7行SQL语句利用SUM函数,并利用Group By 子句,按Publisher分别对销售量进行求和。7 GetSaleCountByPrice静态方法 GetSaleCountByPrice方法按照价格分别统计各个类的销售总量,并用DataTable对象返回。代码 1-11 Book.GetSateCountByPrice方法:Book.cs1 / 2/ 按照价格级别查询图书的销售量3/ 4/ 5public static DataTable GetSaleCountByPrice()67string sql=Select SUM(SaleCount) AS SaleCount,130 AS PriceGrade from Book where price = 30 and price = 50 ;89Database db=new Database();10DataTable dt=db.GetDataTable(sql);11return dt;12第7行构造的SQL命令有些复杂,总体上它利用UNION关键字,把3个查询结果合并在一起。这3个单独的查询,分别查询了价格030、3050,以及大于50的图书销售量。执行这个查询语句,获取的数据如图1.22所示。1.63图书类别类Category1. Category类的功能Category类位于MyBookShop.BussinessLogicLayer空间中,用于管理图书类别,它非常简单,仅有两个属性和两个方法,如图1.23所示。图1.23 Category类的类图2.实现LoadData方法LoadData方法获取一个类别详细信息。代码1-12 Category.LoadData方法:BussinessLogicLayerCategory.cs/ / 根据参数categoryId,获取图书类别详细信息/ / 图书类别IDpublic void LoadData(int categoryId)Database db=new Database();/实例化一个Database类string sql=;sql=Select * from Category where CategoryId = + categoryId ;DataRow dr=db.GetDataRow(sql);/利用Database类的GetDataRow方法查询用户数据/根据查询得到的数据,对成员赋值if(dr!=null)this._categoryId=GetSafeData.ValidateDataRow_N(dr,CategoryId);this._categoryName=GetSafeData.ValidateDataRow_S(dr,CategoryName);this._exist=true;elsethis._exist=false;其实现同用户类的LoadData类似。3实现Query方法Query方法根据条件查询哈希表,查询所有满足一定条件的图书类别信息。代码1-13 Category.Query方法:BussinessLogicLayerCategory.cs1 / 2/ 根据查询条件哈希表,查询数据3/ 4/ 查询条件哈希表5/ 查询结果数据DataTable6public static DataTable Query(Hashtable queryItems)78string where=SqlStringConstructor.GetConditionClause(queryItems);9string sql=Select * From Category+where;10Database db = new Database();11return db.GetDataTable(sql);12第8行利用SqlStringConstructor的GetConditionClause方法获取查询语句的Where子句,然后构造整个查询命令,并用Database的GetDataTable方法执行查询。在图书浏览、查询页面(BookList.aspx)的数据初始化方法InitData()中,将使用该方法获取所有的图书分类信息,并绑定到“图书类别”下拉框中。1.64 购物篮类Cart1. Ca

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论