目 录
中文摘要 3
英文摘要 4
目录 5
第一章 绪论 7
1.1 课题背景、目的及意义 7
1.1.1课题背景 7
1.1.2课题目的和意义 7
1.2 国内外研究现状 7
1.2.1 国外的研究现状 7
1.2.2 国内的研究现状 8
第二章 可行性分析 8
2.1 社会可行性 8
2.2 技术可行性 8
2.3 操作可行性 8
2.4 系统的技术介绍 9
2.4.1 Javascript 9
2.4.2 JQuery 9
2.4.3 MySQL 9
2.4.4 MVC 9
2.4.5 JDBC 10
2.4.6 DBUtils 10
2.4.7 C3P0 11
2.5 系统开发平台及运行环境 11
2.5.1 系统开发平台 11
2.5.2 运行环境 11
第三章 需求分析 11
3.1 系统功能模块概述和分析 11
3.2 系统功能模块设计 12
3.3 数据库分析 13
第四章 传智播客网上图书商城前台设计与实现 17
4.1首页设计 17
4.2用户模块 18
4.2.1用户注册 18
4.2.2用户登录 19
4.2.3修改当前用户密码 20
4.2.4退出 21
4.3图书模块 21
4.3.1图书列表 21
4.3.2图书详细 21
4.3.3高级搜索 22
4.4购物车 22
4.4.1添加图书到购物车 22
4.4.2我的购物车 23
4.4.3修改条目数量 23
4.4.4删除条目 23
4.5订单模块 23
4.5.1选中条目,准备生成订单 23
4.5.2生成订单 24
4.5.3订单列表 24
4.5.4支付页面 25
4.5.5订单详细页面 25
4.5.6订单状态 26
第五章 传智播客网上图书商后台设计与实现 26
5.1管理员登录 26
5.2后台主页 27
5.3分类管理 27
5.3.1.分类列表 27
5.3.2.添加分类 28
5.3.3.修改分类 29
5.3.4.删除分类 30
5.4图书管理 30
5.4.1.图书列表页面 30
5.4.2.添加图书 31
5.4.3.高级搜索 31
5.4.4.图书详细 32
5.5订单管理 33
5.5.1.订单列表 33
5.5.2.订单详细 33
第六章 系统测试 34
6.1测试的目的与目标 34
6.2测试方法 34
6.3测试用例 35
6.4测试结论 35
第七章 结论 36
第八章 致谢 36
第九章 参考文献 37
第三章 需求分析
3.1 系统功能模块概述和分析
《传智播客网上图书商城》模型是典型的网上购物实践中最为普遍的电子商务企业对客户(B2C)模式,主要包括会员注册、订单管理、购物车、搜索、支付等基本功能。此外,本系统也将实现在线图书销售系统的后端管理,包括图书的添加、订单的处理等功能。本系统完全基于JSP技术,在系统的设计与开发过程中严格遵守软件工程的规范,运用软件设计模式,从而减少系统模块间的偶合,力求做到系统的稳定性、可重用性和可扩充性。
《传智播客网上图书商城》主要功能如下:
(1)前台(客户购买)部分:
①用户管理:注册会员、登录、激活、退出、修改密码;
②分类显示:显示所有1级和2级分类;
③图书显示:按分类查询图书、通过关键字搜索图书、高级搜索图书、查看某本图书的详细等;
④购物车管理:向购物车中添加图书、修改购物车中图书数量、删除购物车中图书、我的购物车;
⑤订单管理:通过购物车中图书生成订单、查看我的订单、查看某个订单的详细、订单支付、确认收货、取消未付款订单。
(2)后台(管理员管理)部分:
①管理员:管理员登录;
②分类管理:查看所有分类、添加1级分类、添加2级分类、修改1级分类、修改2级分类、删除1级分类、删除2级分类;
③图书管理:按分类搜索图书、高级搜索图书、添加新图书、查看图书详细信息、编辑图书、删除图书;
④订单管理:按状态搜索订单、查看订单详细信息、取消订单、发货;
3.2 系统功能模块设计
根据系统功能分析,可以画出系统的功能模块图。
前台:用户购书功能图
后台管理员功能图:
3.3 数据库分析
信息系统的主要任务是通过大量数据获得管理所需要的信息,这就要求系统本身能够存储和管理大量的数据,而这一功能的实现必须借助大型数据库系统。本系统的开发选择MySQL作为后台数据库开发工具。
1.概念模型设计
概念模型用于信息世界的建模,与具体的DBMS无关。为了把现实世界中的具体事物抽象、组织为某一DBMS支持的数据模型。人们常常首先将现实世界抽象为信息世界,然后再将信息世界转换为机器世界。也就是说,首先把现实世界中的客观对象抽象为某一种信息结构,这种信息结构并不依赖于具体的计算机系统和具体的DBMS,而是概念级的模型,然后再把模型转换为计算机上某一个DBMS支持的数据模型。实际上,概念模型是现实世界到机器世界的一个中间层次。
信息世界中包含的基本概念有实体和联系。
(1) 实体 (entity)
客观存在并可相互区别的事物称为实体。实体可以是具体的人、事、物,也可以是抽象的概念或联系。例如,一个学生、一门课、一个供应商、一个部门、一本 书、一位读者等都是实体。
(2) 联系 (relationship)
在现实世界中,事物内部以及事物之间是有联系的,这些联系在信息世界中反映为实体内部的联系和实体之间的联系。本文转载自http://www.biyezuopin.vip/onews.asp?id=12449实体内部的联系通常是组成实体的各属性之间的联系。两个实体型之间的联系可以分为3类,一对一联系,(1:1);一对多联系(1 : n);多对多联系(m : n)。
概念模型是对信息世界建模,所以概念模型应该能够方便、准确地表示信息世界中的常用概念。概念模型的表示方法很多,其中最为常用的是P.P.S.Chen于1976年提出的实体,联系方法(Entity-Relationship Approach)简记为E-R表示法)。该方法用E-R图来描述现实世界的概念模型,称为实体-联系模型,简称E-R模型。
package cn.itcast.goods.book.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.commons.CommonUtils;
import cn.itcast.goods.book.domain.Book;
import cn.itcast.goods.book.service.BookService;
import cn.itcast.goods.pager.PageBean;
import cn.itcast.servlet.BaseServlet;
public class BookServlet extends BaseServlet {
private BookService bookService = new BookService();
/**
* 获取当前页码
* @param req
* @return
*/
private int getPc(HttpServletRequest req) {
int pc = 1;
String param = req.getParameter("pc");
if(param != null && !param.trim().isEmpty()) {
try {
pc = Integer.parseInt(param);
} catch(RuntimeException e) {}
}
return pc;
}
/**
* 截取url,页面中的分页导航中需要使用它做为超链接的目标!
* @param req
* @return
*/
/*
* http://localhost:8080/goods/BookServlet?methed=findByCategory&cid=xxx&pc=3
* /goods/BookServlet + methed=findByCategory&cid=xxx&pc=3
*/
private String getUrl(HttpServletRequest req) {
String url = req.getRequestURI() + "?" + req.getQueryString();
/*
* 如果url中存在pc参数,截取掉,如果不存在那就不用截取。
*/
int index = url.lastIndexOf("&pc=");
if(index != -1) {
url = url.substring(0, index);
}
return url;
}
/**
* 按bid查询
* @param req
* @param resp
* @return
* @throws ServletException
* @throws IOException
*/
public String load(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String bid = req.getParameter("bid");//获取链接的参数bid
Book book = bookService.load(bid);//通过bid得到book对象
req.setAttribute("book", book);//保存到req中
return "f:/jsps/book/desc.jsp";//转发到desc.jsp
}
/**
* 按分类查
* @param req
* @param resp
* @return
* @throws ServletException
* @throws IOException
*/
public String findByCategory(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
/*
* 1. 得到pc:如果页面传递,使用页面的,如果没传,pc=1
*/
int pc = getPc(req);
/*
* 2. 得到url:...
*/
String url = getUrl(req);
/*
* 3. 获取查询条件,本方法就是cid,即分类的id
*/
String cid = req.getParameter("cid");
/*
* 4. 使用pc和cid调用service#findByCategory得到PageBean
*/
PageBean<Book> pb = bookService.findByCategory(cid, pc);
/*
* 5. 给PageBean设置url,保存PageBean,转发到/jsps/book/list.jsp
*/
pb.setUrl(url);
req.setAttribute("pb", pb);
return "f:/jsps/book/list.jsp";
}
/**
* 按作者查
* @param req
* @param resp
* @return
* @throws ServletException
* @throws IOException
*/
public String findByAuthor(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
/*
* 1. 得到pc:如果页面传递,使用页面的,如果没传,pc=1
*/
int pc = getPc(req);
/*
* 2. 得到url:...
*/
String url = getUrl(req);
/*
* 3. 获取查询条件,本方法就是cid,即分类的id
*/
String author = req.getParameter("author");
/*
* 4. 使用pc和cid调用service#findByCategory得到PageBean
*/
PageBean<Book> pb = bookService.findByAuthor(author, pc);
/*
* 5. 给PageBean设置url,保存PageBean,转发到/jsps/book/list.jsp
*/
pb.setUrl(url);
req.setAttribute("pb", pb);
return "f:/jsps/book/list.jsp";
}
/**
* 按出版社查询
* @param req
* @param resp
* @return
* @throws ServletException
* @throws IOException
*/
public String findByPress(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
/*
* 1. 得到pc:如果页面传递,使用页面的,如果没传,pc=1
*/
int pc = getPc(req);
/*
* 2. 得到url:...
*/
String url = getUrl(req);
/*
* 3. 获取查询条件,本方法就是cid,即分类的id
*/
String press = req.getParameter("press");
/*
* 4. 使用pc和cid调用service#findByCategory得到PageBean
*/
PageBean<Book> pb = bookService.findByPress(press, pc);
/*
* 5. 给PageBean设置url,保存PageBean,转发到/jsps/book/list.jsp
*/
pb.setUrl(url);
req.setAttribute("pb", pb);
return "f:/jsps/book/list.jsp";
}
/**
* 按图名查
* @param req
* @param resp
* @return
* @throws ServletException
* @throws IOException
*/
public String findByBname(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
/*
* 1. 得到pc:如果页面传递,使用页面的,如果没传,pc=1
*/
int pc = getPc(req);
/*
* 2. 得到url:...
*/
String url = getUrl(req);
/*
* 3. 获取查询条件,本方法就是cid,即分类的id
*/
String bname = req.getParameter("bname");
/*
* 4. 使用pc和cid调用service#findByCategory得到PageBean
*/
PageBean<Book> pb = bookService.findByBname(bname, pc);
/*
* 5. 给PageBean设置url,保存PageBean,转发到/jsps/book/list.jsp
*/
pb.setUrl(url);
req.setAttribute("pb", pb);
return "f:/jsps/book/list.jsp";
}
/**
* 多条件组合查询
* @param req
* @param resp
* @return
* @throws ServletException
* @throws IOException
*/
public String findByCombination(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
/*
* 1. 得到pc:如果页面传递,使用页面的,如果没传,pc=1
*/
int pc = getPc(req);
/*
* 2. 得到url:...
*/
String url = getUrl(req);
/*
* 3. 获取查询条件,本方法就是cid,即分类的id
*/
Book criteria = CommonUtils.toBean(req.getParameterMap(), Book.class);
/*
* 4. 使用pc和cid调用service#findByCategory得到PageBean
*/
PageBean<Book> pb = bookService.findByCombination(criteria, pc);
/*
* 5. 给PageBean设置url,保存PageBean,转发到/jsps/book/list.jsp
*/
pb.setUrl(url);
req.setAttribute("pb", pb);
return "f:/jsps/book/list.jsp";
}
}