摘要
旅游出行前的信息搜集和行程安排一直困扰着自由行游客,分散在各个平台上的景点介绍、攻略资讯、天气预报需要反复切换才能拼凑出完整的出行方案。传统的旅游信息获取方式是依靠搜索引擎的横向比较来获取旅游信息,用户需要自己去筛选大量的信息,并且还要手动地将这些信息整合成可以执行的行程安排,这样就会花费大量的时间和精力,并且还会遗漏一些重要的信息。旅游信息分享系统针对上述痛点,创建起一个包含景点推荐、攻略查找、行程安排、社区交流和天气预报等各个方面内容的综合性服务平台。系统使用SpringBoot搭建后端业务逻辑层,使用Vue.js创建前端交互界面,用MySQL存储结构化的业务数据。用户可以浏览精选的景点和攻略,使用行程规划助手快速生成个性化的路线,在社区里发帖交流旅行心得,并且可以实时查看目的地的天气以及预警。管理员在后台管理过程中会对标签、目的地、景点、攻略、行程以及社区内容进行敏感词过滤,以保证社区环境干净。测试结果说明系统功能闭环完整,操作路径简捷,可以有效地减轻用户的出行准备信息负担,提高旅游决策效率和体验。
关键词:旅游信息分享;SpringBoot;Vue.js;行程规划;社区互动
Abstract
Puzzling over how to gather information and plan trips isn't anything new for solo travelers. Scenic Spot Introductions, Strategy Guides, Weather Forecasts scattered here and there, need to switch back and forth to form a whole travel plan. The traditional way of getting travel information is to horizontally compare through search engines and then sort through countless materials by oneself before compiling the necessary data into practical plans. It will take much time and effort and it is easy to forget some information. The Travel Information Exchange System has its problems, because it creates such services as including attractions introduction, consulting guide information, itineraries arrangement, community communication, as well as weather. We'll create a Backend business Logic System With Spring Boot, It Will Work In Our Interactive Frontend With VueJs, Our Businesses' Data Stores Are MySql Databases. Users can also see some spots and guides, create their own route for trip by using our itinerary planner easily, post & share your trip on community, check out destination's weather and alert at current time. The administrators control tags,destination attraction point of interest guidepost itinerary etc.from the admin console along with a sensitivity words filter so as to make sure it’s overall safer for the entire community The test results show that there is a full-function-looped system, with easy operations, it could greatly decrease the information burden during the preparation of travels, enhance travel decision-making efficiency and experience.
Key words: Tourism Information Sharing; SpringBoot; Vue.js; Itinerary Planning; Community Interaction
目录
摘要
Abstract
1 绪论
1.1 选题背景和意义
1.2 国内外研究现状
1.3 研究内容
2 相关技术介绍
2.1 Spring Boot框架
2.2 Vue.js框架
2.3 MySQL数据库
2.4 前后端分离架构
3 系统需求分析
3.1 可行性分析
3.1.1 技术可行性
3.1.2 操作可行性
3.1.3 经济可行性
3.2 功能需求分析
3.2.1 普通用户角色功能需求
3.2.2 管理员角色功能需求
4 系统设计
4.1 系统架构设计
4.2 功能结构设计
4.3 业务流程设计
4.3.1 景点推荐查看流程设计
4.3.2 行程规划生成流程设计
4.3.3 旅游攻略发布流程设计
4.3.4 景点评论交互流程设计
4.3.5 管理员审核攻略流程设计
4.4 数据库设计
4.4.1 概念模型设计
4.4.2 数据库逻辑设计
5 系统详细设计与实现
5.1 普通用户角色功能实现
5.1.1 景点推荐查看
5.1.2 旅游攻略查看
5.1.3 行程规划助手咨询
5.1.4 行程规划
5.1.5 旅游社区查看
5.1.6 发布论坛
5.1.7 天气查询
5.2 管理员角色功能实现
5.2.1 标签类型管理
5.2.2 目的地类型管理
5.2.3 景点推荐管理
5.2.4 旅游攻略管理
5.2.5 行程规划管理
5.2.6 系统管理
5.2.7 敏感词管理
5.2.8 交流管理
6 系统测试
6.1 测试目的
6.2 测试方法
6.3 测试用例
7 总结
参考文献
致谢
1绪论
1.1选题背景和意义
旅游消费升级促使自由行市场不断扩展,游客对于目的地信息的深入程度以及实时性要求明显提高。传统的旅游服务平台大多集中在票务预订和酒店住宿上,信息呈现方式是以商家的展示为主,用户很难得到其他游客真实的体验反馈和详细的行程建议[1]。社交平台上游记攻略分散在各个角落,时效性不能确定,用户要拼凑出行路线得花很多时间去查找筛选各个平台上的攻略信息。该种信息获取方式效率低,经常因为天气突变、景点临时关闭等原因造成行程受阻,暴露出旅游信息服务整合性、实时性、个性化方面存在的明显不足[2]。开发一个集信息聚合、行程规划和社区互动于一身的旅游分享系统,把分散的景点介绍、攻略内容、天气数据整合到同一个界面里,使用户在制定旅行计划的时候得到连续的信息支持,避免由于跨平台切换造成的时空损耗和信息遗漏 [3]。
系统可以改变用户获取旅游信息的方式。传统的用户被动接受平台推送的标准化内容,在新的系统中用户可以自由选择自己感兴趣的景点类型,查看详细的文保知识,还可以查看他人的评价,从而实现从信息收集到行程安排的全过程闭环。管理员用后台对标签、目的地、景点内容做结构化分类,使得系统的推荐更准确,攻略的审核工作保证发布内容质量以及真实性。行程规划模块可以使用户设置预算、出行方式、游玩天数,系统会给出符合要求的路线方案,把零散的信息变成可以执行的日程。天气查询功能可以和预警信息同步,使用户可以在出发前根据天气情况做出相应的安排来规避风险。由信息整合到决策支持的服务模式提高了旅游准备阶段的工作效率,并且也给行业内其他服务平台提供了一个信息结构化、功能模块化的参考范例。
1.2国内外研究现状
国内旅游信息系统研究由最初的单个票务预订发展成现在的综合服务平台。早期的系统大多围绕旅行社业务来构建,主要功能就是线路发布和订单管理,用户的参与度不高。移动互联网普及之后,旅游类应用开始重视用户生成内容的价值,游记、点评、攻略等也成了系统的核心模块。邢阳阳等人的沧州大运河文化旅游系统使用微信小程序架构,把景点展示和文化传播结合起来,证明了轻量化前端适合旅游信息分发[4]。苑荣、许心蓝开发的泉州蟳埔村智慧旅游系统针对乡村场景,使用JavaWeb技术实现村落文化资源的数字化展示,其研究结果给本系统在目的地类型管理上提供借鉴,即文化介绍和服务设施信息需要结构化存储[5]。陈伍香等人的微服务架构下桂林智慧旅游管理系统的模块解耦、弹性扩展的思想,给本系统行程规划、景点推荐模块的独立开发提供一定的参考[6]。张大秀、朱屹诚开发的碧海苍梧旅游系统用Java技术对景区综合管理系统进行开发,证明了SpringBoot在创建稳定后端服务方面是成熟的[7]。邓永涛等人利用JavaEE和微信公众号创建的矩阵旅游管理系统,说明了多端信息同步是可行的,对本系统天气查询和社区互动模块实时数据对接有借鉴意义[8]。
国外有关旅游服务系统的探究比较早地把地理信息技术和用户行为分析带入其中。Lao等人基于WebGIS设计的自驾旅游服务系统把空间数据和路线规划结合起来,图层叠加的思想给本系统在行程规划中加入景点位置和住宿地点的空间关联提供了一些思路[9]。Gao用双钻模型研究南昌节日旅游寻路服务系统,认为用户需求调研在功能定义阶段起着关键的作用,该方法论给本系统在旅游攻略、社区模块需求提取提供理论支持[10]。虽然一篇有关虚拟民俗博物馆漫游系统的论文被撤回了,但是它所提出的视觉交互技术的尝试表明,在景点图片展示和社区内容呈现方面应该注意界面友好性[11]。王对于大数据提升旅游管理的研究也发生了撤稿事件,但是其有关信息集成系统架构的论述仍可作为参考,提醒本系统在数据整合过程中要重视来源的可靠性和更新的及时性[12]。Yiheng等人的研究使用了计算机视觉技术来对景区标识引导系统进行应用,虽然他们的研究路线超出了本文所讨论的范围,但是他们所遵循的技术服务于具体场景的设计思想也体现在景点推荐和攻略管理的实现过程中。
根据国内外的研究现状可知,现有的旅游信息系统大多只针对一个业务场景,景点推荐、攻略查询、行程规划等各个功能模块都分散在不同的平台上,用户需要在不同的应用之间来回切换才能完成整个出行的准备。部分系统虽然尝试整合多种功能,但是各个模块之间存在数据割裂的情况,景点信息不能直接导入到行程中,攻略内容和实时天气没有关联,造成信息利用率低。本系统在设计之初就强调了各个功能模块之间的数据互通,景点推荐详情可以一键添加到行程规划中,攻略发布时间和目的地天气预警会相互影响,社区讨论的内容可以和具体的景点或者攻略关联起来,在用户的操作路径中自然而然地串联起来。从用户行为主线出发进行功能整合的方式既有国内研究在场景化服务方面取得的经验,也有国外系统对于数据关联和空间表达方面设计出的思路,最后形成了一条连接出行前、出行中全部环节的旅游信息闭环。
1.3研究内容
本文主要工作就是设计并实现一个基于SpringBoot的旅游信息分享系统,该过程是从用户的出行需求出发逐层进行的。首先对自由行游客在信息收集和行程规划中遇到的痛点进行调研,确定系统应该包含景点推荐、攻略查看、行程规划、社区互动、天气查询等主要功能,将用户角色分为普通用户和管理员两种类型,分别整理出他们的操作权限和业务流程。在此基础上完成系统的架构设计,后端采用SpringBoot框架实现业务逻辑,前端用Vue.js开发交互界面,MySQL做数据持久化存储,景点、攻略、行程、用户等结构化信息都在MySQL里保存。系统实现阶段主要解决行程规划助手的算法逻辑问题,把用户的预算、天数同后台保存的景点、住宿、交通信息联系起来,从而得到可以执行的路线方案。测试环节主要是对功能完整性、操作流畅性进行检验,在真实的使用场景下检验各个模块的表现。本研究不涉及支付接口对接和分布式部署方案,交付物包括可以运行的Web系统原型、完整的开发文档以及测试报告,整体按照软件工程规范进行推进,为后面章节的技术介绍和需求分析打下基础。
2相关技术介绍
2.1Spring Boot框架
Spring Boot是基于Java语言的开源应用开发框架,它的设计目的是简化Spring应用的初始搭建和开发过程。传统的Spring项目要编写大量的XML配置文件,依赖管理繁杂且容易出错,Spring Boot用自动配置机制大大减少了这些繁琐的工作[13]。开发人员只需要引入相关的场景启动器,框架就会自动注册所需要的组件,并且设置默认的参数,从而使得开发者可以将更多的精力放在业务逻辑的实现上。该框架里有Tomcat、Jetty这些Servlet容器,其对应的JAR文件可以直接运行,并不需要放到外部的Web服务器上。旅游信息分享系统使用SpringBoot搭建后端服务层,实现景点推荐、攻略查询、行程规划等功能的业务处理,控制器接收前端传来的数据,调用服务层的方法进行逻辑处理,最后返回JSON格式的结果。框架所具有的事务管理功能可以保证行程规划、社区发帖等操作数据的一致性,不会出现并发情况下异常的情况。
Spring Boot的健康监控模块可以实时地反馈系统的运行状况,管理员可以通过内置端点查看内存使用情况、线程池占用情况等,及时发现问题。系统使用分层架构思想,把控制器、服务层、数据访问层分开,Spring Boot的依赖注入特性使各个层之间只通过接口进行交互,从而降低模块之间的耦合度。旅游攻略审核功能中,服务层调用数据访问层接口查询待审核的内容,控制器根据管理员的操作调用相应的服务来完成状态的更新,不需要关注具体的实现类的实例化细节。框架所给的异常处理机制统一捕获业务层抛出的运行时异常,给用户显示友好的错误提示,避免系统直接暴露出技术栈信息,提高系统的安全性和健壮性。
2.2Vue.js框架
Vue.js是一个渐进式的JavaScript框架,它主要用来构建用户界面,核心库只关注视图层,可以和第三方库或者现有的项目很好地集成在一起。与传统的jQuery操作DOM的方式不同,Vue使用声明式渲染把数据和DOM结构绑定起来,开发者只需要管理数据的状态,框架就会自动计算出最小代价的页面元素更新 [14]。系统前端用Vue实现景点推荐列表的动态渲染,当用户选择景点类型或者所在城市的时候,框架会监听到数据的变化之后重新计算过滤后的结果集,并更新页面上的展示内容,不需要手动去操作DOM元素。组件化开发模式把页面分成头部导航、景点卡片、评论区这些独立模块,每一个组件都包含自身的样式和逻辑,在旅游攻略详情页中使用景点卡片组件,从而达到界面风格统一并且减少重复代码的效果。
Vue Router对前端路由进行管理,用户在不同的功能模块之间切换的时候不需要重新加载页面,从而提高了操作的流畅性。使用Vue CLI创建工程化开发环境,具有代码热更新、ES6转译、打包优化等特性,提高了开发效率。在旅游社区模块中,用户发布论坛时上传图片和输入的内容用v-model指令双向绑定到数据模型上,提交时把整个数据对象一起发送到后端接口。框架中提供生命周期钩子函数,在组件挂载完成之后就立即执行天气查询请求,获取当前城市的实时数据并更新视图。Vue响应式原理保证数据的变化可以立即反映到界面上,行程规划助手根据用户输入的预算、天数等实时计算出可选方案,让用户在改变参数的时候得到即时的反馈。
2.3MySQL数据库
MySQL是一种广泛使用的、关系型的数据库管理系统,使用结构化查询语言(SQL)对数据进行操作,具有ACID事务特性来保证数据的可靠性。系统用MySQL来存储用户的个人信息、景点的信息、攻略的内容、行程的记录等主要业务数据,并且利用预设的表结构来保存各个业务数据之间的关联关系。景点推荐表保存着景点名称、景点类型、所在城市、开放时间、图片路径、景点地址、景点文化介绍等信息,每一行都和评论表、收藏表存在外键关系,在景点详情页中可以显示该条记录的评论及点赞情况。数据库使用InnoDB存储引擎,支持行级锁和崩溃恢复,在多人同时收藏景点或者评论攻略的时候保证数据的一致性。
系统在设计表结构的时候依照第三范式的要求,把标签种类、目的地种类、景点推荐各自存放在不同的表里,然后利用外键的手段去关联这些表,从而避免数据重复出现的情况发生。旅游攻略表有攻略标题、相关图片、旅游目的地、发布时间、景点组合、介绍、路线建议等字段,攻略正文使用长文本类型来存储,可以容纳富文本内容。MySQL所具有的全文索引功能,在旅游社区的搜索中起着非常重要的作用,用户输入关键词之后,数据库可以迅速地对论坛的标题以及内容进行搜索,然后返回出相关的搜索结果,并按照搜索结果的相关性进行排序[15]。系统在行程规划模块读取景点、住宿等数据时,使用数据库连接池技术可以重复使用连接,从而减小频繁创建、断开连接所造成的性能损失。定时备份可以保证数据的安全,即使出现硬件故障,也可以从备份文件中恢复到最近的状态。
2.4前后端分离架构
前后端分离是Web应用的一种架构模式,其主要思想就是把前端展示和后端逻辑彻底分开,前端展示和后端逻辑之间只用HTTP接口进行数据交互。传统Web开发中视图层和业务层混在一起,修改前端样式会影响后端代码,项目的维护成本随着规模的增大而急剧增加[16]。使用前后端分离之后,旅游信息分享系统前端项目独立部署在Nginx服务器上,用Ajax请求调用后端提供的RESTful接口获取数据。该种模式下前端只做页面渲染和用户交互,后端只做业务逻辑和数据持久化,两者可以同时开发互不影响。系统上线之后如果需要对景点推荐页面的布局样式进行修改,只需要修改Vue组件重新打包部署,后端服务不需要做任何改动。
接口采用REST风格,用HTTP方法来表示操作类型,GET请求获取景点列表,POST提交新的攻略内容,PUT更新行程规划信息,DELETE删除收藏记录。前端传参用JSON格式,后端返回统一的结构体,即状态码、提示信息和业务数据,方便前端统一处理异常 [17]。跨域问题用后端的CORS策略来解决,只允许指定的域名访问接口资源。分离架构使系统可以自由地扩展,将来如果要开发微信小程序或者移动App,只需要复用现有的接口即可,不需要重新实现后端逻辑。天气查询模块前端调用第三方天气API获取实时数据,与自有业务数据分开展示,混源架构很好地发挥出前后端分离的优势,保证系统的开放性以及扩展性。
3系统需求分析
3.1可行性分析
3.1.1技术可行性
经过多年的发展,Spring Boot已经形成了比较成熟的生态,可以给旅游信息共享系统提供稳定的事务管理、安全控制和数据访问支持。Vue.js在前端领域有诸多的实践案例,它的组件化开发方式和响应式数据绑定机制正好对应着景点展示以及社区交互的需求。MySQL属于主流的关系型数据库,事务处理能力和并发控制可以保证用户行程规划、发帖评论数据的唯一性。前后端通过RESTful接口用JSON数据进行通信,轻量级的通信方式能够减少模块间的耦合度,使系统各个层次可以单独部署、维护。开发环境为IntelliJ IDEA和VS Code,版本控制工具为Git,工具链成熟稳定,团队协作、代码管理有成熟的方案。
3.1.2操作可行性
系统界面以左右分栏的形式出现,顶部导航清楚地将景点推荐、旅游攻略、旅游社区等主要模块区分开来,用户不需要学习就能知道各个入口的功能指向。景点详情页把名称、类型、开放时间、地址、文化介绍等信息分块展示,点赞按钮在显眼的位置,符合移动端和PC端用户的操作习惯。行程规划模块用表单引导用户输入预算、天数、出行方式等参数,系统自动生成路线之后可以手动调整,操作路径清晰、容错性好。管理员后台使用表格形式展示数据列表,每一行都有详情、编辑、删除按钮,查询条件在表头下方,符合通用后台管理系统交互方式,管理人员经过简单的培训就可以上手操作。
3.1.3经济可行性
系统开发所依赖的软件环境都是开源或者免费的,使用的是Spring Boot、Vue.js、MySQL等软件不需要支付授权费用,使用的开发工具为社区版可以满足基本的编码工作。部署阶段使用轻量级云服务器实例,在用户数量较少的时候,资源占用低,月均运行成本在可控范围之内。系统上线以后可以将分散的旅游信息资源进行整合,给用户提供一站式出行服务,减少游客在各个平台上搜索的时间成本。管理员依靠后台集中管理景点及攻略内容,相比于传统的依靠人工维护各个渠道来完成信息更新的工作方式来说,信息更新的速度明显加快了。社区模块所形成的用户生成内容属于数据资产,长久运营之后能沉淀出大量的高质量游记以及路线方案,从而产生持续的内容价值。
3.2功能需求分析
3.2.1普通用户角色功能需求
普通用户在系统中可以查看景点推荐详情、浏览旅游攻略内容、使用行程规划助手生成路线、查看旅游社区帖子、发布论坛参与讨论、查询目的地天气与预警信息。用户能够收藏感兴趣的景点与攻略,对喜欢的内容进行点赞操作,在景点详情页和攻略详情页下方发表评论与其他用户交流。行程规划模块支持用户设定预算、出行方式、游玩天数等条件,系统根据输入自动匹配景点组合与住宿建议。

