news 2026/10/12 5:55:11

SpringBoot+Vue+MySQL文旅网站系统搭建与部署全记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot+Vue+MySQL文旅网站系统搭建与部署全记录

前阵子在本地完整跑了一遍“七彩云南文化旅游网站信息管理系统”这套源码,技术栈很标准:SpringBoot后端 + Vue前端 + MySQL,目录结构、接口设计都比较规整,拿过来确实可以直接启动。它不是那种只有登录页和空壳菜单的演示项目,而是把文化旅游网站的前台展示和后台信息管理都做了闭环,景点内容、旅游攻略、资讯文章、轮播图这些都能在后台维护,前台实时刷新。对于正在学SpringBoot和Vue全栈开发的人来说,这是一份很合适的项目范本;对于要做课程设计、毕业设计的人来说,也可以拿它当底子,基于现有功能再做扩展。下面我把整个项目的模块思路、数据库设计、启动过程和踩坑点完整梳理一遍,当作一份运行笔记。

1. 项目定位与技术选型背后的逻辑

1.1 这套系统到底解决什么问题

很多文旅类网站在早期都是静态页面,运营人员想改一个景点简介、换一张轮播图,都要找开发改代码再重新发布,效率很低。这个信息管理系统把“内容展示”和“信息管理”拆成了两条线:访客看到的是网页前台,运营人员在后台维护内容,前台数据跟着后台改动实时更新。说白了,它要解决的问题就是让不会写代码的人也能管理网站内容。

从项目结构来看,它具备了完整Web系统该有的三层东西:SpringBoot后端负责业务逻辑和接口,Vue前端负责页面交互,MySQL负责数据存储。实际运行后,我确认这套系统的业务场景不是随便拼凑的,而是围绕“七彩云南文化旅游”做了内容闭环:前台有景点展示、旅游资讯、攻略文章、首页轮播,后台有对应的维护入口。这套逻辑放到其他文旅项目上也成立,所以它的扩展价值比单纯一个毕业设计要高。

这套源码适合谁看?如果你是刚学完Java基础和前端基础、想找一个能串起全栈知识的项目,它比零散的小demo有价值得多;如果你正在做信息管理类课程设计,它的前后台划分可以直接参考。就算你只是好奇一个完整项目的数据流向,也可以用它来理解“页面→接口→数据库”这条链路。

1.2 技术选型为什么是SpringBoot + Vue + MySQL

有人可能会问,做文旅信息展示,直接套一个现成的CMS系统不就行了?但如果把“旅游网站”当成一个信息管理场景来看,CMS的自定义能力往往跟不上业务需求。SpringBoot的价值在于它把Spring家族的配置简化到了极致,内嵌Tomcat让项目不需要单独部署Web容器,一个java -jar就能跑起来,非常适合快速构建RESTful API。

Vue这边,组件化开发让页面结构很清晰。前台首页、景点列表、文章详情、后台表单,都可以拆成独立组件,谁负责哪块一目了然。组件复用在文旅网站里尤其有用,比如景点卡片在前台列表页和首页推荐位都能复用,改一次样式,几处同步更新。

MySQL作为关系型数据库,在处理文旅业务时优势也很明显:景点和分类是一对多关系,文章和评论是一对多关系,用户和收藏也是多对多关系。用关系型模型维护这些关联,比用NoSQL需要自己在业务层做关联要省心很多。有人觉得MySQL不够“新潮”,但一个需要保证数据一致性、需要频繁做带条件查询的管理系统,MySQL就是最稳的底子。

这个技术组合还有一个现实原因:资料多、排错容易。SpringBoot的报错信息、Vue的调试方式、MySQL的SQL执行日志,网上有大量成熟案例。对于以“快速跑通、长期迭代”为目标的文旅类系统来说,稳定性和可维护性比技术炫技重要得多。

1.3 前台与后台的功能划分

