摘 要
随着计算机信息技术发展越来越好,开展线上业务已经成为普遍现象,各行业通过互联网实现了更便捷的信息交流。租车公司凭借互联网发展了足不出户发展和完成业务。
由于生活的需要,越来越多人需要用车,但经济方面又有限制,所以越来越多人开始租车。各类租车服务也在不断进步,从最开始的线下人工销售,再到目前的网上租借服务,网上租借车辆已经成为大部分人的选择。
本课题主要研究一个具有个性化功能的网上租车系统。该租车系统能够让用户能够不受时间和空间限制,在线上就可以进行租车。本系统实现了用户登录、用户注册、租用车辆等功能。分析并解决实现中的若干技术问题,建立完整的租车网站。通过使用JSP语言建立前台页面,MySQL建立后台数据库,利用Eclipse跟Tomcat建立了一个SSH框架的网上书城系统。
关键词:租车,Eclipse,SSH框架
SSH-based car rental management system
Abstract
As the development of computer information technology has become better and better, online business has become a common phenomenon, and various industries have achieved more convenient information exchange through the Internet. The car rental company has developed and completed its business with the Internet.
Due to the needs of life, more and more people need to use cars, but there are restrictions on the economy, so more and more people start renting cars. Various types of car rental services are also constantly improving. From the initial offline manual sales to the current online lease service, online leased vehicles have become the choice of most people.
This project focuses on an online car rental system with personalized features. The car rental system allows users to make it easy, fast and convenient to rent a car online, regardless of time and space. The system design realizes the functions of user login, user registration, rental of vehicle, return of vehicle and so on. Analyze and solve several technical problems in the implementation and build a complete car rental website. Using JSP to create front-end pages, MySQL to build a back-end database, and Eclipse and Tomcat to build an online book city system with an SSH framework.
Keywords: Car Rental, Eclipse, SSH Framewor
目录
第一章 课题研究背景
1.1 课题研究背景
近年来,我国汽车租赁市场属于高速增长的状态,市场占比越来越大。虽然因疫情影响,汽车租赁市场占比率从2020年开始有所下降,但规模任然很大,约为1000亿元,2019年增长9.05%,但增速跟前几年相比下降明显。
我国人民在租车上的消费每年都以20%的速度增长。其中,主要消费者是三四十岁的青年人,主要使用于旅游方面。未来十年,中国租车发展将逐步进入成熟阶段,汽车共享将成为人们的重要生活方式。
在国外,汽车租赁业有一个更专业的管理系统,在全世界有数千个服务点。例如,欧洲汽车公司建立了一个与GDS全球调度系统相连的计算机网络,欧洲汽车公司在世界任何有网络的地方都可以进行租车交易。目前,超过10%的交易是通过这个网络预订的。
1.2 研究意义
研究租车管理系统的主要意义在于体现了租赁给人们带来了便利。汽车租赁可以减少政府的财政压力,同时也削弱了人民购买多辆车的欲望,从而缓解城市环境问题。所以本课题研究了一个便捷的网上租借车俩系统,该租车系统不仅实现了用户可以足不出户就租借车俩等功能,并且满足部分顾客短期需要租车的需求。
第二章 技术介绍
2.1 Spring框架
Spring框架是一个开源框架,主要解决了企业开发应用时遇到的的难度。Spring是一个轻量型的控制反转和面向切面的容器框架。以下是它的一些特点:
(1)轻量:Spring框架不大,并且所需要的开销小。
(2)控制反转:Spring框架可以促进松耦合,通过控制反转(IoC)技术。
(3)面向切面:Spring框架可以提供面向切面编程,可以实现内聚性开发,通过分离应用的逻辑与系统级服务。
2.2 Struts框架
java最早期的开源框架其中包含Struts,它通过MVC设计模式来实现设计。 Struts定义了通用的Controller(控制器),通过配置文件(通常是 Struts -config.xml)隔离Model(模型)和View(视图)
2.3 Hibernate框架
Hibernate框架是一款开发源代码的框架。它可以轻量级地封装JDBC,可以在POJO与数据库表之间建立一个映射关系。hibernate可以自动生成并执行SQL语句。
2.4 JSP技术介绍
JSP是一种动态网页技术。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据客户端发送来的请求动态地生成Web网页,在完成任务后再返回给请求方。
2.5 MySQL介绍
MySQL可以把数据保存在各个不同的表内,而不是把数据都存放在一个表内,这大大提高了读取数据的速度。以下是它的一些特点:
(1)体积小:MySQL所占的存储内存特别小。
(2)运行速度快:MySQL执行命令速度快,是当今世间上目前为止最快的数据库。
(3)功能强大:支持多个用户同时使用。人们可以在不同的场景中使用它。
(4)支持跨平台:多个开发平台可以连接MySQL,其中包括Linux、VS、access等开发平台。
第三章 可行性分析
3.1可行性分析
本系统主要语言是SSH框架语言,主要是通过SSH框架和MySQL数据库完成的来完成的。通过Eclipse软件构建框架和后端,再通过Navicat for MySQL连接数据库。使用者只需要通过Web网页来登录界面即可。
SSH框架技术以及MySQL数据库技术是本系统在开发和使用过程中主要使用的技术。其中开发软件是Eclipse软件和Navicat for MySQL软件。这两者使得系统设计更完善。
本系统的操作主要通过Web网页来操作,操作简单,容易上手。
3.1.3时间可行性
本系统节省了很多人租车的时间,提高了效率。
本系统在开发过程和设计中,严格遵守国家法律,不会对使用者和公共社会产生危害。
第四章 需求分析
4.1 需求分析
租车系统前台主要实现了用户登录、用户注册、租用车辆等功能,使得用户能够快速便捷地租借车辆。而后台则实现了管理员登录以及对用户、车辆、订单的管理。
4.2 系统功能设计
4.2.1 用户功能
图4.1 会员功能
4.2.2 管理员功能
图4.2 管理员功能
4.3 模块说明
用户模块:首次登录的用户需要通过注册自己的信息登录系统。用户登录进去后可以通过系统来查看各种车辆的信息,选择出自己所心仪的车辆。完成租车操作后用户可以进入订单界面,来查看自己的订单信息。用户也可以在用户界面中查看到自己的详细信息。
(1)首页:首页中主要展示了各类车辆的简略信息,方便用户选择。
(2)用户注册/登录界面:首次登录的用户需要点击注册按钮进行用户注册,注册完后即可登录进系统。
(3)租车界面:用户登录进系统后,网页上展示了车辆的详细信息。
(4)用户订单界面:用户完成租车后,可以在订单界面查看自己的订单的详细信息。
管理员模块:管理员登录后台管理系统后,可以完善车辆跟用户的信息,也可以对用户的订单进行审核。
(1)订单管理界面:管理员可在此界面对于用户提交的订单进行审核,审核完后这个订单才能成立。
(2)车辆管理界面:管理员可在此界面对于车辆信息进行修改跟更新。
(3)管理员管理界面:管理员可在此界面查看各个管理员的基本信息。
(4)普通用户界面:管理员可在此界面查看已注册用户的注册信息并且可以修改信息。
4.4 设计的主要思想
网上租车这个系统主要设计思想是SSH框架。用户通过点击按钮,使得请求发送到服务器。服务器接受请求后开始处理信息,同时Struts开始运行,通过Struts可以从配置文件struts.xml中查找客户端需要访问的东西即action,Dao层通过Hibernate的方法从数据库中获取数据,同时Service层通过调用Dao层的方法使用从数据库中调取的数据,实现对数据的增删改查。浏览器中的jsp界面即可通过action类中的方法可以把数据库中的数据显示出来。
其流程如图4.3所示:
图4.3 SSH框架流程图
第五章 系统分析与设计
5.1 数据库的分析与设计
数据是系统重要的部分。大部分系统实际上都是对于数据的管理。我们可以通过数据库来对数据进行增删改查的操作。在前台与后台相连后,前台的普通用户跟后台的管理员都可以使用数据库,即对数据库中的数据进行操作,例如增加信息、删除信息、更新信息等。用户点击网上租车系统上的按键后,Struts开始运行,通过Struts可以从配置文件struts.xml中查找客户端需要访问的东西即action,Dao层通过Hibernate的方法从数据库中获取数据,即可对数据库进行一次操作。如图5.1所示。
图5.1 数据库系统
5.1.1 数据库的概念结构设计
数据库的E-R图如图5.2所示:
图5.2 E-R图
5.1.2 数据库的逻辑结构设计
据E-R模型,租车系统建立了以下逻辑数据模型。
用户(用户ID、名字、性别、密码、地址、邮箱、问题、答案、注册时间(会自动更新))
车辆(车辆ID、车名、品牌、价格、产地、出厂时间、图片、详细信息)
订单(订单ID、用户ID、车辆ID、租车时间、还车时间、交易状态、交易时间)
管理员(编号,用户名,密码)
(1)user表主要是用户注册的相关信息,如表5.1所示。
表5.1 user表
user表 | |||||
名 | 类型 | 长度 | 小数点 | 是否为空 | 主键 |
id | int | 11 | 0 | 否 | Y |
name | varchar | 50 | 0 | 否 | |
sex | varchar | 10 | 0 | 否 | |
password | varchar | 16 | 0 | 否 | |
address | varchar | 200 | 0 | 否 | |
| varchar | 50 | 0 | 否 | |
question | varchar | 50 | 0 | 否 | |
answer | varchar | 50 | 0 | 否 | |
createDate | varchar | 50 | 0 | 否 |
(2)car表是车辆的相关信息,如表5.2所示。
表5.2 car表
car表 | |||||
名 | 类型 | 长度 | 小数点 | 是否为空 | 主键 |
id | int | 11 | 0 | 否 | Y |
name | varchar | 50 | 0 | 否 | |
type | varchar | 50 | 0 | 否 | |
price | decimal | 10 | 2 | 否 | |
origin | varchar | 50 | 0 | 否 | |
publicDate | varchar | 50 | 0 | 否 | |
stock | int | 11 | 0 | 否 | |
image | varchar | 100 | 0 | 否 | |
info | text | 50 | 0 | 否 |
(3)order表是车辆租赁订单的相关信息,如表5.3所示。
表5.3 order表
order表 | |||||
名 | 类型 | 长度 | 小数点 | 是否为空 | 主键 |
id | int | 11 | 0 | 否 | Y |
userId | int | 11 | 0 | 否 | |
status | varchar | 50 | 0 | 否 | |
ordertime | varchar | 255 | 0 | 否 |
(4)rent表记录了车辆租赁交易情况的相关信息,如表5.4所示。
表5.4 rent表
车辆租赁订单信息表 | |||||
名 | 类型 | 长度 | 小数点 | 是否为空 | 主键 |
id | int | 11 | 0 | 否 | Y |
userId | int | 11 | 0 | 否 | |
carId | int | 11 | 0 | 否 | |
rentTime | datetime | 0 | 0 | 否 | |
returnTime | datetime | 0 | 0 | 否 | |
status | varchar | 50 | 0 | 否 | |
ordertime | datetime | 255 | 0 | 否 | |
price | decimal | 10 | 0 | 否 |
5.2 数据库的连接原理
网上租车系统采用的是SSH框架技术,该框架通过Hibernate的对象数据库的映射关系查询数据库。SSH框架可细分为Spring、Struts和Hibernate框架三个框架。其中当连接数据库时,Spring相当于一个容器,Spring框架可以引入Struts中的action请求和Hibernate中的sessionFactry。当对数据库进行操作时,即可直接在Spring中取出对象。
当客户端对服务器发送请求后,服务器接受到请求,通过Struts找到action,action类中定义着一个service层的接口,service类中定义着一个Dao层的接口,Dao层通过hibernate的SessionFactory接口提供的方法从数据库中获取到数据。Service层通过调用Dao层的方法获取从数据库中调用的数据。之后,action层通过调用service层的方法来获取数据。客户端即可调用action类中的get方法,来进行逻辑操作,进行关于数据的操作。
连接数据库的代码如下:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://127.0.0.1:3306/car?characterEncoding=utf8
jdbc.username = root jdbc.password = root jdbc.database=cms
第六章 基于SSH的租车管理系统的设计与实现
6.1 前台部分
前台主要是供给会员使用,非会员登录需要进行注册一个账号才能进行租车。登录进去后才可以浏览首页,首页主要是提供平台上进行交易的车辆的简略信息。点击图片即可进入详细界面进行租车,在租车时需要选择租借的时间,确定之后即可点击付款。提交订单后,用户可以在订单界面看见订单详细。
6.1.1 用户登录
用户输入账号的登录名跟密码后点击登录,系统就会到数据库user用户表中匹配信息,如果信息匹配成功,则可登录进系统。如果密码不正确或者没有注册过,将会提示密码不正确或者用户名错误,即登录失败。如果用户没有注册过个人账号,也可以点击注册按钮跳转到注册界面进行注册。同时管理员也可以点击管理员登录按钮跳转到管理员登录界面,登录到后台管理系统。
//登录验证
function check(){
var loginName= $("#loginName").val();
var passWord = $("#passWord").val();
$.ajax({
url: ctx+'/user_login.do',
type: 'POST',
dataType: 'json',
data: {loginName:loginName,passWord:passWord},
async: false,
success : function(data) {
if(data.result == 1){
alert("登录成功");
window.location.href='${ctx}/login_index.do?role=1';
}else{
if(data.result == 2){
alert("密码输入错误");
}else{
if(data.result == 3){
alert("该用户不存在");
}}}
},
error : function() {
alert("error");}
}); }
function register(){
window.location.href='${ctx}/login_register.do';
} </script>
public void login() throws IOException{
HttpServletResponse resp = ServletActionContext.getResponse();
resp.setContentType("application/json;charset=UTF-8");
PrintWriter out = null;
JSONObject json = new JSONObject();
User u1 =userService.getByUserName(user);
User u =userService.login(user);
if(u1==null){
json.put("result", 3);
}else{
if(u!=null){
json.put("result", 1);
HttpSession session =ServletActionContext.getRequest().getSession();
session.setAttribute("loginName", u.getLoginName());
session.setAttribute("userId", u.getId());
session.setAttribute("user", u);
}else{
json.put("result",2); }}
out = resp.getWriter();
out.write(json.toString());}
用户登录界面如图6.1所示:
图6.1 用户登录界面
当用户输入的用户名跟密码都正确时,数据跟数据库中的信息匹配成功。将会弹出“登录成功”窗口。
用户登录成功窗口如图6.2所示:
图6.2 用户登录成功界面
当输入的账号无法在数据库中匹配到,即用户存在,将会弹出“用户不存在”的窗口。
用户不存在窗口如图6.3所示:
图6.3用户不存在窗口
当用户账号存在但密码输入错误,数据库中用户名跟密码不一致,将会弹出“密码输入错误”窗口。
用户密码输入错误窗口如图6.4所示:
图6.4用户密码输入错误窗口
当用户没有在本系统注册过时,数据库中没有其账号信息,则用户无法登录进系统。这时候用户就需要在用户登录界面点击注册按钮跳转到注册界面进行个人账号注册。用户需要在该界面填写用户名、密码、手机号码、电子邮箱、找回密码问题跟找回密码答案。其中密码需要二次确认,当密码跟确认密码不相同时,注册无法成功。而找回密码问题跟找回密码答案是为了防止用户忘记密码,当忘记密码时,用户回答正确问题,则可找回密码。
用户注册界面的代码主要如下:
public void exUpdateMyInfo() throws IOException{
HttpServletResponse resp = ServletActionContext.getResponse();
resp.setContentType("application/json;charset=UTF-8");
PrintWriter out = null;
JSONObject json = new JSONObject();
User existUser = (User) ServletActionContext.getRequest().getSession()
.getAttribute("user");
if(existUser!=null){
User u = userService.getById(existUser.getId());
u.setPhone(user.getPhone());
u.setEmail(user.getEmail());
u.setQuestion(user.getQuestion());
u.setAnswer(user.getAnswer());
userService.update(u);
ActionContext ac = ActionContext.getContext();
Map session1 = ac.getSession();
session1.remove("loginName");
session1.remove("userId");
session1.remove("user");
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("loginName", u.getLoginName());
session.setAttribute("userId", u.getId());
session.setAttribute("user", u);
json.put("result", 1);
}
out = resp.getWriter();
out.write(json.toString());
}
用户注册界面如图6.5所示:
图6.5 用户注册界面
用户点击进入首页后,可以在首页上看见各类车辆的图片,图片上会显示汽车的型号跟价格,这些汽车一共分为两大类,一类是新手推荐,这一类主要是推荐给新手司机,这类汽车驾驶相对来说比较容易,新手司机更能驾驭。另外一类是目前活动专区,即打折专区。这类汽车是一些平台目前实行的活动,用户可以花更少的钱租相同型号的车。点击“更多”这个选项,用户可以看见更多的车辆,有更多的选择。当用户点击图片时,就可以看见该汽车的详细信息,来决定是否租这辆车。
首页的代码主要如下:
public String index(){
if(role==1){
//最新车列表
List<Car> newestList =new ArrayList<Car>();
Map<String,Object> alias1 = new HashMap<String,Object>();
String hql1 = "from Car where 1=1 and isDelete=0 ";
if(!StringUtils.isEmpty(keyword)){
hql1 += " and carType like :carType";
alias1.put("carType","%" +keyword+ "%");
}
hql1 += " order by id desc";
newestList = carService.getByHQL(hql1, alias1);
if(newestList!=null && newestList.size()>0){
if(newestList.size()<=8){
ActionContext.getContext().put("newestList", newestList);
}else{
ActionContext.getContext().put("newestList", newestList.subList(0, 8));}
}else{
ActionContext.getContext().put("newestList", newestList);}
//好车推荐列表
List<Car> recommendList =new ArrayList<Car>();
Map<String,Object> alias2 = new HashMap<String,Object>();
String hql2 = "from Car where 1=1 and isRecommend=1 and isDelete=0 ";
if(!StringUtils.isEmpty(keyword)){
hql2 += " and carType like :carType";
alias2.put("carType","%" +keyword+ "%");
}
hql2 += " order by id desc";
recommendList = carService.getByHQL(hql2, alias2);
if(recommendList!=null && recommendList.size()>0){
if(recommendList.size()<=8){
ActionContext.getContext().put("recommendList", recommendList);
}else{
ActionContext.getContext().put("recommendList", recommendList.subList(0, 8));
}
}else{
ActionContext.getContext().put("recommendList",recommendList);}
//折扣优惠列表
List<Car> discountList =new ArrayList<Car>();
Map<String,Object> alias3 = new HashMap<String,Object>();
String hql3 = "from Car where 1=1 and isDiscount=1 and isDelete=0 ";
if(!StringUtils.isEmpty(keyword)){
hql3 += " and carType like :carType";
alias3.put("carType","%" +keyword+ "%");}
hql3 += " order by id desc";
discountList = carService.getByHQL(hql3, alias3);
if(discountList!=null && discountList.size()>0){
if(discountList.size()<=8){
ActionContext.getContext().put("discountList", discountList);
}else{
ActionContext.getContext().put("discountList", discountList.subList(0, 8));}
}else{
ActionContext.getContext().put("discountList", discountList);
}
ActionContext.getContext().put("a", keyword);
return "userIndex";
}else{
return "manageIndex";
}
首页界面如图6.6所示:
图6.6 首页界面
6.1.4 租车界面
当用户在首页点击图片后即可跳转到该汽车的详细信息界面,用户可以在该界面进行租车。在该界面,用户可以查看汽车的详细信息。当用户将鼠标移到汽车的图片上时,图片将会放大,好方便用户查看汽车的细节部分。当用户决定租这辆车时,需要选择租车时间跟还车时间才能提交订单。
租车界面的代码主要如下:
public String car(){
Map<String,Object> alias = new HashMap<String,Object>();
StringBuffer sb = new StringBuffer();
sb = sb.append("from Car where 1=1 and isDelete=0");
if(car.getCarType()!=null&& !"".equals(car.getCarType() )){
sb.append(" and carType like :carType");
alias.put("carType", "%"+car.getCarType()+"%" );
}
if(car.getCarCategory()!=null&& !"".equals(car.getCarCategory() )){
if(car.getCarCategory().getId()!=0&& !"".equals(car.getCarCategory().getId())){
sb.append(" and carCategory.id = :id");
alias.put("id", car.getCarCategory().getId() );
}
}
if(car.getIsRecommend()!=0&& !"".equals(car.getIsRecommend() )){
sb.append(" and isRecommend = :isRecommend");
alias.put("isRecommend", car.getIsRecommend() );
}
if(car.getIsDiscount()!=0&& !"".equals(car.getIsDiscount() )){
sb.append(" and isDiscount = :isDiscount");
alias.put("isDiscount", car.getIsDiscount() );
}
sb = sb.append(" order by id desc");
Pager<Car> pagers = carService.findByAlias(sb.toString(),alias);
ActionContext.getContext().put("pagers", pagers);
ActionContext.getContext().put("car", car);
Map<String,Object> alias1 = new HashMap<String,Object>();
StringBuffer sb1 = new StringBuffer();
sb1 = sb1.append("from CarCategory where 1=1");
List<CarCategory> carCatList=carCategoryService.getByHQL(sb1.toString(), alias1);
ActionContext.getContext().put("carCatList", carCatList);
return SUCCESS;
}
租车界面如图6.7所示:
图6.7租车界面
当点击“我要租车”按钮后,即可跳转到具体的租车界面。在该界面,用户可以点击图片,使得图片放大,来具体观察汽车的细节。用户需要分别选择租车跟还车时间,选择完之后,点击“确定租车”按钮,即可提交订单,将订单提交给后台。管理员才可以在后台审核该订单。
确定租车界面如图6.8所示:
图6.8 确定租车界面
6.1.5 用户订单界面
当用户提交成功订单后,管理员在后台通过审核之后,即租车成功。用户可以在我的订单里查看订单信息。其中审核状态需要管理员审核完才能通过。当管理员审核通过,租车才算真正成功,用户才能提车。
用户订单界面的代码主要如下:
public String carCategory(){
Map<String,Object> alias = new HashMap<String,Object>();
StringBuffer sb = new StringBuffer();
sb = sb.append("from CarCategory where 1=1 and isDelete=0");
if(carCategory.getCname()!=null&& !"".equals(carCategory.getCname() )){
sb.append(" and cname like :cname");
alias.put("cname", "%"+carCategory.getCname()+"%");
}
sb = sb.append(" order by id desc");
Pager<CarCategory> pagers = carCategoryService.findByAlias(sb.toString(),alias);
ActionContext.getContext().put("pagers", pagers);
ActionContext.getContext().put("carCategory", carCategory);
return SUCCESS;}
public String add(){
return SUCCESS;}
public String exAdd(){
carCategoryService.save(carCategory);
ActionContext.getContext().put("url", "/carCategory_carCategory.do");
return "redirect";}
public String view(){
CarCategory n = carCategoryService.getById(carCategory.getId());
ActionContext.getContext().put("carCategory", n);
return SUCCESS;
}
用户订单界面如图6.9所示:
图6.9 用户订单界面
用户可以点击“点击详情”按钮来查看该订单具体的界面。当审核状态为“未通过”时,点击修改订单就可以修改信息。
订单详情界面如图6.10所示:
图6.10订单详情界面
点击“修改订单”按钮之后,即可跳转到修改订单界面。用户可以在该界面修改租车还车时间。
修改订单界面的代码主要如下:
public String update(){
CarCategory n = carCategoryService.getById(carCategory.getId());
ActionContext.getContext().put("carCategory", n);
return SUCCESS;}
public String exUpdate(){
carCategoryService.update(carCategory);
ActionContext.getContext().put("url", "/carCategory_carCategory.do");
return "redirect";}
public String delete(){
CarCategory n = carCategoryService.getById(carCategory.getId());
n.setIsDelete(1);
carCategoryService.update(n);
ActionContext.getContext().put("url", "/carCategory_carCategory.do");
return "redirect";}
修改订单界面如图6.11所示:
图6.11 修改订单界面
6.1.6 个人中心界面
当用户登录成功,即可在个人中心界面查看并修改自己的信息。同时用户也可以点击“修改密码”按钮修改用户密码。用户也可以点击“修改个人信息”按钮跳转到修改个人信息界面来修改信息。
个人中心界面如图6.12所示:
图6.12 个人中心界面
当用户点击“修改密码”按钮后,即可跳转到修改密码界面。用户需要填写新密码以及确认新密码的文本框。同时“确认新密码”跟“密码”需要一致才能修改成功。当输入无误之后,点击“修改密码”按钮,数据即可在数据库中更新。
修改密码界面如图6.13所示:
图6.13 修改密码界面
用户可以点击“修改个人信息”按钮来修改个人信息。点击按钮后跳转到修改个人信息界面,点击“修改个人信息”按钮,即可更新数据库中的数据。
修改个人信息界面如图6.14所示:
图6.14 修改个人信息界面
6.2 后台部分
后台主要是给管理员提供一个管理后台数据的平台。当管理员在后台登录界面登录成功之后,即可进入后台管理系统。管理系统主要分为这四个部分:用户管理、管理员管理、订单管理、车辆管理。
6.2.1 管理员登录界面
每一个管理员都有独属于自己的账号,在该界面只有管理员才可以登录成功。普通用户无法登录成功。在登录界面中有一个管理员登录的选项,管理员可以点击后即可跳转到租车系统的后台管理登录界面。
管理员登录界面的代码主要如下:
public String admin(){
Map<String,Object> alias = new HashMap<String,Object>();
StringBuffer sb = new StringBuffer();
sb = sb.append("from Admin where 1=1 and isDelete=0");
if(admin.getAdminName()!=null&& !"".equals(admin.getAdminName() )){
sb.append(" and adminName like :adminName");
alias.put("adminName", "%"+admin.getAdminName()+"%" );
}
sb = sb.append(" order by id desc");
Pager<Admin> pagers = adminService.findByAlias(sb.toString(),alias);
ActionContext.getContext().put("pagers", pagers);
ActionContext.getContext().put("admin", admin);
return SUCCESS;
后台登录界面如图6.15所示:
图6.15 后台登录界面
6.2.2 用户管理界面
管理员可以在该界面修改并删除会员信息,该界面只有在本系统注册成功过的用户信息。管理员可以点击操作栏下的修改按钮修改用户信息。如ID、用户名、手机号、电子邮箱、找回密码问题、找回密码答案。管理员也可以点击删除按钮直接删除这个用户的全部信息。
用户管理界面的代码主要如下:
public String user(){
Map<String,Object> alias = new HashMap<String,Object>();
StringBuffer sb = new StringBuffer();
sb = sb.append("from User where 1=1 and isDelete=0");
if(user.getLoginName()!=null&& !"".equals(user.getLoginName() )){
sb.append(" and loginName like :loginName");
alias.put("loginName", "%"+user.getLoginName()+"%" );
}
sb = sb.append(" order by id desc");
Pager<User> pagers = userService.findByAlias(sb.toString(),alias);
ActionContext.getContext().put("pagers", pagers);
ActionContext.getContext().put("user", user);
return SUCCESS;
}
public String add(){
return SUCCESS;
}
public String exAdd(){
userService.save(user);
ActionContext.getContext().put("url", "/user_user.do");
return "redirect";}
public String view(){
User n = userService.getById(user.getId());
ActionContext.getContext().put("user", n);
return SUCCESS;}
public String update(){
User n = userService.getById(user.getId());
ActionContext.getContext().put("user", n);
return SUCCESS;}
public String exUpdate(){
userService.update(user);
ActionContext.getContext().put("url", "/user_user.do");
return "redirect";}
public String delete(){
User n = userService.getById(user.getId());
n.setIsDelete(1);
userService.update(n);
ActionContext.getContext().put("url", "/user_user.do");
return "redirect";}
用户管理界面如图6.16所示:
图6.16 用户管理界面
当管理员在用户管理界面点击“修改”按钮时,将会跳转到修改用户信息界面,管理员可以在该界面修改用户信息。点击“保存”按钮即可修改成功,修改的数据将会在数据库中修改成功。
修改用户信息界面如图6.17所示:
图6.17 修改用户信息界面
6.2.3 车辆管理界面
管理员可以在该界面修改并删除车辆信息,如车辆编号、品牌、车辆号、车名、租车价格/天、行驶里程、图片。管理员可以点击操作栏下的修改按钮修改车辆信息。管理员也可以点击删除按钮直接删除这个车辆的全部信息。当公司决定举办促销活动时,即可在后台修改租车价格/天的数据。
车辆管理界面的代码主要如下:
@Table(name="t_car")
public class Car{
private int id;
private String carType;//汽车型号
private CarCategory carCategory;//汽车品牌
private String carNumber;//车牌号
private String carOilType;//汽油型号
private String dailyPrice;//单日租金
private String distance;//行驶里程
private String carImage;//图片
private int isRecommend;//是否推荐:0:无推荐 1:是为推荐
private int isDiscount;//是否优惠:0:无优惠 1:是为优惠
private int isDelete; //0:不删除 1:删除
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@ManyToOne
@JoinColumn(name="car_category_id")
public CarCategory getCarCategory() {
return carCategory;
}
public void setCarCategory(CarCategory carCategory) {
this.carCategory = carCategory;
}
public String getCarType() {
return carType;
}
public void setCarType(String carType) {
this.carType = carType;
}
public String getCarOilType() {
return carOilType;
}
public void setCarOilType(String carOilType) {
this.carOilType = carOilType;
}
public String getDailyPrice() {
return dailyPrice;
}
public void setDailyPrice(String dailyPrice) {
this.dailyPrice = dailyPrice;
}
public String getDistance() {
return distance;
}
public void setDistance(String distance) {
this.distance = distance;
}
public String getCarImage() {
return carImage;
}
public void setCarImage(String carImage) {
this.carImage = carImage;
}
public int getIsRecommend() {
return isRecommend;
}
public void setIsRecommend(int isRecommend) {
this.isRecommend = isRecommend;
}
public int getIsDiscount() {
return isDiscount;
}
public void setIsDiscount(int isDiscount) {
this.isDiscount = isDiscount;
}
车辆管理界面如图6.18所示:
图6.18 车辆管理界面
管理员点击“修改”按钮,即可跳转到修改车俩信息界面,管理员可在该界面修改汽车编号以外的车俩信息数据,修改成功之后数据库中的数据即可自动更新。
修改车俩信息界面如图6.19所示:
图6.19 修改车俩信息界面
6.2.4 订单管理界面
管理员可以通过该界面管理订单信息。在该界面可以查看订单信息,如手机号、汽车编号、租车时间、还车时间、交易金额、订单审核情况等信息。当管理员未审核时,订单审批情况为未审核。管理员可以通过点击操作栏下的审批情况查看进行审核通过,当管理员点击审核通过,订单审批情况则变为已审核。点击操作栏下的详情按钮,即可查看该订单的详细信息。点击删除即可删除这一订单。
订单管理界面的代码主要如下:
public String carCategory(){
Map<String,Object> alias = new HashMap<String,Object>();
StringBuffer sb = new StringBuffer();
sb = sb.append("from CarCategory where 1=1 and isDelete=0");
if(carCategory.getCname()!=null&& !"".equals(carCategory.getCname() )){
sb.append(" and cname like :cname");
alias.put("cname", "%"+carCategory.getCname()+"%");
}
sb = sb.append(" order by id desc");
Pager<CarCategory> pagers = carCategoryService.findByAlias(sb.toString(),alias);
ActionContext.getContext().put("pagers", pagers);
ActionContext.getContext().put("carCategory", carCategory);
return SUCCESS;
}
public String add(){
return SUCCESS;
}
public String exAdd(){
carCategoryService.save(carCategory);
ActionContext.getContext().put("url", "/carCategory_carCategory.do");
return "redirect";
}
public String view(){
CarCategory n = carCategoryService.getById(carCategory.getId());
ActionContext.getContext().put("carCategory", n);
return SUCCESS;
}
public String update(){
CarCategory n = carCategoryService.getById(carCategory.getId());
ActionContext.getContext().put("carCategory", n);
return SUCCESS;
}
public String exUpdate(){
carCategoryService.update(carCategory);
ActionContext.getContext().put("url", "/carCategory_carCategory.do");
return "redirect";
}
public String delete(){
CarCategory n = carCategoryService.getById(carCategory.getId());
n.setIsDelete(1);
carCategoryService.update(n);
ActionContext.getContext().put("url", "/carCategory_carCategory.do");
return "redirect";
}
订单管理界面如图6.20所示:
图6.20 订单管理界面
当订单审核情况处于未审核时,管理员可点击“审核情况查看”进入审核界面。管理员可在该界面查看该订单的具体信息,管理员通过这些信息查看是否有问题。当订单无误时,管理员点击“通过审批”按钮即可通过审核。
订单审核界面如图6.21所示:
图6.21 订单审核界面
当管理员通过该订单审批时,订单管理界面中的“订单审核情况”变为“已审核”状态。并且操作栏下 “审批情况查看”按钮将会消失。同时前台界面中该订单所匹配的用户的我的订单界面,该订单“审核状态”变成“以通过”状态。
审核通过界面如图6.22所示:
图6.22审核通过界面
我的订单界面如图6.23所示:
图6.23 我的订单界面
当管理员点击“详情”按钮时,将会跳转到订单详情界面。管理员可以在该界面查看到该订单的详细详细。
订单详情界面如图6.24所示:
图6.24订单详情界面
6.2.5 管理员管理界面
管理员可以通过该界面查看各个管理员的登录信息,以防止有管理员忘记密码。当有管理员忘记密码时,其他管理员即可登录后台系统查看管理员管理界面,查看该管理员的密码。这是一种防患措施。
管理员管理界面的代码主要如下:
public void index() throws IOException{
HttpServletResponse resp = ServletActionContext.getResponse();
resp.setContentType("application/json;charset=UTF-8");
PrintWriter out = null;
JSONObject json = new JSONObject();
Admin ad1 = adminService.getByUserName(admin);
Admin ad = adminService.login(admin);
if(ad1==null){
json.put("result", 3);
}else{
if(ad!=null){
json.put("result", 1);
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("adminName", ad.getAdminName());
session.setAttribute("adminId", ad.getId());
ActionContext.getContext().put("url", "/admin_admin.do");
}else{
json.put("result",2);
}
}
out = resp.getWriter();
out.write(json.toString());
}
管理员管理界面如图6.25所示:
图6.25管理员管理界面
第七章 系统测试
7.1系统测试的目的
由于在程序开发途中,我们会遇到各种bug跟问题。在程序开发过程中,这些错误都是不可避免的。但为了使得系统能够安全、正确地运行,系统测试应运而生。我们可以通过系统测试,来发现并解决这些问题,使得系统更加稳定。
7.2系统测试方法
测试可分为白盒测试和黑盒测试两种方法。
白盒测试:是一种测试用例设计方法。
黑盒测试:黑盒测试主要使用于程序外部结构。
7.3测试结果
经过一系列测试操作,我们可以了解到本系统满足用户对于网上租车的基本需求。
结束语
在这段时间,我遇到了很多从未遇到过的问题。比如后台的处理。在遇到这个问题后,我上网查找资料、去寻求同学的帮助。经过一番努力后,通过一段时间终于处理了这个问题。并且在页面的布局上我也遇到了一些问题,布局经常出现问题,但经过一系列的调试,现在已经有了很大的改进,但还要进一步细化整体的布局。但这些问题都在逐步解决。遇到问题的时候,我们可以先去网上寻找资料。
基于SSH框架的网上租车系统进过这几个月的开发,目前已经完成大部分内容。但由于各个方面,系统还需要进一步的完善。
经过这段时间的设计,使我学习到更好地使用学校的知识,也使我掌握到更多的课外知识。并且让我感觉到软件工程和数据库设计的重要性。
这次毕业设计,使我能更通顺地运用各个平台来了解到各种为学习的知识点,也使我越发理解并且知道了团队的必须性。并且我深刻地认识到计算机对于人类的益处。在这个大数据时代,计算机发展得越来越快,且更加融入到人们的生活中。计算机对于人们的生活有很大的益处,使得人们生活越来越便捷。
通过这次的系统设计,让我了解吧并且熟悉了软件的开发过程,也让我了解到跟别人讨论技术的重要,使我能更快的融入到团体中。