3.2.2管理员角色功能需求
管理员在后台系统可以管理标签类型、目的地类型、景点推荐内容、旅游攻略信息、用户行程规划记录,配置系统轮播图与敏感词库,审核并管理旅游社区帖子与评论。管理员能够新增、修改、删除各类基础数据,对用户发布的攻略进行审核操作,控制敏感词汇的过滤规则,维护论坛分类与置顶状态。数据分析模块提供基础统计信息,帮助管理员了解系统内容分布与用户活跃情况。

4系统设计
4.1系统架构设计
旅游信息分享系统采用前后端分离架构,把用户界面展示和业务逻辑处理完全解耦,两者用标准HTTP接口进行数据交换。前端部分部署在Web服务器上,主要用来渲染景点推荐、旅游攻略、社区论坛等页面,并且会收集用户的操作请求,然后将请求传递给后端接口。后端采用Spring Boot搭建,根据业务领域将系统分成景点管理、攻略管理、行程安排、社区互动、系统管理等模块,每个模块都独立完成对应的请求并返回JSON格式的响应。数据持久层用MySQL存储用户信息、景点数据、攻略内容、行程记录等,通过预定义的数据访问对象与业务层进行交互。系统整体架构有明显的层次划分,前端不对数据库进行直接的操作,后端也不关心页面渲染的细节,这样的结构使得开发团队可以同时开展工作,并且利于后期的功能扩展以及维护。系统架构图如下图4-1所示。