这类系统通常不会把前台和后台混在一个界面里,而是从路由层面就分开。前台面向游客,核心是信息检索和阅读体验,页面讲究视觉引导;后台面向管理员,核心是数据维护,表格、表单、筛选这些操作要顺手。我按实际运行后的效果把模块整理成了下面的表:

端模块核心作用
前台首页轮播展示热门景点和活动,做视觉引流
前台景点列表分页浏览景点,支持名称、分类筛选
前台景点详情展示大图、简介、游玩内容
前台攻略文章阅读行程建议、游记内容
前台旅游资讯发布公告、活动、行业动态
后台管理员登录身份校验,区分操作权限
后台景点管理新增、编辑、上下架景点
后台攻略/资讯管理维护前台文章列表和详情
后台轮播图管理控制首页轮播内容和排序
后台评论/用户管理查看用户行为,审核评论内容

一眼看过去,功能不算“惊艳”,但对一个信息管理系统来说,这套模块已经覆盖了主营业务。后续想扩展也很简单:比如加入酒店推荐、门票预订、线路规划,本质上就是新增一张业务表,再做一套新的接口和页面,现有骨架完全撑得住。

2. 数据库设计思路与核心表结构

2.1 关系建模是这类系统最容易出错的地方

运行项目之前,我习惯先打开数据库脚本,把表关系过一遍。很多“可直接运行”的项目,问题往往不发生在代码,而在表设计。

这套系统的表关系主要是一对多:一个内容分类下面有多个景点,一个景点下面可以挂多篇攻略,一个用户可以发布多条评论。如果这些关系没有理清,后面做列表查询、详情联动就会很别扭。比如查询景点列表时,如果只查景点表不关联分类表,列表页就只能显示ID,没法直接显示“民族风情”“自然风光”这样的分类名称,还得在Java代码里二次处理,纯属给自己找麻烦。

以景点模块为例,景点表通常包含景点名称、封面图、简介、详细内容、分类ID、所在城市、浏览量等字段。分类ID是外键,关联分类表;浏览量和收藏量属于冗余字段,每次访问时自增,或者刷新时更新。这种冗余设计在查询时能省掉很多开销,因为列表页只需要一个数字,没必要临时count汇总。

2.2 核心表字段参考

拿到一套源码,看不懂表结构就很难做二次开发。这里我整理了一份常见字段参考,不一定和手头这套源码完全一致,但大方向都是这样:

表名常见字段说明
bannerid, image_url, link_url, sort, status首页轮播图配置
categoryid, name, sort, status内容分类,如“自然风光”“人文风情”
scenicid, category_id, name, cover, summary, content, city, views, status景点核心数据
articleid, category_id, title, cover, content, author, views, status攻略文章或资讯内容
sys_userid, username, password, nickname, phone, avatar, status前台注册用户
adminid, username, password, real_name, role后台管理员
commentid, user_id, article_id, content, create_time, status景点或文章评论

需要注意,表字段的命名风格通常是下划线命名,对应Java实体类里的驼峰命名。如果配置了map-underscore-to-camel-case: true,MyBatis会自动映射,不需要写一堆resultMap。如果没配置,后台查询可能会查出空字段。这是新手最容易疑惑的地方。

2.3 为什么多数表都带status字段

很多人在第一次跑这类项目时会遇到一种情况:数据库里明明有景点数据,前台页面却看不到。这时候大多数问题不是数据丢了,而是status字段的值不对。

为什么设计status而不是直接删记录?因为内容管理需要“下线但保留”的场景。一条景点短期内不推荐,管理员把status改成0,记录还在数据库里,只是前台查询时被过滤掉。这种逻辑删除/软状态方案比物理删除稳妥得多,误操作也能恢复。

在后端实现上,前台查询接口都会默认拼接“status = 1”条件。调试的时候如果发现数据不出来,第一件事就是检查这条数据的status是否启用了。很多“数据明明有,页面却空白”的疑惑都是这个字段惹的祸。

3. 核心功能实现与启动运行实操

3.1 运行前环境版本核对

