中国知网查重 高校在线论文查重入口

立即检测
  • 58 元/篇
    系统说明: 知网职称论文检测AMLC/SMLC是杂志社专用系统,针对投稿论文、评审论文、学校、单位职称论文的学术不端重复率检测系统。
  • 298 元/篇
    系统说明: 知网本科论文检测PMLC是最权威的大学生毕业论文检测系统,含“大学生论文联合对比库”,国内95%以上高校使用。检测结果和学校一致!
  • 498 元/篇
    系统说明: 此系统不支持验证!可用作研究生初稿检测,相比知网VIP5.3缺少“学术论文联合对比库”,检测结果有5%左右的误差!(论文中若参考往届研究生论文,重复率误差会较大)
  • 128 元/篇
    系统说明: 大分解论文检测系统,对于想检测学术不端文献检测系统,而又价格便宜的同学可以选择,限每篇2.9万字符,结果与大学生PMLC、硕博VIP定稿系统有出入!
  • 68 元/篇
    系统说明: 知网论文小分解检测系统,适合中国知网初稿查重,数据库和定稿查重不同。结果与本科PMLC,研究生VIP5.3有出入,限每篇1.4万字符!
  • 3 元/千字
    系统说明: 学术家论文重复率检测系统,支持学位论文、毕业论文、投稿论文、职称评审论文,提供全文对照,word标红报告,性价比超高!