4.2功能结构设计
系统根据使用角色把功能模块划分为普通用户和管理员两部分,在用户端完成信息的获取、内容的生产,管理员端对数据进行维护和运营管理。普通用户模块包括景点推荐查看、旅游攻略查看、行程规划助手咨询、个人行程规划管理、旅游社区浏览、论坛发布、天气查询七个子模块,可以实现用户从信息收集到行程落地的全部操作过程。管理员模块包含标签类型管理、目的地类型管理、景点推荐管理、旅游攻略管理、行程规划管理、系统轮播图配置、敏感词库维护、社区交流管理这八个部分,保证系统的初始数据以及社区内容的合法性。两个角色的功能互相支持,用户产生的内容经过管理员审核之后才成为系统的资源,管理员维护的结构化数据反过来又提高用户的查询效率。该系统的功能结构图如下图4-2所示。

4.3业务流程设计
4.3.1景点推荐查看流程设计
用户在景点推荐列表页浏览系统收录的景点信息,可根据景点类型或所在城市筛选目标内容。点击感兴趣的景点卡片后系统跳转至详情页,页面加载景点名称、开放时间、地址、文化介绍、服务设施等详细信息。用户在此页可以查看其他游客的评论,对景点进行点赞操作,或者将景点加入个人收藏列表。景点推荐查看流程图如图4-3所示。