这套系统的关键技术是SpringBoot + Vue + MySQL,运行前必须先确认本地环境匹配。最容易出问题的是JDK版本:SpringBoot 2.x通常用JDK8就能跑,SpringBoot 3.x则强制要求JDK17。启动前先打开pom.xml看一眼spring-boot-starter-parent的版本号,别用错JDK。

前端这块,Vue2项目一般用Node 14或16比较稳,Vue3 + Vite项目通常需要Node 16以上。如果Node版本太高或太低,npm install可能直接报错。数据库方面MySQL 5.7和8.0都可以,但驱动和连接参数略有差异。我整理了一份建议版本对照:

环境建议版本说明
JDK1.8 / 17看SpringBoot是2.x还是3.x
Maven3.6+管理后端依赖
Node14+ / 16+看Vue是2还是3,Vite要求更高
MySQL5.7+ / 8.0+8.0驱动类名不同
IDEIDEA/VS Code后端推荐IDEA,前端可混用

3.2 初始化数据库与修改后端配置

拿到源码后,第一件事不是急着启动,而是先把数据库准备好。源码目录下一般会带一个sql文件夹,里面是yunnan_travel.sql之类的初始化脚本。用Navicat或命令行执行脚本,生成数据库和基础数据。

执行SQL时注意编码,建议在脚本里使用utf8mb4字符集,否则后面写入中文可能会乱码。我遇到过不少项目,明明页面正常,管理员在后台输入中文后保存,前台却显示成问号,基本都是连接串里没指定字符编码导致的。

接着修改后端配置文件application.yml,核心是数据源配置:

spring: datasource: url: jdbc:mysql://localhost:3306/yunnan_travel?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver

这里几个参数是有讲究的:useUnicode=true和characterEncoding=utf8保证中文正常读写;serverTimezone=Asia/Shanghai解决MySQL 8.0的时区报错;driver-class-name如果是MySQL 8.0,必须用com.mysql.cj.jdbc.Driver,老项目里的com.mysql.jdbc.Driver在8.0驱动下会直接报ClassNotFound。

3.3 启动后端服务

后端项目用IDEA打开,等Maven把依赖下载完,找到主类,也就是带@SpringBootApplication注解的那个类,直接运行。如果习惯命令行操作,也可以在项目根目录执行:

mvn spring-boot:run

启动成功后,控制台会打印Tomcat started on port(s): 8080之类的信息。默认端口是8080,如果你本地8080被其他服务占用了,可以改配置文件里的server.port,改成8081、9090都行。改完之后,前端代理和后端接口文档里的地址也要同步调整,否则联调时还是会走默认端口。

启动过程中最常见两类报错:一是数据库连不上,控制台会打印Communications link failure;二是端口占用,直接提示Port 8080 was already in use。前者按上一节的配置项排查,后者换端口或者删掉占用进程就行。

3.4 启动Vue前端并完成联调

后端起来之后,接着启动前端。用命令行或IDE终端进入前端项目目录,先安装依赖:

npm install

如果网络不太好,npm install可能会卡很久,可以先把镜像源切到国内源:

npm config set registry https://registry.npmmirror.com

依赖安装完成后启动开发服务:

npm run dev

Vue项目默认端口常见的是8080或3000。如果Vue默认端口也是8080,而后端也在8080,就会冲突。这时候建议不要改后端口,而是给前端配置代理转发。以Vue CLI项目为例,在vue.config.js里加这段配置:

module.exports = { devServer: { port: 3000, proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } } } }

这样配的好处是,前端页面请求/api/xxx时,开发服务器会把它转发到后端的http://localhost:8080/api/xxx,既解决了跨域问题,又不需要在Axios里写死完整的后端地址。等以后部署上线,只要在Nginx里配一条同样的转发规则就行。

3.5 验证系统可运行的关键自测点

