A-计算机毕业设计定制:83429旅游网站设计与实现(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C# 、C++、python、数据可视化、大数据、全套文案

摘 要

随着旅游行业的快速发展,人们越来越喜欢通过互联网预订旅行服务。TravelHub旅游网站致力于为用户提供便捷、全面的旅游信息和在线预订、支付、签证服务。该网站的开发能够解决了传统旅行服务效率低、信息不全面、预订流程繁琐等问题,实现旅游服务的数字化、个性化和智能化,能够简化出行流程和提升旅游体验。

本文根据实际要求决定该网站将利用Springboot技术框架构建后端服务,用JSP技术来实现动态的页面,采用Java语言进行编码,并使用MySQL数据库来存储和管理数据。主要分析了用户需求和市场趋势,设计了一个功能齐全、界面简洁、操作流畅的旅游信息获取、推荐和在线预订、签证网站。系统运行实现包括但不限于公共管理、用户管理、资讯管理、航班信息、机票订单、景点信息、酒店信息、酒店订单、签证服务等功能。

本系统经过功能测试,实现了包括但不限于用户登录和注册,及搜索查看航班信息、景点信息、酒店信息,在线预订和支付,及提供签证服务等功能,并以真实数据一一进行相关功能项目的测试输入,最终能够保证每个项目涉及的功能都是能够正常运行,因此能够保证本次设计的,已实现的功能能够正常运行并且相关数据库的信息也同样保证正确。

关键词:旅游网站 Springboot+jsp MySQL数据库


ABSTRACT

With the rapid development of the tourism industry, people increasingly like to book travel services through the Internet. TravelHub travel website is committed to providing users with convenient and comprehensive travel information, as well as online booking, payment, and visa services. The development of this website can solve the problems of low efficiency, incomplete information, and cumbersome booking processes in traditional travel services, achieve digitalization, personalization, and intelligence of tourism services, simplify travel processes, and improve travel experience.

This article conducts market research and determines based on actual requirements that the system will use the Springboot technology framework to build backend services, use JSP technology to implement dynamic pages, use Java language for coding, and use MySQL database to store and manage data. We mainly analyzed user needs and market trends, and designed a fully functional, concise interface, and smooth operation travel information acquisition, recommendation, online booking, and visa website. The system operation implementation includes but is not limited to functions such as public management, user management, information management, flight information, ticket orders, attraction information, hotel information, hotel orders, visa services, etc.

This system has undergone functional testing and has achieved functions including but not limited to user login and registration, as well as searching and viewing flight information, attraction information, hotel information, online booking and payment, and providing visa services. Real data is used to test and input relevant functional items one by one, ultimately ensuring that each project's functions can operate normally. Therefore, it can ensure that the designed and implemented functions can operate normally and the information in the relevant database is also guaranteed to be correct.

Key words: travel website  Springboot+JSP MySQL database


目  录

第一章 绪论

1.1项目背景

1.2项目意义

1.3国内外研究现状

1.4开发工具介绍

1.4.1 Java编程语言

1.4.2 MySQL数据库

1.4.2 Springboot框架

1.4.2 JSP技术

第二章  需求分析

2.1系统概述

2.2系统功能需求

2.3系统性能需求

2.4可行性分析

2.5开发环境

第三章  总体设计

3.1系统总体设计

3.2功能模块设计

3.3数据库设计

第四章  详细设计及实现

4.1前台界面设计与实现

4.2后台功能设计与实现

4.3数据库连接

第五章  系统测试

5.1测试任务及目的

5.2测试计划

5.3测试用例

5.4测试结论

结  论

谢  辞

参考文献

附  录

第一章 绪论

1.1项目背景

旅游业的快速发展和互联网技术的普及使得旅游网站成为了人们获取旅游信息和进行预订的重要渠道。设计与实现TravelHub旅游网站能够为用户提供便捷、全面的旅游信息和提供高效的旅游服务,满足旅游需求的日益增长。

本文通根据实际要求决定该网站将利用Springboot技术框架构建后端服务,用JSP技术来实现动态的页面,采用Java语言进行编码,并使用MySQL数据库来存储和管理数据。主要分析了用户需求和市场趋势,设计了一个功能齐全、界面简洁、操作流畅的旅游信息,包括旅游资讯、航班信息、景点信息、酒店信息、签证服务等信息的获取、和推荐和在线预订网站。通过个性化推荐,帮助用户规划行程、浏览旅游信息,订购机票和酒店,进行旅游签证操作,并实现在线支付功能。

1.2项目意义

TravelHub旅游网站的的设计和实现的旨在满足用户对旅游信息的需求,为用户提供全面的旅游信息和服务,解决传统旅行服务效率低、信息不全面、预订流程繁琐等问题。通过该网站,集成各种旅游资源和服务,为用户提供一站式的旅游务方案,用户可以轻松查找和比较航班信息、酒店信息、景点信息、签证服务等旅游资源,进行预订和管理,并实现在线支付功,并提供签证服务,能解决用户在旅游过程中的信息搜索和预订的繁琐问题,可以简化出行流程,节省用户时间和精力,并提升用户旅游体验。同时,通过管理员的后台管理功能,实现对系统各项业务的监控和管理,可以发布旅游相关的信息内容,包括旅游资讯、航班信息、景点信息、酒店信息、签证服务等,方便用户获取相关信息,提高运营效率和服务质量,改善了用户体验,使用户能够更便捷地规划和享受旅游。

1.3国内外研究现状

在国内外,旅游网站设计与实现已经有了许多成功案例。这些网站通常提供多样化的功能,包括用户管理、航班信息、酒店信息、景点信息等。一些网站还提供签证服务,方便用户规划出境旅行。最近几年,随着人工智能和大数据技术的发展,旅游网站的个性化推荐和定制功能也逐渐得到了加强。

国内方面,很多旅游网站通过与航空公司、酒店、景区等合作,提供了丰富的资源和服务,用户体验得到了不断优化。同时,一些网站也通过大数据分析用户行为,精准推荐旅游产品,提高了用户满意度和转化率。

而国外方面,一些知名的旅游网站如Booking.com、TripAdvisor、Expedia等,在全球范围内提供了丰富的旅游资源和服务。它们的用户界面设计和功能布局经过多年的优化,为用户提供了便捷的预订和管理服务。同时,这些网站也通过与各方合作,不断扩大业务范围,提高了竞争力和用户认知度。

总的来说,现有的国内外旅游网站在功能设计和用户体验方面已经相当成熟,通过借鉴和学习他们的经验,结合自身的特点和优势,设计和实现TravelHub旅游网站将会更加顺利和成功。

1.4开发工具介绍

1.4.1 Java编程语言

Java编程语言是一种面向对象的高级编程语言,以其简单、可移植、安全和高性能等特点在软件开发领域广泛应用。通过支持类、对象、继承、多态等面向对象概念,Java提供了结构化的编程方式,使代码更易读、维护和重用。其可移植性得益于Java虚拟机(JVM),使得Java程序可以在不同平台上运行,只需编写一次代码。Java注重安全性,提供了字节码验证、异常处理和访问控制等安全机制,确保程序的稳定和安全。此外,Java还拥有丰富的类库和框架,覆盖了各个领域,如图形界面、数据库操作和企业级应用。总而言之,Java作为一门成熟且强大的编程语言,在软件开发中发挥着重要作用,帮助开发者轻松构建可靠、可移植和安全的应用程序。MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),其稳定性、可靠性和卓越性能使其成为众多应用程序的首选数据库。