4.3.2行程规划生成流程设计
用户进入行程规划助手界面,输入旅行预算、游玩天数、出发地点、期望出行方式等参数。系统接收条件后查询后台存储的景点门票价格、住宿费用区间、交通成本等数据,自动匹配生成初步路线方案。用户可对方案中的景点顺序或住宿地点进行调整,确认满意后将规划保存至个人行程列表。行程规划生成流程图如图4-4所示。

4.3.3旅游攻略发布流程设计
用户在旅游社区模块点击发布按钮,进入攻略编辑页面填写标题、选择分类、添加标签、上传封面图片、撰写正文内容。编辑器支持插入图片与格式化文本,用户完成编辑后点击提交,系统将内容状态置为待审核。管理员登录后台查看待审核列表,通过后攻略正式对外发布,用户可在社区首页及攻略列表页看到自己的帖子。旅游攻略发布流程图如图4-5所示。

图4-5 旅游攻略发布流程图
4.3.4景点评论交互流程设计
用户在景点详情页底部查看已有评论列表,输入评论内容后点击发表按钮。系统检查当前用户登录状态,未登录用户跳转至登录页面。登录用户提交评论后后端对内容进行敏感词过滤,若命中敏感词汇则提示修改。通过过滤的评论存入数据库,实时更新至页面评论列表底部,其他用户可对该评论进行回复操作。景点评论交互流程图如图4-6所示。

