新闻详情

新闻详情

首页 / 资讯中心 / 详情

SpringBoot+Vue+MySQL旅游网站系统搭建与运行全攻略

发布时间:2026/10/1 17:40:28来源:尧图网络
SpringBoot+Vue+MySQL旅游网站系统搭建与运行全攻略
旅游网站信息管理系统SpringBootVueMySQL这套全家桶怎么跑起来最近一直在折腾旅游类Web项目正好把一套基于SpringBoot后端、Vue前端、MySQL数据库的信息管理系统源码完整跑通了。这套系统面向喀什旅游场景涵盖了景点信息展示、旅游线路管理、用户评论、后台数据维护等常见模块拿来练手、做课程设计、接外包项目都非常合适甚至可以直接二次开发改造成其他城市的旅游网站。这套源码最大的价值在于三件套配合得比较标准后端接口用SpringBoot统一提供前端页面用Vue组件化渲染数据全部落在MySQL里几乎就是目前中小型Web项目最经典的技术组合。不管你是刚学完SpringBoot和Vue的新手还是想快速搭一套管理系统的老手这篇文章会从架构拆解、核心配置、实操步骤到问题排查完整复盘我是怎么把它跑起来并理解透的。1. 项目整体设计与思路拆解1.1 为什么选SpringBootVueMySQL这套组合先说选型逻辑。SpringBoot是目前Java后端最主流的快速开发框架内置Tomcat简化了大量XML配置通过Starter机制可以几行配置就接入Web、MyBatis、数据库连接池这些常用组件。Vue作为前端框架主打组件化开发和响应式数据绑定非常适合做信息展示类网站——景点列表、详情页、后台管理界面这种结构清晰的业务用Vue写起来效率非常高。MySQL则是轻量可靠的关系型数据库旅游信息这种结构化数据用MySQL管理再合适不过。这三者组合起来就是一条标准的开发链路Vue页面通过Axios调用SpringBoot写的RESTful接口SpringBoot通过MyBatis操作MySQL数据库数据最终渲染回前端页面。前后端分离职责明确后期扩展或维护都比传统JSP项目舒服得多。而且这套组合的学习资料多、社区活跃、招聘市场需求大学完能直接应用到实际工作场景。1.2 旅游网站信息管理系统的业务模块划分一个旅游网站信息管理系统核心业务其实可以拆成两大块前台展示和后台管理。前台展示模块首页轮播图、热门景点推荐、景点分类列表、景点详情页、旅游线路展示、线路详情、用户登录注册、用户评论、旅游攻略文章等。后台管理模块景点信息增删改查、线路管理、轮播图管理、用户管理、评论审核、管理员登录与权限校验等。喀什这个场景很典型景区分散、线路组合多对信息分类和检索的需求非常明确。比如按自然风光人文古迹美食体验分类景点按一日游两日游定制游分类线路这套系统正好把这些业务通过数据库表和接口设计给串起来了。1.3 项目结构设计与代码组织方式从源码的整体目录看它是标准的前后端分离结构大致是这样的travel-system/ ├── backend/ # SpringBoot后端工程 │ ├── src/main/java/ │ │ ├── com/travel/ │ │ │ ├── controller/ # 接口控制层 │ │ │ ├── service/ # 业务逻辑层 │ │ │ ├── mapper/ # MyBatis数据访问层 │ │ │ ├── entity/ # 实体类 │ │ │ ├── config/ # 配置类拦截器、跨域等 │ │ │ └── common/ # 通用工具、统一返回结果 │ │ └── TravelApplication.java # 启动类 │ └── src/main/resources/ │ ├── application.yml # 核心配置文件 │ └── mapper/ # MyBatis的XML文件 └── frontend/ # Vue前端工程 ├── src/ │ ├── views/ # 页面组件 │ ├── components/ # 公共组件 │ ├── router/ # 路由配置 │ ├── api/ # 接口请求封装 │ ├── store/ # 状态管理Vuex或Pinia │ ├── assets/ # 静态资源 │ └── App.vue # 根组件 └── package.json # 前端依赖管理这种前端一个工程、后端一个工程的组织方式在实际开发中是主流做法。前端工程可以独立部署到Nginx后端工程打成Jar包部署两边通过HTTP接口通信互不干扰。对新手来说这种结构也便于理解——改页面就在frontend目录里找改接口就在backend目录里找不用在两个技术栈之间来回跳。2. 核心细节解析与实操要点2.1 后端SpringBoot的关键配置与接口设计后端这部分最值得关注的是application.yml配置文件和接口设计规范。application.yml里一般会配置这几项服务器端口默认8080如果被占用可以改成8081或自定义端口。数据库连接信息数据库URL、用户名、密码。这套源码默认连接的库名通常是travel_db本地跑起来之前要先建好库并进行数据初始化。MyBatis配置Mapper文件路径、实体包别名、驼峰命名映射等。文件上传相关配置如果涉及图片/视频上传还会配上传路径和大小限制。接口设计上这套系统基本遵循RESTful风格比如GET /api/attraction/list分页查询景点列表GET /api/attraction/{id}查询景点详情POST /api/attraction新增景点PUT /api/attraction更新景点信息DELETE /api/attraction/{id}删除景点POST /api/user/login用户登录POST /api/user/register用户注册GET /api/comment/list?attractionIdxxx按景点查评论统一返回结果也很重要。这套源码里通常会封装一个Result类包含code状态码、msg消息、data数据三个字段。前端拿到这个结构后根据code判断请求是否成功再做后续处理。我看过不少烂代码接口返回值五花八门有的直接返回Map有的直接返回实体类前端解析全靠猜。而这套源码的规范统一这一点值得学习。2.2 前端Vue的页面架构与组件拆分前端用的是Vue一般都搭配Vue Router做路由管理。页面层面会分成两类面向游客的前台页面和面向管理员的后台页面。前台页面通常包括首页Home.vue轮播图 热门景点推荐入口景点列表页AttractionList.vue分类筛选 分页展示景点详情页AttractionDetail.vue图文介绍 评论区线路列表页RouteList.vue和线路详情页RouteDetail.vue登录/注册页Login.vue、Register.vue个人中心Profile.vue查看自己的评论、收藏等信息后台管理页面则包括登录页复用或单独数据概览仪表盘Dashboard.vue景点管理AttractionAdmin.vue表格展示 新增/编辑弹窗线路管理RouteAdmin.vue用户管理UserAdmin.vue评论管理CommentAdmin.vue组件拆分的思路也很简单——把重复出现的模块抽出来。比如页面顶部的导航栏、底部的版权栏、景点卡片、分页组件这些都应该写成公共组件放进components目录。这样页面代码会干净很多改一处全站生效。前端请求后端接口一般会在src/api目录下建一个request.js封装Axios实例统一设置baseURL、请求超时时间、请求拦截器比如自动携带token和响应拦截器比如统一处理错误码。然后按业务模块写具体的API函数比如attraction.js里就放景点相关的所有请求。我不建议每个页面直接裸用Axios那样重复代码多一旦接口地址变更改起来要命。2.3 MySQL数据库设计与表关系规划数据库设计是整个系统的基础表的合理性直接决定后期开发效率。从这套源码来看核心表大致有这些表名用途关键字段user用户表id, username, password, nickname, avatar, phone, create_timeattraction景点表id, name, cover, location, category_id, description, detail, price, create_timecategory景点分类表id, name, sortroute旅游线路表id, title, cover, days, price, itinerary, descriptioncomment评论表id, user_id, attraction_id, content, create_time, statusbanner轮播图表id, image, title, link_url, sortadmin管理员表id, username, password, role最关键的两个关联关系是景点和分类是多对一关系一个景点属于一个分类一个分类下有很多景点。所以景点表里存category_id外键。评论和用户、景点都是多对一关系评论表里同时存user_id和attraction_id。设计表的时候有几点值得注意密码字段不要存明文。源码里一般会用MD5加密存储登录时对输入的密码加密后比对。时间字段用datetime并设置默认值CURRENT_TIMESTAMP这样插入数据时自动记录创建时间。状态字段用tinyint比如评论的status字段0表示待审核1表示已通过2表示已驳回。比用字符串存待审核已通过更省空间、查询更快。图片字段存相对路径或URL不要直接存图片二进制。系统里图片文件上传到服务器指定目录数据库存路径即可。2.4 前端鉴权方案与前后端交互细节旅游网站虽然信息是公开的但评论、收藏、后台管理这些操作需要区分用户身份。这套系统采用的鉴权方案比较简单实用JWTJSON Web Token。用户登录成功后后端会生成一个token返回给前端。前端把token存到localStorage或sessionStorage里在Axios请求拦截器中带上这个token。后端通过拦截器校验token的合法性如果有效就放行如果无效就返回401状态码前端收到401后跳转到登录页。后台管理接口还需要区分管理员权限。通常管理员表和普通用户表是分开的管理员的token里会带一个角色标识后端接口校验角色后决定是否放行。比如删除景点、修改轮播图这类敏感操作应该只允许管理员执行。前后端交互中还有一个特别容易踩坑的地方就是跨域问题。前端开发服务器默认在localhost:5173Vite或localhost:8081后端接口在localhost:8080不同端口之间通信就是跨域。解决办法一般有几种在后端配置CORS跨域过滤器允许指定来源访问。在前端Vite配置代理把/api开头的请求代理到localhost:8080。部署后通过Nginx统一转发不存在跨域问题。这套源码里后端一般都已经写好了CORS配置本地跑起来基本不会遇到跨域拦截。3. 实操过程与核心环节实现3.1 环境准备与项目导入先把运行环境准备好这一步别偷懒环境问题能折腾人一整天。JDK建议JDK 8或JDK 11。SpringBoot 2.x版本对这些版本兼容最稳JDK 17也能跑但部分旧版本SpringBoot需要升级。Maven3.6以上版本就行主要用于后端依赖下载和打包。Node.js建议16或18 LTS版本Vue 2项目用Node 14也能跑Vue 3项目建议Node 16以上。版本太高有时候反而出问题。MySQL5.7或8.0均可建议8.0性能更好字符集记得用utf8mb4能存emoji表情。IDEA VSCode后端用IntelliJ IDEA导入Maven项目前端用VSCode打开目录。如果你只用IDEA它的Vue插件也能支持前端开发但VSCode对前端体验更好。环境准备好之后先导入后端工程。IDEA里选择File - Open选中backend目录IDEA会自动识别Maven项目并开始下载依赖。第一次下载依赖会有点慢需要几分钟甚至更久建议用阿里云镜像加速Maven仓库下载。前端工程在VSCode里打开后打开终端执行npm install安装依赖。这一步同样可能遇到网络慢的问题可以配置npm使用国内镜像源npm config set registry https://registry.npmmirror.com安装完的node_modules目录会很大正常现象不用管它。3.2 数据库初始化与配置修改数据库初始化是整个运行过程里最容易出错的一步。源码目录里一般会附带一个SQL文件比如travel.sql或者schema.sql里面包含了建表语句和初始数据。操作方式很简单登录MySQL之后执行这个SQL文件Mac/Linux环境命令行执行Windows环境可以用Navicat等可视化工具导入。mysql -u root -p travel.sql如果是用Navicat这类图形化工具直接新建数据库、右键选择运行SQL文件即可。这里有个极其重要的点这个SQL文件本身的库名和你的本地账号密码要跟后端application.yml里配置一致。假设SQL文件里写的是CREATE DATABASE travel_db但后端配置文件里是jdbc:mysql://localhost:3306/kashi_travel那启动必报错——数据库不存在。所以导入SQL后第一步核对数据库名第二步确认后端配置文件里的用户名密码和实际MySQL账号一致。默认情况下源码里的配置可能是spring: datasource: url: jdbc:mysql://localhost:3306/travel_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: 123456如果你的MySQL密码不是123456记得改成自己的密码。同时确认数据库URL里的库名和SQL建出的库名一致。3.3 启动后端服务与验证接口数据库准备好后回到IDEA找到启动类TravelApplication.java右键点击运行。如果配置没问题控制台会输出SpringBoot的启动日志。看到类似这样的日志就说明启动成功了Tomcat started on port(s): 8080 (http) with context path Started TravelApplication in 5.123 seconds启动日志里还要特别注意有没有关于Mapper扫描的警告如果提示找不到Mapper就需要在启动类上加MapperScan(com.travel.mapper)注解或者在每个Mapper接口上加Mapper注解。验证接口可以直接用浏览器访问http://localhost:8080/api/attraction/list如果返回一串JSON数据就说明后端接口和数据库通了。如果在浏览器里看不到结果可以用Postman或者Apipost这类接口测试工具调试。后端端口默认是8080如果8080被其他程序占用启动会报端口冲突。解决办法就是改端口在配置文件里加一行server: port: 8081改动之后前端那边请求的baseURL也要相应调整否则就请求不到了。3.4 启动前端项目与页面测试后端跑通之后再启动前端。在VSCode的终端里执行npm run serveVue 3 Vite的项目则执行npm run dev启动成功后终端会显示本地访问地址比如http://localhost:5173或http://localhost:8081。浏览器打开这个地址就能看到网站首页了。第一次看到首页出来的时候先别急着高兴建议做几件事用管理员账号登录后台测一遍景点新增、编辑、删除功能是否正常。注册一个普通用户测试前台评论功能是否能正常提交和展示。在浏览器的开发者工具F12里打开Network面板看看接口请求的响应码是否是200有没有报404、500之类的错误。我遇到过很多次的情况是首页能显示但一登录就卡住。这种问题基本都出在token或跨域上面。你要看请求发了没有、响应是什么、前端有没有把token正确处理。3.5 核心功能模块的代码实现思路理解了整套系统能跑起来之外更关键的是看懂核心功能是怎么实现的。我挑几个有代表性的模块讲一讲实现思路这样你后面想改功能或者二次开发知道从哪儿下手。景点首页展示前端首页加载时在created或onMounted钩子里调用getBannerList和getHotAttraction接口。后端分别查询轮播图和景点列表按浏览量或权重排序返回前N条数据。前端拿到数据后通过v-for渲染轮播图和景点卡片。分页查询景点列表前端传pageNum和pageSize两个参数给后端。后端Controller接收参数后调用Service层Service层通过MyBatis的PageHelper插件或者手写分页SQL完成分页查询。返回结果包含total总记录数、pages总页数、records当前页数据三个字段。前端根据total渲染分页器点击页码时重新请求数据。这一步需要注意页码从1开始还是从0开始前后端约定一致不然后端返回的数据总感觉错了一位。使用PageHelper时的代码示例Service public class AttractionServiceImpl implements AttractionService { Autowired private AttractionMapper attractionMapper; Override public PageResultAttraction getAttractionList(int pageNum, int pageSize, Integer categoryId) { PageHelper.startPage(pageNum, pageSize); ListAttraction list attractionMapper.selectAttractionList(categoryId); PageInfoAttraction pageInfo new PageInfo(list); return PageResult.success(pageInfo); } }用户评论流程用户在前台详情页输入评论内容点击提交。前端把userId或通过token解析、attractionId、content传给后端。后端Service层校验参数后将评论数据插入comment表。新提交的评论默认status0待审核管理员在后台审核通过后status改为1前台才展示出来。这样做的好处是能过滤垃圾和广告评论实际运营旅游网站时这个功能很实用。图片上传这个模块稍微复杂一点但一旦理解就很通用。前端使用el-upload组件选择图片提交到后端POST /api/upload接口。后端接收MultipartFile判断文件类型和大小然后保存到服务器指定目录。返回给前端一个图片的相对路径或完整URL。前端拿到路径后把路径存入表单对应的cover字段提交表单时连同路径一起传给后端。后端再存储到数据库。很多新手一开始不理解先传文件再提交表单这个串行流程这里捋清楚就通了。4. 常见问题与排查技巧实录4.1 项目运行时的典型报错与解决方案我把这套系统运行中常见的报错整理成一张速查表照着排查会快很多。报错信息原因解决方案Access denied for user rootlocalhost数据库用户名密码错误核对application.yml里的账号密码确认MySQL服务已启动Unknown database travel_db数据库不存在执行SQL文件创建数据库检查库名拼写Communications link failure数据库连接失败确认MySQL服务启动检查URL端口是3306还是自定义端口Failed to configure a DataSource数据源配置失败类路径下缺少驱动依赖或配置文件读取不到检查pom.xml中是否引入mysql-connector-javaServlet.service() threw exception接口内部异常查看IDEA控制台详细堆栈多半是SQL语句或参数问题逐层排查Port 8080 was already in use端口被占用换端口或杀死占用进程后重启Error: Cannot find module node-sass前端依赖缺失执行npm install重新安装如果项目用的sass版本和Node版本不兼容考虑替换依赖方式proxy error前端代理配置错误检查vue.config.js里的devServer.proxy配置代理目标地址要和后端地址一致4.2 前后端联调中的注意事项前后端分离开发最怕的就是接口对接不一致。这里有几个高频坑位我每次帮人排查项目必查这几个点。第一个坑后端返回的字段名和前端取的不一致。比如后端实体类是attractionName前端页面里写的却是name那页面就渲染不出来。这个问题在联调时代价高所以规范做法是前排接口文档写明每个接口的请求参数和返回字段两边按文档对齐。没有文档的话就打开浏览器直接看接口返回的JSON结构。第二个坑时间格式不一致。后端返回的datetime默认序列化成ISO字符串比如2025-01-01T00:00:00但前端用的组件可能期望的是yyyy-MM-dd HH:mm:ss格式。解决方式是在后端实体类的日期字段上加JsonFormat注解JsonFormat(pattern yyyy-MM-dd HH:mm:ss, timezone GMT8) private Date createTime;第三个坑token校验拦截了登录接口。有些后端的拦截器写得不严谨把登录接口也拦截了导致用户输入用户名密码后请求直接401。正确的做法是配置拦截器时放行登录、注册、验证码等白名单路径。如果遇到一提交登录就报错的问题第一反应就是查拦截器配置。第四个坑下载或上传的文件路径。系统里如果涉及附件上传开发环境下文件保存到本地磁盘路径数据库存的是相对路径但前端访问时用的是http://localhost:8080/upload/xxx.png。如果配置不对图片会404。解决方式是把上传目录映射成静态资源路径SpringBoot里这样配置Configuration public class WebConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/upload/**) .addResourceHandler(file:D:/travel/upload/); } }4.3 部署上线时的简单调整建议如果要把这套系统放到云服务器上线有几个地方需要调整这里一并说了。后端打包在backend目录执行mvn clean package -DskipTests生成target目录下的Jar包。服务器上用java -jar travel.jar --spring.config.locationapplication-prod.yml启动。生产环境的application.yml要改数据库地址、账号密码端口不要用8080暴露在外网改成8080的话默认端口很容易被扫描到建议改成一个不常用的端口。不过我平时自用一般保持默认安全方面看你的场景。前端构建在frontend目录执行npm run build生成dist目录。这个目录里的文件是纯静态资源放在Nginx的html目录下。Nginx配置里要做两件事情一是location /指向dist目录实现前端页面访问二是location /api/反代到后端Jar包的地址。这样前后端就通过同一个域名和端口对外提供服务没有跨域问题。Nginx核心配置示例server { listen 80; server_name travel.example.com; location / { root /var/www/travel/dist; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }关于数据持久化MySQL也要做定期备份。最省事的做法是写一个crontab计划任务每天凌晨自动执行mysqldump备份数据库文件保留最近7天的备份防止数据丢失造成不可挽回的后果。我见过好几个小项目因为没有备份服务器磁盘损坏后数据全丢只能哭着重新录入这个教训希望你们不要踩。4.4 我真的建议大家自己动手敲一遍核心代码很多同学拿到源码导入能跑就丢一边了这样不行。能跑只是最低标准搞懂为什么能跑才是目标。我建议大家照着源码做三件事第一自己画一遍数据库ER图把所有表、字段、关联关系理清楚。不夸张地说搞懂了数据库设计整个系统的业务逻辑你就懂了一大半。第二自己手写一遍后端的接口。先别看源码的Controller自己根据数据库表设计接口、实现查询逻辑写完再对照源码看看差异。你会发现很多细节——比如分页参数怎么校验、空值怎么处理、异常怎么抛出——都是经验积累出来的。第三自己改一个前端页面。比如把首页的景点卡片从两列改成三列或者给景点详情页加一个天气组件。改的时候你会接触到组件传参、生命周期、样式作用域这些实际开发高频知识点。改通了你的前端水平就会有质的提升。写在最后说实话旅游网站管理系统算是一个麻雀虽小、五脏俱全的典型JavaWeb项目。它不像电商系统那么复杂没有订单、支付、库存那些棘手的业务但又完整覆盖了用户体系、内容管理、分类检索、评论互动这些主流Web项目必备的能力。如果你正处在学完SpringBoot基础但不知道做什么项目的阶段用这套源码练手是最合适的。按照我的实操路径先初始化数据库再启动后端、启动前端走通一遍流程然后对着源码梳理接口设计和表结构最后尝试改一两个功能模块把它变成你自己的东西。整个过程走完你对这套技术栈的理解一定会比以前扎实很多。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Intel VT-x启用指南:BIOS/UEFI虚拟化开关实操手册 2026/10/1 18:20:18

