SpringBoot旅游网源码和论文

本文围绕Spring Boot旅游网开发展开,分析了国内旅游网站发展现状与传统旅游模式的不足,明确开发目的与意义。介绍了相关技术和开发环境,阐述了网站需求、设计、实现细节,并对关键功能进行测试,最后总结网站并分析问题与未来扩展方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【512】SpringBoot旅游网源码和论文

问题的提出

首先对国内旅游网站发展现状进行分析,并且对新型旅游网站的发展趋势做 深入分析,总结出开发旅游网站目的与意义。然后对设计和开发旅游网站中所用 到的相关技术和开发环境进行介绍。然后介绍旅游网站的需求、设计、实现的细 节。然后对旅游网站的关键功能进行全面测试。最后对旅游网站的设计和实现进 行总结,对网站存在的问题和网站未来的扩展进行分析。

1.2 选题背景及意义

随着人民生活品质的提高,百姓对于旅游的需求越来越强烈。旅游是一个集 吃、住、行、游、购、各个环节为一体的综合性行业,旅游的产业链的发展可以 带动相关其他产业链的发展,可以刺激社会经济的增长。近年来,无论是国内游 还是出境游,我国旅游业都取得了长足的发展,在世界旅游市场中的地位得到了 大幅度地提升。随着网络技术的发展和普及,旅游网站可以为消费者提供新型旅 游服务的网络平台,提供一种更加自由和个性化的旅游服务。国内的旅游网站有 马蜂窝、去哪儿网、携程网、艺龙网等,提供酒店预订、火车票预订、飞机票预 订、门票预订、线路规划、向导提供等功能。这些网站摆脱了传统旅游的各种限 制,把旅游的自主权还给消费者。

目前传统旅游的模式已经无法满足当前消费者的旅游需求。传统旅游存在诸 多限制如下:线路和景点非常固定,无法提供更加个人化的选择。传统旅游为更 加景点数和缩短天数,每天的行程安排极不合理,导致多数消费者出现更加疲惫 的感觉,与旅游的最终目的南辕北撤。传统旅游其实增加了热门景点的压力,导 致旅游质量的下降。传统旅游线路数量多、内容杂,消费者为了挑选一条合适自 己的线路,往往要花更多的时间去研究,间接地降低消费者的消费欲望。

通过分析传统旅游的缺点,我们可以明确传统旅游业无法满足日益多元化的 消费者。在消费者追求更加个性化的旅游体验之下,旅游网站就能提供相应的服 务。因此我想通过开发旅游网站提供更好的旅游体验和服务。目前,我国有数以 百万计的自由行游客,他们热爱旅游、热爱生活。这些旅游爱好者们喜欢自由行, 同时追求更加个人化的旅游体验。随着网络技术的发达,旅游网站应运而生。它 可以带给游客一种全新的旅游体验,是一个集旅游结伴、旅游分享和推荐优质旅 游线路的网站。在旅游网站中,你可以通过旅游结伴,找到与自己志趣相投的人 一起踏上旅途,从而更加旅游的乐趣。在旅游结伴中,可以更好地了解到旅游景 区的特点和新开发的旅游景点;也可以通过旅游分享,获取最新的旅游资讯和分 享自己的旅游历程,除此之外,该网站还可以为广大的旅游提供可靠准确的旅游 攻略,让用户更好地做好出行准备。当然,旅游爱好者可以关注网站推荐的线路, 获取最新最优质的旅游线路,实现更加快捷的出行方式和更个性化的旅游服务; 更令人惊喜的是,网站还会与各种旅游俱乐部合作推出各种大型的旅游活动,提 供更加新颖和更加优质的短途路线。

国内外研究现状

