MVC模式开发图书商城项目分析
功能分析
1、用户注册
2、用户登录
3、添加商品(CURD)
4、商品查看--列表查询
5、商品详情页面
6、将商品添加购物车
7、查看购物车
8、修改购物车
9、生成订单
10、订单查看(取消)
11、在线支付
12.下载销售榜单
游客(未登录):注册、登陆、商品查看
商城注册用户:商品查看、添加商品到购物车、购物车管理、生成订单、订单管理、在线支付
管理员:添加商品、商品管理、查看订单、榜单查看(导出)
系统设计
1技术选型(系统架构)
JSTL+JSP+Servlet+JavaBean+BeanUtils+FileUpload+JavaMail+DBUtils(JDBC)+C3P0+MySQL+MyEclipse10+Tomcat7.0+JDK6+Windows
MVC模式
JavaEE三层结构web层service层dao层
DAO模式
2数据库设计
系统存在以下实体:用户、商品、订单、购物车
购物车不放入数据库(Session或者Cookie实现)
用户表
createtableusers(
idintprimarykeyauto_increment,
usernamevarchar(40),
passwordvarchar(100),
nicknamevarchar(40),
emailvarchar(100),
rolevarchar(100),
stateint,
activecodevarchar(100),
updatetimetimestamp);
商品表
createtableproducts(
idvarchar(100)primarykey,
namevarchar(40),
pricedouble,
categoryvarchar(40),
pnumint,
imgurlvarchar(100),
descriptionvarchar(255));
订单表
createtableorders(
idvarchar(100)primarykey,
moneydouble,
receiverinfovarchar(255),
paystateint,
ordertimetimestamp,
user_idint,
foreignkey(user_id)referencesusers(id)
);
用户与订单之间存在一对多关系:在多方添加一方主键作为外键
订单和商品之间存在多对多关系:创建第三张关系表,引入两张表主键作为外键(联合主键)
订单项
createtableorderitem(
order_idvarchar(100),
product_idvarchar(100),
buynumint,
primarykey(order_id,product_id),
foreignkey(order_id)referencesorders(id),
foreignkey(product_id)referencesproducts(id)
);
设置数据库环境
数据库:createdatabaseestoresystem
3工程环境搭建和网站部署
1)导入jar包
导入mysql驱动mysqldriver/mysql-connector-java-5.0.8-bin.jar
导入c3p0c3p0/c3p0-0.9.1.2.jar将c3p0-config.xml复制src下将DataSourceUtils复制cn.itcast.estore.utils-----配置c3p0-config.xml数据库连接参数
导入dbutilsapachecommons\dbutils\commons-dbutils-1.4.jar
导入beanutilscommons-beanutils-1.8.3.jarcommons-logging-1.1.1.jar
导入fileuploadcommons-fileupload-1.2.1.jarcommons-io-1.4.jar
导入javamailmail.jar
导入jstljstl.jarstandard.jar
2)建立package结构按照JavaEE三层结构
cn.itcast.estore.web.servlet
cn.itcast.estore.web.filter
cn.itcast.estore.web.listener
cn.itcast.estore.service
cn.itcast.estore.dao
cn.itcast.estore.domain
cn.itcast.estore.utils
3)domain类编写
4)工程发布
将bookEstore项目配置虚拟主机,以顶级域名方式进行发布
1)将工程根目录bookEstore目录配置虚拟主机目录----配置conf/server.xml
unpackWARs="true"autoDeploy="true"
xmlValidation="false"xmlNamespaceAware="false">
2)将工程目录下WebRoot目录,配置缺省web应用
unpackWARs="true"autoDeploy="true"
xmlValidation="false"xmlNamespaceAware="false">
3)将www.estore.com虚拟主机配置缺省虚拟主机-----能够用ip直接访问主机
4)修改本机域名解析文件hosts----c:\windows\system32\drivers\etc
添加127.0.0.1www.bookEstore.com
功能实现
1用户注册
1、功能一:用户注册(技术点:验证码技术、激活邮件技术)
1)一次性验证码
原理:在生成验证码Servlet程序中,将生成验证码保存Session中,用户提交验证码与保存在Session验证码进行比较,如果相同,请求合法
2)注册表单JS校验
考虑JS校验是否可以抽取成框架
3)处理form乱码问题----通用getpost乱码过滤器
4)密码MD5加密
5)激活邮件发送
6)配置通用错误处理页面web.xml
500
/500.jsp
404
/404.jsp
500.jsp显示错误的信息
404.jsp自动刷新跳转回主页面
2用户登录
原理:用户输入正确用户名和密码,登陆成功,用户信息将会被保存Session对象中。------记住用户名和密码、自动登陆
1)登陆表单中,添加记住用户名和自动登陆功能
2)登陆过程中判断账户是否激活
3)在login.jsp显示记住用户名
在username的input项中添加value="${cookie.username.value}"
在勾选自动登陆checkbox添加
4)登陆后注销功能
注销Session
3用户自动登录过滤器
自动登陆功能对系统所有页面有效(例如访问index.jsplist_product.jspinfo_product.jsp这些页面在访问时都将执行自动登陆)
对于登陆相关页面不会执行自动登陆逻辑(login.jsp、LoginServlet、InvalidateServlet)
1)判断该请求页面是否需要自动登陆
2)是否已经登陆
3)是否含有自动登陆cookie
4)自动登陆
5)在LoginServlet添加对于没有勾选记住用户名和自动登陆处理代码!!!!!!!
6)在退出功能InvalidateServlet清除自动登陆信息
4商品添加
文件上传三个注意事项
1)input输入框必须有name属性
2)表单form必须post提交方式
3)设置form的enctype为multipart/form-data
表单提交时,校验分为两种:客户端校验、服务器端校验------只有服务器端校验才能确保数据准确
商品图片上传到服务器端后,保存在哪个目录???必须直接在WebRoot下及其除WEB-INF、META-INF子目录外
一般情况下,一张表对应Domain类---DAO类----Service类
5商品列表查看
列表中显示原图,因为原图比较大,页面加载非常缓慢,页面布局不会很美观----------------缩略图
Java中通过图形界面技术,生成小图
在Product类中添加getImgurl_s方法,用来获取缩略图路径
6商品详细信息查看
通过在列表中点击商品图片或者商品名称进入详情查看页面
7添加商品到购物车
购物车对象,不保存在数据库中,使用Session来保存用户购物车数据
保存购物车对象Mapkey商品对象value商品购买数量
流程:添加商品到购物车流程,点击添加到购物车,将商品id传递Servlet,从Session中取出购物车对象,判断商品是否已经在购物车中,如果不在添加商品到购物车数量1,在购物车取出原有数量+1
1)如果Map的key是一个自定义对象,重写hashcode和equals
2)如果商品不在购物车中,需要根据商品id查询商品所有信息,添加购物车
3)添加商品到购物车
Session中信息在服务器正常关闭时,会被序列化到硬盘中----Product实现Serializable接口完成序列化
8显示与修改购物车数据
购物车信息保存在Session中,不需要去查询数据库,将Session中信息显示出来
1)在购物车中显示总价
2)购物车修改:
清空购物车:request.getSession().removeAttribute("cart");
删除购物车中单项商品:cart.remove(product);注意:删除一项后,判断购物车是否为空,如果为空移除购物车对象
删除确认功能
写法一:直接在href中触发js函数,询问用户是否确认,如果确认,location.href发起删除请求-----...
写法二:在链接中添加onclick事件,询问用户是否确认,如果用户取消,通过JS阻止href事件提交
阻止href默认事件:e.preventDefault()----必须支持事件FF支持、IE不支持
IE阻止href默认事件
functionconfirmDel(e){
//询问用户是否确认
varisConfirm=window.confirm("商品不要了吗?多好的商品啊!");
if(!isConfirm){
//用户选择取消,阻止a标签默认事件href发生
if(e&&e.preventDefault){
//e对象存在,preventDefault方法存在----火狐浏览器
e.preventDefault();
}else{
//不支持e对象,或者没有preventDefault方法----IE
window.event.returnValue=false;
}
}
}
修改购物车中商品购买数量----JavaScript控制购物数量修改
9订单生成
重点:
1)向orders表插入订单信息后,同时需要向orderitem表插入订单中每项数据
2)多表插入(数据完整性问题)---事务管理
3)订单生成后,商品数量更新减少
10订单列表查询与取消
管理查询订单---所有人订单信息
普通用户----只能查询自己的订单
在订单生成后,查看订单列表、也可以通过index.jsp进入订单查看页面
重点:查询订单时,同时查询订单项目信息
1)查询订单基本信息时,查询下单用户昵称和用户名
在Order类中添加用户的username和nickname字段
selectorders.,users.username,users.nicknamefromorders,userswhereorders.user_id=users.id;
2)查询订单项信息时,查询商品的名称和单价
在OrderItem类中添加商品的name和price字段
selectorderitem.,products.name,products.pricefromorderitem,productswhereorderitem.produtct_id=products.idandorderitem.order_id=?
订单取消:删除订单表信息时,同时删除订单项信息(订单项信息依赖订单信息,必须先删除订单项)
注意事项
1)可以取消未支付的订单,如果订单已经支付,将无法取消
2)管理员不能取消任何用户未支付订单,普通用户只能取消自己的未支付的订单
取消订单进行事务管理:删除订单项、删除订单、恢复商品数量
11订单在线支付
1)网站进行支付,根据易宝支付接口请求规范,生成易宝需要数据,将数据提交到易宝指定网址https://www.yeepay.com/app-merchant-proxy/node
在提交支付请求给易宝,需要将请求中数据,使用易宝提供密钥和算法进行加密,获得数字签名hmac码,将hmac码发送给易宝
2)易宝会连接银行,进行支付
3)支付后,浏览器会以重定向方式访问网站回调程序,易宝在收到银行转账后,会以Socket方式通知网站
在浏览器重定向通知后,提供给用户支付成功显示页面(不要去修改订单状态)
在网站收到易宝点对点通知后,回复易宝success,修改订单状态
数字签名原理:将数据使用密钥和算法加密后获得数字签名hmac,将数据和数字签名hmac一起发送给易宝,易宝采用同样密钥和算法对数据进行加密获得数字签名hmac,比较请求中数字签名hmac与加密后获得数字签名hmac是否一致,如果一致签名hmac有效(数据没有被篡改)
流程入口:未支付订单可以进行支付,管理员不允许支付
在线支付
1)pay.jsp银行选择页面
2)OnlinePayServlet准备易宝支付参数
提供密钥和算法商家编号真实的将PaymentUtil复制utils包,将merchantInfo.properties复制src
responseURL支付成功后回调地址,该地址会收到浏览器重定向和服务器点对点两次通知,确保该地址可以被易宝访问(estore项目必须要配置缺省虚拟主机)
将OnlinePayServlet准备易宝参数,传递JSP确认
3)confirm.jsp通过form的隐藏域提交参数给易宝网址https://www.yeepay.com/app-merchant-proxy/node
4)CallbackServlet回调程序
收到浏览器重定向和服务器点对点两个通知
浏览器重定向,显示支付成功,不要修改订单状态
服务器点对点,修改订单状态,回复success
12销售榜单导出功能
获得商品销售情况,需要查询orderitem表-------统计已支付订单项内容
1)榜单中存在哪些信息?(已支付订单中商品)
商品信息products表
销售数量orderitem表
订单支付情况orders表
selectfromproducts,orderitem,orderswhereproducts.id=orderitem.product_idandorderitem.order_id=orders.id;
进行商品分组查询groupby
selectproducts.,sum(orderitem.buynum)totalSaleNumfromproducts,orderitem,orderswhereproducts.id=orderitem.product_idandorderitem.order_id=orders.idandorders.paystate=1groupbyproducts.idorderbytotalSaleNumdesc;
2)榜单文件是什么格式?
导出Excel使用POI类库
csv格式文件,逗号分隔文件
1)信息当中有,在两端加双引号
2)信息当中有"在之前加双引号转义
文件下载
设置Content-Type、Content-Disposition头信息
文件流输出(输出文件内容)
Excel默认读取字符集gbk
|
|