论文知识案例-旅游网站的设计与实现
时间:2021-04-23 15:04:56

  网站主要是利用IDEA中maven框架来进行开发,web层视图页面采用html,Servlet作为前端控制器;service层采用Redis,nosql内存数据库;DAO层数据库采用My SQL,Druid作为数据库连接池;tomcat作为服务器运行应用程序。主要内容是开发一个具有用户注册及登陆、邮件激活、退出、数据分类展示、旅游线路名称查询及详情展示、旅游线路收藏、游客留言板、管理员管理用户信息等功能齐全的网站。该网站尽可能做到美观大方,功能齐全,具有个性化的一些服务。网站布局合理,信息组织良好,网站各部分链接互通方便。

  1.1问题分析

  在网站开发前,我们应该提出设计开发旅游网站的目的和意义,引出网站设计中用到的相关架构和技术选型。然后详细介绍实际开发中的需求和设计方案,根据用户需求定制网站应该具有哪些功能,根据功能选取技术线路,搭建网站开发环境,设计具体的系统方案,根据系统方案制定各个功能模块方案。最后完成编码并进行系统测试。

  1.2选题背景及意义

  目前,因新型肺炎疫情的影响,对旅游业的冲击较大,自2020年春节至今,许多人都宅在家里,预测疫情过后旅游市场出现需求反弹,由于境外游暂时不开通,国内游作为旅游业的主要业务。

  近几年,国民的物质生活有了质的提升,使人民开始对精神生活品质展开了热烈的追求。中国景区旅游网创始人黄忠成,是国内首批开发旅游网站的先驱者,搭建智慧网站创造互联网旅游。利用旅游平台能够及时准确发布旅游信息,是帮助游客挑选旅游目的地的重要窗口和平台;是掌握网上舆情动态、树立圈子形象、提高公信力的重要惠信息、旅游行业新闻动态、景点攻略等相关信息;是有效并妥善回应旅客关切的重要渠道;是展现旅游行业能够推动本地圈子经济跨越式发展成果手段。

  1.3国内外研究现状

  随着中国旅游业的迅猛发展,旅游产业规模持续扩大,2019年我国旅游收入占GDP总量的11%,这预示着旅游业将成为我国经济新的增长点。

  旅游业的迅速发展催生出了许多网站的出现,如携程、酷讯、途牛和去哪儿网。旅游网站的出现也充满了激烈竞争,如何赢得顾客的青睐,成为了众多商家争相追逐的目标。相对传统旅游模式,如何开发出一个完美自由和个性化的网站,是目前赢得消费者青睐的重要通道。随着国内旅游网站的发展,顾客能够方便的查询国内外的各个旅游景点信息,同时还可以查询相关票价、酒店和旅游信息。在最初时,这些业务只能在线下交易。特别是旅游票价、酒店等方面。如今在“互联网+”时代,信息化已成为一种趋势,完善了旅游产业链。目前,许多网站的在线旅游功能都提供“在线预订”所有服务。这种服务模式能够大大降低商家和顾客的成本,满足了信息时代的多元化,真正为游客的所需定制旅游模式。相信很快,游客旅行中各个环节均可以线上完成。在国外,对比于国内,早在19世纪70年代欧美等国家就已经注重对旅游网站相关技术的研究。至90年代,已初具规模,并对旅游电子商务模式进行研发。随之互联网的快速发展,国内许多商家都与国外旅游平台商家开启合作模式。

  近年来,国内旅游网站发展壮大,国外侧重于开发网络+旅游业相结合模式,将来的在线旅行模式会愈加成熟和完善。

  1.4研究方案

  先确定研究标题,查阅相关资料并整理留存备用。然后确定网站搭建使用的相关技术。再次,分析网站信息,确定搭建功能模块方案。最后,测试网站功能并发现问题,进行修正和改进总结。

  1.5论文结构介绍

  第一章主要提出问题并分析网站研究的方案、目的和意义。第二章讲述开发中涉及到的技术信息和开发环境。第三章从技术和经济角度分析网站的可行性,论述开发需求。第四章通过第三章的需求,提出旅游网站的结构和设计方案。第五章介绍详细的设计方案和实现步骤。第六章主要对关键功能进行测试评估。第七章总结并致谢相关人员。

  2系统体系结构和相关技术

  首先,在网站开发前,搭建好开发环境同时选定相关技术。选择不同的技术和体系结构带来的使用方式会有差异。除此之外,选取优秀的相关技术能够提高网站性能和开发效率。对比搜集到的技术,我们应该首选成本低和效率高的开发工具进行网站开发。

  2.1 B/S模式

  网站开发选用B/S模式,在浏览器端输入网址访问服务器,属于改进的C/S架构。但是这种模式也存在优缺点,B/S模式使用优点包括开发、安装、部署、维护简单;缺点是如果应用过大,用户的体验可能会受到影响同时硬件要求过高。

  2.2关键技术

  2.2.1 Servlet技术

  Servlet是指利用java虚拟机运行,以Web服务器端作为运行环境,类似公共网关接口技术(CGI)。这种技术可以用来生成动态内容,使用较为广泛,但是这项技术存在缺陷,即平台相关性和不可扩展性。由此,诞生出Servlet技术。Java Servlet技术显著优点便是可移植。除此之外,还具有多线程优势,当浏览器端被多个客户同时访问时,多个请求可以同时访问,利用java多线程来处理。这种方式可以降低启动进程的开发,从而大大缩短它的执行时间。在本次网站开发中利用 WebServlet+路径名称注解技术和前端进行数据交互,利用HttpServlet中的service()方法执行具体代码。

  2.2.2 HTML技术

  浏览器端选取HTML作为视图页面,一般网站开发都是采用HTML,方面用户的浏览。在上个世纪90年代,万维网的信息标识主要采用HTML。HTML是一种用于构建web文档的语言。本次网站开发中前端以HTML为主页,加上javascript+jquery+css+bootstrap控制页面样式和动态效果。

  2.3系统开发环境

  2.3.1 MYSQL

  MySQL是一款用C和C++编写的,开源免费的关系数据库软件。使用优化标准的SQL查询算法,极大地提高了访问数据库的速度。MySQL和其他数据库比,它的优点是速度快,开发成本较低,因此受到许多中小型网站的青睐。MySQL的缺点是规模较小和功能受到限制,不适合应用于大规模项目。

  2.3.2 IDEA

  IDEA是一个由java语言编写的集成开发环境。它具有自动代码提示、重构和对Junit的完美支持等功能,堪称java编程人员的智能小助手。开发人员在编码时,它能够监测编程者的意图并提供建议。

  IDEA是所有集成开发环境中最早支持重构的,也是这款产品的卖点之一。它的排版功能灵活并且人性化,在开发中可以根据项目的不同而选取理想的排版方式。IDEA集成了几乎所有的版本控制工具插件,方便开发人员的开发编程。

  2.3.3 TOMCAT

  Tomcat服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet程序的首选。Tomcat是Apache软件基金会的核心项目。在本次网站开发中使用MAVEN框架中自带的tomcat7版本,相比之前的版本,tomcat7有以下优点:

  (1)Web应用程序内存泄漏检测和预防

  (2)改进的安全性管理器和主机管理器应用程序

  (3)通用CSRF保护

  (4)支持包括外部内容直接在web应用程序中

  (5)重构和大量的内部代码清理

  2.3.4 REDIS

  Redis即(Remote Dictionary Server)远程字典服务器。是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSQL数据库之一,也被人们称为数据结构服务器。

  Redis与其他key-value缓存产品有以下三个特点:

  (1)Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

  (2)Redis不仅仅支持简单的key-value类型的数据,同时还提供list、set、zset、hash等数据结构的存储。

  (3)Redis支持数据的备份,即master-slave模式的数据备份。

  3需求分析

  3.1需求概述

  系统需求分析是直接关系到一个系统成败的关键因素,如果一开始就没有明白系统的需求,那基本上可以确定这个项目肯定是要失败的。

  本次网站开发的目的是根据游客需求,制定网站应该具有哪些功能。以下是本次网站的主要功能:

  (1)用户注册功能:在注册页面填写用户名、真实姓名、密码、邮箱、出生日期等信息,注意邮箱必须填写真实,方便服务器发送链接,否则注册失败。

  (2)邮件激活功能:服务器自动发送一条链接到您的邮箱,点击完成激活任务。

  (3)登录和退出功能:在登录页面输入用户名、密码和验证码进行登录。注意如果用户没有激活,会提示“用户尚未激活”;完成登录,用户可直接点击退出按钮。

  (4)线路查询功能:用户可以在搜索框输入旅游目的地,点击搜索即可。

  (5)分页功能:当用户点击国内游,由于信息量过大,使用分页效果更好,提升用户体验。

  (6)收藏功能:用户只有登录成功后,才可以进行收藏,收藏完成,可点击“我的收藏”查看收藏商品信息。

  (7)在线支付功能:用户在商品价格旁边,可点击“在线预订”功能,根据商品信息填写并提交订单,订单提交30分钟内完成支付。

  (8)管理员管理用户信息功能:管理员可以管理用户注册信息,进行增删改查。

  (9)修改信息功能:用户点击“个人信息”进行修改,注意用户的真实姓名和激活状态不可更改。

  3.2网站可行性分析

  3.2.1技术可行性

  网站主要是利用IDEA中maven框架来进行开发,web层视图页面采用html,Servlet作为前端控制器,Filter作为过滤器,使用BeanUtils封装数据,json作为序列化工具;业务逻辑层采用Redis(nosql内存数据库)存储分类信息;Jedis是java的redis客户端;DAO层数据库采用My SQL,com.alibaba.druid.pool.DruidDataSource作为数据库连接池,JdbcTemplate作为jdbc的工具。

  3.2.2经济可行性

  近年来随着我国的物质生活水平和文化普及度显著提高,使国民的精神追求更加迫切。人们渴望节假日或周末休息时间出门旅游,到处走一走,看一看,欣赏风景。旅游网站的出现可以帮助游客节省时间和成本,也可以帮助商家节约运营成本。网站中搜集了国内外各大旅游景点的详细信息,帮助顾客提前做好攻略,旅途愉快。

  旅游业的发展,可以促进人们的物质消费,增加当地旅游业的经济收入,加快旅游产业链的完善发展。

  4系统总体设计

  网站开发之前,我们应该设计出总体架构。通过总体架构,可以快速的实现各功能模块,避免在编程过程中的错误和偏差。

  4.1系统总体结构

  网站总体结构根据需求分析,将分为注册、邮件激活、登录、退出、线路查询、分页展示以及用户收藏、游客留言板、在线支付功能、管理员管理用户信息功能。网站功能模块分布如图4.1所示。

  图4.1网站功能结构图

  4.2系统体系结构

  网站体系结构采用B/S模式。用户在客户机浏览器端输入网址,发送请求到web服务器,web服务器选用apache-tomcat-8.5.31,通过继承HttpServlet的BaseServlet类中的service()方法完成各种功能的调用,实现查询或更新Mysql数据库中的数据。网站设计结构如图4.2所示。

  图4.2请求响应结构图

  如图所示,系统体系结构分为三层:

  第一层:浏览器端。用户通过浏览器发送request请求,等待接收服务器返回的数据,在本次开发中请求响应方式使用异步交互方式。

  第二层:WEB服务器。网站使用maven框架中的tomcat7作为web服务器软件。

  第三层:MySQL数据库服务器。通过servlet调用service层的方法,service层调用dao查询或更新相应数据,最后返回客户端。

  4.3功能模块设计

  网站功能主要为注册、登录、邮件激活、退出、线路查询、收藏、在线支付、留言板、管理员模块等功能。

  4.3.1用户模块

  (1)用户注册功能:用户在注册页面填写个人信息,包括真实姓名、性别、手机号、出生日期、邮箱等。

  (2)用户登录功能:用户在注册成功后可以登录账号,查询旅游相关信息。

  (3)用户退出功能:待用户浏览完相关信息,“点击退出”即可退出账号。

  (4)用户收藏功能:用户必须在登陆之后才可以点击收藏按钮,收藏成功可以点击“我的收藏”查看收藏信息。

  (5)修改账户信息功能:用户登录网站后,选择修改信息,注意用户真实姓名和激活状态不可更改。

  4.3.2线路模块

  目前,因新型冠状病毒疫情影响,境外游、全球自由行、港澳游等旅游暂时中止,用户可以通过分类展示列表中的国内游查看国内旅游信息。如果游客已确定了游行目的地,可在搜索框中输入名称查询具体信息。

  4.3.3邮件激活模块

  服务器会自动发送一条激活链接至用户邮箱。用户点击激活邮件,如无错误,提示“激活成功”。如果提示“激活失败”,请联系管理员。

  4.3.4在线支付模块

  用户在商品详情页面,可根据需要在线预订,待订单提交30分钟内完成付款即可,如果超时未付款,默认取消订单。

  4.3.5游客留言板模块

  用户在留言页面需输入用户昵称、标题和留言内容,注意昵称、留言标题和内容不可为空,否则弹出消息警告框“数据有误”。

  4.3.6管理员模块

  管理员可对用户信息进行数据操纵。在用户信息列表展示页面,管理员能对用户个人信息删除、修改和全选;注意点击全选删除所有用户信息,会弹出确认框,不建议使用。

  4.4数据库设计

  4.4.1 E-R图设计

  根据网站功能需求分析,设计出系统数据实体和属性关系,如下图4.3所示。

  图4.3系统E-R图

  图4.4线路收藏实体属性图

  图4.5线路分类实体属性图

  图4.6线路信息实体属性图

  图4.7用户信息实体属性图

  图4.8线路详情实体属性图

  图4.9商家信息实体属性图

  图4.10管理员实体属性图

  图4.11留言板实体属性图

  4.4.2数据表设计

  用户注册信息表存储用户的注册信息,包括真实姓名、激活状态、激活码、出生日期、性别、手机号、邮箱、用户名、密码等,主键为uid,用户注册信息表结构如4.1所示。

  表4.1用户注册信息表

  字段名数据类型关键字备注

  Uid Int是用户编号

  Username varchar(100)否用户名

  Password varchar(32)否密码

  Name varchar(100)否姓名

  Birthday Date否出生日期

  Sex char(1)否性别

  telephone varchar(11)否手机号

  Email varchar(100)否邮箱

  Status char(1)否激活状态,“N”代表未激活,“Y”代表激活

  Code varchar(50)否激活码(唯一)

  线路信息表主要存储各个景点的介绍信息,包括收藏次数统计、是否上架、上架时间、是否主题旅游、所属分类、所属商家等信息,主键为rid(线路编号),线路信息表结构如表4.2所示。

  表4.2线路信息表

  字段名数据类型关键字备注

  Rid int(11)是线路编号

  Rname varchar(500)否线路名称

  续表4.2

  字段名数据类型关键字备注

  Price Double否价格

  routeIntroduce varchar(1000)否线路介绍

  Rflag char(1)否是否上架标志

  Rdate varchar(19)否上架时间

  isThemeTour char(1)否是否主题旅游标志

  Count int(11)否收藏次数统计

  cid int(11)否所属分类编号

  Rimage varchar(200)否景点图

  Sid int(11)否所属商家编号

  sourceId varchar(50)否抓取数据的来源ID

  线路分类表存储划分线路信息,例如分类编号、分类名称等,主键为cid,字段包括分类id和分类名称,线路分类表结构如表4.3所示。

  表4.3线路分类表

  字段名数据类型关键字备注

  cid int(11)是分类编号

  Cname varchar(100)否分类名称

  商家表存储商家信息,包括商家联系方式、商家注册名称、商家地址等,主键为sid(商家编号),商家表的结构如表4.4所示。

  表4.4商家表

  字段名数据类型关键字备注

  Sid int(11)是商家标号

  Sname varchar(200)否商家名称

  Consphone varchar(20)否商家电话

  Adress varchar(200)否商家地址

  线路图片表存储旅游景点的图片,包括商品图片ID、旅游商品ID、详情商品大图、详情商品小图等,主键为rgid(商品图片ID),线路图片表结构如表4.5所示。

  表4.5线路图片表

  字段名数据类型关键字备注

  Rgid int(11)是商品图片编号

  Rid int(11)否旅游商品编号

  bigPic varchar(200)否详情商品大图

  smallPic varchar(200)否详情商品小图

  管理员表用来存储管理员的账户信息,包括管理员用户名和密码,主键为id,管理员表结构如表4.6所示。

  表4.6管理员表

  字段名数据类型关键字备注

  id int(11)是管理员编号

  adusername Varchar(32)否管理员用户名

  adpassword Varchar(32)否管理员密码

  用户收藏表主要存储用户喜爱的旅游地点,包括所属线路编号、所属用户编号和收藏时间,主键为rid和uid,用户收藏表结构如表4.7所示。

  表4.7用户收藏表

  字段名数据类型关键字备注

  Rid int(11)是所属线路编号

  Uid int(11)是所属用户编号

  Date Date否收藏时间

  留言表主要存储游客的留言信息,包括留言昵称、留言标题、留言消息和留言时间等,主键为mid和uid,留言板信息表结构如表4.8所示。

  表4.8留言板信息表

  字段名数据类型关键字备注

  mid int(11)是留言信息编号

  uid int(11)是所属线路编号

  title Varchar(100)否留言标题

  content Varchar(2000)否发表的留言消息

  talker Varchar(32)否留言人昵称

  time Datetime否留言时间

  5网站具体实现

  5.1用户模块的实现

  5.1.1注册功能实现

  根据网站的设计需求,为方便用户浏览使用,网站应该提供注册功能,便于保护用户的私有空间或个人信息。注册表单的提交方式为post,防止个人信息泄露。同时为了增强用户体验,注册表单采用ajax异步方式提交。

  网站使用B/S模式,因此用户只需要打开浏览器,输入网址“http://localhost/travel/register.html”,注意localhost为本机地址,如果是在其他设备上,用户必须先获得服务器端的ip地址,将localhost换成服务器端ip地址,同时保证俩个设备在同一个局域网内,用户才可以进行访问本网站。用户注册需要填写相关个人信息,包括用户名、密码、邮箱、真实姓名、手机号、性别和出生日期。如果输入有误,会弹出警告框或错误信息提示,请按照提示修改自己的错误信息即可。注册界面如图5.1所示。

  图5.1注册界面

  注册流程图如图5.2所示。

  图5.2注册流程图

  网站设计框架采用maven三层架构,web层服务器端注册代码主要在UserServlet的regist方法中,regist方法获取用户提交的参数,使用BeanUtils封装到User类,调用UserServicImpl实现类中的regist方法查找用户是否注册并判断邮箱是否激活,在UserServicImpl中调用UserDaoImpl类中操作数据库的语句进行查询或更新数据库中的数据。

  注册页面关键代码如下:

  String check=request.getParameter("check");

  HttpSession session=request.getSession();

  String checkcode_server=(String)session.getAttribute("CHECKCODE_SERVER");

  if(checkcode_server==null||!checkcode_server.equalsIgnoreCase(check)){

  ResultInfo info=new ResultInfo();

  info.setErrorMsg("验证码错误");

  info.setFlag(false);

  String json=writeValueAsString(info);

  response.setContentType("application/json;charset=utf-8");

  response.getWriter().write(json);

  return;

  }

  //session.removeAttribute("CHECKCODE_SERVER");

  Map<String,String[]>map=request.getParameterMap();

  User user=new User();

  try{

  BeanUtils.populate(user,map);

  }catch(IllegalAccessException e){

  e.printStackTrace();

  }catch(InvocationTargetException e){

  e.printStackTrace();

  }

  //UserService userService=new UserServiceImpl();

  Boolean flag=userService.regist(user);

  ResultInfo info=new ResultInfo();

  if(flag){

  //注册成功

  info.setFlag(true);

  }else{

  info.setFlag(false);

  info.setErrorMsg("此用户名太受欢迎,请更换");

  }

  String json=writeValueAsString(info);

  response.setContentType("application/json;charset=utf-8");

  response.getWriter().write(json);

  5.1.2登录功能的实现

  用户在浏览器中输入“http://localhost/travel/login.html”网址,进入登录页面。登录时,需要填写用户名、密码和验证码,如果用户名或密码输入有误,会提示“用户名或密码错误”;如果验证码错误,会提示“验证码有误”。如果用户注册成功,尚未邮箱激活,会提示“用户尚未激活”信息,请登录邮箱点击激活链接进行激活。登录界面如图5.3所示,流程图如图5.4所示。

  图5.3登录界面

  图5.4登录流程图

  登录功能WEB层调用UserServlet中的login()方法。该方法先判断填写验证码是否正确,然后调用业务层中的userService的login获取用户信息,判断用户是否为空或是否激活,将返回的信息传入前端。完成登录之后,用户名将显示在页面右上角。

  关键代码如下:

  String check=request.getParameter("check");

  HttpSession session=request.getSession();

  String checkcode_server=(String)session.getAttribute("CHECKCODE_SERVER");

  if(checkcode_server==null||!checkcode_server.equalsIgnoreCase(check)){

  ResultInfo info=new ResultInfo();

  info.setErrorMsg("验证码错误");

  info.setFlag(false);

  String json=writeValueAsString(info);

  response.setContentType("application/json;charset=utf-8");

  response.getWriter().write(json);

  return;

  }

  Map<String,String[]>parameterMap=request.getParameterMap();

  User user=new User();

  try{

  BeanUtils.populate(user,parameterMap);

  }catch(IllegalAccessException e){

  e.printStackTrace();

  }catch(InvocationTargetException e){

  e.printStackTrace();

  }

  User u=userService.login(user);

  ResultInfo info=new ResultInfo();

  if(u==null){

  info.setFlag(false);

  info.setErrorMsg("用户名或密码错误");

  }

  if(u!=null&&!"Y".equals(u.getStatus())){

  info.setFlag(false);

  info.setErrorMsg("您尚未激活,请激活");

  }

  if(u!=null&&"Y".equals(u.getStatus())){

  request.getSession().setAttribute("user",u);

  info.setFlag(true);

  }

  writeValue(info,response);

  5.1.3收藏功能的实现

  收藏功能是网站里面一个重要的功能模块,该功能是方便用户的服务业务。当用户浏览到想要去的旅游地点,可以点击收藏功能,这样便用户下次查询。流程图如图5.8所示。

  用户在浏览器中输入地址“http://localhost/travel/route_detail.html?rid=11”,就可以进入线路详情界面。通过点击收藏按钮,当鼠标放在收藏按钮是一个禁止禁止状态时,表示收藏成功,并且收藏按钮旁边显示该线路被收藏次数,如若用户尚未登录,则给出提示信息“您尚未登录,请登录”,点击确定,跳转到登录页面。界面如图5.5所示。

  图5.5收藏界面

  点击收藏按钮,尚未登录状态,界面如图5.6所示。

  图5.6未登录点击收藏

  请点击警告框中的“确定”按钮,跳转到登录页面,输入正确的用户名、密码、验证码,完成登录。您可以在搜索框中输入旅游目的地,点击添加收藏,按钮状态变为灰色,表示收藏成功,收藏界面如图5.7所示。

  图5.7收藏成功界面

  图5.8收藏流程图

  用户收藏关键代码如下:

  //addFavorite添加收藏方法servlet

  String rid=request.getParameter("rid");

  User user=(User)request.getSession().getAttribute("user");

  int uid;

  if(user==null){

  return;

  }else{

  uid=user.getUid();

  }

  favoriteService.add(rid,uid);

  //service层代码

   Override

  public void add(String rid,int uid){

  favoriteDao.add(Integer.parseInt(rid),uid);

  }

  //dao层代码

   Override

  public void add(int rid,int uid){

  String sql="insert into tab_favorite values(?,?,?)";

  template.update(sql,rid,new Date(),uid);

  }

  5.2邮件激活模块的实现

  在完成注册之后,服务器会发送给用户一条激活链接,用户需要点击链接,完成邮件激活功能,用户只有激活成功,才可以登录。页面会转到登录界面,界面如图5.9所示,激活流程图如图5.10所示。

  图5.9激活成功界面

  图5.10激活流程图

  在UserServlet中active方法中,获取激活码,调用service中的active方法查询数据库中激活码,同时设置激活状态。

  关键代码如下所示:

  String code=request.getParameter("code");

  if(code!=null){

  //UserService userService=new UserServiceImpl();

  Boolean flag=userService.active(code);

  String msg=null;

  if(flag){

  msg="<h1>激活成功请<a href='../login.html'>登录</a></h1>";

  }else{

  msg="<h1><激活失败,请联系管理员</h1>";

  }

  response.setContentType("text/html;charset=utf-8");

  response.getWriter().write(msg);

  5.3线路查询模块的实现

  用户浏览网站时,想要查询某个旅游地点,按照需求在搜索框中输入如“西安”,点击搜索即可。该功能能够帮助游客快速找到相关信息。界面如图5.11所示。

  图5.11线路搜索界面

  在搜索框中输入“西安”,点击搜索,界面如图5.12所示。

  图5.12搜索结果界面

  搜索线路流程图如图5.13所示。

  图5.13搜索线路流程图

  当用户搜索结果显示信息量较大时,为了提升用户体验效果,使用分页功能较好。我们可以仿照百度的分页效果,一页显示10页,如果不足10页,直接显示总页数。分页效果图如图5.14所示。

  图5.14分页结果展示

  分页效果关键代码如下:

  String cidStr=request.getParameter("cid");

  String currentPageStr=request.getParameter("currentPage");

  String pageSizeStr=request.getParameter("pageSize");

  String rname=request.getParameter("rname");

  rname=new String(rname.getBytes("iso-8859-1"),"utf-8");

  int cid=0;

  if(cidStr!=null&&cidStr.length()>0&&!"null".equals(cidStr)){

  cid=Integer.parseInt(cidStr);

  }

  int currentPage=0;

  if(currentPageStr!=null&¤tPageStr.length()>0){

  currentPage=Integer.parseInt(currentPageStr);

  }else{

  currentPage=1;

  }

  int pageSize=0;

  if(pageSizeStr!=null&&pageSizeStr.length()>0){

  pageSize=Integer.parseInt(pageSizeStr);

  }else{

  pageSize=5;

  }

  PageBean<Route>list=service.pageQuery(cid,currentPage,pageSize,rname);

  writeValue(list,response);

  }

  5.4分类展示模块的实现

  分类展示模块主要给用户提供更明确的目的地,用户可以根据分类了解优质线路的功能模块,该模块可以查询车票、门票、酒店和国内游等详情展示。

  浏览器输入“http://localhost/travel/index.html”,进入网站主页面。用户可以通过分类目录点击进入相应的模块。分类列表如果是第一次请求加载界面,数据会从数据库中查询分类,加载可能存在延时,带给用户体验不好,为了不影响用户使用效果,我们应该使用redis,将从数据库中查询到的数据加载进内存,由内存加载进页面展示,分类界面如图5.15所示,流程图如图5.16所示。

  图5.15分类模块界面

  图5.16分类模块流程图

  分类模块关键代码如下:

   Override

  public List<Category>findAll(){

  Jedis jedis=JedisUtil.getJedis();

  Set<Tuple>categories=jedis.zrangeWithScores("category",0,-1);

  List<Category>cs=null;

  if(categories==null||categories.size()==0){

  //从数据库查询

  System.out.println("从数据库查询");

  cs=categoryDao.findAll();

  for(Category category:cs){

  jedis.zadd("category",category.getCid(),category.getCname());

  }

  }else{

  //从redis中查询

  System.out.println("redis查询...");

  cs=new ArrayList<Category>();

  for(Tuple tuple:categories){

  Category category=new Category();

  category.setCname(tuple.getElement());

  category.setCid((int)tuple.getScore());

  //System.out.println(category);

  cs.add(category);

  //System.out.println(cs);

  }

  }

  return cs;

  }

  5.5在线支付模块的实现

  在线支付模块主要给用户提供在线预订,当游客确定想去某个地点旅行时,可提前预定门票,方便用户。

  在线支付页面需要用户填写旅游日期、手机号(务必真实)、选择票数以及票价等信息,用户需在提交支付表单30分钟内完成支付,否则订单取消。在线支付界面如图5.17所示,流程图如图5.18所示。

  图5.17在线支付模块界面

  图5.18在线支付模块流程图

  在线预订模块关键代码如下所示:

  response.setContentType("text/html;charset=utf-8");

  String num=request.getParameter("num");

  String price=request.getParameter("price");

  String msg;

  if("".equals(num)||"".equals(price)){

  msg="<a href='../online_book.html'><h3>提交数据为空,请返回<h3></a>";

  }else{

  Object user=request.getSession().getAttribute("user");

  if(user==null){

  msg="<a href='../login.html'><h3>您尚未登陆,请登录<h3></a>";

  }else{

  int i=Integer.parseInt(num);

  int p=Integer.parseInt(price);

  int sum=i*p;

  System.out.println(sum);

  msg="<a href='../book.html'><h2>共"+num+"人,单人票价"+price+"元,总票价"+sum+"元.点击支付跳转到支付页面</h2></a>";

  }

  }

  response.getWriter().write(msg);

  5.6管理员模块的实现

  管理员模块主要是对用户账户信息进行查询、修改和删除。用户信息界面如图5.19所示,流程图如图5.20所示。

  图5.19用户信息管理界面

  图5.20用户信息管理流程图

  用户修改关键代码如下:

  Map<String,String[]>map=request.getParameterMap();

  User user=new User();

  try{

  BeanUtils.populate(user,map);

  }catch(IllegalAccessException e){

  e.printStackTrace();

  }catch(InvocationTargetException e){

  e.printStackTrace();

  }

  int count=adminService.update(user);

  ResultInfo info=new ResultInfo();

  if(count>0){

  //注册成功

  info.setFlag(true);

  }else{

  info.setFlag(false);

  info.setErrorMsg("修改失败!");

  }

  String json=writeValueAsString(info);

  response.setContentType("application/json;charset=utf-8");

  response.getWriter().write(json);

  5.7留言板模块的实现

  用户可在游客留言板中提出问题或发表评论,方便用户了解景点的详细信息。留言板界面如图5.21所示,流程图如图5.22所示。

  图5.21留言板界面

  图5.22留言板流程图

  留言板模块关键代码如下:

  String talker=request.getParameter("talker");

  String title=request.getParameter("title");

  String content=request.getParameter("content");

  String uid=request.getParameter("userID");

  ResultInfo info=new ResultInfo();

  if("".equals(talker)||"".equals(title)||"".equals(content)){

  info.setFlag(false);

  info.setErrorMsg("输入数据不能为空");

  return;

  }else{

  boolean flag=userService.saveMessage(talker,title,content,uid);

  if(flag){

  info.setFlag(true);

  }else{

  info.setFlag(false);

  info.setErrorMsg("数据提交失败");

  }

  }

  writeValue(info,response);

  6网站的测试与优化

  软件测试是为了评估设计的功能是否符合预期效果,在特定条件下,输入条件,输出我们想要的结果,发现程序在应用时是否存在bug或错误。这为日后的软件维护降低成本同时提高开发效率。对于此次网站的测试,我们可以采取多种方法,对网站从模块到整体的测试。

  6.1系统测试

  在进行测试之前,我们应该提前搭建好网站的运行环境。首先在idea中新建工程选择maven架构,运行环境中选择tomcat部署运行和测试,服务器启动之前,先打开redis-server.exe和redis-cli.exe,为了方便分类数据的加载,首先在本地安装好TOMCAT,配置好TOMCAT的端口和虚拟目录。利用IE、360浏览器、火狐浏览器和谷歌浏览器进行测试。

  网站开发过程中,不可避免的出现一些错误,因此系统化测试很有必要。我们必须站在用户的角度考虑,测试某功能是否会产生错误。测试流程图如图6.1所示。

  图6.1测试流程图

  软件测试过程一般包含以下4个层次。单元测试、确定测试、系统测试和集成测试,层次图如图6.2所示。

  图6.2测试层次图

  (1)单元测试模块

  单元测试的工具:在pom.xml引入Junit相关jar包坐标,在test类中具体方法上面加上 Test注解进行测试。

  针对被测代码或者被测的功能点先创建测试类,然后在类里面创建一个个测试方法。通过实例化对象调用被测方法,用断言进行实际值预期值比较。

  (2)集成测试模块

  一次性的集成big-bang:把所有通过了单元测试的模块按设计要求一次全部组装起来,然后进行整体测试,寻找出全局中的错误。

  (3)确定测试模块

  确认测试的目的是向未来的用户表明系统能够像预定要求那样工作。确认测试是为了进一步验证软件的有效性。

  (4)系统测试模块

  黑盒为主,对整个系统进行完整的测试,找出与需求不符合的地方,在系统测试中,提供完善的方案。

  6.2单元测试实例

  单元测试模块首先对注册功能进行测试,输入用户信息查看是否提示相应的错误,或注册成功,测试结果如表6.1所示。

  表6.1注册测试表

  测试要点测试数据测试结果

  用户名用户名已被注册过;输入“zhangsan”提示“此用户名太受欢迎,请更换”

  密码输入密码不符合定义的规则;输入“123”密码框标红,表示密码不符合6-20位单词字符

  邮箱非法邮箱格式;输入“sa123”输入框标红,表示邮箱不合法

  手机号非法手机号;输入“110”输入框标红,表示手机号不合法

  验证码验证码有误;输入不等于图片显示提示“验证码错误”

  用户名、密码、邮箱、手机号、姓名和验证码用户名、密码、邮箱、手机号、姓名和验证码都输入正确注册完成,跳转到注册成功页面

  针对登陆功能进行测试,检验登陆模块是否提示相应的错误,或登陆成功,测试结果如表6.2所示。

  表6.2登陆测试表

  测试要点测试数据测试结果

  用户名、密码用户名不存在、密码错误;输入用户名“baby”;密码“123456”提示“用户名或密码错误”

  验证码验证码错误;输入不等于验证码提示“验证码错误”

  邮箱、密码输入用户名、密码;输入“lisi”,密码“12345”提示“您尚未激活,请激活”

  用户名、密码、验证码用户名、密码、验证码都输入正确登录成功

  针对留言板功能进行测试,检验留言信息是否提交成功,测试结果如表6.3所示。

  表6.3留言信息测试表

  测试要点测试数据测试结果

  昵称、标题、内容昵称、标题、内容输入数据为空;提示“输入数据有误”

  发表评论用户未登录状态;提示“您尚未登录,请登录”

  6.3代码优化

  网站开发过中因为功能需求,每个功能都需要重写一个相应的类。导致代码冗余,我们把经常用到的代码提取到一个类中的方法内,提高开发效率。