1.4.2 MySQL数据库

MySQL支持标准SQL语法,并提供丰富的功能和特性,如事务处理、触发器和存储过程等,以满足开发者对数据管理和操作的需求。MySQL具有良好的可扩展性,支持主从复制、分布式架构和集群部署,适用于各种规模和负载的应用场景。作为一个开源项目,MySQL拥有庞大的用户社区和活跃的开发者社区,为用户提供了丰富的文档、教程和支持资源。总之,MySQL是一款可靠、强大且灵活的关系型数据库管理系统,通过其卓越性能和可扩展性,帮助开发者高效地管理和操作数据,并得到了广大用户的认可和应用。

1.4.2 Springboot框架

Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。SpringBoot基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。

1.4.2 JSP技术

JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。


第二章  需求分析

2.1系统概述

本TravelHub旅游网站首先根据使用该网站的用户的角色的不同分为:普通用户,管理员。

根据用户需求主要分为两个模块:普通用户,管理员。其中普通用户模块主要实现普通用户的注册登录,能够查看首页、通知公告消息,可以搜索和浏览旅游资讯、航班信息、景点信息、酒店信息、签证服务、对我的账户、个人中心(个人首页、机票订单、酒店订单、签证服务、收藏)等功能进行管理。

普通用户角色的用例展示如图2-1所示。

图2-1  普通用户角色用例图

管理员模块主要负责公共管理、用户管理、资讯管理、航班信息、机票订单、景点信息、酒店信息、酒店订单、签证服务等系统信息管理,包括可进行增删等操作。

管理员角色的用例展示如图2-2所示。

图2-2 管理员角色用例图

2.2系统功能需求

根据TravelHub旅游网站功能需求分析,主要划分为了普通用户模块和管理员模块这两大部分,以上模块又细分小功能模块。具体如下:

普通用户模块:

  1. 注册登录:游客可以通过注册成为系统用户,使用账号密码可进行登录,使用系统功能。
  2. 首页:可查看轮播图、通知公告、旅游资讯推荐、航班信息推荐、景点信息推荐、酒店信息推荐等,并可和使用系统其他功能。
  3. 通知公告:可查看包括关于我们、联系方式、网站介绍等管理员发布的所有通知公告,点击可查看详情。
  4. 旅游资讯:可查看管理员发布的所有旅游资讯信息,支持局部搜索和下拉(筛选、排序)搜索,热门文章推荐,点击可查看详情,进行点赞、收藏和评论。
  5. 航班信息:可查看所有航班信息,支持关键字(航班分类、机票类型)搜索和下拉(航班分类、机票类型、排序)搜索,点击可查看详情,进行点赞、收藏和评论,并可点击预订机票操作,填写预订机票信息(报名人数)并提交。
  6. 景点信息:可查看所有景点信息,支持关键字(景点名称)搜索和下拉(排序)搜索,点击可查看详情,进行点赞、收藏和评论。
  7. 酒店信息:可查看所有酒店信息,支持关键字(酒店名称)搜索和下拉(排序)搜索,点击可查看详情,进行点赞、收藏和评论,并可点击预订酒店操作,填写预订酒店信息(预订日期、预订天数、预订总价、约定备注)并提交。
  8. 签证服务:可填写签证服务信息(办理日期、办理内容)并提交。
  9. 我的账户:对个人资料进行管理,包括修改密码和修改资料(头像、昵称、邮箱、用户姓名、用户性别)。
  10. 个人中心:可对个人首页、机票订单、酒店订单、签证服务、收藏等信息进行管控。具体如下:
  • 点击“机票订单”,可查看自己的所有机票订单,进行查询操作,支持航班号、用户姓名、审核状态、支付类型搜索,可点击查看详情,并可点击进行支付(微信、支付宝、网银)操作;
  • 点击“酒店订单”,可查看自己的所有酒店订单,进行查询操作,支持酒店名称、用户姓名、审核状态、支付状态搜索,可点击查看详情,并可点击进行支付(微信、支付宝、网银)操作;
  • 点击“签证服务”,可查看自己的所有签证服务,进行查询操作,支持用户姓名、审核状态搜索,可点击查看详情;
  • 点击“收藏”,可管理所有收藏信息,包括旅游资讯、航班信息、景点信息、酒店信息等收藏信息,进行查看和删除操作,点击可查看详情。

管理员模块:

  1. 登录:管理员账号密码由系统生成,可使用账号密码可进行登录,使用系统功能,并对个人信息和密码进行管理。
  2. 公共管理:可对首页的轮播图和通知公告进行管理,进行增删改查操作,支持标题搜索,可点击查看详情
  3. 用户管理:可对普通用户和管理员进行管控,包括进行增删改查操作,点击可查看详情。
  4. 资讯管理:可对旅游资讯和资讯分类进行管理,进行增删改查操作,旅游资讯支持标题、标签、分类搜索,可点击查看详情(封面图、标题、分类、标签、描述、正文)和查看评论;资讯分类支持频道名称搜索,可点击查看详情。
  5. 航班信息:可查看所有航班信息,进行增改删查操作,支持航班号、航班分类、机票类型,可点击查看详情(航班号、航班分类、机票类型、机票票价、出发地点、目的地点、起飞时间、到达时间、图片、购票须知)和查看评论。
  6. 机票订单:可查看所有机票订单,进行增改删查操作,支持航班号、用户姓名、搜索,可点击查看详情(航班号、航班分类、机票类型、机票票价、出发地点、目的地点、起飞时间、到达时间、用户信息、用户姓名、联系电话、订购数量、订单总价、预订备注、审核状态、审核回复),进行审核,并可点击进行支付/Pay操作,修改支付状态。
  7. 景点信息:可查看所有景点信息,进行增改删查操作,支持景点名称搜索,可点击查看详情(景点名称、景点门票、景点电话、开放时间、景点地址、图片、景点介绍)和查看评论。
  8. 酒店信息:可查看所有酒店信息,进行增改删查操作,支持酒店名称搜索,可点击查看详情(酒店名称、房间名称、房间价格、酒店电话、酒店地址、图片、酒店介绍)和查看评论。
  9. 酒店订单:可查看所有酒店订单,进行增改删查操作,进行查询操作,支持酒店名称、用户姓名搜索,可点击查看详情(酒店名称、房间名称、房间价格、用户信息、用户姓名、联系电话、预订日期、预订天数、预订总价、约定备注、审核状态、审核回复),进行审核,并可点击进行支付/Pay操作,修改支付状态。
  10. 签证服务:可查看所有签证服务,进行增改删查操作,支持用户姓名、审核状态搜索,可点击查看详情(用户信息、用户姓名、用户性别、联系电话、办理日期、办理内容、审核状态、审核回复,进行审核)。
  11. 个人信息:点击“个人信息”可对个人信息(邮箱、用户组、状态、用户名、昵称、邮箱)进行管控,可修改头像、昵称、邮箱等个人信息。
  12. 修改密码:点击“修改密码”可对账号密码进行管控,修改成功后,需用性密码进行登录。

2.3系统性能需求

根据TravelHub旅游网站的性能分析需求,主要体现在比如TravelHub旅游网站的稳定性怎么样,可靠性怎么样,安全性怎么样等。具体如下:

稳定性:TravelHub旅游网站应具备良好的性能,能够快速响应用户请求和处理大量并发操作。系统需要进行性能测试和优化,确保在高负载和高并发情况下仍能保持稳定和高效的运行。