图4-6 景点评论交互流程图
4.4数据库设计
4.4.2数据库逻辑设计
数据库逻辑设计阶段把概念模型中的实体和关系转换成具体的表结构定义。根据系统业务流程及数据操作频率来确定各个表的字段类型、长度、约束条件,创建主外键关系来保证数据的完整性[19]。景点推荐表和目的地类型表之间存在逻辑上的关联关系,用到JOIN操作来获取完整的相关信息,不会因为物理外键的引入而造成插入和更新的性能损失。行程规划表保存用户的预算以及出行方式,预算字段用字符串类型来存储,可以支持经济型、舒适型等分类值,也可以存储具体的金额数字。论坛帖子表设是否置顶字段控制首页展示顺序,评论表用回复目标ID字段实现嵌套回复。所有的业务表都带有创建时间和更新时间这两个字段,用以数据审计以及缓存失效的判定。
普通用户表主要是用来存储系统注册用户的基本信息与账号状态。主要包括用户姓名、用户手机、兴趣标签、审核状态等字段。如表4-1所示。
表4-1 普通用户表
|
序号 |
字段名 |
数据类型 |
长度 |
备注 |
|
1 |
普通用户id |
int |
11 |
主键 |
|
2 |
用户姓名 |
varchar |
64 |
姓名 |
|
3 |
用户手机 |
varchar |
16 |
联系电话 |
|
4 |
兴趣标签 |
varchar |
64 |
偏好标签 |
|
5 |
审核状态 |
varchar |
16 |
已通过 |
|
6 |
用户id |
int |
11 |
关联账号 |
|
7 |
创建时间 |
datetime |
– |
注册时间 |
|
8 |
更新时间 |
timestamp |
– |
信息更新时间 |
景点推荐表主要是用来存储景点名称、类型、开放时间、地址、文化介绍等信息。主要包括景点名称、景点类型、所在城市、开放时间等字段。如表4-2所示。
表4-2 景点推荐表
|
序号 |
字段名 |
数据类型 |
长度 |
备注 |
|
1 |
景点推荐id |
int |
11 |
主键 |
|
2 |
景点名称 |
varchar |
64 |
名称 |
|
3 |
景点类型 |
varchar |
64 |
分类 |
|
4 |
所在城市 |
varchar |
64 |
城市 |
|
5 |
开放时间 |
varchar |
64 |
时间段 |
|
6 |
景点图片 |
varchar |
255 |
图片路径 |
|
7 |
景点地址 |
varchar |
64 |
详细地址 |
|
8 |
文化介绍 |
text |
– |
背景文化 |
|
9 |
服务设施 |
text |
– |
配套设施 |
|
10 |
点击数 |
int |
11 |
访问量 |
|
11 |
点赞数 |
int |
11 |
点赞量 |
|
12 |
收藏数 |
int |
11 |
收藏量 |
|
13 |
创建时间 |
datetime |
– |
录入时间 |
旅游攻略表主要是用来存储用户发布的攻略标题、目的地、景点组合、路线建议等内容。主要包括攻略标题、相关图片、旅游目的地、发布时间等字段。如表4-3所示。
表4-3 旅游攻略表
|
序号 |
字段名 |
数据类型 |
长度 |
备注 |
|
1 |
旅游攻略id |
int |
11 |
主键 |
|
2 |
攻略标题 |
varchar |
64 |
标题 |
|
3 |
相关图片 |
varchar |
255 |
封面图 |
|
4 |
旅游目的地 |
varchar |
64 |
地点 |
|
5 |
发布时间 |
date |
– |
发布日期 |
|
6 |
景点组合 |
varchar |
64 |
景点列表 |
|
7 |
攻略介绍 |
text |
– |
正文 |
|
8 |
路线建议 |
text |
– |
行程 |
|
9 |
美食建议 |
longtext |
– |
餐饮 |
|
10 |
审核状态 |
varchar |
16 |
未审核 |
|
11 |
点击数 |
int |
11 |
访问量 |
|
12 |
点赞数 |
int |
11 |
点赞量 |
|
13 |
创建时间 |
datetime |
– |
提交时间 |
行程规划表主要是用来存储用户制定的旅行计划信息。主要包括规划标题、规划日期、旅游起点、出行方式等字段。如表4-4所示。
表4-4 行程规划表
|
序号 |
字段名 |
数据类型 |
长度 |
备注 |
|
1 |
行程规划id |
int |
11 |
主键 |
|
2 |
规划标题 |
varchar |
64 |
名称 |
|
3 |
规划日期 |
date |
– |
日期 |
|
4 |
旅游起点 |
varchar |
255 |
出发地 |
|
5 |
出行方式 |
varchar |
64 |
交通 |
|
6 |
游玩景点 |
varchar |
64 |
景点 |
|
7 |
住宿地点 |
varchar |
64 |
住宿 |
|
8 |
旅行预算 |
varchar |
64 |
费用 |
|
9 |
规划备注 |
text |
– |
说明 |
|
10 |
规划用户 |
int |
11 |
创建者 |
|
11 |
创建时间 |
datetime |
– |
记录时间 |
论坛帖子表主要是用来存储用户在旅游社区发布的讨论内容。主要包括标题、内容、论坛分类、标签等字段。如表4-5所示。
表4-5 论坛帖子表
|
序号 |
字段名 |
数据类型 |
长度 |
备注 |
|
1 |
论坛id |
int |
8 |
主键 |
|
2 |
标题 |
varchar |
125 |
帖子标题 |
|
3 |
内容 |
longtext |
– |
正文 |
|
4 |
论坛分类 |
varchar |
64 |
分类 |
|
5 |
标签 |
varchar |
255 |
关键词 |
|
6 |
是否置顶 |
int |
10 |
置顶标志 |
|
7 |
用户id |
int |
8 |
发帖人 |
|
8 |
昵称 |
varchar |
16 |
昵称 |
|
9 |
发帖人头像 |
varchar |
255 |
头像 |
|
10 |
点赞数 |
int |
10 |
点赞量 |
|
11 |
访问数 |
int |
10 |
点击量 |
|
12 |
创建时间 |
timestamp |
– |
发帖时间 |
评论表主要是用来存储用户对景点、攻略、帖子的评论内容。主要包括评论内容、昵称、头像地址、创建时间等字段。如表4-6所示。
表4-6 评论表
|
序号 |
字段名 |
数据类型 |
长度 |
备注 |
|
1 |
评论id |
int |
11 |
主键 |
|
2 |
评论人id |
int |
11 |
用户 |
|
3 |
回复目标id |
int |
11 |
回复对象 |
|
4 |
内容 |
longtext |
– |
评论正文 |
|
5 |
昵称 |
varchar |
255 |
用户昵称 |
|
6 |
头像地址 |
varchar |
255 |
头像 |
|
7 |
来源表 |
varchar |
255 |
所属模块 |
|
8 |
来源id |
int |
10 |
关联id |
|
9 |
是否隐藏 |
tinyint |
4 |
隐藏标志 |
|
10 |
是否置顶 |
tinyint |
4 |
置顶标志 |
|
11 |
创建时间 |
timestamp |
– |
评论时间 |
目的地类型表主要是用来存储系统支持的旅游目的地名称。主要包括旅游目的地、创建时间、更新时间等字段。如表4-7所示。
表4-7 目的地类型表
|
序号 |
字段名 |
数据类型 |
长度 |
备注 |
|
1 |
目的地类型id |
int |
11 |
主键 |
|
2 |
旅游目的地 |
varchar |
64 |
目的地名称 |
|
3 |
创建时间 |
datetime |
– |
添加时间 |
|
4 |
创建用户id |
int |
11 |
操作人 |
|
5 |
更新时间 |
timestamp |
– |
修改时间 |
标签类型表主要是用来存储景点或攻略的标签分类信息。主要包括旅游标签、创建时间、更新时间等字段。如表4-8所示。
表4-8 标签类型表
|
序号 |
字段名 |
数据类型 |
长度 |
备注 |
|
1 |
标签类型id |
int |
11 |
主键 |
|
2 |
旅游标签 |
varchar |
64 |
标签名称 |
|
3 |
创建时间 |
datetime |
– |
添加时间 |
|
4 |
创建用户id |
int |
11 |
操作人 |
|
5 |
更新时间 |
timestamp |
– |
修改时间 |
5系统详细设计与实现
5.1普通用户角色功能实现
5.1.1景点推荐查看
景点推荐查看功能主要是对系统收录的景点信息进行列表展示与详情呈现。用户在首页点击景点推荐入口进入列表页,页面默认按系统推荐权重加载景点卡片,每张卡片展示景点名称、类型、所在城市与缩略图。用户可通过顶部分类筛选下拉框选择景点类型或输入城市名称进行精确过滤,系统实时向后端发送查询请求并更新列表内容。点击任意卡片跳转至详情页,页面顶部轮播景点图片,下方分栏展示开放时间、详细地址、文化介绍、服务设施等信息,底部加载其他用户的历史评论与点赞数量。景点推荐查看界面如图5-1所示。

