第三章Qzmall电子商城系统设计1.
了解Qzmall电子商城系统基本设计思想.
2.
掌握数据库设计,掌握主键、外键的含义以及触发器的作用.
3.
理解过滤器的作用.
4.
学会数据库设计和表设计,学会设置主键、外键,学会触发器的设置.
5.
学会配置数据库连接.
6.
学会配置过滤器.
建设网上商城之前,首先要了解用户的需求,确定商城的基本功能,需要通过数据库来实现和用户进行交互的复杂的商品显示、查找、登录、购物等功能.
问题:建立一个网站商城需要有哪些表表与表之间的关系是什么第一节Qzmall电子商城系统概述一、前台购物系统(一)商品展示/搜索(1)商品查询.
根据查询条件查询所有符合条件的商品信息.
查询商品流程:用户输入查询条件并提交查询;系统根据用户提交的查询条件从数据库中查询商品并输出.
(2)商品展示.
首页显示本网站的最新商品.
(3)商品浏览.
输入需要查看信息的种类,查看该类型的所有产品.
(4)商品详情.
可以看到商品的详细信息,如商品名称、图片、价格、基本参数.
(二)购物车/订单(1)加入购物车.
注册用户可以在浏览商品的过程中,把需要购买的商品放置在一起付款,单击商品下方的"加入购物车"按钮即可把商品加入购物车.
(2)购物车查询.
用户在购物过程中可以随时查看购物车中的商品,以了解所选购的商品信息.
(3)注册用户选购商品后,在确认购买之前,可以对购物车的商品进行二次选择,既可以删除购物车中不要的商品,也可以修改购物车中的商品购买数量.
(4)在用户确认购买后,系统会为注册用户生成购物订单,注册用户可以查看自己的订单信息以了解付款信息和商品配送情况.
(5)查询、修改订单状态.
用户登录成功后,可以修改订单状态,如付款、收货等.
(6)取消订单.
用户在未付款之前,可以取消订单.
(7)订单查询.
用户登录后,可以浏览或查询本人订单.
(三)会员(1)注册.
系统考虑到用户购买信息的真实性,规定访客只能在系统中查看商品信息,不能进行商品的订购.
但是访客可以进行注册,登记相关基本信息,成为系统的注册用户.
(2)登录.
用户输入用户名及用户密码可以进行登录.
(3)信息修改.
用户登录之后修改自己的账号、密码及其他个人信息.
二、后台功能需求(一)商品分类维护管理员进入后台系统后可以对商品分类信息进行增、删、改、查.
(二)商品维护管理员进入系统后可以添加商品信息、修改已有商品信息、查询商品信息和查询某类及某件商品信息.
(三)订单订单是用户在前台购物过程中生成的,后台管理员可以对已付款订单进行订单状态修改,同时根据订单情况通知物流配送人员进行商品配送.
(四)商品库存维护商品库存会随着订单的完成而减少,管理员可以为缺货商品添加库存,并能查看单个商品的库存周转记录.
课堂技能训练:【实训操作内容】登录淘宝、京东、苏宁等购物网站,分析这些网站主要有哪些功能,并比较它们功能的异同.
【实训操作要求】必须写出每个网站相比于其他电子商务网站有哪些特色.
第二节设计并创建电子商城系统数据库本系统采用数据库管理系统MySQL管理商品、分类、会员、订单、购物车等数据.
数据库表的结构设计是应用软件中的关键部分,数据库表设计采用规范化关系模式的方法.
在关系数据库中,规范化关系模式就是要解决关系模式中存在的插入异常、删除异常、修改复杂、数据冗余等问题.
规范化的基本思想是消除数据依赖中不合适的部分,使模式中的各关系模式达到某种程度的"分离",让一个关系描述一个概念、一个实体或者实体间的一种联系,若多于一个概念就把它分离出去.
一、MySQL外键设置方式(一)cascade方式在父表上update/delete(更新或删除)记录时,同步update/delete子表的匹配记录.
(二)setnull方式在父表上update/delete记录时,将子表上匹配记录的列设为null.
要注意子表的外键列不能为notnull.
(三)noaction方式如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作.
(四)restrict方式同noaction,都是立即检查外键约束.
(五)setdefault方式父表有变更时,子表将外键列设置成一个默认的值,但InnoDB不支持此方式.
二、Qzmall数据库表根据系统功能描述和实际业务分析,进行Qzmall电子商城系统的设计,其主要数据及其内容如表3-1~表3-10所示.
表3-1商品大类表(category)表序号1表名category含义存储商品大类信息关联表subcatE.
shop字段名字段类型字段长度键别描述cidint(自动增长)11主键大类编号cnamevarchar30大类名称表3-2商品子类表(subcate)表序号2表名subcate含义存储商品子类信息关联表shop字段名字段类型字段长度键别描述sidint(自动增长)11主键大类编号cidint11外键(category)大类编号snamevarchar30小类名称表3-3商品信息表(shop)表序号3表名shop含义存储商品信息关联表Categorysubcate字段名类型长度键别说明pidint(自动增长)11主键商品编号cidint11外键(category)大类编号sidint11外键(subcate)小类编号shopnamevarchar40商品名称shopinfovarchar100基本信息pricefloat8,1价格stockint11库存shopdatevarchar20上架时间image1varchar100图片1image2varchar100图片2image3varchar100图片3descriptionvarchar2000说明表3-4订单主表(orders)表序号4表名orders含义存储订单主要信息关联表user字段名类型长度键别说明orderIdvarchar20主键订单编号usernamevarchar30外键(user)会员名truenamevarchar40真实姓名postcodevarchar6邮编addtimevarchar20时间phonevarchar11手机addressvarchar100数量sumfloat8,1总价stateint1订单状态表3-5订单明细表(ordersitem)表序号5表名ordersitem含义存储订单明细信息关联表Ordersshop字段名类型长度键别说明oidint(自动增长)11主键编号orderIdvarchar20外键(orders)订单编号续表字段名类型长度键别说明pidint11外键(shop)商品编号shopnamevarchar40商品名称pricefloat100售价shopnumint11数量表3-6用户信息表(user)表序号6表名user含义存储用户明细信息关联表字段名类型长度键别说明usernamevarchar30主键编号passwordvarchar50支付方式truenamevarchar20真实姓名postcodevarchar6邮编adddatevarchar20时间phonevarchar11手机addressvarchar100数量pointint11积分questionvarchar10密保问题birthdayvarchar10生日answervarchar30答案表3-7广告表(ad)表序号7表名ad含义存储广告关联表subcate字段名字段类型字段长度键别描述aidint(自动增长)11主键广告编号sidint11外键大类编号aimagevarchar30广告图片atimebigint20上架时间表3-8会员积分表(point)表序号8表名point含义存储会员积分记录关联表user字段名字段类型字段长度键别描述pointidint(自动增长)11主键编号usernamevarchar30外键会员名orderIdvarchar20外键订单编号pointtimebigint20积分时间descriptionvarchar100积分说明表3-9商品库存记录表(stockitem)表序号9表名stockitem含义存储商品库存记录关联表shop字段名字段类型字段长度键别描述stockidint(自动增长)11主键库存编号pidint11外键商品编号numint11数量pricefloat8,1价格stocktimebigint20时间表3-10管理员(admin)表序号10表名admin含义存储商品大类信息关联表字段名字段类型字段长度键别描述anamevarchar20主键管理员信息apassvarchar30密码三、设置触发器表:point类型:插入描述本表插入记录的同时,更新user表的point字段值begindeclarecint;setc=(selectpointfromuserwhereusername=new.
username);updateusersetpoint=c+new.
mypointwhereusername=new.
username;end类型:删除描述本表删除记录的同时,更新user表的point字段值begindeclarecint;setc=(selectpointfromuserwhereusername=old.
username);updateusersetpoint=c-old.
mypointwhereusername=old.
username;end表:stockitem触发器名称:adstockItem类型:插入描述插入记录的同时,商品表对应商品的库存应增加同样的数量begindeclarecint;setc=(selectstockfromshopwherepid=new.
pid);updateshopsetstock=c+new.
shopnumwherepid=new.
pid;end触发器名称:destockItem类型:删除描述删除记录的同时,商品表对应商品的库存应减少同样的数量begindeclarecint;setc=(selectstockfromshopwherepid=old.
pid);updateshopsetstock=c-old.
shopnumwherepid=old.
pid;End小提示:利用navcatformysql添加触发器打开Qzmall数据库后,右击表point,单击"触发器"标签,再单击"添加触发器"按钮,输入触发器名称,选择触发方式,然后在"定义"文本框中输入触发器内容即可,如图3-1所示.
图3-1添加触发器课堂技能训练:【实训操作内容】利用navcatformysql数据库操作可视化工具,建立Qzmall数据库.
【实训操作要求】(1)设置每个表的主键、字段类型及其长度.
(2)建立表与表之间的关系(主键、外键约束).
(3)建立触发器(为stockitem表建立触发器,即在增加商品库存记录时,shop表中库存数量能够一并更新).
第三节电子商城详细设计一、实体类设计编写Qzmall商城实体类时应注意以下问题.
(1)实体类的名字尽量和数据库表的名字对应相同.
(2)实体类应实现java.
io.
Serializable接口.
(3)实体类一般有无参和在参的构造方法.
(4)实体类有属性和方法,属性对应数据库中表的字段,主要有getter和setter方法.
(5)属性一般是private类型,方法一般是public类型,对于数据库自动生成的ID字段对应的属性的set方法应为private.
实体类放在com.
qzmall.
entity包下,各个实体类的代码如下://大类表(category)对应的实体类publicclassCategory{privateintcid;//大类编号privateStringcname;//大类名称privateArrayListsubCates=newArrayList(0);//和子类表建立对应关系privateArrayListshopArrayList=newArrayList(0);//和商品表建立对应关系//set、get方法略}//子类表(subcate)对应的实体类publicclassSubCate{privateintsid;//子类编号privateCategorycategory;//商品大类privateStringsname;//小类名称privateSetshops=newHashSet(0);//和商品表建立对应关系//set、get方法略}//商品表(shop)对应的实体类publicclassShop{publicShop(privateintpid;//商品IprivateCategorycategory;//商品大类privateSubCatesubCate;//商品子类privateStringshopname;//商品名称privateStringshopinfo;//商品信息privateFloatprice;//价格privateintstock;//库存privateStringshopdate;//上架日期privateStringimage1;//图片1privateStringimage2;//图片2privateStringimage3;//图片3privateStringdescription;//详细信息//set、get方法略}//用户表(user)对应的实体类publicclassUser{publicUser(privateStringusername;//登录账号privateStringpassword;//登录密码(MD5加密)privateStringtruename;//真实姓名privateStringbirthday;//出生日期privateStringadddate;//注册时间privateintquestion;//请输入密码问题privateStringanswer;//密码问题答案privateStringphone;//手机privateStringpostcode;//邮编privateStringaddress;//地址privateintpoint;//积分//set、get方法略}//订单主表(orders)对应的实体类publicclassOrders{privateStringorderId;//订单编号privateStringusername;//订单用户名privateStringtruename;//真实姓名privateStringaddress;//地址privateStringphone;//手机号码privateStringpostcode;//邮编privateStringaddtime;//订单时间privatefloatsum;//金额privateintstate;//订单状态//set、get方法略}//订单明细表(ordersitem)对应的实体类publicclassOrdersItem{privateintoid;//订单明细编号privateStringorderId;//订单编号privateintpid;//商品编号privateStringshopname;//商品名称privatefloatprice;//商品价格privateintshopnum;//商品数量//set、get方法略}小提示:利用IntelliJIDEA在实体类中插入set、get方法非常方便右击类的空白处,选择Generate选项,然后出现Generate面板,选择Getter和Setter选项,如图3-2所示,选择想要生成get、set方法的属性,单击OK按钮,即可自动生成get和set方法.
图3-2为实体类属性添加set和get方法二、定义数据库的连接类、查询方法下面介绍如何定义数据库的连接类、查询方法.
代码如下://数据库连接管理类ConnectionManager.
javapackagecom.
qzmall.
db;importjava.
sql.
Connection;importjava.
sql.
SQLException;importcom.
mchange.
v2.
c3p0.
ComboPooledDataSource;importcom.
mchange.
v2.
c3p0.
DataSources;publicclassConnectionManager{privatestaticConnectionManagerinstance;//C3P0的连接池对象privateComboPooledDataSourceds;privateConnectionManager()throwsException{ds=newComboPooledDataSource("mysql");}//单例模式获取数据库连接对象publicstaticfinalConnectionManagergetInstance(){if(instance==null){try{instance=newConnectionManager();}catch(Exceptione){e.
printStackTrace();}}returninstance;}//为了线程安全,同步publicsynchronizedfinalConnectiongetConnection(){try{returnds.
getConnection();}catch(SQLExceptione){e.
printStackTrace();}returnnull;}@Overrideprotectedvoidfinalize()throwsThrowable{DataSources.
destroy(ds);//关闭datasourcesuper.
finalize();}}//数据库操作类DBUtil.
javapackagecom.
qzmall.
db;importjava.
sql.
Connection;importjava.
sql.
PreparedStatement;importjava.
sql.
ResultSet;importjava.
sql.
SQLException;publicclassDBUtil{/*从C3P0数据库连接池中获取数据库连接对象*/publicstaticConnectiongetConnection(){Connectionconn=null;try{//从数据连接池中获取数据库连接对象conn=ConnectionManager.
getInstance().
getConnection();}catch(Exceptione){e.
printStackTrace();}returnconn;}//释放资源publicstaticvoidclose(Connectionconnection,PreparedStatementpsmtStatement,ResultSetresultSet){try{if(resultSet!
=null){resultSet.
close();}if(psmtStatement!
=null){psmtStatement.
close();}if(connection!
=null){connection.
close();}}catch(Exceptione){e.
printStackTrace();}}//增、删、改的通用方法publicstaticintexecuteUpdate(Stringsql,Object.
.
.
objects){intresult=0;Connectionconn=null;PreparedStatementpsmt=null;try{conn=getConnection();psmt=conn.
prepareStatement(sql);if(objects!
=null){for(inti=0;ilogin_page/login.
jspvalidateLogncom.
qzmall.
filter.
ValidateFiltervalidateLogn/cart.
jsp【代码说明】在上述代码中,方法doFilter设置和请求的session对象user不能为空,同时设置cart.
jsp页面需要经过上述过滤器来处理.
如果user为空,要转向login.
jsp页面,要求用户登录.
小提示:在使用Servlet3.
0以上版本时,配置过滤器和servlet都可以采用注解的方式,比如上述的CharsetEncodingFilter,可以在过滤方法前加上下面一段注解:@WebFilter(filterName="CharsetEncodingFilter",urlPatterns="/*")这样,就没有必要再在web.
xml中进行此过滤器配置了.
同时,配置servlet时,也可以采用注解的方式,但必须保证是Servlet3.
0以上版本.
但对于用户过滤器validateLogn,需要控制的页面是有选择的,所以我们还把它统一配置在web.
xml中.
【知识拓展】过滤器在系统应用中很常见.
比如在银行系统中,客户不小心把银行卡丢了,需要挂失银行卡.
只要挂失银行卡,在银行系统中就不能访问这张银行卡了,这样有效地保护了客户账户的安全.
这个时候就可以用过滤器来做这个应用.
课后训练一、选择题1.
客户端发送请求后,Java过滤器对请求的工作流程包括以下四项:(1)进行请求预处理;(2)对响应后的请求做后处理;(3)调用servlet.
service()对请求进行处理;(4)将响应结果返回给客户端.
其中为正确执行顺序的是().
A.
(1)(2)(3)(4)B.
(3)(2)(1)(4)C.
(3)(1)(2)(4)D.
(1)(3)(2)(4)2.
使用Servlet过滤器,需要在web.
xml中配置()元素.
A.
B.
C.
D.
3.
servlet过滤器参数初始化,需要在web.
xml的filter元素下配置()元素.
A.
B.
C.
D.
4.
相关代码如下:UrlSecurityFiltercom.
qzmall.
filter.
UrlSecurityFilterCoursewarePrivFilter/courseware/*REQUESTINCLUDE过滤器配置中,有request和include两种方式的配置,如果此时courseware目录下的目标页面可以forward方式被调用,请问UrlSecurityFilter过滤器会不会被调用()A.
再增加一个项,配置为error,就会被调用B.
再增加一个项,配置为forward,就会被调用C.
不确定D.
不会5.
通过过滤器实现编码的统一,可以通过过滤器类在doFilter方法下,设置()代码.
A.
response.
setCharacterEncoding("UTF-8")B.
request.
setCharacterEncoding("UTF-8")C.
response.
setCharacterEncoding("UTF-8")D.
request.
getCharacterEncoding("UTF-8")6.
以下是关于Filter生命周期的描述,横线处分别调用了哪个方法()(1)Web应用加载后会立即创建出当前Web应用中的Filter对象;(2)创建后,立即调用________方法进行初始化操作;(3)当关闭Web容器,关机,或者reload整个应用时,会调用_______方法来关闭Filter.
也就是说,当Web容器启动时,Filter就被加载到内存,并在销毁之前都常驻内存.
A.
destroy(),init(B.
doFilter(),destroy()C.
init(),doFilter()D.
init(),destroy()7.
以下哪个操作不是Java过滤器完成的()A.
完成用户请求B.
字符编码处理C.
权限访问控制D.
压缩响应信息8.
编写Servlet过滤器时,()方法用于调用过滤器链中的下一个过滤器.
A.
ServletB.
FilterConfigC.
FilterD.
FilterChain9.
publicclassSecurityFilter_如果想要让该类成为一个过滤器,横线处应为().
A.
implementsHttpFilterB.
extendsFilterC.
implementsFilterD.
extendsHttpFilter10.
下面哪个方法当服务器关闭时被调用,用来释放Servlet所占的资源()A.
service()B.
init()C.
doPost()D.
destroy()11.
在Java中开发JDBC应用程序时使用()类的getConnection()方法可以获取Connection连接对象.
A.
DBManagerB.
DriverManagerC.
DBHelperD.
PreparedStatement12.
在进行Web开发时经常会遇到中文乱码的问题,可以在JSP页面中解决乱码的方式是().
A.
B.
C.
D.
13.
在Web项目的目录结构中,web.
xml文件位于()中.
A.
src目录B.
文档根目录C.
META-INF目录D.
WEB-INF目录二、实际操作题1.
利用navcatformysql数据库操作可视化工具,建立Qzmall数据库,按照第二节的实例,把所有表都添加进去,并设置好各个表之间的主键、外键约束,按照要求建立触发器.
WordPress经典外贸企业建站主题,经典配色扁平化简约设计+跨屏自适应移动端设备,特色外贸企业建站功能模块+在线Inquiry询单功能,更有利于Google等英文搜索优化和站点收录。采用标准的HTML5+CSS3语言开发,兼容当下的各种主流浏览器: IE 6+(以及类似360、遨游等基于IE内核的)、Firefox、Google Chrome、Safari、Opera等;同时支持移动终端的常用...
快云科技怎么样?快云科技是一家成立于2020年的新起国内主机商,资质齐全 持有IDC ICP ISP等正规商家。云服务器网(yuntue.com)小编之前已经介绍过很多快云科技的香港及美国云服务器了,这次再介绍一下新的优惠方案。目前,香港云沙田CN2云服务器低至29元/月起;美国超防弹性云/洛杉矶CUVIP低至33.6元/月起。快云科技的云主机架构采用KVM虚拟化技术,全盘SSD硬盘,RAID10...
2021年9月中秋特惠优惠促销来源:数脉科技 编辑:数脉科技编辑部 发布时间:2021-09-11 03:31尊敬的新老客户:9月优惠促销信息如下,10Mbps、 30Mbps、 50Mbps、100Mbps香港优质或BGPN2、阿里云线路、华为云线路,满足多种项目需求!支持测试。全部线路首月五折起。数脉官网 https://my.shuhost.com/香港特价数脉阿里云华为云 10MbpsCN...