可靠性:TravelHub旅游网站应具备高度可靠性,能够持续稳定地运行,并且能够自动恢复故障或异常状态。系统需要进行容错处理、错误处理和异常处理,以确保数据的完整性和可用性。

安全性:TravelHub旅游网站应具备良好的安全性,保护用户个人信息和敏感数据的安全。系统需要采用合适的身份验证和授权机制,以及加密技术来保护数据的传输和存储安全。同时,要注意防范常见的安全攻击,如跨站脚本(XSS)、跨站请求伪造(CSRF)等。

可扩展性:TravelHub旅游网站应具备良好的可扩展性,能够根据业务需求进行灵活的扩展和变更。系统架构和设计应考虑到未来的业务扩展,采用模块化和可插拔的方式,方便新增功能和模块的集成。

可维护性:TravelHub旅游网站应具备良好的可维护性,使得开发团队能够快速定位问题并进行修复、更新。代码结构清晰、注释明确,并遵循一致的编码规范。此外,系统应提供适当的日志记录和监控机制,以便及时发现和解决潜在的问题。

用户体验:TravelHub旅游网站应提供良好的用户体验,保证界面简洁直观、操作流畅。系统的响应时间应尽量缩短,页面加载速度要快,交互过程要流畅,以提升用户满意度和使用体验。

可移植性:TravelHub旅游网站应具备良好的可移植性,能够在不同的操作系统和硬件环境中运行。Springboot+jsp的跨平台特性和自包含的部署方式,有助于系统的移植和部署。

2.4可行性分析

2.4.1技术可行性

TravelHub旅游网站的设计与实现对于所使用的计算机没有什么硬性的要求,计算机只要可以正常的使用进行代码的编写及页面设计就可行,主要是对于服务器有些要求,对于平台搭建完成要上传的服务器是有一定的要求的,服务器必须选择安全性比较高的,然后就是在打开系统必须顺畅,不能停顿太长时间;且需性价比高;安全性高。

该网站的开发整个系统使用的是云计算,流量的可扩展性和基于流量的智能调整云计算的优点就是流量的可扩展性和基于流量的智能调整,保障系统的安全及数据信息的及时备份。

TravelHub旅游网站的开发环境和配置都是可以自行安装,此外,其所使用的开发软件像Java开发工具,Springboot+jsp技术框架,MySQL数据库、Photoshop图片处理软件等,这些都是开源免费的,能够从网上都可以直接下载,并且这些环境在学校都进行了系统的学习,自己能够独立操作完成,不需要额外花费,同时通过开发TravelHub旅游网站来能够帮助管理员减少工作,为方便用户提供便捷高效的操作系统和使用体验,优化资源分配和降低人力和时间成本。

因此,其研发具有操作可行性。

2.4.2运行可行性

运行可行性分析,要分析系统在各个运行过程中都能正常运行,证明系统的可行性。正因为本系统是在服务器的基础上开发的,系统开发成功以后,用户无需导航指导便可自己上手进行操作。系统一经开发测试后,在计算机移动客户端能上网的情况下,只需在浏览器里完成所有可用操作,也无需配置复杂的使用和运行环境,只需一个网址便可进入系统。

因此,其研发具有运行可行性。

2.5开发环境

为了更好的实现系统功能,本系统的开发语言为Java语言,开发平台选用Springboot框架,开放源码Eclipse,动态网站设计用JSP实现,数据库则选用体积小,成本低,速度快的MySQL数据库并支持大型数据库。这样可以使得系统运行更具有稳定性和安全性,从而完成实现系统的开发。


第三章  总体设计

3.1系统总体设计

本系统采用模块化的方式进行网站结构设计,主要模块有普通用户模块、管理员模块,通过正确地处理模块之间的内部联系、调用关系和数据关系以实现整个系统的功能。

普通用户模块实现的功能有未注册时可查找首页、旅游资讯、航班信息、景点信息、酒店信等信息;注册登录后可能够除了查看首页、通知公告消息,可以搜索和浏览旅游资讯、航班信息、景点信息、酒店信息,还可以实现在线预订机票、预订酒店操作,并且可以进行签证服务;同时,对我的账户、个人中心(个人首页、机票订单、酒店订单、签证服务、收藏)等功能进行管理。

管理员模块实现的功能有管理员的后台登录,对普通用户、管理员用户进行管理;发布通知公告、旅游资讯信息;并对用户的航班信息、机票订单、景点信息、酒店信息、酒店订单、签证服务等信息进行查看、审核和管理操作,来确保信息的准确。

3.2功能模块设计

3.2.1普通用户模块设计

普通用户注册登录后可能够查看管理员发布的首页、通知公告消息,搜索和浏览旅游资讯、航班信息、景点信息、酒店信息,点击进入航班信息、酒店信息详情页面,可以进行在线预订机票、预订酒店操作,并且可以点击进行签证服务;同时,对我的账户、个人中心(个人首页、机票订单、酒店订单、签证服务、收藏)等功能进行管理。普通用户模块图如图3-1所示。

图3-1  普通用户功能模块设计

3.2.2管理员模块设计

管理员模块实现的功能有管理员的登录后台,可以对普通用户、管理员用户进行管理;发布通知公告、旅游资讯信息;并对发布和管理航班信息、机票订单、景点信息等服务信息,进行增删改查操作;并对普通用户提交酒店信息、酒店订单、签证服务等信息进行查看、审核和管理操作,来确保信息的准确。管理员模块图如图3-2所示。

图3-2  管理员功能模块设计

3.3数据库设计

数据库设计一般包括需求分析、概念模型设计、数据库表建立三大过程,其中需求分析前面章节已经阐述,概念模型设计有概念模型和逻辑结构设计两部分。根据前面的数据流程图,结合系统的功能模块设计,设计出符合系统的各信息实体,主要包括公共管理、用户管理、资讯管理、航班信息、机票订单、景点信息、酒店信息、酒店订单、签证服务等。具体的数据库E-R图如图3-3所示。

图3-3 数据库总体E-R图

通过上一小节中TravelHub旅游网站中总E-R关系图上得出一共需要创建很多个数据表。在此我主要罗列几个主要的数据库表结构设计。

(1)普通用户表

用户表含有普通用户ID、用户姓名、用户性别、联系电话、审核状态、用户ID、创建时间、更新时间等属性。如表3-1所示。

表3-1  普通用户表结构表(User)

字段

类型

主键

外键

注释

regular_users_id

int

普通用户ID

user_name

varchar

用户姓名

user_gender

varchar

用户性别

contact_phone_number

varchar

联系电话

examine_state

varchar

审核状态

user_id

int

用户ID

create_time

datetime

创建时间

update_time

timestamp

更新时间

(2)航班信息表

航班信息表含有航班信息ID、航班号、航班分类、机票类型、机票票价、出发地点、目的地点、起飞时间、到达时间、封面图片、购票须知、点击数、点赞数、智能推荐、创建时间、更新时间等属性。如表3-2所示。

表3-2 航班信息表结构表(flight_information)

字段

类型

主键

外键

注释

flight_information_id

int

航班信息ID

flight_number

varchar

航班号

flight_classification

varchar

航班分类

ticket_type

varchar

机票类型

air_ticket_price

int

机票票价

departure_location

varchar

出发地点

destination_location

varchar

目的地点

takeoff_time

datetime

起飞时间

arrival_time

datetime

到达时间

续表

cover_photo

varchar

封面图片

ticket_purchase_notice

text

购票须知

hits

int

点击数

praise_len