系统启动成功后,不要只看页面能打开就认为万事大吉。我建议按下面四个点做一轮自测:

  1. 前台首页能加载出轮播图和景点列表,图片不裂。
  2. 点击某个景点进入详情页,能看到完整内容信息。
  3. 后台登录能成功,进入控制台后能看到昨天的统计数据或内容列表。
  4. 在后台新增一条景点数据,回前台刷新,能看到这条新内容。

这四个点全部通过,说明前后台数据链路是通的。如果前台能看到轮播图,但景点列表为空,问题多半出在“该分类下没有启用状态的景点”,而不是程序坏了。用Postman直接调后端接口也能帮助定位,比如登录接口返回正常JSON、列表接口返回分页数据,就说明后端没问题,剩下的锅在前端渲染或跨域配置上。

4. 常见问题与排查技巧实录

4.1 数据库连不上:九成是配置和驱动问题

这个问题我在多个环境里遇到太多次了。第一反应是先看报错关键字:如果是Access denied for user 'root'@'localhost',就是用户名或密码不对,改application.yml就行。如果是Unknown database 'yunnan_travel',说明SQL脚本没执行,或者数据库名和配置不一致。如果是Public Key Retrieval is not allowed,在连接串末尾加allowPublicKeyRetrieval=true即可。

MySQL 8.0和5.7的驱动类名不一样,这也是高发问题。老项目里写的是com.mysql.jdbc.Driver,这个类在MySQL 8.0驱动中仍然存在,但已经标记为废弃,部分版本会直接报错。正确写法是com.mysql.cj.jdbc.Driver。还有一个隐藏坑:如果之前机器上装过多个数据库并改了端口,连接串里的3306可能根本不是MySQL实际端口,检查一下netstat或配置文件,别在端口上钻牛角尖。

4.2 前台页面数据加载不出来:优先查跨域

前后端分离项目里,数据加载不出来最常见的不是接口没通,而是浏览器把跨域请求拦了。打开浏览器开发者工具,切到Network面板,如果看到某个请求标红,状态码是CORS error,或者控制台打印blocked by CORS policy,就是跨域问题。

解决跨域有几个常见思路。最简单的,在后端写一个配置类,允许所有来源和所有请求方法:

@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.addAllowedOriginPattern("*"); config.addAllowedMethod("*"); config.addAllowedHeader("*"); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }

或者像上面说的,用Vue的devServer代理转发。需要注意的是,如果后端接口做了登录拦截,某些接口请求失败不一定是跨域,而是没带Token。此时Network里经常会看到401状态码,先把请求头里的Authorization带上再说。

4.3 npm install卡死或构建报错

前端依赖安装失败分几种情况。第一种是网络问题,npm install长时间没有进度,切换镜像源基本能解决。第二种是Node版本和项目依赖不匹配,比如老项目用了sass-loader而本地Node版本太高,构建时会报Node version mismatch或Module build failed。这时候建议用nvm切换一下Node版本,不要硬去升级依赖。

第三种是依赖中package-lock.json带来的冲突。如果源码里的lock文件版本和你本机不一致,删掉node_modules和package-lock.json再重新install,通常能解决。构建完以后如果静态资源404,还要检查publicPath配置。默认是/,如果部署在子目录下,就要改成相对路径或对应的子目录名,不然图片、JS、CSS全找不到。

4.4 二次开发时容易忽略的细节

最后说几个我实际踩过、也觉得比较有参考价值的细节。

第一,改功能一定要同时改前端和后端。很多人习惯在前端页面里直接看到某个字段,就去后端改SQL或改接口,结果前端页面没适配,数据还是显示不出来。比如想在景点列表加一个“推荐指数”字段,后端实体类、数据库表、前端表格列三个地方都要动,少一个都可能报错或展示异常。

第二,默认密码和管理员账号要第一时间改掉。演示项目里通常有几个预设账号,比如admin/123456,用户账号可能是test/123456。本地学习无所谓,但一旦部署到公网测试机,这些弱口令就是最直接的入口。信息管理系统后台是敏感区域,这个问题必须重视。