相对传统旅游模式,国内旅游网站迅速地发展起来,如去哪儿网、携程网、 途牛网、艺龙旅游网和酷讯网等。这些旅游网站从预订酒店和机票的平台,后来 发展成一个更加自由和更加个性化的旅游服务平台。国内旅游网站提供一个旅游 平台,让商家和消费者具有更多的自主权。在国内新型旅游网站的发展下,消费 者可以更加方便地查询火车票、机票、酒店、门票和旅游咨询等。最初电子商务 概念进入旅游行业时,只能实现在线查询线路、机票、酒店等业务,其真正交易 还是在线下进行的。特别是在酒店、票务、交通等方面,仍然需要一个很大的支 持平台。随着“互联网+”时代的到来,信息化成为提高旅游品质的重要手段, 在线旅游拥有提供在线订购所有服务的功能。如今,类似艺龙网、携程网的旅游 网站越来越多。线上的旅游服务降低游客和商家的成本,提高了出行效率和多元 化。需求多元化的消费者需要个性化、自由化、差异化的定制旅游。在不久的未 来,游客出行旅游的各个环节都可以通过旅游网完成。相对于国内而言,19世 纪 70 年 代 , 美 国 , 欧洲 发 达 国 家 等 国 家 开 始 对 旅游服务 技术 创 新 开 始 研 究 ,但 是还未形成庞大规模。90 年代,国外互联网业开始对于旅游产业电子商务有所 研究。国外互联网业对旅游产业的主要研究在于旅游网络的铺设,旅游景点与产 品的营销,旅游电子商务平台等。随着网络日益完善,更多的商家与国外旅游网 站进行更加紧密的合作模式。此外,国外另一种新型旅游平台也在慢慢发展,这 种旅游平台提供一个旅游交流平台,让用户享受更加自主的出行模式。用户通过 结伴系统可以寻找志同道合的旅友,并且跟他们一起出行。这些平台还可以帮助 喜欢自驾游的用户寻找车队,提供更加安全的出行方式[1]。总体而言,基于web 平台的旅游网站设计是一个逐渐兴起的领域, 是在网站设计的基础上引入旅游业 的元素而产生的。 国内旅游网站设计近年来发展迅速, 国外着重研究了互联网与 旅游产业结合后的服务模式, 国内外的旅游网站都是大势所趋, 将来的旅游线上 模式将会越来越成熟, 相关产品也会越来越完善,正在进行的旅游大数据研究也 将在将来扮演极其重要的角色。

1.4 研究方法

本文主要采用的研究方法是通过阅读文献、模拟法和信息查阅。 首先通过阅 读文献, 确定研究目标, 根据文献提供的资料, 对研究对象有了初步了解。 利用 模拟法建立网站雏形, 并通过信息的收集、加工、整合, 帮助我掌握运用规律。

1.5 论文的结构安排

第一章介绍开发旅游网站的背景、旅游网站的发展现状。 对旅游网站的特性 进行分析, 说明开发目的与意义。 第二章介绍开发旅游网站所用到的相应技术和 开发环境。 第三章从技术、经济、操作等角度上分析开发的网站的可行性, 并且 从用户的使用需求和体验角度上得出网站的需求分析。第四章通过网站的需求分 析,提出网站结构和功能的设计方案。 第五章介绍网站各个模块的详细设计和实 现。 第六章对网站关键功能进行测试,发现潜在问题。 第七章对网站的总结与致 谢。

package com.xingying.travel.controller;

import com.xingying.travel.common.PageResult;
import com.xingying.travel.common.Result;
import com.xingying.travel.common.StatusCode;
import com.xingying.travel.pojo.User;
import com.xingying.travel.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;


/**
 * 控制器层
 *
 *
 */
@RestController
@CrossOrigin
@RequestMapping("/user")
public class UserController {

	@Autowired
	private UserService userService;

	@Autowired
	private RedisTemplate redisTemplate;

	@Autowired
	private HttpServletRequest request;

	@Autowired
    BCryptPasswordEncoder encoder;



    /**
     * 查询全部数据
     *
     * @return
     */
    @RequestMapping(method = RequestMethod.GET)
    public Result findAll() {
        return new Result(true, StatusCode.OK, "查询成功", userService.findAll());
    }

    /**
     * 根据ID查询
     *
     * @param id ID
     * @return
     */
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public Result findById(@PathVariable String id) {
        return new Result(true, StatusCode.OK, "查询成功", userService.findById(id));
    }


	/**
	 * 分页+多条件查询
	 * @param searchMap 查询条件封装
	 * @param page 页码
	 * @param size 页大小
	 * @return 分页结果
	 */
	@RequestMapping(value="/search/{page}/{size}",method=RequestMethod.POST)
	public Result findSearch(@RequestBody Map searchMap , @PathVariable int page, @PathVariable int size){
		Page<User> pageList = userService.findSearch(searchMap, page, size);
		return  new Result(true,StatusCode.OK,"查询成功",  new PageResult<User>(pageList.getTotalElements(), pageList.getContent()) );
	}

	/**
     * 根据条件查询
     * @param searchMap
     * @return
     */
    @RequestMapping(value="/search",method = RequestMethod.POST)
    public Result findSearch( @RequestBody Map searchMap){
        return new Result(true,StatusCode.OK,"查询成功",userService.findSearch(searchMap));
    }
	
	/**
	 * 增加
	 * @param user
	 */
	@RequestMapping(method=RequestMethod.POST)
	public Result add(@RequestBody User user  ){
		userService.add(user);
		return new Result(true,StatusCode.OK,"增加成功");
	}
	
	/**
	 * 修改
	 * @param user
	 */
	@ResponseBody
	@RequestMapping(value="/{id}",method= RequestMethod.PUT)
	public Result update(@RequestBody User user, @PathVariable String id ){
		User oldUser=userService.findById(id);
		user.setId(id);
		user.setPassword(oldUser.getPassword());
		userService.update(user);
		return new Result(true,StatusCode.OK,"修改成功");
	}

