随着人们生活水平的不断提升,人们对旅游的需求越来越旺盛,对旅游产品 和服务的质量要求也越来越高。伴随着计算机技术、网络技术的不断普及与应用, 人们通过网络浏览旅游信息,预订旅游产品,交流旅游体验的活动越来越多。旅 游在线预订系统应运而生。但是,当前的旅游在线预订系统存在诸多不足,包括: 系统界面不够美观,对用户没有吸引力;系统操作比较复杂,降低了潜在客户升 级为顾客的可能性;对旅游路线、导游、旅行团的管理比较粗放等;系统性能不 能满足用户不断提高的需求的要求。
针对旅游在线预订的背景以及目前存在的问题,论文从理论分析和项目实践 两方面进行阐述。在理论分析方面,论文介绍了国内外旅游在线预订系统的产生、 发展和运行现状,重点介绍了国内外学者对旅游在线预订行为的研究现状,通过 分析,明确了系统设计应紧密结合用户在线预订行为特征,确定了系统设计的基 本原则和方向。随后,在理论研究和用户需求分析的基础上,论文介绍了旅游在 线系统的相关技术、设计、开发、测试、评价的整个过程。系统技术上,采用轻 量级 Java EE 开发技术,及 Springboot,数据库采用 MySQL 数 据库管理系统,系统设计上,分别从总体设计、业务流程设计、 页面设计、数据库设计等方面进行了论述。在系统开发上,分别从普通用户、旅 行团管理员、超级管理员等角色出发,对系统页面实现、 Action 文件、 DAO 文 件和其他文件及核心源代码进行了阐述。最后,通过不同的角色,不同的角度对 系统进行了测试,结果表明,系统基本能够满足用户在线预订旅游产品的需求。
通过研究,本文对旅游在线预订系统的理论研究具有一定的参考价值,对旅 游在线预订系统的设计与开发具有一定的借鉴意义。
系统演示视频:
【java毕业设计】SpringBoot旅游网源码和论文java旅游管理系统
### **主要功能介绍**
用户登录、注册、个人资料、景点列表、相册墙、购买景点、评论、酒店管理和一整套后台管理系统等。
### 软件架构
1.数据库:MySql5.7
2.前端:Layui,BootStrap,Echars等技术
3.后台:SpringBoot、SpringDataJpa等
4.架构模式:
5.模板引擎:thymeleaf
6.项目管理:Maven
7、JDK版本:1.8
8、QQ邮箱验证服务
9、主要算法:Twitter雪花算法(ID生成策略)、Bcrypt(密码加密)、JPA排序、推荐算法
随着我国经济的快速发展和人民生活水平的不断提升,旅游已经成为人们生 活不可或缺的需求。旅游业已经从一般性产业上升为国家战略性支柱产业。据统 计,2009 年-2017 年,国内旅游人次和旅游收入增长态势明显,旅游总收入年均增 长率始终在 10%以上。2013 年,国务院批准发布的《国民旅游休闲纲要》文件, 明确指出了与小康社会相配套的现代旅游体系的愿景。据乐观的估计,2020 年, 我国旅游产业规模将会在2012 年的水平基础上再翻一番,达到60 亿人次[1]。
随着信息技术、网络技术的迅速发展和国内旅游消费环境不断升级与优化, 我国在线旅游市场的规模正在不断扩大。1999年,携程网率先将中国带入在线旅 游时代,随后社会资本不断注入旅游行业,在线旅游迎来了新一轮高速发展的黄 金时代[2]。应用不断普及的互联网技术为游客行前查询资料、预订出游产品、行中 获取实时信息、行后分享旅游心得与体会提供了很好的技术平台。近年来,各种 各样的旅游网站不断涌现,综合性网站中旅游栏目内容越来越丰富,界面越来越 诱人。据统计,国内已拥有5000多家具有一定资讯服务实力的旅游网站,可以提 供食、住、行、游、购、娱等方面的网上旅游服务[3]。
本文选题基于以上背景,拟根据游客在线预订行为特征,设计和开发一种旅 游在线平台,从而满足人们在线预订旅游产品的迫切需求。同时,论文选题来源 于国内某一小型旅行社旅游信息系统。选题拟从对旅行团游客在线旅游预订行为 特征的研究出发,分析旅游社对旅行团管理、导游管理、旅游线路管理、系统管 理等方面的需求,利用Java EE技术,设计并开发一种旅游高效快捷在线预订系 统,满足旅行团对旅游在线预订的需求。
- 研究意义与价值
论文针对当前旅游现状和需求,详细的分析游客在线预订旅游产品的行为, 根据分析结论,设计和开发一种在线旅游预订系统。其研究意义和应用价值主要 体现在:
- 论文在国内外对游客在线预订旅游产品的行为研究的基础上,分析影响 旅行团游客购买旅游产品的诸多因素,针对这些因素,针对性的设计系统的主要 功能,这对旅游在线研究具备一定的研究意义,也为类似平台的开发提供一定的 参考。
- 系统采用了目前比较流行的 Java EE 技术和 Struts2、Spring、Hibernate 框架技术,有利于系统快捷方便的部署在服务器上,便于系统的实施、普及与推 广。
- 线路管理模块使得旅行社方便快捷的为旅行团设计科学合理、灵活自由的 旅游线路,尤其为旅行团在预订阶段提供了重要的参考资料,便于旅行团的旅游 决策。
- 系统的设计、实施和应用,方便了旅行团在线预订旅游产品和服务,使得 旅行社能够顺应时代潮流,转变工作理念和方式,在市场经济不断变化的情况下, 处于主动的地位,赢得利润和实现价值。
- 国内外研究现状
国外学者对旅游在线预订行为的研究比较早,Ajzen等人率先提出一种理性 行为理论(TRA)[4]。该理论假设人们的行为完全是由理性支撑的,消费需求直接反 映了人的动机[5]。后来,Davis改进了 TRA,创建了技 术接 受模型TAM[6]。 TAM模型认识到网站能够部分的影响消费者的消费意愿[7]。后续,Ajzen又完善 了 TRA,创设了计划行为理论TPB[8],该理论深入分析了消费者的理性行为°Matzler 等人发现火车票订票网站的可用性与消费者订票行为有着比较紧密的关系[9]。 Cosmaa等人深入分析了罗马尼亚人的在线预订偏好,认为罗马尼亚人更偏向于通 过线下渠道选购旅游服务[10]。
国内对于旅游在线预订行为的研究起步比较晚,研究者侧重于分析和比较网 络环境下游客预订行为与传统消费行为的不同。刘子龙等人认为游客在进行旅游 决策时主观性更强,消费行为更加理性[11]。而张猛等人则发现游客在网络中能够 更加主动的使用旅游搜索服务来选订旅游产品[12]。安蓉等人指出互联网背景下游 客对旅游服务的信任的建立相对于线下更加复杂[13]。
package com.xingying.travel.controller.User;
import com.xingying.travel.common.Result;
import com.xingying.travel.dao.HotelDao;
import com.xingying.travel.dao.ScenicDao;
import com.xingying.travel.pojo.Hotel;
import com.xingying.travel.pojo.Hotel_orders;
import com.xingying.travel.pojo.Scenic;
import com.xingying.travel.service.HotelService;
import com.xingying.travel.service.Hotel_ordersService;
import com.xingying.travel.service.ScenicService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.data.domain.Page;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.*;
/**
*
* @Date:2019
*/
@Controller
@CrossOrigin
@RequestMapping("/travel")
public class RecomTravelController {
@Autowired
private ScenicService scenicService;
@Autowired
private ScenicDao scenicDao;
@Autowired
private HotelService hotelService;
@Autowired
private HotelDao hotelDao;
/**
* 查询所有景点
* @return
*/
@RequestMapping("/test")
public String all_attrs1(Model model){
return "page/test.html";
}
/**
*查询星级
* @return
*/
@ResponseBody
@RequestMapping(value = "/star",method = RequestMethod.POST)
public Result judgeStar(String id,String start){
System.out.println(id+"===="+start);
Optional<Scenic> s = scenicDao.findById(id);
if (s.isPresent()){
Scenic scenic = s.get();
int valuestar = (Integer.valueOf(start)+Integer.valueOf(scenic.getStart()))/2;
scenic.setStart(valuestar);
scenicDao.save(scenic);
System.out.println("数据不为空!");
return new Result(true,1,"","");
}else {
System.out.println("数据为空!");
return new Result(false,0,"","");
}
}
/**
*查询酒店
* @return
*/
@ResponseBody
@RequestMapping(value = "/hotel",method = RequestMethod.POST)
public Result judgeHotelStar(String id,String start){
System.out.println(id+"===="+start);
Hotel scenic = hotelService.findById(id);
if (scenic!=null){
int valuestar = (Integer.valueOf(start)+Integer.valueOf(scenic.getStar()))/2;
scenic.setStar(valuestar);
hotelDao.save(scenic);
System.out.println("数据不为空!");
return new Result(true,1,"","");
}else {
System.out.println("数据为空!");
return new Result(false,0,"","");
}
}
/**
* 查询所有景点
* @return
*/
@RequestMapping("/AllAttrs")
public String all_attrs(Model model){
List<Scenic> attrs=scenicService.findAll();
System.out.println("进入查询!"+attrs.toString());
model.addAttribute("attrs",attrs);
return "page/travel::table_refresh";
}
/**
* 景点分页
* @param start
* @param limit
* @return
*/
@RequestMapping("/page_attrs")
public String page_attrs(Model model,@RequestParam(value = "start" ,defaultValue = "0")Integer start,
@RequestParam(value = "limit" ,defaultValue = "6")Integer limit){
start=start<0?0:start;
Sort sort=new Sort(Sort.DEFAULT_DIRECTION,"id");
Pageable pageable=PageRequest.of(start,limit,sort);
Page<Scenic> page=scenicDao.findAll(pageable);
model.addAttribute("attrs",page);
model.addAttribute("number",page.getNumber());
model.addAttribute("numberOfElements",page.getNumberOfElements());
model.addAttribute("size",page.getSize());
model.addAttribute("totalElements",page.getTotalElements());
model.addAttribute("totalPages",page.getTotalPages());
model.addAttribute("first",page.isFirst());
model.addAttribute("last",page.isLast());
return "page/travel::table_refresh";
}
/**
* 查询单个景点
* @param model
* @param id
* @return
*/
@RequestMapping("/oneAttr")
public String One_attr(Model model,String id){
System.out.println("id为:"+id);
Scenic scenic=scenicService.findById(id).get();
System.out.println(scenic.toString());
model.addAttribute("oneAttr",scenic);
//return "page/product::table_refresh";
return "page/product.html";
}
/**
* 景点模糊查询分页
* @param model
* @param start
* @param limit
* @param search_key
* @return
*/
@RequestMapping("/search_attrs")
public String search_attrs(Model model,@RequestParam(value = "start" ,defaultValue = "0")Integer start,
@RequestParam(value = "limit" ,defaultValue = "6")Integer limit,
@RequestParam String search_key){
start=start<0?0:start;
Sort sort=new Sort(Sort.Direction.DESC,"id");
Pageable pageable=PageRequest.of(start,limit,sort);
Specification specification=new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> scenics=new ArrayList<>();
if (StringUtils.isNotBlank(search_key)){
scenics.add( criteriaBuilder.like(root.get("name"),"%"+search_key+"%"));
}
return criteriaBuilder.and(scenics.toArray(new Predicate[scenics.size()]));
}
};
Page<Scenic> page=scenicDao.findAll(specification,pageable);
model.addAttribute("attrs",page);
model.addAttribute("number",page.getNumber());
model.addAttribute("numberOfElements",page.getNumberOfElements());
model.addAttribute("size",page.getSize());
model.addAttribute("totalElements",page.getTotalElements());
model.addAttribute("totalPages",page.getTotalPages());
model.addAttribute("first",page.isFirst());
model.addAttribute("last",page.isLast());
return "page/travel";
}
@RequestMapping("/local")
public String localRefresh(Model model,String id) {
System.out.println("id::====="+id);
Scenic scenic=scenicService.findById(id).get();
// Sort sort=new Sort(Sort.Direction.DESC,"star");
System.out.println(scenic.toString());
List<Hotel> hotels=hotelService.findByCountryLike(scenic.getContry());
System.out.println("2222"+hotels.toString());
Collections.sort(hotels, new Comparator<Hotel>() {
@Override
public int compare(Hotel o1, Hotel o2) {
if (o1.getStar()<o2.getStar()){
return 2;
}
if (o1.getStar().equals(o2.getStar()) ){
return 1;
}
return -1;
}
});
if (hotels.size()>=4){
List newList=hotels.subList(0,3);
model.addAttribute("scenics",newList);
System.out.println("个数:"+newList.size());
}else {
model.addAttribute("scenics",hotels);
System.out.println("个数2:"+hotels.size());
}
return "page/product::table_refresh";
}
}