Intel VT-x启用指南:BIOS/UEFI虚拟化开关实操手册

1. 这不是BIOS报错,是虚拟化能力的“健康体检报告”你刚点开eNSP,界面弹出红色警告:“Intel VT-x 处于禁用状态”;或者装完WSL2,系统提示“此计算机上未启用虚拟化”;又或者VMware Workstation启动时卡在“…

阅读更多 →
CrewAI实战:从零搭建多Agent协作流水线 2026/10/1 18:20:18

CrewAI实战:从零搭建多Agent协作流水线

1. 框架选型:为什么是CrewAI而不是LangChain或AutoGen 先说结论:这个5.9万Star的项目,大概率是CrewAI。它是目前多智能体编排领域最火的开源框架之一,GitHub上五位数Star,社区活跃度非常高,文档友好&#x…

阅读更多 →
C#泛型与函数式编程组合实战:从类型安全到代码复用的最佳实践 2026/10/1 18:20:17

C#泛型与函数式编程组合实战:从类型安全到代码复用的最佳实践

不知道你有没有遇到过这种场景&#xff1a;打开同事提交的 PR&#xff0c;看到代码里一排泛型约束、连着几个 Func<T, TResult> 和一条链式 LINQ&#xff0c;第一反应是"这人水平可以啊"。但等你接手维护&#xff0c;却发现这套"高级代码"改起来无…