	/**
	 * 修改
	 * @param user
	 */
	@RequestMapping(value="/change",method= RequestMethod.POST,consumes = "application/json")
	public Result update(@RequestBody User user, HttpSession session){
		User us= (User) session.getAttribute("user");
		user.setId(us.getId());
		user.setPassword(us.getPassword());
		userService.update(user);
		return new Result(true,StatusCode.OK,"修改成功");
	}
	
	/**
	 * 删除
	 * @param id
	 */
	@RequestMapping(value="/{id}",method= RequestMethod.DELETE)
	public Result delete(@PathVariable String id ){
		userService.deleteById(id);
		return new Result(true,StatusCode.OK,"删除成功");
	}
	/**
	 * 发送短信验证码
	 *
	 * @return
	 */
	@RequestMapping(value = "/sendsms/{mobile}", method = RequestMethod.POST)
	public Result sendSms(@PathVariable String mobile) {

		userService.sendSms(mobile);
		return new Result(true, StatusCode.SMS, "验证码已发送至你的手机,请注意查收");
	}


	/**
	 * 发送邮箱验证码
	 * @param email
	 * @return
	 */
	@RequestMapping(value = "/sendEmail/{email}", method = RequestMethod.POST)
	public Result sendEmail(@PathVariable String email) {

		userService.sendEmail(email);
		return new Result(true, StatusCode.SMS, "验证码已发送至你的邮箱,请注意查收");
	}


	/**
	 * 用户注册
	 * @param code
	 * @param user
	 * @return
	 */
	@RequestMapping(value = "/register1",method = RequestMethod.POST)
	public Result regist(@RequestBody User user){
		Result findemail = findemail(user);
		if (findemail.getCode() != 0) {
			return findemail;
		}
			userService.add(user);
			return new Result(true,StatusCode.OK,"注册成功");

	}

	/**
	 *判断账号是否存在
	 * @param user
	 * @return
	 */
    @RequestMapping(value = "/register",method = RequestMethod.POST)
	@ResponseBody
    public Result findsame(@RequestBody User user){

		System.out.println("拿到的手机号码"+user.getMobile());
		String phone = user.getMobile();

		User userphone= userService.findByMobile(phone);

		if (userphone == null){
			return new Result(true,StatusCode.OK,"该手机号可以注册");
		}
		return new Result(false,StatusCode.ERROR,"该手机号已经被注册");
	}



	@RequestMapping(value = "/email",method = RequestMethod.POST)
	@ResponseBody
	public Result findemail(@RequestBody User user){

		System.out.println("拿到的email"+user.getEmail());
		String email = user.getEmail();

		User useremail= userService.findByEmail(email);

		if (useremail == null){
			return new Result(true,StatusCode.OK,"该邮箱可以注册");
		}
		return new Result(false,StatusCode.ERROR,"该邮箱已经被注册");
	}





	/**
	 * 用户登录
	 * @param loginMap
	 * @return
	 */
	@RequestMapping(value="/login",method=RequestMethod.POST)
	public Result login(@RequestBody Map<String,String> loginMap,HttpServletRequest request){
		  String mobile = loginMap.get("login");
		  System.out.println("打印手机号:--->"+mobile);
		  //手机号正则,判断输入是否为手机号
		  String ph = "^[1][3578]\\d{9}$";
		  System.out.println("正则---->"+mobile.matches(ph));
		if (mobile.matches(ph)){
			User user = userService.findByMobileAndPassword(loginMap.get("login"),loginMap.get("password"));
			if(user!=null){
				request.getSession().setAttribute("user",user);
				//String token = jwtUtil.createJWT(user.getId(), user.getNickname(), "user");
				Map map=new HashMap();
				//	map.put("token",token);
				map.put("name",user.getName());//姓名
				return new Result(true,StatusCode.OK,"登陆成功",map);
			}else{
				return new Result(false,StatusCode.LOGINERROR,"用户名或密码错误");
			}
		}else {
			User user =  userService.findByNameAndPassword(loginMap.get("login"),loginMap.get("password"));
			if(user!=null){
				request.getSession().setAttribute("user",user);
				//String token = jwtUtil.createJWT(user.getId(), user.getNickname(), "user");
				Map map=new HashMap();
				//	map.put("token",token);
				map.put("name",user.getName());//姓名
				return new Result(true,StatusCode.OK,"登陆成功",map);

			}else{
				return new Result(false,StatusCode.LOGINERROR,"用户名或密码错误");
			}
		}
	}


	/**
	 *  用户注销
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	@RequestMapping(value="/logout",method=RequestMethod.GET)
	public void logout(HttpServletRequest request,HttpServletResponse response) throws IOException {
        request.getSession().setAttribute("user", null);
        response.sendRedirect(request.getContextPath() + "/dist/view");

    }

}
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";
    }



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿毕业分享网

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值