
1.1 系统开发背景
1.2 设计任务
采用Jsp + MySql 开发一个在线购物系统。该系统具备用户注册、登录,商品发布,购物车等基本功能。
1.3 设计目标
现在流行的网上购物系统不仅要有漂亮的网页,更要有严谨的规划,注重每一个细小的环节,这样才能使得在电子交易时避免不必要错误发生。我们将使用HTML、JSP等技术来编辑网页,并运用JDBC技术把数据库和动态网页相关联。传统的管理信息系统信息获取方法是由专业文字录入人员将信息输入到管理系统的数据库中,这种方法在数据量不大时有很多的应用场合。当数据量比较大,并且有较强的专业性时,录入的费用和出错的可能性都相应上升。本设计在实际应用中的解决方案是建立网站, 以及自己的数据库,使得所需商品信息可以及时的保存、更新,可以更好的及时了解商品买卖的情况。
1.4 系统功能需求分析
通过对日常网上购物网站的认识和分析和我对网上购物有了基本的了解,我觉得该系统至少应该具有以下的一些基本功能:
注册管理:能够对用户名,密码的简单验证;能够对电子邮箱,Email进行有效性验证;能够防止利用页面刷新重复注册,以及已经注册的用户不能重复注册。
商品浏览:分类显示商品;显示商品详情,提供购买链接;可以对商品进行模糊查询。浏览商品时不要求用户登录,但下订单前用户必须登录,对于浏览过的商品有历史记录。
购物车管理:欲购买商品可以增添到购物车;也可以从购物车退回商品,清空购物车;对于同一件商品的多次购买只能在原来的商品上增添数量,还可以修改购物车中某个商品的数量,统计商品总金额。
商品管理:管理员可以增添商品分类;修改商品基本信息;增添商品时候可以上传图片。
第2章 概要设计
2.1 数据库设计
在建设网站系统之前,我们必须对系统所用到的数据进行大致的分类和具体的结构设计,既要做到清晰明了,又要能适应系统各项功能的调用,而不至于产生结构上的逻辑混乱,保证关键数据在意外情况下不会被破坏,可以说数据库是系统的重中之重。
数据库设计要遵循一些规则,一个好的数据库满足一些严格的约束和要求。尽量分离各实体对应的表,一个实体对应一个表,搞清楚该实体有哪些属性,对应有些什么字段,以及各实体之间有何种联系。实体、属性与联系是进行概念设计时要考虑的三个元素,也是一个好的数据库设计的核心。
从实际出发,经过仔细地设计,得到各表的设计如表2.2——2.9所示。
表2-1 商品信息表hw
| 字段 | 字段名 | 类型 | 宽度 | 小数位 | 索引 | 可否为空 |
| Hw_id | 商品编号 | 自动编号 | 是 | 否 | ||
| Hw_name | 商品名称 | 文本型 | 50 | 否 | ||
| Hw_cash | 商品价格 | 数值型 | 18 | 2 | ||
| Hw_content | 商品信息 | 备注型 | 255 | |||
| Hw_pic | 商品图片 | 文本型 | 255 | |||
| Hw_buys | 商品数量 | 数值型 | 18 | |||
| Hw_date | 商品日期 | 日期型 |
表2-2 会员信息表member
| 字段 | 字段名 | 类型 | 宽度 | 小数位 | 索引 | 可否为空 |
| User_id | 会员编号 | 自动编号 | 是 | |||
| User_name | 会员帐号 | 文本型 | 50 | 否 | ||
| User_pass | 会员密码 | 文本型 | 50 | 否 | ||
| User_adds | 会员地址 | 文本型 | 255 | |||
| User_mail | 会员E_Mail | 文本型 | 50 | |||
| User_tel | 会员电话 | 文本型 | 50 | |||
| User_regtime | 注册时间 | 日期型 | ||||
| User_postcode | 邮政编码 | 文本型 | 50 | |||
| User_namec | 会员姓名 | 文本型 | 50 |
表2-3购物车表basket
| 字段 | 字段名 | 类型 | 宽度 | 小数位 | 索引 | 可否为空 |
| Basket_id | 购物车编号 | 自动编号 | 是 | 否 | ||
| Hw_id | 商品编号 | 自动编号 | 是 | 否 | ||
| User_name | 会员帐号 | 文本型 | 50 | 否 | ||
| Basket_count | 商品数量 | 数值型 | 18 | |||
| Basket_date | 购物时间 | 日期型 | ||||
| Basket_check | 是否结帐 | 是/否 | ||||
| Hw_name | 商品名称 | 文本型 | 50 | |||
| Hw_cash | 商品价格 | 数值型 | 18 | 2 | ||
| Sub_number | 订单编号 | 文本型 | 50 | 是 |
| 字段 | 字段名 | 类型 | 宽度 | 小数位 | 索引 | 可否为空 |
| Admin_id | 管理员编号 | 自动编号 | 是 | |||
| Admin_name | 管理员帐号 | 文本型 | 50 | |||
| Admin_pass | 管理员密码 | 文本型 | 50 |
| 字段 | 字段名 | 类型 | 宽度 | 小数位 | 索引 | 可否为空 |
| News_id | 新闻编号 | 自动编号 | 是 | |||
| News_title | 新闻标题 | 文本型 | 255 | |||
| News_content | 新闻内容 | 备注型 | ||||
| News_date | 新闻日期 | 日期型 |
| 字段 | Name | Tel | Adds | OICQ | MSN | Sitename | Fax | Code | |
| 字段名 | 姓名 | 信箱 | 电话 | 地址 | MSN | 网站名称 | 传真 | 邮编 | |
| 类型 | 文本 | 文本 | 文本 | 文本 | 数值 | 数值 | 文本 | 文本 | 文本 |
| 字段 | 字段名 | 类型 | 宽度 | 小数位 | 索引 | 口否为空 |
| Id | 自动编号 | 自动编号 | 是 | 否 | ||
| url | 链接地址 | 文本型 | 50 | |||
| Wordlink | 链接名称 | 文本型 | 50 | 2 | ||
| Content | 链接内容 | 文本型 | 50 |
2.2.1 平台功能模块图
在平台功能的分析基础上,得到本平台的功能模块图如下:
图2.1 平台购物模块图
2.2.2 前台购物流程
图2.2 前台购物流程图
2.2.3 用户注册流程
图2.3 用户注册流程
注册的具体实现为:
点击主页面的用户注册选项后,会弹出一个注册信息页面,用户需要如实填写用户名,密码,E_mail,地址,电话,真实,姓名等各项信息,提交后,系统进行检测判断该用户名是否已经注册过,如果已经存在则弹出新页面,提示用户该用户名已经注册过,如果没有则进行下一步判断,用户输入的两次密码是否一致,然后依次往后判断用户所填写的各项信息是否符合要求,直到所有信息均正确无误,系统将该用户注册信息写入会员表即member并提示用户注册成功,用户登陆后,就可以进行有效的购物了。
2.2.4 商品搜索流程
图2.4 商品搜索流程图
商品的搜索功能使用户更加方便的进行自己所需要的商品的查询,节省时间,提高效率。用户搜索时只要输入商品的关键字就能搜索到所有相关的商品。并且能列出通过搜索得到的商品的详细信息。
2.2.5用户登录流程
用户登录,首先要有一个提供用户登录的表单。用户登录的表单应该嵌入整体的结构当中。在实际的应用中,可以这样设计,如果用户没有登录,则在页面中显示用户登录的选项,用户登录后,则可隐藏用户登录的选项而代之以用户的基本信息。
首先,用户要有一个用户名和密码。商务网站需要很高的稳定性和安全性,因此对用户名不允许使用恶意的代码作为用户名。同时对密码也要求保密,将密码加密后再存入数据库。另外,一个电子商务网站。用户的真实姓名是必不可少的。除此之外还需要用户的性别、E-MAIL、电话号码等。
2.5用户登陆流程图
2.2.6商品管理流程
图2.6商品管理流程图
在该功能里管理员可以进行不需要的商品的删除,在这里管理员当然也可以浏览到商品的详细信息。并且比普通用户在浏览商品界面里所看到的商品信息多一个该商品在数据库中的ID。
2.2.7购物车流程
购物车具体的实现可采用这种形式:定义一个购物车的类(Class)。
1.列出商品的列表,使用户能够自由选择所需要的商品。
2.当用户在点击“添加到购物车”的链接时,执行如下功能:
检查用户购物车类是否存在。如不存在,则建立,并注册这Session变量;在有用户购物车类存在的情况下,检查该类中是否有该商品。如存在,则商品数量相应加1;如没有该商品,则将该商品添加到该类中。
图2.7购物车流程图
第3章 详细设计
3.1数据库的连接
出于安全性的考虑,我们将与数据库的连接,单独写出来并进行编译,也就是数据库连接的javabean文件,编译出来的.class文件是无法被修改的只能通过源文件进行修改,我们在JSP页面中只用直接调用改方法即可,在本系统中我们将其命名为为.faq存放在class/ckstudio/db下设其id为mdb,我们在需要对数据库进行操作的时候只需在页面上添加这样一个标签
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");定义驱动类型
String strDirPath=application.getRealPath(request.getRequestURI());
strDirPath=strDirPath.substring(0,strDirPath.lastIndexOf('\\\\'))+"\\\\";
得到数据库的存放路径
String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};
DBQ="+strDirPath+"db.mdb";
定义连接地址
Connection conn = DriverManager.getConnection(url);
连接数据库
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
| 返回操作结果 |
用户登陆模块是防止非法用户登陆的第一道防线,通过它可以保护后台数据库的安全性,当用户要进行定购时,首先要进入的就是身份验证界面,只有在密码正确的情况下才能进行以后的购物,如果输入的密码不正确,则不能进行定购。如果用户以浏览者的身份进入网站,则只能进行一般的商品浏览和搜索,而不能进行选购,在点击添加购物车后,系统会判断该用户是否是登陆用户,如果不是则弹出提示页面,提示用户必须先登陆才能定购商品,如果是第一次登陆,请先注册。
主页面的效果图如下:
图3.1 主页面示意图
登陆的具体实现要通过一个全程变量,即Session变量来实现,在系统中则由一个单独的session.jsp页面来放置该session。用户登录的界面dengluyufou.jsp,从member表查得用户提交的帐户名和密码正确后,用一个全局变量,即Session变量保存这一消息(该变量名称为Session(“user_name”))。具体的判断过程为:
若session中user为空即session.getAttribute("user_name")==null,表明没有经过登陆与否的验证,则立即跳转到dengluyufou.jsp,请用户登录;并将用户登陆的帐号和密码通过
user_name=request.getParameter("user_name");
user_pass=request.getParameter("user_pass");
分别赋给变量user_name,和user_pass,然后将其与数据库中的相应信息进行比较String sql="select * from member where user_name='"+user_name+"'";
如果user_name存在的话则判断其密码是否正确
user_pass.equals(rs.getString("user_pass"))如果为真则将用户信息赋给session session.setAttribute("user_name
以方便系统对用户在操作一些会员功能时进行用户身份验证。
如果用户还不是会员则提示用户进行注册,用户提交信息之后,系统开始判断用户的注册信息是否有效,首先是用户名是否为空,(该处存在用户名命名规则的问题,后面问题中会详细解决)用户输入的两次密码是否一致,然后依次往后判断用户所填写的各项信息是否符合要求,直到所有信息均正确无误,系统将该用户注册信息写入会员表即member并提示用户注册成功,用户登陆后,就可以进行有效的购物了。
注册页面的效果图如下:
图3.2注册页面示意图
系统对用户的注册信息的验证实现如下:
用户输入的各项信息分别对应字段
user_name,user_pass,user_pass2,user_adds,
user_tel,user_mail,user_postcode;
先判断用户名是否为空
request.getParameter("user_name").equals("") 如果不为空则将该值传给变量user_name user_name=getStr(request.getParameter("user_name"));同样道理对密码进行判断
request.getParameter("user_pass").equals(""))
request.getParameter("user_pass2").equals(""))
判断两次输入是否一致user_pass.equals(user_pass2)
其他选项与上面类似,如果条件符合则将该值赋给各个字段
用户名重复的验证代码为:
sql="select * from member where user_name='"+user_name+"'";
rs=mdb.executeQuery(sql);
if(rs.next()){
用户名已被别人注册";
}
当所有条件都符合的时候,系统将数据写入数据表,并返回成功页面,显示用户所填的注册信息,写入关键语句为:
sql="Insert into member(user_name,user_pass,user_adds,user_mail,user_tel,user_regip,user_namec)values('"+user_name+"','"+user_pass+"','"+user_adds+"','"+user_mail+"','"+user_tel+"','"+request.getRemoteHost()+"','"+getStr(request.getParameter("user_namec")))";
用户在注册之后也可以对自己的资料进行修改,在点击主页面的修改资料之后,弹出这样的一个页面,用户可以直接在文本框里修改,然后确认。
图3.3用户资料修改示意图
修改这一过程的具体实现过程为
user_name=request.getParameter("user_name");
sql="select * from member where user_name='"+user_name+"'";
ResultSet rs;rs=mdb.executeQuery(sql);
根据用户名将该用户的所有信息列出来,以供用户修改,
修改的方法采用的是rs.updateString("user_pass",user_pass);其他的类似。
3.3.3 购物车模块的实现
当用户登陆成功以后,如果找到了希望定购的物品,在点击物品下方的定购以后,系统会弹出一个新的页面,显示该物品已经添加进购物车,然后用户需要选择定购的数量。页面效果如下:
图3.3购物车示意图
在 点击确认以后,该物品信息被后台添加到购物车表即basket表中,如果用户需要继续购物,可以继续选择,不断添加,系统会自动将所有信息写入basket表,同时显示用户所购买的物品列表,及合计价格。
其具体代码实现过程为:
从session中取得该用户的信息
user_name=(String)session.getValue("user_name");
user_type=(String)session.getValue("user_type");
对商品的信息进行提取以写入购物车表
String hw_ids=request.getParameter("hw_id");
String counts=request.getParameter("count");
String hw_cashs=request.getParameter("hw_cash");
hw_name=request.getParameter("hw_name");
具体的写入语句为:
sql="insert into basket(hw_id,user_name,basket_count,hw_name,hw_cash)";
mdb.executeInsert(sql);
如果用户在去收银台结帐前对已经选购的物品不满意时,可选择清空购物车,同时系统也将basket表中相关信息删除。用户完成选购之后,可点击收银台付款,系统返回最终选购物品列表和合计价格,如图所示:
图3.4收银台结帐示意图
该步骤实现的关键语句为:
String user_name=(String)session.getValue("user_name");
String sql="select * from basket where user_name='"+user_name+"'and basket_check=false";
ResultSet rs;rs=mdb.executeQuery(sql);
系统只统计basket_check为否的该用户选购的商品信息。
用户再一次确认后,系统会显示购物成功并返回给用户一个定购单号,提示用户填写收货人详细信息,包括姓名、地址、邮编、邮箱、电话、付款方式、备注等信息,这些信息是系统自动从用户表中提取出来的,用户可以修改
图3.5定货单示意图
这一步的具体实现与用户资料修改类似,都是先将该用户的相关资料从数据库中调出来
sql="select * from member where user_name='"+(String)session.getValue("user_name")+"'";然后使用方法update对表中各项信息进行修改。确认后,系统弹出提交成功页面,
图3.6 订货成功示意图
该页面也就是将用户提交的订单信息返回,并产生了一个唯一订单号,以方便用户查询,这个订单号的产生,并不是随机产生的,而是使用了一定的规则,在这里主要是根据用户名和订单产生的时间来生成订单号,具体的代码如下:
String sub_number="";
String now=(String)((new java.util.Date()).toLocaleString());
sub_number=user_name+now;
相类似的,系统中的其他类似字段也可以使用这样规则来产生随机编号,以方便管理
3.3.4后台管理模块的实现
网上购物系统除了能够让用户实现前台的浏览和购物等操作之外,还必须能够使管理人员能够对系统的各种信息进行维护,比如商品的增加、删除、修改,会员的审查,网站新闻的更新等等。管理功能是网上购物系统相当重要的一部分功能。
管理员可以通过主页面的“管理进入”进入系统后台进行维护,点击之后,首要的就是进行身份验证,输入正确的帐号,密码之后,方能进入。由于涉及到交易,出于安全性考虑,管理员帐号应尽量少分配,密码也要尽量复杂,经常更换。
进入之后系统管理的主页面 采用了框架结构,左边是一个树型菜单,右边显示具体信息。
管理的主要功能有商品信息的更新,会员信息维护,网站信息维护,广告链接设置等四大块,商品信息管理,主要就是添加新的商品,删除和修改已经添加的商品。
如下图所示:
图3.7 商品管理界面
这一部分的实现也没有新的方法,使用的依然是一些sql语句来对相关数据进行添加和修改,添加的关键的sql语句为:
sql=sql+"data,isbn,zhuang,hw_pic,tuijian,jia)";
sql=sql+"values('"+hw_name+"','"+hw_content+"','"+hw_content2";
sql=sql+"','"+zhuang+"','"+hw_pic+"',"+btuijian+
mdb.executeInsert(sql);
修改则使用update语句。
会员信息管理,则主要是对一些恶意注册用户进行删除,该功能设计存在一定问题,具体在后面会有一定说明。
图3.8 会员信息管理界面
网站信息管理,进行网上新闻的发布,修改删除,以及系统公告等信息的设置,这些功能虽然无关紧要,但在实际中却能方便用户,提高网站效益。
图3.9 新闻信息管理界面
广告链接,可进行一些广告信息的发布,及更新和修改,主要是链接一些合作单位的网页,能够给自己带来一些经济上的收益。
在完成系统的更新之后,作为管理人员,应该及时注销自己的帐户,树型菜单的上方提供了注销登陆的选项,点击之后,注销用户,并返回到前台页面,防止他人恶意修改网站信息,造成不必要的损失。
以上两个部分都是比较简单的功能实现,具体实现过程与前几个类似。
3.3.5 商品搜索模块的实现
网上购物作为一个在网上展示自己商品的销售系统,如何能让用户以最快的速度找到自己希望买到的物品,也是需要非常重视的一个问题,此时搜索引擎也就必不可少了。本购物系统也做了一个小模块,以供用户进行一些模糊查找,用户不必输入全部名称,只需输入一些关键词,系统就可以将符合该查询条件的所有商品信息以网页形式返回给用户。
该搜索功能在jsp页面中实现的关键代码为:
<%
String hw_name,sort_id;
if(session.getAttribute("sort_id")==null){ 进行判断如果商品类别为空
hw_name=getStr(request.getParameter("hw_name")) 则按商品名称进行搜索
sql="select * from hw where hw_name like '%"+hw_name+"%'
order by hw_id DESC";
rs=mdb.executeQuery(sql); 查找出所有含有该关键字的商品信息
}else{
sort_id=request.getParameter("sort_id") ; 如果商品类别不为空
hw_name=getStr(request.getParameter("hw_name"));
sql="select * from hw where sort_id='"+sort_id+"' and hw_name like '%"+
hw_name+"%' order by hw_id DESC";
rs=mdb.executeQuery(sql); 根据商品类别和商品名称进行模糊查询
} 并将返回结构给集合rs
if(!rs.next()){
%> 如果集合rs为空即没有符合该查询条件的
<%while(rs.next()){%> 如果集合rs不为空则说明有符合该查询条
<%=rs.getString("hw_name")%>