阅读更多 →
AI会编造参考文献?8款免费工具从检索到核验,构建真实文献引用链路 2026/10/1 18:20:11

AI会编造参考文献?8款免费工具从检索到核验,构建真实文献引用链路

前几天学妹抱着开题报告来找我&#xff0c;导师在“参考文献”那一栏用红笔打了个大大的问号&#xff0c;旁边只批了六个字&#xff1a;请核实文献真实性。学妹当场就懵了&#xff0c;她说这些文献是AI写的&#xff0c;题目、作者、年份全都规规矩矩&#xff0c;怎么就不真实了…

阅读更多 →
基于SpringBoot的高校教师教研信息填报系统设计与实现 2026/10/1 18:20:11

基于SpringBoot的高校教师教研信息填报系统设计与实现

高校里“填表”这件事&#xff0c;大家多少都经历过。从课题申报、论文统计到工作量核算&#xff0c;每到期末或申报季&#xff0c;一份表在QQ群、邮箱、打印室之间来回传递&#xff0c;教研秘书逐个催收、手工合并&#xff0c;最后导出的Excel还要手工清洗一遍。搞过这个流程的…

阅读更多 →
COMSOL石墨烯/钙钛矿太阳能电池光电耦合仿真模型复现指南 2026/10/1 18:20:11

COMSOL石墨烯/钙钛矿太阳能电池光电耦合仿真模型复现指南

COMSOL石墨烯/钙钛矿太阳能电池仿真模型&#xff1a;光电耦合模型复现这个课题我盯了很久。石墨烯和钙钛矿&#xff0c;一个是二维材料界的明星&#xff0c;一个是光伏领域的当红炸子鸡&#xff0c;把两者放进COMSOL里做光电耦合仿真&#xff0c;不是简单的“11”&#xff0c;而…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