第三,页面上传图片的存放路径要看清楚。很多项目把图片上传到本地某个临时目录,比如D:/upload/,前端通过/upload/**访问。如果换了一台机器,这个目录不存在,图片上传成功但前台显示不出来。优先在配置文件里为上传路径设置变量,或者接入对象存储,可以省掉很多空间和性能上的麻烦。

第四,做功能扩展时不要为了图快直接改数据库结构,要留意启用的代码是否有关联。给景区表加一个“热度”字段容易,但如果删除某个旧字段,文章表里的数据可能引用不到。先梳理清楚表之间的关系,再动结构。

这套系统我整体跑下来,最大的感受是它把文旅信息管理该有的链路走完整了,适合作为全栈项目的第一块跳板。刚开始接触时,不要急着改功能,建议按“前台页面→后端接口→数据库表”的顺序把数据流梳理通:看到一个页面上的景点卡片,就去找它调用了哪个接口,接口查到哪张表,表里哪些字段映射到了页面。把这条链路理清楚,后面做扩展和优化都会顺畅很多。最后再提醒一句:源码里的数据库连接信息、密钥文件、默认账号都属于敏感内容,无论你是自己学习还是准备拿去二次开发,交付或部署前一定要先改掉这些默认值。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 5:52:05

容器里没有ls?从内核证据到nsenter抓包的完整排障指南

“面试被问:容器里连 ls 都没有,网络故障怎么抓包?”——这题我第一次听到时也愣了几秒。很多人的第一反应是:没工具怎么排障?装个 busybox?或者顶多点两下 curl?但面试官真正想看的&#xff0c…

作者头像 李华
网站建设 2026/10/12 5:51:34

Java实现GB28181国标接入:SIP信令与RTP媒体流的平台化实践

简介:JGB28181是一套基于Java实现的GB28181国标信令平台源码,面向安防视频监控开发者、系统集成商及需要对接国标设备的学生工程师。项目核心涵盖设备注册、目录查询、实时视频流(TCP被动/UDP)等基本功能,修改config.p…

作者头像 李华
网站建设 2026/10/12 5:51:27

Claude Code:从命令行生长的AI编程搭档

第一次在终端里敲下claude这个命令,没等几秒,AI 就把我那个跨平台项目里 20 多个文件的结构摸了个遍,然后用一句话点出了问题的根源。那一刻我意识到,这跟我平时用的聊天式 AI 辅助完全是两种东西。Claude Code 不是把 AI 塞进 ID…

作者头像 李华
网站建设 2026/10/12 5:50:11

Neuphonic 开源 43MB 语音决策模型 NeuDecide:不经 ASR 语音调用工具;法国 Mallow 儿童无屏语音游戏音箱,AI 听孩子语音实时推进丨日报

本期编辑:三水 鲍勃 01 有话题的技术 1、端侧 AI 模型公司 Liquid AI 开放两款多模态决策模型 d1:600M 首次支持音频输入,3B 可在 Jetson 上实现毫秒级决策 Liquid AI 发布 d1-3B 和实验性模型 d1-omni-600M,两款模型分别支持文…

作者头像 李华
网站建设 2026/10/12 5:49:38

PS5游戏信息聚合平台实战:从数据采集到搜索排序

“AnyPS5”这名字,是我做这个个人项目时随手起的。它要解决的事情其实很具体:当你面对一台次世代主机,无论是刚入手还是已经玩了一年多,总会反复产生“这个游戏到底值不值得买”“现在入手是不是好价”“通关之后还有什么同类作品…

作者头像 李华
网站建设 2026/10/12 5:48:43

离散机加工行业中DNC是什么?

前言 在离散机加工行业信息化架构里,最底层是工段与数控机床;上层是技术、生产、计划、采购等业务部门。很多人都听过 DNC,但经常和 CNC、MDC 混淆。 CNC 是单台数控车床 / 加工中心的机床控制器;而 DNC,是打通办公室工…

作者头像 李华