图5-1 景点推荐查看界面
5.1.2旅游攻略查看
旅游攻略查看功能就是对用户发布的攻略内容进行聚合展示和全文阅读。攻略列表页使用瀑布流布局,每条记录展示标题、封面图、目的地、发布时间、点赞数,用户可以根据目的地标签或者发布日期来排序。点击攻略卡片进入详情页,页面顶部显示攻略标题和作者信息,正文部分可以实现富文本渲染,图片和文字一起排版,还原用户编辑时的原始样貌。详情页底部展示出当下的攻略所包含的景点组合以及路线建议,用户能够直接点击收藏或者点赞来对内容进行操作。图5-2为旅游攻略查看界面。

图5-2 旅游攻略查看界面
5.1.3行程规划助手咨询
行程规划助手咨询功能主要是帮助用户根据自己的条件生成初步的旅行方案。用户点击行程规划模块中的助手咨询按钮,就会弹出条件输入表单,该表单有预算金额、游玩天数、出发城市、出行方式这四个输入项。用户填写完毕之后点击生成方案,系统把参数传送到后端服务,服务从景点库和住宿库中查询出符合条件的资源,计算组合方案并返回前端展示。方案用日程表形式展示出来,每天均有推荐景点及所对应的住宿信息,费用始终显示在底部。行程规划助手咨询界面如下图5-3所示。

图5-3 行程规划助手咨询界面
5.1.4行程规划
行程规划功能主要是对用户已保存的旅行方案进行列表管理与详情查看。用户在个人中心进入行程规划列表页,页面以卡片形式展示每条规划的标题、规划日期、出行方式与预算类型。点击卡片进入规划详情页,页面按天显示完整行程安排,包含每个景点的名称、开放时间与游玩时长,住宿地点显示名称与参考价格。用户可在详情页修改景点顺序或替换住宿选项,修改后系统重新计算总预算并提示保存。行程规划界面如图5-4所示。

图5-4 行程规划界面
5.1.5旅游社区查看
旅游社区查看功能主要是对论坛帖子进行分类浏览与内容阅读。社区首页分区展示置顶帖、热门帖与最新帖,用户可通过顶部分类标签切换不同话题领域。点击帖子标题进入详情页,正文区域显示用户发布的文字与图片内容,页面向下滚动可查看其他用户的评论列表。评论支持嵌套回复,用户点击某条评论的回复按钮可在下方输入框直接回应。旅游社区查看界面如图5-5所示。

图5-5 旅游社区查看界面
5.1.6发布论坛
发布论坛功能主要是支持用户创建新的话题帖子参与社区讨论。用户在社区页面点击发布按钮进入编辑器,编辑器提供标题输入框、正文编辑区、图片上传组件与分类选择下拉框。正文编辑区支持文字加粗、插入图片、添加超链接等基础排版功能,用户上传的图片实时预览在编辑区下方。填写完成后点击提交按钮,系统将内容状态置为待审核并跳转至个人帖子列表页。发布论坛界面如图5-6所示。

