SpringBoot+Vue+MySQL全栈实战:旅游分享小程序开发与部署指南

发布时间:2026/7/28 19:59:18
SpringBoot+Vue+MySQL全栈实战:旅游分享小程序开发与部署指南 这次我们来看一个基于 JavaSpringBootVue 的丽江市旅游分享平台小程序项目。这是一个典型的计算机毕业设计项目采用前后端分离架构后端使用 SpringBoot 框架前端使用 Vue 构建小程序界面数据库采用 MySQL。对于正在寻找毕业设计选题、学习全栈开发或想了解旅游类应用实现细节的同学来说这个项目提供了一个完整的、可直接运行的参考案例。它涵盖了用户管理、景点信息展示、游记分享、互动评论等核心功能技术栈也是当前企业开发中的主流选择。本文的核心是带你从零开始把这个项目跑起来并深入理解其技术实现。我们会重点关注环境如何搭建、前后端如何启动、数据库如何配置以及每个核心功能模块对应的代码逻辑。整个过程不涉及复杂的算法或高深的架构重点在于可操作性你能不能在本地成功部署能不能理解数据是如何从数据库流转到小程序页面的。如果你手头有 IntelliJ IDEA、VSCode、MySQL 和微信开发者工具跟着步骤走一两个小时就能看到成果。1. 核心能力速览在动手之前我们先快速了解这个项目的关键信息判断它是否适合你当前的学习或开发需求。能力项说明项目类型计算机毕业设计 / 全栈学习项目技术栈Java 8/11 SpringBoot 2.x MyBatis/MyBatis-Plus MySQL 5.7/8.0 Vue 2.x 微信小程序核心功能用户登录注册、丽江景点浏览与搜索、游记发布与管理、点赞收藏评论、个人中心部署方式本地开发环境部署需分别启动后端服务和前端小程序硬件门槛普通开发电脑即可无需高性能GPU。主要依赖CPU、内存和磁盘空间。数据库MySQL需提前创建数据库并导入SQL脚本。适合场景计算机专业毕业设计参考、Java全栈开发入门学习、微信小程序开发练习、旅游类应用原型开发2. 适用场景与使用边界这个项目最适合以下几类同学计算机专业毕业生正在寻找一个功能完整、技术栈主流、有源码和文档的毕业设计题目。Java全栈初学者想通过一个真实项目学习SpringBoot如何整合MyBatis、如何提供RESTful API、如何与Vue前端交互。微信小程序开发者希望了解如何用Vue构建小程序页面如何调用后端接口以及小程序端的用户交互逻辑。项目经验积累者需要一个小型但结构清晰的项目来充实个人作品集。它能帮你解决“从理论到实践”的跨越问题让你看到用户注册、数据增删改查、文件上传、前后端联调等功能的完整代码实现。使用边界与注意事项学习目的本项目主要供学习和毕业设计参考。如果用于商业用途需要充分考虑数据安全、性能优化、合规性如用户隐私政策等问题并在此基础上进行大量重构和增强。数据合规项目中涉及的景点图片、游记内容等在实际应用中必须确保拥有合法版权或授权避免侵权风险。功能完整性作为毕业设计或学习项目它实现了核心流程但生产级功能如支付、第三方登录、消息推送、高级搜索如Elasticsearch、微服务化等可能需要自行扩展。安全考虑学习时请注意代码中可能包含硬编码的配置如数据库密码在实际部署前务必进行安全加固例如使用配置中心、环境变量管理敏感信息。3. 环境准备与前置条件在开始编码或运行之前请确保你的开发环境满足以下要求。这是项目能成功启动的基础。1. 后端开发环境JDK: 版本 1.8 或 11推荐。确保JAVA_HOME环境变量配置正确。IDE: IntelliJ IDEA推荐或 Eclipse。IDEA对SpringBoot支持更好。构建工具: Maven 3.6 或 Gradle。项目通常提供pom.xml。数据库: MySQL 5.7 或 8.0。确保服务已启动并记住 root 密码或你有权限的其他账号。2. 前端开发环境Node.js: 版本 14.x 或 16.xLTS版本。这是运行 npm 和 Vue CLI 的基础。包管理器: npm 或 yarn。安装Node.js后会自带npm。IDE: Visual Studio Code推荐或 WebStorm。微信开发者工具: 用于小程序的预览、调试和上传。需要注册微信小程序账号获取AppID。3. 版本管理工具可选但推荐Git: 用于克隆项目代码。4. 资源预估磁盘空间: 预留至少 2GB 空间用于存放项目代码、依赖包和数据库。内存: 建议电脑内存 8GB 以上以保证IDE、数据库、前后端服务同时运行流畅。检查清单[ ] JDK 已安装并配置环境变量 (java -version)[ ] MySQL 已安装并启动 (mysql --version)[ ] Maven 已安装 (mvn -v)[ ] Node.js 已安装 (node -v,npm -v)[ ] 微信开发者工具已安装[ ] IDE (IDEA, VSCode) 已准备就绪4. 安装部署与启动方式假设你已经从提供的源码链接如网盘或Git仓库下载了项目压缩包。项目结构通常如下lijiang-travel-share/ ├── backend/ # SpringBoot后端项目 │ ├── src/ │ ├── pom.xml │ └── application.yml (或 application.properties) ├── frontend/ # Vue小程序前端项目 │ ├── src/ │ ├── package.json │ └── vue.config.js └── database/ # 数据库SQL脚本 └── lijiang_travel.sql4.1 数据库初始化这是第一步也是关键一步数据表没创建好后端服务启动就会报错。登录MySQL使用命令行或图形化工具如Navicat、MySQL Workbench。mysql -u root -p创建数据库CREATE DATABASE IF NOT EXISTS lijiang_travel DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE lijiang_travel;导入数据表结构找到项目中的database/lijiang_travel.sql文件执行它。命令行方式在SQL文件所在目录mysql -u root -p lijiang_travel lijiang_travel.sql图形化工具直接运行SQL文件。4.2 后端SpringBoot服务启动后端是整个应用的大脑负责业务逻辑和数据库操作。用IDEA打开后端项目打开backend文件夹。配置数据库连接找到src/main/resources/application.yml(或.properties)修改其中的数据库连接信息确保与你的MySQL配置一致。spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/lijiang_travel?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai username: root # 改为你的用户名 password: your_password # 改为你的密码下载依赖IDEA通常会自动下载Maven依赖。如果没有可以右键点击pom.xml选择Maven - Reload project或在终端执行mvn clean install。启动主类找到xxxApplication.java通常以Application结尾运行它的main方法。验证启动控制台看到类似Tomcat started on port(s): 8080的日志且没有报错说明后端启动成功。可以在浏览器访问http://localhost:8080或你配置的端口可能会看到简单的欢迎页或404正常因为没配置默认首页这表示服务已运行。4.3 前端Vue小程序启动前端负责界面展示和用户交互通过API与后端通信。用VSCode打开前端项目打开frontend文件夹。安装依赖在终端中进入该目录执行npm install # 或使用淘宝镜像加速 # npm install --registryhttps://registry.npmmirror.com这个过程会下载node_modules耐心等待完成。配置API基地址找到前端请求后端的配置文件通常是src/utils/request.js或vue.config.js中的proxy配置。确保它指向你后端服务的地址例如http://localhost:8080。// 示例在 vue.config.js 中配置代理 module.exports { devServer: { proxy: { /api: { target: http://localhost:8080, // 后端地址 changeOrigin: true, pathRewrite: { ^/api: } } } } }启动开发服务器在终端执行npm run serve成功后会输出本地访问地址如http://localhost:8081。导入微信开发者工具打开微信开发者工具。选择“导入项目”项目目录选择frontend文件夹。填入你的小程序AppID如果没有可以选择“测试号”。点击“导入”工具会自动编译项目。前后端联调确保后端服务(localhost:8080)和前端开发服务器(localhost:8081)都在运行。在微信开发者工具中预览小程序尝试进行登录、浏览景点等操作观察网络请求是否成功。5. 功能测试与效果验证项目跑起来后我们需要验证核心功能是否正常。下面我们按模块进行测试。5.1 用户模块测试测试目的验证用户注册、登录、个人信息修改等基础功能。注册功能操作在小程序注册页面输入用户名、密码、手机号等信息点击注册。预期页面提示“注册成功”并在数据库user表中能看到新增的记录密码应为加密后的密文。后端观察查看控制台日志应有处理/api/user/register请求的日志并执行了INSERT操作。登录功能操作使用注册的账号密码登录。预期登录成功跳转到首页或个人中心前端应能获取到后端返回的token或用户信息并存储如存入Vuex或本地存储。接口验证登录成功后后续请求的HTTP头部应携带token如Authorization: Bearer xxx。个人信息修改操作在个人中心页面修改昵称或头像并保存。预期页面信息实时更新数据库user表对应字段被更新。5.2 景点模块测试测试目的验证景点数据的展示、搜索、详情查看功能。景点列表浏览操作进入小程序首页或景点列表页。预期页面应展示丽江的多个景点卡片包含图片、名称、简介等。数据来源于数据库scenic_spot表。接口检查打开微信开发者工具的“网络”面板应能看到对/api/scenic/list或类似接口的GET请求并成功返回JSON数据。景点搜索操作在搜索框输入关键词如“古城”。预期列表动态刷新只显示名称或描述中包含“古城”的景点。后端逻辑这对应后端一个带有WHERE name LIKE ‘%古城%’条件的查询。景点详情操作点击某个景点卡片。预期跳转到详情页展示更全面的信息如地址、开放时间、详细图文介绍等。5.3 游记模块测试测试目的验证用户发布、编辑、删除、浏览游记的核心流程。发布游记前提用户已登录。操作进入“写游记”页面填写标题、内容上传图片选择关联的景点点击发布。预期发布成功跳转到游记列表或详情页。数据库travel_note表和note_image表如果图片单独存应有新记录。难点关注图片上传功能。前端通常将图片转为FormData或Base64上传后端接收后存储到服务器目录或云存储并将文件路径存入数据库。浏览与互动操作在游记列表或详情页进行点赞、收藏、评论。预期点赞数、收藏状态实时更新评论列表刷新。对应数据库的like、favorite、comment表会记录这些关联关系。并发测试思考题多人同时点赞一篇游记点赞数的更新在代码层面是如何保证正确的涉及数据库事务或乐观锁。5.4 后台管理模块测试如果项目包含测试目的验证管理员对景点、游记、用户等内容的管理能力。管理员登录使用特定的管理员账号登录后台管理界面可能是一个独立的Web页面或小程序内嵌。内容审核找到一篇用户新发布的游记尝试进行“通过”或“拒绝”操作。景点管理尝试新增一个景点信息或修改已有景点的详情。数据查看查看用户统计、游记发布量等数据面板。6. 接口 API 与数据交互设计理解前后端如何通信是掌握全栈开发的关键。本项目通常采用 RESTful 风格的 API。6.1 典型API接口示例以下是一些你可能在项目中遇到的接口示例1. 用户登录接口请求方式: POSTURL:/api/user/login请求体 (JSON):{ username: testUser, password: 123456 }成功响应 (JSON):{ code: 200, msg: 登录成功, data: { userId: 1, username: testUser, nickname: 测试用户, token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... } }2. 分页获取景点列表请求方式: GETURL:/api/scenic/list?pageNum1pageSize10keyword古城成功响应:{ code: 200, msg: success, data: { total: 25, list: [ { id: 1, name: 丽江古城, coverImage: /images/lijiang_old_town.jpg, intro: 世界文化遗产..., address: 丽江市古城区 }, // ... 其他9条数据 ] } }3. 发布游记含文件上传请求方式: POSTURL:/api/travel-note/publish请求头:Content-Type: multipart/form-data请求体 (FormData):title: 我的丽江之旅 content: 这是一次难忘的旅行... scenicSpotId: 1 images: (File)图片1.jpg images: (File)图片2.jpg后端处理SpringBoot 使用RequestParam接收文本字段使用MultipartFile接收文件。6.2 前端如何调用API在前端Vue项目中通常会封装一个统一的请求工具如基于axios。// src/utils/request.js import axios from axios const service axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 从环境变量读取 timeout: 5000 }) // 请求拦截器统一添加token service.interceptors.request.use( config { const token localStorage.getItem(token) if (token) { config.headers[Authorization] Bearer token } return config }, error { return Promise.reject(error) } ) // 响应拦截器统一处理错误 service.interceptors.response.use( response { const res response.data if (res.code ! 200) { // 处理业务错误如 token 过期 return Promise.reject(new Error(res.msg || Error)) } return res }, error { // 处理HTTP错误如网络超时 return Promise.reject(error) } ) export default service在页面组件中调用// 在某个Vue组件的方法中 import request from /utils/request export default { methods: { async getScenicList() { try { const response await request.get(/api/scenic/list, { params: { pageNum: 1, pageSize: 10 } }) this.scenicList response.data.list } catch (error) { console.error(获取景点列表失败:, error) // 这里可以显示错误提示给用户 } } } }7. 数据库设计与关键表结构分析理解数据库设计才能更好地理解业务逻辑。以下是核心表的简化结构1. 用户表 (user)CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 用户ID, username varchar(50) NOT NULL COMMENT 用户名, password varchar(255) NOT NULL COMMENT 密码加密存储, nickname varchar(50) DEFAULT NULL COMMENT 昵称, avatar varchar(500) DEFAULT NULL COMMENT 头像URL, phone varchar(20) DEFAULT NULL COMMENT 手机号, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表;2. 景点表 (scenic_spot)CREATE TABLE scenic_spot ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 景点ID, name varchar(100) NOT NULL COMMENT 景点名称, cover_image varchar(500) DEFAULT NULL COMMENT 封面图, description text COMMENT 详细描述, address varchar(200) DEFAULT NULL COMMENT 地址, open_time varchar(100) DEFAULT NULL COMMENT 开放时间, ticket_info varchar(200) DEFAULT NULL COMMENT 门票信息, longitude decimal(10,7) DEFAULT NULL COMMENT 经度, latitude decimal(10,7) DEFAULT NULL COMMENT 纬度, status tinyint(1) DEFAULT 1 COMMENT 状态1正常0下架, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT景点信息表;3. 游记表 (travel_note)CREATE TABLE travel_note ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 游记ID, user_id int(11) NOT NULL COMMENT 作者ID, title varchar(200) NOT NULL COMMENT 标题, content longtext COMMENT 内容富文本或Markdown, scenic_spot_id int(11) DEFAULT NULL COMMENT 关联景点ID, view_count int(11) DEFAULT 0 COMMENT 浏览量, like_count int(11) DEFAULT 0 COMMENT 点赞数, collect_count int(11) DEFAULT 0 COMMENT 收藏数, status tinyint(1) DEFAULT 0 COMMENT 状态0待审核1已发布2审核失败, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), KEY idx_user_id (user_id), KEY idx_scenic_spot_id (scenic_spot_id), CONSTRAINT fk_note_user FOREIGN KEY (user_id) REFERENCES user (id), CONSTRAINT fk_note_scenic FOREIGN KEY (scenic_spot_id) REFERENCES scenic_spot (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT游记表;4. 关联表点赞、收藏、评论这些表用于记录用户与游记、景点之间的多对多关系。user_like_note(用户点赞游记)user_collect_note(用户收藏游记)comment(评论表)8. 关键代码逻辑剖析了解核心功能的代码实现能帮助你快速定位问题并进行二次开发。8.1 后端SpringBoot Controller 示例以发布游记接口为例RestController RequestMapping(/api/travel-note) public class TravelNoteController { Autowired private TravelNoteService travelNoteService; PostMapping(/publish) public Result publishNote(RequestParam String title, RequestParam String content, RequestParam(required false) Integer scenicSpotId, RequestParam(images) MultipartFile[] images, HttpServletRequest request) { // 1. 从请求中获取当前登录用户ID (通常通过拦截器从token解析后存入) Integer userId (Integer) request.getAttribute(userId); if (userId null) { return Result.error(用户未登录); } // 2. 构建游记实体 TravelNote note new TravelNote(); note.setUserId(userId); note.setTitle(title); note.setContent(content); note.setScenicSpotId(scenicSpotId); note.setStatus(0); // 待审核状态 // 3. 处理上传的图片 ListString imageUrls new ArrayList(); for (MultipartFile image : images) { if (!image.isEmpty()) { try { // 调用文件存储服务返回访问URL String url fileStorageService.store(image); imageUrls.add(url); } catch (IOException e) { return Result.error(图片上传失败: e.getMessage()); } } } // 4. 调用Service层保存游记和图片关联信息 boolean success travelNoteService.publishNote(note, imageUrls); return success ? Result.success(发布成功等待审核) : Result.error(发布失败); } }8.2 后端MyBatis Mapper XML 示例查询带分页和条件的景点列表!-- ScenicSpotMapper.xml -- select idselectScenicList resultTypecom.lijiang.project.entity.ScenicSpot SELECT id, name, cover_image, intro, address FROM scenic_spot WHERE status 1 if testkeyword ! null and keyword ! AND (name LIKE CONCAT(%, #{keyword}, %) OR intro LIKE CONCAT(%, #{keyword}, %)) /if ORDER BY id DESC /select对应的Java接口方法ListScenicSpot selectScenicList(Param(keyword) String keyword);8.3 前端Vue 页面组件示例一个简单的景点列表组件template div classscenic-list input v-modelsearchKeyword inputonSearch placeholder搜索景点... / div v-foritem in scenicList :keyitem.id classscenic-card img :srcitem.coverImage :altitem.name / div classinfo h3{{ item.name }}/h3 p{{ item.intro }}/p span{{ item.address }}/span /div /div div v-ifloading加载中.../div div v-if!hasMore scenicList.length 0没有更多了/div /div /template script import { getScenicList } from /api/scenic export default { data() { return { searchKeyword: , scenicList: [], pageNum: 1, pageSize: 10, loading: false, hasMore: true } }, created() { this.loadScenicList() }, methods: { async loadScenicList() { if (this.loading || !this.hasMore) return this.loading true try { const res await getScenicList({ pageNum: this.pageNum, pageSize: this.pageSize, keyword: this.searchKeyword }) this.scenicList [...this.scenicList, ...res.data.list] this.hasMore this.scenicList.length res.data.total this.pageNum } catch (error) { console.error(error) } finally { this.loading false } }, onSearch() { // 搜索时重置数据 this.pageNum 1 this.scenicList [] this.hasMore true this.loadScenicList() } } } /script9. 常见问题与排查方法在部署和运行过程中你可能会遇到以下问题。这里提供排查思路。问题现象可能原因排查方式解决方案后端启动失败端口被占用8080端口已被其他程序如另一个SpringBoot应用、Tomcat使用。1. 查看启动日志中的错误信息。2. 命令行执行netstat -ano | findstr :8080(Windows) 或lsof -i:8080(Mac/Linux) 查看占用进程。1. 终止占用端口的进程。2. 在application.yml中修改server.port为其他端口如8081。数据库连接失败1. MySQL服务未启动。2. 数据库连接配置URL、用户名、密码错误。3. 数据库lijiang_travel不存在。1. 检查MySQL服务状态。2. 核对application.yml中的配置。3. 登录MySQL执行SHOW DATABASES;确认数据库存在。1. 启动MySQL服务。2. 修正配置文件。3. 执行提供的SQL脚本创建数据库和表。前端npm install失败1. 网络问题无法连接到npm仓库。2. Node.js版本不兼容。3. 项目依赖包有冲突。1. 检查网络连接尝试 pingregistry.npmjs.org。2. 使用node -v检查版本。3. 查看错误日志通常会有明确提示。1. 使用淘宝镜像npm config set registry https://registry.npmmirror.com。2. 使用nvm切换Node.js版本到LTS。3. 删除node_modules和package-lock.json重新执行npm install。前端运行后页面空白或报错1. 依赖未正确安装。2. 代码语法错误。3. API代理配置错误无法访问后端。1. 检查终端是否有编译错误。2. 打开浏览器开发者工具查看Console和Network面板报错。3. 检查vue.config.js中的代理配置是否指向正确的后端地址和端口。1. 重新安装依赖。2. 根据控制台错误修改代码。3. 修正代理配置并确保后端服务正在运行。微信开发者工具无法预览1. 项目目录不正确。2. AppID配置错误或无效。3. 小程序代码包超过大小限制。1. 确认导入的是frontend目录包含project.config.json。2. 检查AppID可使用测试号。3. 工具会提示包大小。1. 重新选择正确目录导入。2. 申请或使用正确的AppID。3. 优化代码和图片分包加载。操作登录、发布提示“网络错误”或“请求失败”1. 前后端跨域问题。2. 后端接口地址错误。3. 后端接口内部报错如空指针。1. 查看浏览器或微信开发者工具Network面板请求是否发出状态码是什么如404, 500, CORS错误。2. 查看后端控制台日志是否有异常堆栈信息。1. 后端可通过CrossOrigin注解或配置WebMvcConfigurer解决跨域。2. 核对前端请求的URL。3. 根据后端日志修复代码Bug。图片上传失败1. 前端未正确构造FormData。2. 后端文件保存目录权限不足或路径不存在。3. 文件大小超过后端配置限制。1. 检查前端网络请求的Content-Type是否为multipart/form-datapayload是否正确。2. 查看后端日志是否有文件IO异常。3. 检查SpringBoot配置spring.servlet.multipart.max-file-size。1. 确保前端使用FormData对象并正确append文件。2. 确保后端保存目录存在且有读写权限或改用云存储。3. 在application.yml中调整文件大小限制。10. 项目扩展与优化建议当你成功运行基础项目后可以考虑从以下几个方面进行扩展和深化这会让你的毕业设计或作品更有竞争力。引入Redis缓存将热点数据如首页景点列表、热门游记缓存到Redis中减轻数据库压力提升响应速度。学习Spring Cache抽象与Redis集成。实现全文搜索使用Elasticsearch替代数据库的LIKE查询为景点和游记提供更高效、更强大的搜索功能支持分词、高亮、相关性排序。增加第三方登录集成微信登录、QQ登录等提升用户体验。需要申请对应的开放平台应用。实现消息通知当用户的游记被点赞、收藏、评论时通过WebSocket或小程序订阅消息模板给用户发送实时通知。后台管理功能强化开发一个功能更强大的后台管理系统可以用VueElement UI实现数据统计图表、内容精准审核、用户行为分析等。容器化部署学习使用Docker将SpringBoot应用、MySQL、Redis等打包成容器编写docker-compose.yml实现一键部署并了解基本的CI/CD流程。小程序体验优化分包加载当代码包超过2M时必须使用分包。骨架屏在数据加载前展示页面骨架提升用户体验。图片懒加载与压缩优化长列表的图片加载。接口请求优化合并请求、合理使用缓存。这个基于SpringBootVue的丽江市旅游分享平台小程序项目提供了一个非常标准的全栈开发学习范本。从环境搭建、数据库设计、接口编写到前后端联调它覆盖了Web应用开发的核心链路。对于初学者建议不要急于求成先确保每一步都能走通理解每一行代码的作用。遇到问题时善用搜索引擎、查看官方文档、阅读日志是程序员最重要的能力。把这个项目吃透你不仅能完成一份不错的毕业设计更能为后续学习更复杂的分布式、微服务架构打下坚实的基础。建议将源码和本文的部署指南收藏在需要时随时参考。