JAVA网上商城系统课设报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1.绪论 (1)
1.1课题研究背景 (1)
1.2课题研究意义 (1)
1.3国内外的发展现状 (2)
2.需求分析 (3)
2.1 技术可行性分析 (3)
2.2 操作可行性分析 (3)
2.3 成本可行性分析 (3)
3.总体设计 (4)
4.详细设计 (6)
4.1 数据库设计 (6)
4.1.1 概念建模 (6)
4.1.2 物理建模 (6)
4.1.3数据库表结构 (8)
4.2 功能设计 (12)
4.3 代码设计 (14)
4.3.1后台功能 (14)
4.3.2前端功能 (18)
5.结论 (27)
参考文献 (28)
1.绪论
1.1课题研究背景
随着社会经济的发展和信息技术的高度发达,越来越多的企业和个人的购物方式和以前有了实质的改变,网上商店逐渐增多,交易的方式也从以前的网上发布,然后网下交易购买,发展到了直接通过网络进行在线支付,随着物流的发展,交易的物品也从以前的大件物品,发展到现在几乎所有商品都能在网上购买。
因此,为了更方便顾客购物,就需要有一个功能比较完善的网上商城系统来实现这个平台。
网上商城系统是解决实体商城各种问题的一种方法。
因此该课题具有一定的意义和研究价值。
1.2课题研究意义
相对于传统的实体商城,网上商城投资少,回收快。
一项针对中国中小企业的情况调查显示,个人在网下启动销售公司的平均费用至少5万元,而网上开店建店成本非常小。
一般说,筹办一家网上的商店投入很小,不用去办营业执照,不用去租门面,不用囤积货品,所需资金不过1500元左右;网上商店比同等规模的地面商店“租金”要低得多,同时租金不会因为营业面积的增加而增加,投资者也不用为延长营业时间而增加额外的费用。
基本不需要占压资金。
传统商店的进货资金少则几千元,多则数万元,而网上商店则不需要压资金。
24小时营业时间。
网上商店延长了商店的营业时间,一天24小时、一年365天不停地运作,无须专人值班看店,都可照常营业。
传统店铺的营业时间一般为8-12小时,遇上坏天气或者老板、店员有急事也不得不暂时休息。
销售规模不受地盘限制。
传统商店有多大就只能摆放多少商品,生意大小常常被小店面积限制。
而在网上,即便在地面上只有一个小商店,或者干脆就没有门面,开店的生意却可以照样做得很大。
不受店面空间的限制。
哪怕只是街边小店,在网上却可以拥有百货大楼那么大的店面,只要投资者愿意,可以摆上成千上万种商品。
目前国内最大的专业拍卖网站同时在线的商品要超过10万件——已超过一些大超市。
不受地理位置影响。
不管客户离店有多远,也不管顾客是国内还是国外,在网上,客户一样可以很方便地找到并购买商品。
这令消费群体突破了地域的限制,变得无限广阔了。
1.3国内外的发展现状
伴随着Internet的蓬勃发展,网络购物中心作为电子商务的一种形式正以其高效、低成本的优势,逐步成为新兴的经营模式和理念,人们已不再满足于信息浏览和发布,而是渴望着能够充分享受网络所带来的更多的便利。
客户足不出户便可以方便快捷的选购自己喜欢的商品,这正是网络购物中心为客户带来的好处。
敏锐的网络商家当然不会错过这样绝好的机会,越来越多的网站投身到提供网络购物服务的行列中来,一个基于Internet的全球电子商务框架正在形成。
在我国,网上购物从无到有也不过短短几年时间。
我国第一家网上购物发生在1996年,燕莎友谊商场首次通过网上商城售出一个景泰蓝,虽然货款的支付不是在网上进行的,但这毕竟为我国零售业奏出了网上购物的先声。
根据CNNIC的统计结果,截止2004年1月中国有互联网用户7950万人,而又有40.7%以上的网民在过去的一年里有过网上购物经历,这就说明中国有网上购物的用户达是3235.7万人,并且这一数字还在以17%左右的速度增长,到2006年中国网上购物用户将达到6962万人,这说明在中国发展网上购物具有良好的群众基础,网上购物方式日趋被大家所接受。
因此,设计一个网上购物网站具有非常好的开发与应用前景。
2.需求分析
2.1 技术可行性分析
本系统在前台用在前台用JSP进行页面开发和管理用户界面,提示信息完善,界面友好,具有较强的亲和力,后台采用MYSQL数据开发和管理数据库,对数据库操作采用事务处理机制,具有强大的错误处理功能。
本系统的开发环境是使用现在非常流行的开源开发工具Eclipse和Tomcat服务器。
使用的灵活、以及他们当前的广泛实际应用,充分说明本系统在技术方面可行。
2.2 操作可行性分析
本系统采用的是网上管理,非常简单、易懂,不需要具有非常高的计算机专业知识,只需要管理员能够上网,就可对商城进行维护。
2.3 成本可行性分析
整个开发过程只需要一台装有上述所需求的各种软件的PC机就可以实现全部的开发任务。
目前的计算机硬件市场竞争比较激烈,在价格上都出现了从没有过低廉;而所需要的各种软件,在相关产品的官方网站上都可以免费下载,而且还不断的有增加了最新功能的升级版的出现。
因此,整个开发成本可以说是非常的低廉,这也为我进一步完善我的网站提供了更大的方便。
在使用成本上,用户只需要拥有一台能够连接到国际互联网上的计算机,通过注册就可以在世界的任何一个角落使用网站的全部功能和服务。
而且对计算机的硬件的需求也不是很高,软件方面也没有特殊的需求,极大了方便了广大用的访问与使用。
因此,从成本可行性分析来看,这个网站体现了经济实惠,但是功能强大的特点。
3.总体设计
网上商城系统又称在线商城系统,其功能主要包含商品的管理、会员的管理、订单的管理、在线支付等。
本次实训将由指导老师带领学生有Java EE技术完成“网上商城系统”的设计与开发,主要开发的功能如图3-1所示。
图3-1 功能图
1)后台功能
商品模块:包括后台商品库存管理、上货、出货、编辑管理和商品分类管理、商品品牌管理等。
订单模块:在线订单程序,使消费者能够顺利的通过Web在线的方式,直接生成购买订单。
会员模块:在购物系统中,集成会员注册是吸引会员进行二次购买和提升转换率最好的方式。
配送模块:购物系统集成的物流配送方式,从而方便消费者对物流方式进行在线选择。
如:EMS、顺风等等。
2)前端功能
商品搜索:通过前端界面,以标准的或者其他个性化的方式向用户展示商品各类信息,完成购物系统内信息流的传递。
购物车:用户可对想要购买的商品进行网上订购,在购物过程中,随时增删商品。
商品浏览:随着电子商务的发展商品图片成为吸引消费者的第一要素,多图展示即提供前台多张图片的展示,从而提升消费者的购物欲望。
用户管理模块:为了方便于网站的管理,必须由一套完整的用户管理体系。
该网站用户管理模块主要实现用户的注册、登录、找回密码3方面功能。
为了全面的了解前端功能,图3-2将前端的购物流程详细的展示。
图3-2购物流程
4.详细设计
4.1 数据库设计
4.1.1 概念建模
本系统实体包括:管理员、网站、顾客、商品、购物车、订单。
如图4-1所示:
图4-1 E-R图
4.1.2 物理建模
数据库表之间关系如图4-1所示:
图4-2数据库表关系图
4.1.3数据库表结构
整个购物系统能运行离不开数据库的支持,数据库在整个系统的最底部发挥着不可忽视的作用。
没有了数据库的支撑,系统无法运行。
由此可见,系统离不开数据库,在系统之前首先必须保证数据库的准备工作已经完成。
本系统采用的是Mysql数据库,数据库的准备工作需要以下几个表来保存整个系统的重要信息,它们分别是:
商品表,用来存储购物系统的所有商品的信息,能够根据这个表来管理所有的商品信息,如表4-1所示。
表4-1 商品表(product)
商品图片表,用来存储购物系统的商品的所有图片信息,能够根据这个表来管理商品所有的图片信息,如表4-2所示。
表4-2 商品图片表(pic)
分类表,用来存储购物系统的所有商品的分类信息,能够根据这个表来管理所有的分类信息,如表4-3所示。
表4-3 分类表(category)
商品属性名称表,用来存储购物系统的所有商品属性名称信息,能够根据这个表来管理所有商品属性名称信息,如表4-4所示。
表4-4 商品属性名称表(attribute)
商品属性值表,用来存储购物系统的所有商品属性值的信息,能够根据这个表来管理所有商品属性值的信息,如表4-5所示。
表4-5 商品属性值表(value)
商品属性中间表,用来存储购物系统的所有商品的属性信息,能够根据这个表来管理所有商品的属性信息,如表4-6所示。
表4-6 商品属性中间表(attrvalue)
发票表,用来存储购物系统的发票信息,能够根据这个表来管理发票,如表4-7所示。
表4-7 发票表(invocie)
订单明细表,用来存储购物系统的所有订单详细信息,能够根据这个表来管理订单详细信息,如表4-8所示。
表4-8 订单明细表(orderdetail)
订单表,用来存储购物系统的所有订单信息,能够根据这个表来管理订单信息,如表4-9所示。
表4-9 订单表(orders)
支付方式表,用来存储购物系统的支付信息,能够根据这个表来管理支付信息,如表4-10所示。
表4-10 支付方式表(payway)
收货人信息表,用来存储购物系统的收货人信息,能够根据这个表来管理收货人信息,如表4-11所示。
表4-11 收货人信息表(receive)
配送方式表,用来存储购物系统的配送方式,能够根据这个表来管理配送方式,如表4-12所示。
表4-12 配送方式表(sendway)
用户表,用来存储所有会员用户的信息,能够根据这个表管理所有用户,如表4-13所示。
表4-13 用户表(user)
4.2 功能设计
网上商城系统又称在线商城系统,其功能主要包含商品的管理、会员的管理、订单的管理、在线支付等。
1)后台功能
商品模块:包括后台商品库存管理、上货、出货、编辑管理和商品分类管理、商品品牌管理等。
订单模块:在线订单程序,使消费者能够顺利的通过Web在线的方式,直接生成购买订单。
会员模块:在购物系统中,集成会员注册是吸引会员进行二次购买和提升转换率最好的方式。
配送模块:购物系统集成的物流配送方式,从而方便消费者对物流方式进行在线选择。
如:EMS、顺风等等。
2)前端功能
商品搜索:通过前端界面,以标准的或者其他个性化的方式向用户展示商品各类信息,完成购物系统内信息流的传递。
购物车:用户可对想要购买的商品进行网上订购,在购物过程中,随时增删商品。
商品浏览:随着电子商务的发展商品图片成为吸引消费者的第一要素,多图展示即提供前台多张图片的展示,从而提升消费者的购物欲望。
用户管理模块:为了方便于网站的管理,必须由一套完整的用户管理体系。
该网站用户管理模块主要实现用户的注册、登录、找回密码3方面功能。
该购物网站具体功能结构图如图4-3所示。
图4-3 功能图
4.3 代码设计
4.3.1后台功能
1)添加或修改
a.判断是添加还是修改代码
//如果有商品ID,说明是编辑
int productid=CommonUtil.getIntParameter(request, "productid"); BaseDAO dao=new BaseDAO();
if(productid!=0){//说明是进入修改页面
try {
Map<String,Object> record=dao.listWithPage("a.*,b.categoryname", "product a,category b", " and a.categoryid=b.categoryid and
a.productid="+productid, "a.productid desc", 1, 9999,
false).getRecords().get(0);
request.setAttribute("record", record);
} catch (Exception e) {
e.printStackTrace();
}
}
String tree=CategoryUtil.makeTree("listcategory");
request.setAttribute("tree", tree);
request.getRequestDispatcher("addproduct.jsp").forward(request, response);
b.添加或修改代码
//接收参数
String productname = request.getParameter("productname");
String categoryid = request.getParameter("categoryid");
String storecount = request.getParameter("storecount");
String marketprice = request.getParameter("marketprice");
String saleprice = request.getParameter("saleprice");
String hit = request.getParameter("hit");
String picture = request.getParameter("picture");
String addtime = request.getParameter("addtime");
String isdel = request.getParameter("isdel");
String content = request.getParameter("content");
int productid=CommonUtil.getIntParameter(request, "productid");
try {
//调用DAO
BaseDAO dao=new BaseDAO();
int result=0;
if(productid!=0){//修改
result=dao.update("product","productname='"+productname+"',
categ oryid='"+categoryid+"',storecount='"+storecount+"'
,marketprice='"+marketprice+"',saleprice='"+saleprice+"',
hit='"+hit+"',picture='"+picture+"',addtime='"+addtime+"',
isdel='"+isdel+"',content='"+content+"'", " and productid="+productid);
}else{//添加result=dao.add("product","pro ductname='"+productname+"', categoryid='"+categoryid+"',storecount='"+storecount+"',
marketprice='"+marketprice+"',saleprice='"+saleprice+"',
hit='"+hit+"',picture='"+picture+"',addtime='"+addtime+"',
isdel='"+isdel+"',content='"+content+"'");
}
String msg="";
if(result>0){
msg="<script>alert('操作成功
');window.location.href='productServlet?action=list';</script>";
}else{
msg="<script>alert('操作失败
');window.location.href='productServlet?action=list';</script>";
}
//把提示信息放入request
request.setAttribute("msg", msg);
request.getRequestDispatcher("msg.jsp").forward(request, response);
c.商品的添加及修改公用一个页面,如图4-4所示。
图4-4 添加或修改页面
2)商品列表及删除
a.列表代码
String where=" and a.categoryid=b.categoryid";
String productname=CommonUtil.getStringParameter(request,"productname"); if(!productname.equals("")){
where+=" and a.productname like '%"+productname+"%'";
}
int categoryid=CommonUtil.getIntParameter(request,"categoryid");
if(categoryid!=0){
where+=" and a.categoryid="+categoryid;
}
CommonUtil.getIntParameter(request,"categoryname");
float startprice=CommonUtil.getFloatParameter(request,"startprice"); float endprice=CommonUtil.getFloatParameter(request,"endprice");
if(startprice==0 && endprice==0){
}else{
float temp=0;
if(startprice>endprice){
temp=startprice;
startprice=endprice;
endprice=temp;
}
where+=" and a.saleprice>="+startprice+" and a.saleprice<="+endprice;
}
BaseDAO dao=new BaseDAO();
SearchResult sr=dao.listWithPage("a.*,b.categoryname", "product a,category b",where, "a.addtime desc",CommonUtil.getPageNo(request),
2,true);
request.setAttribute("records", sr.getRecords());
request.setAttribute("pb", sr.getPb());
List<Integer> pagecode=new ArrayList<Integer>();
for(int i=1;i<=sr.getPb().getPageCount();i++){
pagecode.add(i);
}
request.setAttribute("pagecode", pagecode);
String tree=CategoryUtil.makeTree("searchproduct");
request.setAttribute("tree", tree);
request.getRequestDispatcher("listproduct.jsp").forward(request, response);
b.删除代码
int productid=CommonUtil.getIntParameter(request, "productid");
BaseDAO dao=new BaseDAO();
int result = dao.del("product", " and productid="+productid);
String msg="";
if(result>0){
msg="<script>alert('删除成功
');window.location.href='productServlet?action=list';</script>";
}else{
msg="<script>alert('删除失败
');window.location.href='productServlet?action=list';</script>";
}
request.setAttribute("msg", msg);
request.getRequestDispatcher("msg.jsp").forward(request, response);
c.列表部分适合删除在一起完成的,如列表图4-5、删除如图4-6所示。
图4-5 列表
图4-6 删除
3)分类管理
这一部分包括了分类的添加修改以及删除,基本实现方法与商品管理相同,不同的地方是:分类主要的视图是以分类树的形式出现。
如图4-7所示是分类的添加及修改所公用的页面,而图4-8则是分类的删除及列表的页面。
图4-7添加修改公用页面图4-8分类列表
4.3.2前端功能
1)主页
在这部分比较重要的是主页的分类树的实现,如图4-9、4-10所示。
图4-9 主页代码
图4-10 主页2)商品列表
在列表部分比较重要的是分页树的实现以及排序方式和分页功能,如图4-11、4-12所示。
图4-11列表代码
图4-12 列表
3)登陆
a.可以完成的功能是登陆之后才可以结算。
//调用DAO
BaseDAO dao=new BaseDAO();
String username=CommonUtil.getStringParameter(request, "username"); String password=MD5.md5(CommonUtil.getStringParameter(request,
"password"));
String checkcode=CommonUtil.getStringParameter(request, "checkcode");
//获取SESSION
HttpSession session=request.getSession();
String msg="";
String rightcode=session.getAttribute("checkcode").toString();
//验证码正确
if(checkcode.equals(rightcode)){
try {
List<Map<String,Object>> records=dao.listWithPage("*", "user", " and username='"+username+"' and password='"+password+"'", "userid desc", 1, 1, false).getRecords();
if(records.size()>0){
//当前登录用户的信息
Map<String,Object> user=records.get(0);
session.setAttribute("user", user);
msg="<script>alert('登录成功
');window.location.href='frontServlet?action=orderconfirm';</script>";
}else{
msg="<script>alert('用户或密码错误
');window.location.href='userlogin.jsp';</script>";
}
} catch (Exception e) {
e.printStackTrace();
}
}else{
msg="<script>alert('验证码错误
');window.location.href='userlogin.jsp';</script>";
}
request.setAttribute("msg", msg);
request.getRequestDispatcher("msg.jsp").forward(request, response);
b.登陆如图4-13所示。
图4-13 登陆
4)将商品放入购物车
a.这一部分需要完成的功能是商品放入购物车,并且可以计算出价钱。
//这是购买第一件产品,即现在没有车子,我们就创建一个车子
if(session.getAttribute("cart")==null){
cart=new ArrayList<Map<String,Object>>();
//放入商品图片
record.put("picurl", record.get("picurl"));
//设置商品数量(增加一列)
record.put("buycount", buycount);
//增加总价
record.put("totalprice",
BaseCalculate.round(buycount*Float.parseFloat(record.get("saleprice"
).toString()), 1));
//把产品放入车子就行了。
cart.add(record);
}else{ //说明已经有车子了
cart=(List<Map<String,Object>>)session.getAttribute("cart");
//判断该次购买的产品是否已在车中,默认不在车中
boolean inCart=false;
//循环车子,判断当前购买的产品是已经购买过(重复购买)
for(int i=0;i<cart.size();i++){
//获取每一条车子中已有的产品
Map<String,Object> temprecord=cart.get(i);
//是重复购买
if(temprecord.get("productid").equals(productid)){
//取出之前购买的数量,加上本次的购买数量
temprecord.put("buycount",
Integer.parseInt(temprecord.get("buycount").toString())+buycount);
//重新计算总价
temprecord.put("totalprice",
BaseCalculate.round(BaseCalculate.add(Float.parseFloat(temprecord.get(" totalprice").toString()),
buycount*Float.parseFloat(record.get("saleprice").toString())), 1));
//将更改的记录重新放入Cart(更改)
//cart.add(i, temprecord);
inCart=true;
break;
}
}
//该产品不在车中
if(inCart==false){
System.out.println("buycount:"+buycount);
//放入商品图片
record.put("picurl", record.get("picurl"));
//增加数量列
record.put("buycount", buycount);
//增加总价列
record.put("totalprice",
BaseCalculate.round(buycount*Float.parseFloat(record.get(
"saleprice").toString()),1));
System.out.println("===="+record);
//把商品放入车子
cart.add(record);
}
}
//购物车中商品的总价
float sum=0;
//重新循环购物车,统计总价
for(int i=0;i<cart.size();i++){
Map<String,Object> temp=cart.get(i);
//当前商品的总价
sum=BaseCalculate.round(BaseCalculate.add(sum,
Float.parseFloat(temp.get("totalprice").toString())), 1);
}
//把总价放入Session
session.setAttribute("sum",sum);
//将车子放入Session
session.setAttribute("cart", cart);
response.sendRedirect("showCart.jsp");
b.放入购物车如图4-14所示。
图4-14 加入购物车
5)订单确认
a. 订单确认页面进行订单确认。
//调用DAO
BaseDAO dao=new BaseDAO();
//获取SESSION
HttpSession session=request.getSession();
Map<String,Object>user=(Map<String,Object>)session.getAttribute("user") //当前登录用户的ID
String userid=getUserid(request);
//查询收货人的信息
try {
List<Map<String,Object>> receivelist=dao.listWithPage("*", "receive", " and userid="+userid, "receiveid desc", 1, 999999, false).getRecords(); if(receivelist.size()>0){
//把所有的收货人信息放入页面
request.setAttribute("receivelist", receivelist);
//跳转到填写订单确认的页面
request.getRequestDispatcher("orderconfirm.jsp").forward(request, response);
}else{//目前该用户没有收货人信息
//跳转到填写收货信息人信息的页面
request.getRequestDispatcher("addreceiver.jsp").forward(request, response);
}
b.订单确认如图4-15所示。
图4-15 订单确认
6)保存收货人信息
a.保存收货人信息以便下次使用。
String receiver=CommonUtil.getStringParameter(request, "receiver"); String address=CommonUtil.getStringParameter(request, "address");
String mobile=CommonUtil.getStringParameter(request, "mobile");
String phone=CommonUtil.getStringParameter(request, "phone");
String mail=CommonUtil.getStringParameter(request, "mail");
String postcode=CommonUtil.getStringParameter(request, "postcode");
String userid=getUserid(request);
//调用DAO
BaseDAO dao=new BaseDAO();
int result=0;
try {
result =
dao.add("receive","receiver='"+receiver+"',address='"+address+"',mobile ='"+mobile+"',mail='"+mail+"',postcode='"+postcode+"',phone='"+phone+"' ,userid='"+userid+"'");
String msg="";
if(result>0){
msg="<script>window.location.href='frontServlet?action=orderconfirm' ;</script>";
}else{
msg="<script>alert('操作失败
');window.location.href='addreceiver.jsp';</script>";
}
request.setAttribute("msg", msg);
} catch (Exception e) {
e.printStackTrace();
}
request.getRequestDispatcher("msg.jsp").forward(request, response);
b.收货人信息保存如图4-16所示。
图4-16 保存收货人
5.结论
经过两个月的实训,我发现了自己的许多不足,针对自己的不足,我也有了很大的进步。
在最开始学习java时,我学习和了解的都只是很浅的理论知识,虽然进行了上机来练习所学习到得知识,但是这些东西根本不可能去处理一些比较难的问题以及建立良好的交互界面。
在这两个月的实训中,我自己是有些怠惰的。
在开始的时候还能跟上老师静的内容,但是我之后就有一些放松了,最后的一些功能在老师要验收的时候我还没有写完,只能自己加班加点的完成。
但是在这期间,我学到了对数据库操作的封转,这样的封装在一定程度上可以减少代码的冗余以及加强系统的安全性。
而且还了解到有许多我们平常见到的一些很强大的控件是开源的(如日期控件等),当自己想用的时候就可以直接下载,不需要自己为难自己。
因为知道了这个,我在完成自己的期末作业时,搜索到了一有日期又有时分秒的控件,当时真的很高兴,发现原来很多东西都是不用自己写,是可以找到的。
而且不仅仅是控件,我也学到了像页码这样的代码,以后当我需要的时候就可以直接拿来用了。
两个月里,有得有失。
好的地方是我学到了许多有用的知识,而不好的地方就是自己太懒了。
我以后一定会努力改正,让自己在未来更加进步。
参考文献
1.张新曼.精通JSP-Web开发技术与典型应用[M] ,北京:人民邮电出版社,
2007,516-564。
2.邹竹彪.JSP网络编程从入门到精通[M],北京:清华大学出版社,2007,
329-548。
3.王家华.软件工程[M],沈阳:东北大学出版社,2005,46-199。
4.萨师煊,王珊.数据库系统概论(第三版)[M],北京:高等教育出版社,
2000,45-149。
5.黄理,李积善,曹林有,张勇.用JSP轻松开发Web网站(第一版)[M].北
京:北京希望电子出版社.2001.100~152。
6.周绪,管丽娜,白海波.SQL Server 2000中文版入门与提高[M],北京:
清华大学出版社,2001,112-113。