图5-6 发布论坛界面
5.1.7天气查询
天气查询功能主要是为用户提供目的地实时天气与预警信息。用户点击顶部导航天气查询入口进入页面,默认显示当前所在城市的天气实况,包含温度、天气状况、风力等级与未来七天预报。页面下方分区域展示全国热门城市天气列表,用户可点击城市名称切换查询。右侧边栏滚动更新各省市发布的气象预警信息,每条预警显示发布时间与预警类型。天气查询界面如图5-7所示。

图5-7 天气查询界面
5.2管理员角色功能实现
5.2.1标签类型管理
标签类型管理功能主要是对景点与攻略的标签分类进行维护。管理员进入标签管理列表页,表格展示现有标签名称、创建时间与更新时间,每行末尾提供详情与删除按钮。列表上方提供查询输入框,管理员输入标签关键词可快速定位目标记录。点击添加按钮弹出表单窗口,填写标签名称后提交,系统校验通过后新增记录显示在列表末尾。标签类型管理界面如图5-8所示。

图5-8 标签类型管理界面
5.2.2目的地类型管理
目的地类型管理功能主要是对系统支持的旅游目的地进行增删改查。管理员进入目的地管理列表页,表格展示目的地名称、创建时间与更新时间,每行附带详情按钮点击可查看该目的地关联的景点与攻略数量。列表上方提供重置与删除按钮,勾选多条记录后可批量移除。添加目的地时填写名称后提交,系统自动校验是否重复。目的地类型管理界面如图5-9所示。

图5-9 目的地类型管理界面
5.2.3景点推荐管理
景点推荐管理功能主要是对前台展示的景点内容进行编辑与审核。管理员进入景点管理列表页,表格展示景点名称、类型、所在城市、开放时间、地址等字段,每行末尾提供详情与查看评论按钮。点击详情进入编辑页,管理员可修改景点名称、类型、开放时间、文化介绍等信息,上传新的景点图片替换原图。查看评论按钮跳转至该景点所有评论列表,管理员可对违规评论进行删除操作。景点推荐管理界面如图5-10所示。