int

点赞数

recommend

int

智能推荐

create_time

datetime

创建时间

update_time

timestamp

更新时间

(3)景点信息表

航班信息表含有景点信息ID、景点名称、景点门票、景点电话、开放时间、景点地址、景点图片、景点介绍、点击数、点赞数、智能推荐、创建时间、更新时间等属性。如表3-3所示。

表3-3  景点信息表结构表(attraction_information)

字段

类型

主键

外键

注释

attraction_information_id

int

景点信息ID

attraction_name

varchar

景点名称

attraction_tickets

varchar

景点门票

tourist_attraction_phone_number

varchar

景点电话

opening_hours

int

开放时间

attraction_address

varchar

景点地址

scenic_spot_pictures

varchar

景点图片

introduction_to_scenic_spots

datetime

景点介绍

hits

datetime

点击数

praise_len

varchar

点赞数

recommend

text

智能推荐

create_time

int

创建时间

update_time

int

更新时间

(4)酒店信息表

酒店信息表含有酒店信息ID、酒店名称、房间名称、房间价格、酒店电话、酒店地址、酒店图片、酒店介绍、点击数、点赞数、智能推荐、创建时间、更新时间等属性。如表3-2所示。

表3-4 酒店信息表结构表(hotel_information)

字段

类型

主键

外键

注释

hotel_information_id

int

酒店信息ID

hotel_name

varchar

酒店名称

room_name

varchar

房间名称

room_price

varchar

房间价格

hotel_phone_number

int

酒店电话

hotel_address

varchar

酒店地址

hotel_pictures

varchar

酒店图片

hotel_introduction

datetime

酒店介绍

hits

datetime

点击数

praise_len

varchar

点赞数

recommend

text

智能推荐

create_time

int

创建时间

update_time

int

更新时间


第四章  详细设计及实现

4.1前台界面设计与实现

4.1.1用户登录界面

普通用户注册后可以使用账号密码可进行登录,使用系统功能;用户登录时按照要求输入用户名和密码,系统中函数在数据库中查询用户名和密码若有匹配的则进入系统普通用户页面,否则证明非该网站用户,跳回网站首页。

用户登录流程图如下所示。

图4-1  用户登录流程图

用户登录页面设计如下图所示。

图4-2  登录页面设计

4.1.2用户注册界面

游客可以通过注册成为系统用户,使用账号密码可进行登录,使用系统功能,包括首页、通知公告、旅游资讯、航班信息、景点信息、酒店信息、签证服务、我的账户、个人中心(个人首页、机票订单、酒店订单、签证服务、收藏)等功能。

用户注册流程图如下所示。

图4-3  用户注册流程图

用户注册页面设计如下图所示。

图4-4 用户注册页面设计

4.1.3航班信息界面

可查看所有航班信息,支持关键字(航班分类、机票类型)搜索和下拉(航班分类、机票类型、排序)搜索,点击可查看详情,进行点赞、收藏和评论,并可点击预订机票操作,填写预订机票信息(报名人数)并提交。

航班信息订购机票流程图如下所示。

图4-5 航班信息订购机票流程图

航班信息页面设计如下图所示。

图4-6 航班信息页面设计

4.1.4景点信息界面

可查看所有景点信息,支持关键字(景点名称)搜索和下拉(排序)搜索,点击可查看详情,进行点赞、收藏和评论。

景点信息搜索流程图如下所示。

图4-7 景点信息搜索流程图

景点信息页面设计如下图所示。

图4-8 景点信息页面设计

4.1.5酒店信息界面

可查看所有酒店信息,支持关键字(酒店名称)搜索和下拉(排序)搜索,点击可查看详情,进行点赞、收藏和评论,并可点击预订酒店操作,填写预订酒店信息(预订日期、预订天数、预订总价、约定备注)并提交。

酒店信息订购酒店流程图如下所示。

图4-9 酒店信息订购酒店流程图

酒店信息页面设计如下图所示。

图4-10 酒店信息页面设计

4.1.6签证服务界面

可填写签证服务信息(办理日期、办理内容)并提交,提交的签证服务信息可以在个人中心页面查看。

签证服务流程图如下所示。

图4-11 签证服务订购酒店流程图

签证服务页面设计如下图所示。

图4-12 签证服务页面设计

4.1.7个人中心界面

可对个人首页、机票订单、酒店订单、签证服务、收藏等信息进行管控。点击“机票订单”,可查看自己的所有机票订单,进行查询操作,支持航班号、用户姓名、审核状态、支付类型搜索,可点击查看详情,并可点击进行支付(微信、支付宝、网银)操作;点击“酒店订单”,可查看自己的所有酒店订单,进行查询操作,支持酒店名称、用户姓名、审核状态、支付状态搜索,可点击查看详情,并可点击进行支付(微信、支付宝、网银)操作;点击“签证服务”,可查看自己的所有签证服务,进行查询操作,支持用户姓名、审核状态搜索,可点击查看详情;点击“收藏”,可管理所有收藏信息,包括旅游资讯、航班信息、个人中心、酒店信息等收藏信息,进行查看和删除操作,点击可查看详情。

例如,个人中心机票订单支付流程图如下所示。

图4-13 个人中心机票订单支付流程图

个人中心页面设计如下图所示。

图4-14 个人中心页面设计

4.2后台功能设计与实现

4.2.1管理员登录模块

管理员账号密码由系统生成,可使用账号密码可进行登录,使用系统功能,并对个人信息和密码进行管理。

管理员登录流程图如下所示。

图4-15 管理员登录流程图

管理员登录页面设计如下图所示。

图4-16 管理员登录页面设计

4.2.2公共管理界面

可对首页的轮播图和通知公告进行管理,进行增删改查操作,支持标题搜索,可点击查看详情。

公共管理流程图如下所示。

图4-17 公共管理流程图

公共管理页面设计如下图所示。

图4-18 公共管理页面设计

4.2.3用户管理界面

可对普通用户和管理员进行管控,包括进行增删改查操作,点击可查看详情。

用户管理流程图如下所示。

图4-19 用户管理流程图

用户管理页面设计如下图所示。

图4-20 用户管理页面设计

4.2.4航班信息界面

可查看所有航班信息,进行增改删查操作,支持航班号、航班分类、机票类型,可点击查看详情(航班号、航班分类、机票类型、机票票价、出发地点、目的地点、起飞时间、到达时间、图片、购票须知)和查看评论。

航班信息流程图如下所示。

图4-21 航班信息流程图

航班信息页面设计如下图所示。

图4-22 航班信息页面设计

4.2.5机票订单界面

可查看所有机票订单,进行增改删查操作,支持航班号、用户姓名、搜索,可点击查看详情(航班号、航班分类、机票类型、机票票价、出发地点、目的地点、起飞时间、到达时间、用户信息、用户姓名、联系电话、订购数量、订单总价、预订备注、审核状态、审核回复),进行审核,并可点击进行支付/Pay操作,修改支付状态。

机票订单流程图如下所示。

图4-23 机票订单流程图

机票订单页面设计如下图所示。

图4-24 机票订单页面设计

4.2.6签证服务界面

可查看所有签证服务,进行增改删查操作,支持用户姓名、审核状态搜索,可点击查看详情(用户信息、用户姓名、用户性别、联系电话、办理日期、办理内容、审核状态、审核回复,进行审核)。

签证服务流程图如下所示。

图4-25 签证服务流程图

签证服务页面设计如下图所示。

图4-26 签证服务页面设计

