对"易购网上商城"项目开发的总结
本次项目开发的各模块灵感来自于市面上已经成熟的各大电商项目(网上商城)、例如淘宝京东。项目开发时间为2020/2/27—2020/3/28。开发工具前期使用Eclipse创建的Dynamic Web项目(动态web项目),到中期使用IDEA开发工具将项目转为Maven项目继续开发(期间自学了Maven的相关生命周期和使用方法后才决定转为Maven项目)。本项目使用Java语言作为后端开发语言。
此项目所用到的前端相关技术:Html+Css+Js+Layui+JQuery+Ajax+JSTL
后端用到的相关技术与工具:Spring+SpringMVC+MyBatis+MySQL+Tomcat
本项目使用的相关工具与框架版本:IDEA-2019.3 Maven-3.6.0 JDK-1.8 Spring+SpringMVC-5.2.4 MyBatis-3.2.8 MySQL-8.0.19 JSTL-1.2 Tomcat-8.5.41
本项目为大三时期在疫情期间完成,从了解电商项目的基本运营方式到需求分析、数据库关系设计、后端实现、前端设计(部分界面参考已有的商场界面设计)、前后端交互、上线前准备工作与测试、部署上线等工作均为独立开发,用时一个月左右(因为开发期间的时间也用于做其它事情,加上此为本人第一个使用SSM开发的项目,所以开发时间略长),开发过程中也遇到了许许多多的大大小小的问题,得益于信息网络的发达还好都解决了,后续会列出开发中遇到的问题及我自己的解决方法。
本项目分为两大模块,第一是给客户使用的网上商城,第二是给商城管理员使用的后台管理系统。在开发接近尾声的时候刚好遇上阿里云的高校学生“在家实践”计划的活动,便免费领取了一台ECS用于项目部署上线。项目访问地址:http://39.96.66.218:8080/EasyShopping
本项目拥有网上商城的基本功能,首页展示最新商品(查询十件后台最新添加的商品)、热卖商品(没做商品被购买的总次数,就展示上架最久的5件商品吧)、商品分类展示(导航栏、下面还有各类商品的总数)、商品详情页(商品详细信息、商品的评论)、加入购物车、购买商品(从商品详情页购买、从购物车批量购买)、个人订单列表(可查看详细订单商品、继续支付未支付的订单、删除订单)、个人信息修改(包括头像上传)、购物车查看(删除、购买)、地址管理(增加、删除)、用户对已购买商品进行评论、商品的模糊查询;后台管理系统可允许管理员查看不同等级的管理员信息、查看商品信息(模糊查询商品、修改商品、上架商品)、查看客户信息、查看所有订单列表(可查看订单包含的商品信息)。
通过本项目的开发也让我学习了一些jquery的事件,没学js之前本人对js代码有点反感,但其实只要自己亲手去做一些js事件会发现很有意思,使用js对用户的操作反馈更加人性化,特别是对于开发者来说使用js提交数据更加的灵活,以前只会使用按钮对form表单提交数据,现在可以将提交事件写在js中,不仅能提交数据,还能对数据的合法性按照自己的要求进行效验;使用jquery的ajax可以完美配合spring框架提供的@RequestBody来接收json字符串并将json属性名解析成java类所对应的属性名,使用@ResponseBody可以按自己需求将字符串、java类、List集合、Map集合等数据结构返回给ajax,form表单提交和ajax提交可按照业务需要进行选择。
在Controller控制层主要匹配前端各个请求,接收传来的数据,使用spring管理的业务层bean调用业务层相关方法对数据进行处理,返回给前端相关数据。
在Service服务层主要处理相关业务逻辑,使用spring管理的持久层mapper(或dao)调用持久层相关方法完成相应的业务逻辑,包含与数据库有关的操作也包含与数据库无关的操作。
在Mapper持久层是操作数据库的接口,配合Mapper.xml配置文件对数据库进行各种操作,可以使用mybatis的逆向工程生成各个表的Mapper配置文件和Mapper接口,也可以根据自己业务需求手写sql语句,提供相应的查询结果给服务层。
例(加入购物车实现):
前端判断session会话中有无用户对象(判断用户是否登录),如图:
此处使用jquery的ajax对商品id和购买数量进行post提交,Controller层如图:
后台接收到HttpSession、购买商品的数量、商品的id,构造一个购物车对象,用当前登录用户的id作为购物车所属的用户id,调用业务层的添加购物车方法,利用@ResponseBody返回指定字符串给ajax,前端进行弹框提示。
Service服务层的代码如图:
首先调用Mapper持久层的方法根据当前用户的id和商品的id查询该用户的购物车里面是否已经有此件商品。如果有,便更改此购物车对象的商品数量为已添加数量与新添加数量之和,并调用持久层的购物车更新方法更新数据库;如果没有,直接调用持久层的添加购物车方法添加一条购物车数据到数据库。
通过此例可以看出使用ssm框架开发的优点,各层只负责做自己的工作,由spring管理并提供各层bean实例,起到连接各层的作用,每一个模块只做一件事,各模块提供最小限度的接口。如此一来便可以实现高内聚和低耦合。
项目上线后遇到的问题:
1.第一次部署上去后未发现问题,等第二天起床再访问就报错了。
上网查阅资料后发现是遇到了经典的“8小时问题”。原因是mysql在默认情况下,如果发现一个连接的空闲时间超过8小时,将会在数据库端自动关闭这个连接。而数据源并不知道这个连接已经关闭了,当它将这个无用的连接返回给某个Mapper时,就会报无法获取connection异常。
可以设置mysql的配置文件,将这2个参数设置为24小时(60*60*24=604800)即可。 set interactive_timeout=604800; set wait_timeout=604800; 也可以配置dbcp连接池相关参数。
2.过了几天后再次访问居然直接报错了,说是没有数据库表。
去看了下数据库发现数据库居然被黑了。。。只留下了经典的warning表。。。我一个用于学习的项目的数据库都会被黑,看来安全问题是非常值得重视的。ip地址暴露,数据库端口还是默认的3306,数据库密码也太过简单了,于是将备份的sql重新导入,重设密码等等。
3.之后遇到过一些浏览器无法登录项目的情况。
原来是浏览器阻止了cookie的问题导致的,设置一下浏览器就行了。
项目开发中遇到的问题:
1.查询数据时总是报错,错误信息的sql语句也挺奇怪的。
后面发现是我的表名和一些字段名使用了mysql的保留字,更改后即可解决,详细参见另一篇博客。