图5-10 景点推荐管理界面
6系统测试
6.1测试目的
系统测试主要是对旅游信息分享系统各个功能进行测试,以保证旅游信息分享系统各项功能满足需求规格说明书所规定的要求和用户的期望。模拟真实的用户操作环境,检验景点推荐查看、行程规划生成、论坛发布、管理员审核等主要流程是否完整、正确地实现了数据前后端传输过程中的无丢失、无错误映射。测试过程中主要对系统的边界条件进行考察,比如用户输入的极端预算值下规划助手给出合理的提示,评论内容包含敏感词的时候拦截机制是否能够及时生效等[20]。检验多用户并发操作时数据库事务的隔离性,多人同时点赞同一个景点时点赞数是否可以准确累加,防止出现数据覆盖或者丢失的情况。最终目的就是系统化的测试来发现潜在的缺陷,修复之后再交付一个运行稳定、逻辑严密、用户体验好的可以上线的系统。
6.2测试方法
系统测试以黑盒测试为主、白盒测试为辅的方式进行,从功能完整性、操作友好性、数据一致性三个方面展开。功能测试阶段编写测试用例覆盖所有的用户角色和功能模块,每一个用例都有前置条件、操作步骤、预期结果、实测结果等部分,最后进行对比实际输出和预期是否一致。根据不同分辨率的浏览器来测试系统的界面,检查页面布局是否乱,元素是否居中,响应式效果是否正常。兼容性测试用Chrome、Firefox、Edge主流浏览器最新版本进行测试,保证核心功能可以在各个内核下正常使用。压力测试用模拟工具发起了50个用户的请求,对系统的响应时间和数据库连接池的占用情况进行观察,评价目前的部署架构是否可以支持初期的用户量。
6.3测试用例
景点推荐查看功能测试如表6-1所示。
表6-1 景点推荐查看功能测试表
|
测试项 |
测试目的 |
测试步骤 |
预期结果 |
实际结果 |
|
列表加载 |
验证景点列表正常显示 |
进入景点推荐页面 |
卡片列表展示景点信息 |
符合预期 |
|
分类筛选 |
验证筛选功能有效 |
选择景点类型下拉框 |
列表刷新显示对应类型 |
符合预期 |
|
详情跳转 |
验证详情页跳转正确 |
点击任意景点卡片 |
跳转至详情展示完整信息 |
符合预期 |
|
点赞操作 |
验证点赞功能正常 |
详情页点击点赞按钮 |
点赞数加1按钮状态变化 |
符合预期 |
|
收藏操作 |
验证收藏功能有效 |
详情页点击收藏按钮 |
提示收藏成功个人中心可见 |
符合预期 |
行程规划生成功能测试如表6-2所示。
表6-2 行程规划生成功能测试表
|
测试项 |
测试目的 |
测试步骤 |
预期结果 |
实际结果 |
|
参数输入 |
验证表单可正常填写 |
在助手页面输入预算天数 |
输入框正常接收字符 |
符合预期 |
|
方案生成 |
验证匹配逻辑正确 |
点击生成方案按钮 |
返回按天排序的行程 |
符合预期 |
|
手动调整 |
验证顺序调整功能 |
拖动景点调整顺序 |
日程表实时更新 |
符合预期 |
|
费用计算 |
验证总预算计算准确 |
修改住宿或增加景点 |
底部总费用重新计算 |
符合预期 |
|
方案保存 |
验证保存功能有效 |
点击保存按钮 |
规划出现在个人列表中 |
符合预期 |
论坛发布功能测试如表6-3所示。
表6-3 论坛发布功能测试表
|
测试项 |
测试目的 |
测试步骤 |
预期结果 |
实际结果 |
|
编辑器加载 |
验证发布页正常打开 |
点击发布按钮 |
进入编辑器页面 |
符合预期 |
|
图片上传 |
验证上传功能有效 |
选择本地图片上传 |
图片预览在编辑区 |
符合预期 |
|
内容提交 |
验证提交逻辑正常 |
填写完整后点击提交 |
状态变为待审核 |
符合预期 |
|
敏感词过滤 |
验证拦截机制生效 |
输入敏感词提交 |
提示包含敏感词 |
符合预期 |
|
未登录提交 |
验证登录校验有效 |
未登录状态点击提交 |
跳转至登录页 |
符合预期 |
管理员审核功能测试如表6-4所示。
表6-4 管理员审核功能测试表
|
测试项 |
测试目的 |
测试步骤 |
预期结果 |
实际结果 |
|
待审核列表 |
验证待审核项正常显示 |
进入攻略管理页 |
待审核攻略高亮展示 |
符合预期 |
|
详情查看 |
验证内容完整显示 |
点击攻略详情按钮 |
展示标题正文图片 |
符合预期 |
|
审核通过 |
验证通过逻辑正确 |
点击审核通过按钮 |
攻略状态改为已发布 |
符合预期 |
|
审核驳回 |
验证驳回逻辑有效 |
点击驳回填写理由 |
攻略退回用户编辑页 |
符合预期 |
|
批量操作 |
验证批量功能可用 |
勾选多条点击批量通过 |
选中攻略同时通过 |
符合预期 |
天气查询功能测试如表6-5所示。
表6-5 天气查询功能测试表
|
测试项 |
测试目的 |
测试步骤 |
预期结果 |
实际结果 |
|
当前城市 |
验证默认天气加载 |
进入天气查询页 |
显示当前城市实况 |
符合预期 |
|
城市切换 |
验证切换功能有效 |
点击热门城市名称 |
天气信息更新为对应城市 |
符合预期 |
|
预警信息 |
验证预警列表加载 |
滚动至预警区域 |
显示多条预警记录 |
符合预期 |
|
七天预报 |
验证预报数据完整 |
查看预报区域 |
显示未来七天天气 |
符合预期 |
|
搜索城市 |
验证搜索功能可用 |
输入城市名搜索 |
搜索结果匹配输入 |
符合预期 |
7总结
旅游信息分享系统设计与实现,主要解决自由行游客在出行前信息整合的痛点,创建出一个集景点推荐、攻略查看、行程规划、社区互动、天气查询等为一体的综合性服务平台。系统把分散在各个地方的旅游相关信息按照行为路径重新组织起来,使用户在制定旅行计划的时候可以在一个界面内完成信息搜集、方案产生和内容分享,从而有效地减少跨平台切换所造成的耗时。经过完整的用户需求分析、架构设计、编码实现、系统测试之后,系统已经可以满足普通用户和管理员两个角色的所有业务需求,景点详情页、攻略详情页可以进行点赞、收藏、评论等操作,行程规划助手可以根据用户的预算和天数自动给出路线方案,管理员后台对标签、目的地、景点、攻略、行程等都有完整的管理权限。
系统使用SpringBoot搭建后端服务层,采用SpringBoot的自动配置、依赖注入等方式快速组织业务模块,用Vue.js创建响应式界面,用组件化开发的方式保证景点卡片、评论列表等公共组件可以被复用。MySQL存储业务数据时严格遵守第三范式的要求,用合理的主外键关联来保证数据的一致性,行程规划模块频繁查询景点和住宿信息的时候使用了数据库连接池技术,提高了响应速度。前后端分离架构使开发团队可以同时进行工作,前端修改界面样式的时候后端服务不需要做任何改动,这样就为以后开发移动端应用留出了接口。
系统还存在着可以改进的空间,行程规划助手的匹配算法目前是根据预设规则来筛选的,未来可以加入协同过滤或者基于用户偏好的推荐模型,提高路线生成的个性化程度。社区模块的帖子展示目前是按照发布时间倒序排列的,以后可以加入热度计算逻辑,把点赞数、评论数和时效性结合起来生成综合排序。目前天气查询功能使用第三方免费接口调取数据,数据更新频率和稳定性受到服务商的影响,长期运营可以考虑接入商业气象API来提高服务质量。系统部署初期用户数量较少,单节点架构可以满足日常访问,随着用户数量的增加可以采用缓存的方式降低数据库的压力,必要时也可以扩展成集群的形式来提高系统的可用性。旅游信息分享系统对提高出行准备效率有明显的应用价值,经过不断的迭代更新之后会更加适合于广大自由行游客使用。
参考文献
致谢
论文写到致谢部分,意味着学生生涯即将画上句号。回想选题之初在几个方向间反复摇摆,最终选定旅游信息分享系统,是因为自己也是自由行爱好者,每次出发前在各平台间来回切换的繁琐深有体会。做这个系统的过程像是把自己的旅行经验一点点拆解再组装,景点该怎么分类、攻略要包含哪些信息、行程规划的逻辑怎样才合理,每一个决策背后都是曾经踩过的坑。代码跑通的那天晚上,看着自己写的规划助手真的生出了路线,那种成就感比完成任何作业都强烈。
感谢指导老师在整个研究过程中的包容与点拨。开题时我的想法还很粗糙,老师没有直接否定,而是用问题引导我一步步想清楚系统到底要解决什么实际问题。中期遇到技术难点进度停滞,老师提醒我从用户最核心的需求往回推,不要被框架束缚。这些指导不只影响了这篇论文,也让我学会在面对复杂问题时如何拆解、如何聚焦。感谢室友在熬夜写代码时帮我带饭,在调试不出bug时听我抱怨,那些一起对着屏幕找分号缺漏的夜晚会成为日后回忆里的光点。
感谢父母从不干涉我的选择,只在我疲惫时说一句累了就歇歇。二十多年你们替我挡了太多风雨,现在终于轮到我去承担。这个系统也许不够完美,但它是我用所学知识认真搭建出的第一个完整作品。写完最后一个字时窗外天已经黑了,我知道这不是结束,是另一个开始。
网硕互联帮助中心


![打卡信奥刷题(3491)用C++实现信奥题 P10734 [NOISG 2019 Prelim] Experimental Charges-网硕互联帮助中心](https://www.wsisp.com/helps/wp-content/uploads/2026/08/20260805014046-6a72949eaf30f-220x150.png)

评论前必须登录!
注册