4.3数据库连接

从Springboot+jsp架构的原理可知,航班信息推荐系统分析系统的各大模块的实现均需要对数据库的数据进行操作,具体包括查询数据、写入数据、更新数据和删除数据。

数据库查询流程图如下图所示。

图4-1  数据库查询流程图

数据库配置文件关键代码如下:

db = SQLAlchemy()

app = Springboot+jsp(__name__, static_folder='static')

# 数据库链接配置

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@127.0.0.1:3306/projectxxxxx'

app.secret_key = 'v&#prqo7t*(!ktb+8r=+83@#_$n1pg_xig$j=6v^r3#$i)wx87'

db.init_app(app)

app.config['UPLOAD_FOLDER'] = 'static/upload'


第五章  系统测试

5.1测试任务及目的

系统测试就是以发现程序错误或不稳定性而执行程序的过程。系统测试的目的是实现确保整个系统的运行良好和验证TravelHub旅游网站设计与实现的有效性。虽然程序设计本身就具备一定的风险,因此,即便出现一点点的失败,就会影响到整个的运行。因此,我们必须对程序进行严格的检查,及早发现和解决失败,从而确保整个系统的运行良好,从而确保其运行的持久性和稳定性。通过本章的讨论,我们可以更好地识别出存在的问题,从而有效地解决它们,尽管需要花费大量的精力,但却至关重要且不可或缺。

5.2测试计划

根据系统测试目的并结合面向对象的测试方法,给出如下系统测试计划:

1、尽可能早的、并且不断地进行系统测试。因为错误发现的越早,修正它所付出的代价以及费用就会越小。

2、设计本测试用例时,应该给出测试的预期结果。一个合理的测试用例由两部分组成:主要有测试用的输入数据和该输入数据所期望的系统运行结果。

3、在设计本测试用例时,不仅需要有合法的输入测试用例,还应该要有非法的输入测试用例。因为,因为在系统的实际使用过程中,通常由于各种原因,用户往往会使用一些非法的输入测试用例来进行测试。测试用例为了测试系统的正确性和完整性,本节将对系统中重点模块的测试进行介绍。

5.3测试用例

5.3.1登录模块测试用例

下表是系统登录功能测试用例,检测了用户名和密码的不同的输入情况,观察系统的响应情况。得出该功能达到了设计目标。

表5-1 系统登录功能测试用例

功能描述

用于系统登录

测试目的

检测登录时的合法性检查

测试数据以及操作

预期结果

实际结果

输入的用户名和密码带有非法字符

提示用户名或者密码错误

与预期结果一致

输入的用户名或者密码为空

提示用户名或者密码错误

与预期结果一致

输入的用户名和密码不存在

提示用户名或者密码错误

与预期结果一致

输入正确的用户名和密码

登录成功

与预期结果一致

5.3.2注册模块测试用例

下表是注册功能测试用例,检测了各种数据的输入情况,观察系统的响应情况。得出该功能达到了设计目标。

表5-2 注册功能测试用例

功能描述

用于用户注册

测试目的

检测用户注册时的合法性检查

测试数据以及操作

预期结果

实际结果

输入的手机号不合法

提示请输入正确的手机号码

与预期结果一致

输入的字段为空

提示必填项不能为空

与预期结果一致

输入的密码少于6位

提示密码必须为6-12位

与预期结果一致

输入的密码大于12位

提示密码必须为6-12位

与预期结果一致

5.3.3航班信息模块测试用例

下表是航班信息功能的测试用例,检测了航班信息中对航班信息的增加,删除,修改,查询操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。

前置条件;管理员登录系统。

表5-3 航班信息的测试用例

功能描述

用于航班信息

测试目的

检测航班信息时的各种操作的运行情况

测试数据以及操作

预期结果

实际结果

点击添加航班信息,必填项合法输入,点击保存

提示添加成功

与预期结果一致

点击添加航班信息,必填项输入不合法,点击保存

提示必填项不能为空

与预期结果一致

点击修改航班信息,必填项修改为空,点击保存

提示必填项不能为空

与预期结果一致

点击修改航班信息,必填项输入不合法,点击保存

提示必填项不能为空

与预期结果一致

点击删除航班信息,选择航班信息删除

提示删除成功

与预期结果一致

点击搜索航班信息,输入存在的航班信息名

查找出航班信息

与预期结果一致

点击搜索航班信息,输入不存在的航班信息名

不显示航班信息

与预期结果一致

5.3.4景点信息模块测试用例

下表是景点信息功能的测试用例,检测了景点信息中对景点信息的增加,删除,修改,查询操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。

前置条件;管理员登录系统。

表5-4 景点信息的测试用例

功能描述

用于景点信息

测试目的

检测景点信息时的各种操作的运行情况

测试数据以及操作

预期结果

实际结果

点击添加景点信息,必填项合法输入,点击保存

提示添加成功

与预期结果一致

点击添加景点信息,必填项输入不合法,点击保存

提示必填项不能为空

与预期结果一致

点击修改景点信息,必填项修改为空,点击保存

提示必填项不能为空

与预期结果一致

点击修改景点信息,必填项输入不合法,点击保存

提示必填项不能为空

与预期结果一致

点击删除景点信息,选择景点信息删除

提示删除成功

与预期结果一致

点击搜索景点信息,输入存在的景点信息名

查找出景点信息

与预期结果一致

点击搜索景点信息,输入不存在的景点信息名

不显示景点信息

与预期结果一致

5.3.5酒店信息模块测试用例

下表是酒店信息功能的测试用例,检测了酒店信息中对酒店信息的增加,删除,修改,查询操作是否成功运行。观察系统的响应情况,得出该功能也达到了设计目标,系统运行正确。

前置条件;管理员登录系统。

表5-5 酒店信息的测试用例

功能描述

用于酒店信息

测试目的

检测酒店信息时的各种操作的运行情况

测试数据以及操作

预期结果

实际结果

点击添加酒店信息,必填项合法输入,点击保存

提示添加成功

与预期结果一致

点击添加酒店信息,必填项输入不合法,点击保存

提示必填项不能为空

与预期结果一致

点击修改酒店信息,必填项修改为空,点击保存

提示必填项不能为空

与预期结果一致

点击修改酒店信息,必填项输入不合法,点击保存

提示必填项不能为空

与预期结果一致

点击删除酒店信息,选择酒店信息删除

提示删除成功

与预期结果一致

点击搜索酒店信息,输入存在的酒店信息名

查找出酒店信息

与预期结果一致

点击搜索酒店信息,输入不存在的酒店信息名

不显示酒店信息

与预期结果一致

5.4测试结论

经过对登录模块测试、注册模块测试、航班信息测试、景点信息测试、酒店信息测试等进行严格的测试,我们发现该网站的性能非常出色,能够保证每个项目涉及的功能都是能够正常运行,而且它还支持快速、精细的点击操作,使用者的使用感受更加良好。同时,它还支持各种主流浏览器,满足不同的使用要求。同时也存在一定的问题,需要在后期的维护中将不断完善。


结  论

经过对TravelHub旅游网站的设计与开发,我们成功地基于Springboot+jsp框架构建了一个便捷、高效的旅游信息获取、推荐和在线预订、签证平台。该网站为管理员提供了一个简单易用的管理界面,可以方便地管理用户管理、资讯管理、航班信息、机票订单、景点信息、酒店信息、酒店订单、签证服务,可以高效处理旅游信息和订单信息等功能。同时,普通用户可以通过系统快速搜索和浏览通知公告、旅游资讯、航班信息、景点信息、酒店信息、签证服务等信息,并实现在线预订机票、预订酒店,进行签证服务,并可以在线支付和评价。

在系统的开发过程中,我们充分利用了Springboot+jsp框架的优势,如自动配置、快速开发等特点,加快了项目的迭代和部署速度。同时,借助Springboot+jsp提供的丰富的生态系统,我们引入了一些常用的第三方库和组件,增强了系统的功能和性能。

然而,TravelHub旅游网站仍有进一步的改进空间。首先,我们可以继续优化系统的用户界面和交互体验,使其更加直观友好。其次,可以引入更多的智能化技术,提升用户的个性化体验和服务质量。此外,还可以探索更多的创新功能,为用户提供更全面的旅游信息获取、推荐和在线预订、签证等服务。

未来,我们将继续关注用户的需求变化和行业趋势,持续优化TravelHub旅游网站。通过不断的迭代和创新,我们希望将该网站打造成为行业的领先平台,为用户提供更便捷、高效的旅游信息获取、推荐和在线预订、签证体验。同时,我们也将加强与合作伙伴和供应商的合作,共同推动旅游行业的发展和创新。

总之,基于Springboot+jsp框架的TravelHub旅游网站在设计与实现过程中取得了一定的成果,但仍有进一步的改进和发展空间。未来我们将持续努力,不断提升系统的功能和性能,为用户提供更好的服务体验。


谢  辞

时间过得飞快,马上就要毕业了,在母校的学习生活中,得到了许多来自老师、朋友、同学的帮助。因此,在本文的最后,我要对许多人表示诚挚的感谢,他们为TravelHub旅游网站的研发和完成做出了重要的贡献。首先,我要感谢我的导师,您给予了我悉心的指导和支持,在选题和研究过程中提供了宝贵的意见和建议。您的专业知识和严谨态度使我受益匪浅,让我能够顺利地完成毕业设计。其次,我要感谢我的同学和朋友们,你们在我写作和排版过程中给予了热情的帮助和鼓励。与你们一起度过的大学生活是我宝贵的回忆,你们的友谊让我感到无比温暖和快乐。

此外,我也要感谢那些为我们提供参考和指导的学者和专家们。他们的研究成果为我们的论文提供了宝贵的指导,使我们能够更好地理解问题和展开思考。

最后,我要感谢我的家人和爱人,你们一直以来对我无条件的支持和理解让我能够专注于学业。你们的鼓励和陪伴是我坚持不懈的动力。

在这段时间里,我收获了很多宝贵的经验和知识。尽管我的能力有限,但我会继续努力去完善这篇论文,并且真诚地希望各位老师和同学们能够给予宝贵的指导与意见。

最后,再次向所有支持和帮助过我的人表示深深的感谢!我会将所学所得用于实践,为社会做出自己的贡献。


参考文献

  1. 吴伶琳.基于SpringBoot的客户关系管理系统设计与实现[J].无线互联科技,2023,20(24):60-62.
  2. 曲锦旭.基于SpringBoot的农作物受灾分析系统的设计与实现[J].农业工程技术,2023,43(35):18-19.DOI:10.16815/j.cnki.11-5436/s.2023.35.006.
  3. 艾钰承,朱海风,刘舟.基于SpringBoot的“喵站”宠物服务平台的设计与实现[J].科技资讯,2023,21(22):22-25.DOI:10.16661/j.cnki.1672-3791.2305-5042-0756.
  4. 游晶,邱淑丽,李敬文.基于SpringBoot的校园智慧报修系统的设计与实现[J].电脑知识与技术,2023,19(32):50-52+65.DOI:10.14004/j.cnki.ckt.2023.1718.
  5. 谢欣,赵家琪,杨卫明.基于SpringBoot的中国传统节日推广平台设计与实现[J].信息与电脑(理论版),2023,35(19):91-94.
  6. 李建森,董宝兰.旅游服务网站的设计与实现[J].电子技术,2023,52(09):54-55.
  7. 杨志俊,侯江华.基于SpringBoot的智慧养老系统设计[J].无线互联科技,2023,20(17):87-89.
  8. 张大秀,朱屹诚.基于Java的碧海苍梧旅游系统设计与实现[J].现代信息科技,2023,7(11):1-6.DOI:10.19850/j.cnki.2096-4706.2023.11.001.
  9. Yang Y .Design and Implementation of Student Information Management System Based on Springboot[J].Advances in Computer, Signals and Systems,2022,6(6):
  10. 蒋莉.东阳古镇旅游网站设计与实现[J].信息与电脑(理论版),2022,34(12):113-116.
  11. Hejing W .Commerce Middle Office Management System Based on Springboot[J].International Journal of Advanced Network, Monitoring and Controls,2022,7(2):32-45.
  12. 黄文翔,潘晓衡.基于SpringBoot的旅游平台构建[J].电子测  试,2021,(11):71-72+132.DOI:10.16520/j.cnki.1000-8519.2021.11.027.
  13. 孙岩,李晶.基于SpringBoot的旅游资源管理网站的设计与实现[J].信息技术与信息化,2021,(01):37-39.
  14. 王家明,李湘.基于大数据分析的新疆智慧旅游网站的设计与实现[J].电脑知识与技术,2021,17(03):129-130+133.DOI:10.14004/j.cnki.ckt.2021.0151.
  15. Chen G ,Xu J .Design and implementation of efficient Learning platform based on SpringBoot Framework[J].Journal of Electronics and Information Science,2020,6(1):
  16. 陈艳声,黄俊辉.大学生共享旅游系统设计与实现[J].福建电脑,2020,36(02):57-62.DOI:10.16707/j.cnki.fjpc.2020.02.016.
  17. 韩旭.基于JSP的旅游平台的设计与实现[J].电子世界,2020,(02):203-204.DOI:10.19353/j.cnki.dzsj.2020.02.112.


附  录

附录一:《大连交通大学毕业设计(论文)软件使用说明书》

使用电脑端登录即可

附录二:《大连交通大学毕业设计(论文)软件程序源代码》

连接数据库的文件在Resources 文件夹下的application.yml文件,代码如下:

server:

  port: 5000

  servlet:

    context-path: /api

spring:

  mvc:

    static-path-pattern: /upload/**

  resources:

    static-locations: file:此处填写地址/project93355/server/src/main/resources/static

datasource:    

jdbc:mysql://127.0.0.1:3306/projectxxxxx?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8

    username: root

    password: root

    driver-class-name: com.mysql.cj.jdbc.Driver

    type: com.alibaba.druid.pool.DruidDataSource

  jackson:

    property-naming-strategy: CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES

    default-property-inclusion: ALWAYS

    time-zone: GMT+8

    date-format: yyyy-MM-dd HH:mm:ss

  servlet:

    multipart:

      max-file-size: 500MB

      max-request-size: 500MB

  redis:

    host: 127.0.0.1

    port: 6379

    password:

    database: 2

    lettuce:

      pool:

        max-idle: 30

        min-idle: 10

        max-active: 30

        max-wait: 10000

mybatis-plus:

  mapper-locations: classpath*:mapper/*.xml

  type-aliases-package: com.project.demo.entity

  configuration:

    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

    use-column-label: true

    map-underscore-to-camel-case: false

    lazy-loading-enabled: true

    aggressive-lazy-loading: false

use-generated-keys: true

项目启动文件Application.java,代码如下:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

@EnableJpaRepositories

@MapperScan("com.project.demo.dao")

public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class,args);

    }

}

登陆拦截管理器,在config文件夹下的WebAppConfig.java文件,代码如下:

package com.project.demo.config;

@Configuration

@Slf4j

public class WebAppConfig implements WebMvcConfigurer {

    @Override

    public void addInterceptors(InterceptorRegistry registry) {

        //登录拦截的管理器

        InterceptorRegistration registration = registry.addInterceptor(loginInterceptor());

        //拦截的地址

        registration.addPathPatterns("/**");

        //根据需要拦截,一般设置所有地址拦截,放行公共连接

    }

    @Bean

    public LoginInterceptor loginInterceptor(){

        return new LoginInterceptor();

    }

}

登陆接受管理器,在interceptor文件夹下的LoginInterceptor.java文件,控制请求头代码如下:

package com.project.demo.interceptor;

@Slf4j

public class LoginInterceptor implements HandlerInterceptor {

    private String tokenName = "x-auth-token";

    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        String token = request.getHeader(this.tokenName);

        setHeader(request, response);

        log.info("[请求接口] - {} , [请求类型] - {}",request.getRequestURL().toString(),request.getMethod());

        if (request.getRequestURL().toString().contains("/api/user/login")){

            return true;

        }

        else if (request.getRequestURL().toString().contains("/api/user/state")){

            return true;

        }

        else if (request.getRequestURL().toString().contains("/api/user/register")){

            return true;

        }

    }

    @Override

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {

        //更新token

    }

    @Override

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }

    private void failure(HttpServletRequest request, HttpServletResponse response) throws IOException {

        response.setHeader("Content-type", "application/json;charset=UTF-8");

        response.setStatus(401);

        response.sendRedirect("https://www.baidu.com");

    }

    private void setHeader(HttpServletRequest request, HttpServletResponse response) {

        //跨域的header设置

        response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin"));

        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH");

        response.setHeader("Access-Control-Allow-Credentials", "true");

        response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));

        response.setHeader("Access-Control-Max-Age", "1800");

        //防止乱码,适用于传输JSON数据

        response.setHeader("Content-Type", "application/json;charset=UTF-8");

        response.setStatus(HttpStatus.OK.value());

    }

}

组装sql语句,在constant文件夹下的FindConfig.java文件,代码如下:

package com.project.demo.constant;

public class FindConfig {

    public static String PAGE = "page";

    public static String SIZE = "size";

    public static String LIKE = "like";

    public static String ORDER_BY = "orderby";

    public static String FIELD = "field";

    public static String GROUP_BY = "groupby";

    public static String MIN_ = "_min";

    public static String MAX_ = "_max";

    public static String SQLHWERE = "sqlwhere";

}

项目采用三层架构controller(每一个实体对应一个controller),entity(项目表实体),service

,Controller 均继承自BaseController,注入两个对象,一个是实体类(以Auth为例),另一个是其AuthService:

@RestController

@RequestMapping("auth")

public class AuthController extends BaseController<Auth, AuthService> {

    /**

     * 服务对象

     */

    @Autowired

    public AuthController(AuthService service) {

        setService(service);

    }

}

Controller用于spring控制请求的地址

新增一条数据,通过post传入一个json对象,然后经过request.getReader(),最后经过readBody()转成一个Map,含有String和Object,key用的是字段名,Object存放数据,最终得到Map,insert用拼装sql,读取body,组装成一个insert对象,runCountSql()语句,代码如下:

    @PostMapping("/add")

    @Transactional

    public Map<String, Object> add(HttpServletRequest request) throws IOException {

        service.insert(service.readBody(request.getReader()));

        return success(1);

    }

public Map<String, Object> addMap(Map<String,Object> map){

    service.insert(map);

     return success(1);

 }

修改一个数据,原理与add基本一致,不同点在于通过readConfig()读取关键字,以及通过readQuery()获取URL后面?指定位置的标识,转成Map对象后,执行update操作,同样通过拼接的sql语句执行,执行过程读取query,toWhereSql()语句完成数据库操作,body为修改对象的值,代码如下:

    @PostMapping("/set")

@Transactional

    public Map<String, Object> set(HttpServletRequest request) throws IOException {

        service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader()));

        return success(1);

    }

删除一条数据,通过readQuery(),获取URL后面的对象地址,删除FROM具体的table,query删除查询FindConfig语句,代码如下:

    @RequestMapping(value = "/del")

    @Transactional

    public Map<String, Object> del(HttpServletRequest request) {

        service.delete(service.readQuery(request), service.readConfig(request));

        return success(1);

    }

    public void delete(Map<String,String> query,Map<String,String> config){

        QueryWrapper wrapper = new QueryWrapper<E>();

        toWhereWrapper(query, "0".equals(config.get(FindConfig.GROUP_BY)),wrapper);

        baseMapper.delete(wrapper);

        log.info("[{}] - 删除操作:{}",wrapper.getSqlSelect());

    }

通过请求的参数获取一条数据,通过readQuery(),获取URL后面的对象地址,查询FindConfig语句,select筛选Map对象,FIELD为查询字段,未传输的情况下传入“*”,代码如下:

    @RequestMapping("/get_obj")

    public Map<String, Object> obj(HttpServletRequest request) {

        List resultList = service.selectBaseList(service.select(service.readQuery(request), service.readConfig(request)));

        if (resultList.size() > 0) {

            JSONObject jsonObject = new JSONObject();

            jsonObject.put("obj",resultList.get(0));

            return success(jsonObject);

        } else {

            return success(null);

        }

    }

通过请求的参数获取列表数据,代码如下:

    @RequestMapping("/get_list")

    public Map<String, Object> getList(HttpServletRequest request) {

        Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));

        return success(map);

    }

获取某个组下面的数量,代码如下:

    @RequestMapping(value = {"/count_group", "/count"})

    public Map<String, Object> count(HttpServletRequest request) {

        Integer value= service.selectSqlToInteger(service.groupCount(service.readQuery(request), service.readConfig(request)));

        return success(value);

    }

获取某个组下面的总计值,代码如下:

    @RequestMapping(value = {"/sum_group", "/sum"})

    public Map<String, Object> sum(HttpServletRequest request) {

        Integer value = service.selectSqlToInteger(service.sum(service.readQuery(request), service.readConfig(request)));

        return success(value);

    }

图片/文件/视频等的上传方法通过MultipartFile,代码如下:

   @PostMapping("/upload")

    public Map<String, Object> upload(@RequestParam("file") MultipartFile file) {

        log.info("进入方法");

        if (file.isEmpty()) {

            return error(30000, "没有选择文件");

        }

        try {

            //判断有没路径,没有则创建

            String filePath = System.getProperty("user.dir") + "/src/main/resources/static/";

            File targetDir = new File(filePath);

            if (!targetDir.exists() && !targetDir.isDirectory()) {

                if (targetDir.mkdirs()) {

                    log.info("创建目录成功");

                } else {

                    log.error("创建目录失败");

                }

            }

            String fileName = file.getOriginalFilename();

            File dest = new File(filePath + fileName);

            log.info("文件路径:{}", dest.getPath());

            log.info("文件名:{}", dest.getName());

            file.transferTo(dest);

            JSONObject jsonObject = new JSONObject();

            jsonObject.put("url", "/api/upload/" + fileName);

            return success(jsonObject);

        } catch (IOException e) {

            log.info("上传失败:{}", e.getMessage());

        }

        return error(30000, "上传失败");

    }

注册页UserController.java,传入user对象,并将"user_id"、 "state"、 "user_group"、"login_time"、"phone"、"phone_state"、 "username"、"nickname"、"password"、"email"、"email_state"、"avatar"、"create_time"输入,重点是 "username"、"nickname"、"password"必须输入,通过获取username,数据库查询是否有该用户,如果存在,则提示“用户已存在”,否则执行将UserId置为空(数据库表中该字段已设置自动递增),代码如下:

    /**

     * 注册

     * @param user

     * @return

     */

    @PostMapping("register")

    public Map<String, Object> signUp(@RequestBody User user) {

        // 查询用户

        Map<String, String> query = new HashMap<>();

        Map<String,Object> map = JSON.parseObject(JSON.toJSONString(user));

        query.put("username",user.getUsername());

        List list = service.selectBaseList(service.select(query, new HashMap<>()));

        if (list.size()>0){

            return error(30000, "用户已存在");

        }

        map.put("password",service.encryption(String.valueOf(map.get("password"))));

        service.insert(map);

        return success(1);

}     

注册页password则使用了MD5加密,代码如下:

    public String encryption(String plainText) {

        String re_md5 = new String();

        try {

            MessageDigest md = MessageDigest.getInstance("MD5");

            md.update(plainText.getBytes());

            byte b[] = md.digest();

            int i;

            StringBuffer buf = new StringBuffer("");

            for (int offset = 0; offset < b.length; offset++) {

                i = b[offset];

                if (i < 0)

                    i += 256;

                if (i < 16)

                    buf.append("0");

                buf.append(Integer.toHexString(i));

            }

            re_md5 = buf.toString();

        } catch (Exception e) {

            e.printStackTrace();

        }

        return re_md5;

}

登录页,首先传入"username"、"email"、"phone"、"password",用户可通过用户名、邮箱、手机号进行登陆,通过判断resultList来确定查询结果,然后执行查询用户组UserGroup,用户组里面不存在,依然报“用户不存在”,执行完以上代码,最后涉及到用户带有“审核”的,会查询examine_state(用户的审核状态),数据库表user_group中含有source_table和source_field进行查询,以上步骤完成,对输入的密码进行存储Token到数据库,匹对账号和密码,数据库中的AccessToken为令牌,用于身份认证,其代码如下:

 /**

     * 登录

     * @param data

     * @param httpServletRequest

     * @return

     */

    @PostMapping("login")

    public Map<String, Object> login(@RequestBody Map<String, String> data, HttpServletRequest httpServletRequest) {

        log.info("[执行登录接口]");

        String username = data.get("username");

        String email = data.get("email");

        String phone = data.get("phone");

        String password = data.get("password");

        List resultList = null;

        Map<String, String> map = new HashMap<>();

        if(username != null && "".equals(username) == false){

            map.put("username", username);

            resultList = service.selectBaseList(service.select(map, new HashMap<>()));

        }

        else if(email != null && "".equals(email) == false){

            map.put("email", email);

            resultList = service.selectBaseList(service.select(map, new HashMap<>()));

        }

        else if(phone != null && "".equals(phone) == false){

            map.put("phone", phone);

            resultList = service.selectBaseList(service.select(map, new HashMap<>()));

        }else{

            return error(30000, "账号或密码不能为空");

        }

        if (resultList == null || password == null) {

            return error(30000, "账号或密码不能为空");

        }

        //判断是否有这个用户

        if (resultList.size()<=0){

            return error(30000,"用户不存在");

        }

        User byUsername = (User) resultList.get(0);

        Map<String, String> groupMap = new HashMap<>();

        groupMap.put("name",byUsername.getUserGroup());

        List groupList = userGroupService.selectBaseList(userGroupService.select(groupMap, new HashMap<>()));

        if (groupList.size()<1){

            return error(30000,"用户组不存在");

        }

        UserGroup userGroup = (UserGroup) groupList.get(0);

        //查询用户审核状态

        if (!StringUtils.isEmpty(userGroup.getSourceTable())){

            String res = service.selectExamineState(userGroup.getSourceTable(),byUsername.getUserId());

            if (res==null){

                return error(30000,"用户不存在");

            }

            if (!res.equals("已通过")){

                return error(30000,"该用户审核未通过");

            }

        }

        //查询用户状态

        if (byUsername.getState()!=1){

            return error(30000,"用户非可用状态,不能登录");

        }

        String md5password = service.encryption(password);

        if (byUsername.getPassword().equals(md5password)) {

            // 存储Token到数据库

            AccessToken accessToken = new AccessToken();

            accessToken.setToken(UUID.randomUUID().toString().replaceAll("-", ""));

            accessToken.setUser_id(byUsername.getUserId());

            Duration duration = Duration.ofSeconds(7200L);

            redisTemplate.opsForValue().set(accessToken.getToken(), accessToken,duration);

            // 返回用户信息

            JSONObject user = JSONObject.parseObject(JSONObject.toJSONString(byUsername));

            user.put("token", accessToken.getToken());

            JSONObject ret = new JSONObject();

            ret.put("obj",user);

            return success(ret);

        } else {

            return error(30000, "账号或密码不正确");

        }

    }

找回密码,接收用户输入的用户名、密码、验证码,并进行条件判断,代码如下:

    /**

     * 找回密码

     * @param form

     * @return

     */

    @PostMapping("forget_password")

    public Map<String, Object> forgetPassword(@RequestBody User form,HttpServletRequest request) {

        JSONObject ret = new JSONObject();

        String username = form.getUsername();

        String code = form.getCode();

        String password = form.getPassword();

        // 判断条件

        if(code == null || code.length() == 0){

            return error(30000, "验证码不能为空");

        }

        if(username == null || username.length() == 0){

            return error(30000, "用户名不能为空");

        }

        if(password == null || password.length() == 0){

            return error(30000, "密码不能为空");

        }

        // 查询用户

        Map<String, String> query = new HashMap<>();

        query.put("username",username);

        List list = service.selectBaseList(service.select(query, service.readConfig(request)));

        if (list.size() > 0) {

            User o = (User) list.get(0);

            JSONObject query2 = new JSONObject();

            JSONObject form2 = new JSONObject();

            // 修改用户密码

            query2.put("user_id",o.getUserId());

            form2.put("password",service.encryption(password));

            service.update(query, service.readConfig(request), form2);

            return success(1);

        }

        return error(70000,"用户不存在");

    }

修改密码,通过请求data,获取旧密码,并将新密码重新赋值,期间都是需要通过加密,代码如下:

    /**

     * 修改密码

     * @param data

     * @param request

     * @return

     */

    @PostMapping("change_password")

    public Map<String, Object> change_password(@RequestBody Map<String, String> data, HttpServletRequest request){

        // 根据Token获取UserId

        String token = request.getHeader("x-auth-token");

        Integer userId = tokenGetUserId(token);

        // 根据UserId和旧密码获取用户

        Map<String, String> query = new HashMap<>();

        String o_password = data.get("o_password");

        query.put("user_id" ,String.valueOf(userId));

        query.put("password" ,service.encryption(o_password));

        int count = service.selectBaseCount(service.count(query, service.readConfig(request)));

        if(count > 0){

            // 修改密码

            Map<String,Object> form = new HashMap<>();

            form.put("password",service.encryption(data.get("password")));

            service.update(query,service.readConfig(request),form);

            return success(1);

        }

        return error(10000,"密码修改失败!");

    }

免费领取项目源码,请关注❤点赞收藏并私信博主,谢谢-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值