ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

SpringBoot+Vue疫苗预约系统:毕业设计全栈拆解与部署实战

SpringBoot+Vue疫苗预约系统:毕业设计全栈拆解与部署实战 最近聊到一个挺典型的毕业设计项目基于 SpringBoot Vue MySQL 的疫苗发布和接种预约系统源码和数据库都齐还带着论文和部署文档。不少同学拿到这类项目后第一反应是“源码能跑就行”结果一部署就是一堆环境问题或者答辩时被问到底层原理就卡壳。我决定把这类全栈项目从头到尾拆一遍从系统设计的角度讲清楚每个模块为什么要这么做再把部署、论文、答辩的坑都填上。这篇内容适合正在做毕业设计的在校生、想练手全栈项目的自学开发者也适合刚接触前后端分离架构的初学者。1. 项目核心定位与业务需求拆解1.1 这套系统到底解决了什么问题疫苗发布和接种预约系统本质上是一个“信息发布 在线预约 后台管理”三位一体的业务闭环。普通用户需要看到疫苗到货公告、了解接种须知、选择合适的接种点和时间段完成预约管理员需要维护疫苗信息、发布接种公告、管理预约订单、统计接种数据。表面上看起来像一个简单的 CRUD 应用但真正做起来业务逻辑里藏着不少值得打磨的点预约冲突怎么避免、库存号源扣减怎么保证不超卖、用户爽约了怎么处理、公告发布后如何让用户第一时间看到。这些才是答辩时能拿出来讲的亮点。从技术栈上看SpringBoot 负责后端的接口服务和业务逻辑Vue 负责前端页面的交互渲染MySQL 负责数据持久化。三者组合是当前 Java 全栈方向最主流、也最适合写进简历和论文里的一套搭配。框架本身不复杂但组合起来就是一个完整的前后端分离项目比单纯写个 SSM 或者 JSP 项目要有说服力得多。1.2 用户角色与核心功能清单这套系统的用户角色可以分为三类普通用户接种者、管理员、系统定时任务。我习惯在拆解项目时先把角色和权限边界画出来后面的开发才会有方向感。普通用户端主要功能包括注册登录、浏览疫苗公告与科普资讯、查看接种点与号源余量、在线预约接种时间段、查看个人预约记录、取消未开始的预约、接种完成后查看留观提醒。管理员端主要功能包括疫苗信息管理增删改查、上下架、接种点管理维护地址、开放时间、每日号源总数、公告发布疫苗到货、暂停接种等通知、预约管理查看全部预约、处理爽约、解除锁定、数据统计每日预约量、接种完成率、疫苗库存消耗。这里要重点提醒一下预约状态的设计思想。预约单至少要包含这几个状态待接种、已完成、已取消、爽约已过期未取消也未接种。状态流转要画清楚不能只是一堆散乱的字段。很多同学的数据库表设计得稀烂就是因为没先想清楚状态机。1.3 技术选型的深层考虑选 SpringBoot 而不是 SSMSpring SpringMVC MyBatis最大的理由是 SpringBoot 的自动配置和内嵌 Tomcat 让项目可以“一个 Jar 包跑起来”开发和部署成本低非常多。对毕业生来说这意味着你不需要花大量时间去搞各种 XML 配置能把精力放在业务逻辑上。选 Vue 而不是 JSP 或者 Thymeleaf则是顺应了前后端分离的大趋势。前端工程用 npm 管理依赖、用 Axios 发请求、用 Vue Router 做路由控制、用 Element UI 搭后台界面这一套下来简历上的技术栈会非常完整。而且 Vue 本身学习曲线平缓中文文档完善遇到问题查资料也方便。MySQL 没什么好争议的开源免费、社区资料丰富、学校机房和云服务器都支持。唯一要强调的是版本选择建议使用 5.7 或 8.0 的稳定版本避开那些刚发布还没经过市场验证的大版本。2. 数据库设计与核心表结构解析2.1 数据库设计的基本原则疫苗预约系统的数据库设计核心是“业务状态驱动表结构”。什么意思呢就是每一张核心表里都应该有能描述业务状态的字段比如预约表的 status 字段公告表的 is_publish 字段疫苗表的 status 字段。这样的设计让业务逻辑可以用简单的条件查询实现而不是每次都在 Java 代码里做复杂的过滤。在设计表的时候我建议遵循几个基本规范。主键统一用自增的 Long 类型不用 UUID 或者雪花 ID因为毕业设计的数据量根本到不了需要分布式 ID 的级别自增主键在 InnoDB 下的索引性能最好。所有表都加上 create_time 和 update_time 字段这不仅是规范问题后面做统计报表的时候会发现这两个字段非常有用。业务字段尽量加注释包括字段注释和表注释这一点在论文的数据库设计章节可以直接复用。2.2 核心数据表与字段精讲按照业务模块划分系统一般需要这几张核心表用户表sys_user、疫苗表vaccine、接种点表vaccination_site、公告表announcement、预约表appointment、疫苗批次表vaccine_batch可选。用户表是最简单的主要字段就是用户名、密码加密存储、手机号、身份证号、姓名、性别、年龄。角色字段用 role 做个区分比如 0 表示普通用户、1 表示管理员不做复杂的 RBAC 权限模型毕业设计这个体量用角色字段最合适。疫苗表需要重点关注。字段包括疫苗名称、生产厂家、批号、适用年龄段、接种剂次第一针/第二针/加强针、库存量、状态0 下架 1 上架。需要注意疫苗和库存是绑定关系不要单独做一个库存表去管理否则每次查询都要 JOIN徒增复杂度。直接在疫苗表里存一个剩余库存字段配合预约逻辑做扣减和回滚即可。预约表是整个系统业务逻辑最重的表字段包括预约编号、用户 ID、疫苗 ID、接种点 ID、预约日期、预约时间段上午/下午、状态、接种完成时间、取消时间。预约时间段的处理要特别注意不建议用完整的 datetime 字段让用户自己选到具体分钟而是把一天划分成几个固定的时间窗口比如 09:00-11:00、14:00-16:00这样既简化了数据库存储也降低了排班管理的难度。这里放一个预约表的简化 SQL 参考CREATE TABLE appointment ( id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID, appointment_no VARCHAR(32) NOT NULL COMMENT 预约编号, user_id BIGINT(20) NOT NULL COMMENT 用户ID, vaccine_id BIGINT(20) NOT NULL COMMENT 疫苗ID, site_id BIGINT(20) NOT NULL COMMENT 接种点ID, appointment_date DATE NOT NULL COMMENT 预约日期, time_slot TINYINT(4) NOT NULL COMMENT 时间段1上午 2下午, status TINYINT(4) NOT NULL DEFAULT 0 COMMENT 状态0待接种 1已完成 2已取消 3爽约, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), UNIQUE KEY uk_appointment_no (appointment_no), KEY idx_user_id (user_id), KEY idx_date_site (appointment_date, site_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT疫苗预约表;唯一索引一定要给预约编号加上这不仅能防止重复提交在后续做高并发预约时也是一个保障。普通索引的建立按照查询习惯来先用 WHERE 条件最频繁的字段比如按用户查询预约记录、按日期查询号源。2.3 防止超卖的数据库层方案疫苗预约最核心的并发问题就是“多个用户同时预约同一个时间段怎么保证不超卖”。数据库层的常见方案是乐观锁或者悲观锁。毕业设计里我建议用乐观锁的思路在疫苗表里加一个 version 字段扣减库存时带上 WHERE version #{version} 条件如果影响行数为 0说明版本变了预约失败重新获取数据再试一次。SQL 大概是这样的UPDATE vaccine SET stock stock - 1, version version 1 WHERE id #{vaccineId} AND stock 0 AND version #{oldVersion}这种方案比直接用 synchronized 或者分布式锁要简单得多而且在论文里非常好解释。分布式锁虽然听着高级但在这个场景下属于过度设计反而会让评委觉得你没搞清楚业务复杂度。当然如果你想让项目多一些亮点可以在 Redis 部分引入 Redis 的原子操作做库存预扣但前提是你确实把 Redis 部署起来并能讲清楚原理否则宁可不用。3. 后端核心业务逻辑与接口设计3.1 预约流程的状态机设计与实现预约功能的代码实现是整个后端最核心的部分它不是一个简单的 insert 操作而是一系列操作的组合校验疫苗是否存在且已上架、校验接种点当天该时间段是否还有余号、扣减库存、生成预约记录、返回结果。这个过程必须放在一个事务里任何一个环节出错都要回滚。SpringBoot 里用 Transactional 注解即可满足需求。事务粒度不要开太大只把必要的写操作包进去查询校验放在事务外做这样能显著降低锁的持有时间。状态流转要遵循几个硬性规则待接种状态可以主动取消取消后库存要回补待接种状态超过预约日期当天仍未接种通过定时任务自动标记为爽约同时释放号源已完成状态不能取消只能查看。这些规则写在后端 Service 层不要散落在 Controller 里。我见过不少同学的代码把业务判断写到 Controller 里这是答辩时的扣分点因为三层架构的意义就在于分层清晰。3.2 定时任务实现爽约释放爽约释放号源的功能可以用 SpringBoot 内置的 Scheduled 注解来实现不需要引入 Quartz 这种重量级框架。定时任务的逻辑很简单每隔一段时间扫描预约表把 status 为待接种且预约日期小于当前日期的记录批量更新为爽约状态同时回补对应疫苗的库存。Scheduled(cron 0 0 2 * * ?) // 每天凌晨2点执行 public void releaseExpiredAppointments() { ListAppointment expiredList appointmentMapper.selectExpiredList(new Date()); for (Appointment appointment : expiredList) { appointmentService.markAsNoShow(appointment.getId()); vaccineService.increaseStock(appointment.getVaccineId()); } }注意定时任务要对执行时间做错峰处理不要在整点准时分执行否则刚好和数据库的备份任务或者其他定时任务撞在一起可能出现资源争抢。我在实践中习惯把 cron 表达式定在凌晨的 1 点到 5 点之间的随机分钟数。3.3 Swagger 接口文档与统一返回体后端接口要设计成统一返回结构。我通常定义一个 Result 类包含 code、message、data 三个字段返回时配合一个静态方法 Result.success(data) 和 Result.error(msg)。代码示例public class ResultT { private Integer code; private String message; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMessage(success); result.setData(data); return result; } public static T ResultT error(String message) { ResultT result new Result(); result.setCode(500); result.setMessage(message); return result; } }接口文档建议集成 Swaggerspringfox 或 springdoc 都可以加几个注解就能自动生成可调试的 API 文档。这一步不仅方便自己前后端联调在写论文的时候可以直接截几张 Swagger 的接口列表图作为系统功能实现的效果展示非常加分。接口路径命名也建议遵循 RESTful 风格比如 GET /api/appointment/list、POST /api/appointment/create、PUT /api/appointment/cancel、DELETE /api/appointment/{id}。RESTful 风格不是强制要求但用了会让接口看起来更专业论文里写到接口设计时也有话可说。3.4 登录鉴权与密码加密这个系统的登录鉴权推荐用 JWTJSON Web Token而不是传统的 Session。原因有两个前后端分离项目天然适合无状态的 Token 鉴权JWT 的原理容易讲清楚答辩时是很好的提问点。生成 Token 的流程用户登录成功后用用户的 ID、用户名和过期时间生成 Token返回给前端。前端把 Token 存在 localStorage 或者 Vuex/Pinia 里每次请求在 Axios 拦截器中加进请求头 Authorization。后端用一个拦截器统一校验 Token校验失败返回 401。密码存储千万不要用明文使用 BCrypt 加密。Spring Security Crypto 包里的 BCryptPasswordEncoder 就可以不用引入全套 Spring Security。BCrypt 的特点是加盐、不可逆、同一密码每次加密结果不同这几点在论文里只要写出来就是加分项。4. 前端 Vue 页面设计与交互实现4.1 技术选型与工程结构前端部分我习惯用 Vue 2 Element UI Axios Vue Router 这套组合工程通过 Vue CLI 创建。有些同学喜欢用 Vue 3 Element Plus但考虑到大部分课程用的是 Vue 2模板代码也以 Vue 2 居多为了减少踩坑我建议以你手头资料匹配的版本为准不要随便升大版本。目录结构按模块划分pages 放页面组件router 放路由配置api 放接口请求封装utils 放工具函数比如统一的 Axios 实例。不要把所有请求直接写在组件里而是封装成 API 模块这样代码可读性好很多。Axios 封装的核心有两个请求拦截器统一携带 Token响应拦截器统一处理业务错误。Code 为 200 时直接返回 data否则统一弹 Message 提示。401 时跳转到登录页并清除本地 Token。这些细节直接影响用户体验也是前端代码质量的重要体现。4.2 用户预约页面的核心交互用户端最核心的页面是疫苗列表页和预约页。列表页展示当前在售疫苗包括名称、厂家、适用人群、剩余库存、接种点分布。前端在进入页面后拉取列表展示时注意库存为 0 的条目要置灰并显示“已约满”标签这个逻辑虽然简单但能体现你对用户体验的关注。预约页的交互要关注四个要素选择疫苗、选择接种点、选择日期、选择时间段。日期控件要禁用掉过去的日期时间段组件要实时显示各时间段剩余号源这个剩余数据由后端接口提供。前端提交预约时要把用户选中的时间组装成约定好的参数格式传给后端日期用 YYYY-MM-DD 字符串时间段用 1 或者 2 这样的数字枚举。提交预约成功后前端不要直接提示“预约成功”就完事而是要跳转到预约详情页展示预约编号和相关提示接种当日需携带证件、提前 15 分钟到场等。这些细节在演示环节非常加分评委会觉得这个系统是真的考虑过实际业务的。4.3 后台管理页面与数据可视化管理端页面基于 Element UI 的 Layout 布局搭建左侧是菜单栏右侧是内容区。菜单包括公告管理、疫苗管理、预约管理和统计报表。表格组件配合分页组件实现列表展示表单组件用弹窗 Dialog 实现添加和编辑删除操作必须加二次确认弹窗。统计报表模块建议使用 ECharts 画两个基础图一个是近 7 日预约量折线图一个是不同疫苗的预约占比饼图。这两个图的数据由后端提供一个统计接口返回聚合结果前端用 ECharts 直接渲染。ECharts 的引入方式很简单npm 安装后在组件里 import 即可。不要小看统计报表这个模块它往往是论文里“系统亮点”章节最有说服力的内容。一个能展示数据的系统比单纯的管理系统有深度得多。5. 本地开发环境搭建与部署实战5.1 环境版本匹配是第一个大坑这类项目最常见的部署问题就是“环境版本不匹配”。后端 JDK 8 还是 11、Maven 版本、SpringBoot 版本、前端 Node 版本每一项不匹配都会导致莫名其妙的报错。我的经验是先看 pom.xml 里 spring-boot-parent 的版本和本机 JDK 的版本是否兼容再看 package.json 里 vue 和 element-ui 的版本要求。比如 SpringBoot 2.7 版本默认支持 JDK 8 和 JDK 11但如果你装了 JDK 17某些旧版本的依赖在编译时就会出问题。前端如果 Vue CLI 版本和 Node 版本不匹配npm run serve 会报 Node 语法错误。解决方案就一句话别追新按项目文档的版本说明做环境配置。5.2 后端打包运行全过程后端打包前要改三个配置文件application.yml 里的数据库用户名密码、端口号是否被占用、如需上传文件则检查文件存储路径。数据库连接建议加上时区参数spring: datasource: url: jdbc:mysql://localhost:3306/vaccine?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 你的密码打包时在项目根目录执行 mvn clean package 即可生成的目标目录下会有 xxx.jar。如果用的是 IDEA可以点击右侧 Maven 面板的 package 指令完成操作。打包完成后直接在命令行运行 java -jar xxx.jar 启动服务。注意首次运行时要保证 MySQL 中有对应的数据库和表。5.3 前端打包与 Nginx 部署前端开发模式用 npm run serve 启动端口默认 8080而后端接口在 8081视配置而定这就涉及跨域问题。开发阶段用 Vue CLI 的 devServer 代理解决在 vue.config.js 里配置 proxy 将 /api 前缀的请求转发到后端地址。生产环境用 Nginx 做反向代理把根路径指向前端 dist 包把 /api 前缀指向后端服务。一份参考的 Nginx 配置server { listen 80; server_name localhost; location / { root /usr/share/nginx/html/dist; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8081/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }Nginx 部署前端相比直接 Node 启动有两个明显优势支持 history 路由模式刷新不 404静态资源加载效率更高。5.4 一键部署包的制作思路部署文档里最有价值的内容是“一键启动脚本”。Windows 环境下可以写一个 .bat 文件顺次检查 MySQL 服务、启动后端 jar、启动 Nginx。Linux 环境则写一个 .sh 脚本。这个脚本并不复杂但对用户体验的提升极大评委在演示时不用看你敲一堆命令这一点对答辩效果很有帮助。写一个简易的 Linux 启动脚本示例#!/bin/bash # 启动后端 nohup java -jar /opt/vaccine-system/app.jar --spring.profiles.activeprod /dev/null 21 # 启动 Nginx systemctl start nginx echo System started!6. 论文框架与答辩准备要点6.1 论文章节怎么编排最合理我见过的优秀毕业设计论文章节基本都遵循这个骨架绪论背景、意义、国内外现状、相关技术介绍、系统需求分析、系统设计、系统实现、系统测试、总结与展望。这里重点提醒三点。第一需求分析章节要包含用例图和数据流描述不需要严格的 UML 规范但要有基本的用例说明。第二系统设计章节要包含数据库设计的 ER 图和核心表结构描述可以直接复用 2.2 节的表设计。第三系统实现章节要用“页面截图 核心代码片段 文字说明”的方式展示截图不要过度修图保持真实。6.2 答辩高频问题与作答思路答辩环节评委最爱问的问题我整理了五个高频的提前准备能减少大量紧张感第一个问题这张表为什么这么设计作答思路是先讲业务背景再说字段说明最后补充索引设计。核心是让评委看到你有独立设计能力而不是照抄模板。第二个问题预约并发超卖怎么解决作答思路是乐观锁 事务回滚。如果能补充一句“后续可以引入 Redis 分布式锁做进一步优化”说明你有扩展思考能力这就拿到了额外的印象分。第三个问题项目里哪些是你自己写的哪些是借鉴的这个问题很常见作答原则是诚实但有技巧。可以说“框架搭建和基础 CRUD 参考了课程模板但预约状态机、乐观锁防超卖、定时任务这些是独立设计实现的”。这样回答既坦诚又展示了你的核心工作量。第四个问题系统还有什么可改进的地方不要只说“没有”而是给出实际可行的优化方向比如引入 Redis 缓存热点疫苗信息、用 RabbitMQ 做预约高峰期的削峰填谷、增加疫苗批次追溯功能。说这些不需要你把方案实现出来只需要讲清楚思路。第五个问题部署文档中的环境差异怎么处理回答要点是版本兼容、配置分离、一键脚本。把你部署过程中真实的踩坑经验说出来远比千篇一律的“注意版本”更有说服力。6.3 部署环境差异问题速查考虑到不少同学是在 Windows 上开发但最后要部署到 Linux 云服务器上这里把常见的部署问题整理成一个速查表格方便对照排查故障现象可能原因解决方案数据库连接超时云服务器 MySQL 端口未开放安全组放行 3306 端口后端启动成功但访问 404前端未部署或 Nginx 配置不对检查 Nginx location 和 try_files前端请求跨域未配置代理或 Nginx 未加 /api 转发对照 5.3 节配置检查定时任务未执行服务器时区不是 Asia/Shanghai修改系统时区并在 JDBC 连接串加 serverTimezone上传文件失败存储路径不存在或权限不足创建目录并 chmod 7557. 项目二次开发与个人亮点扩展7.1 从“能用”到“有亮点”的四个方向一个毕业设计要想拿高分不能停留在“登录 增删改查”的层面。我见过不少拿优秀论文的项目其实核心功能都一样但他们多做了几个小而美的功能点。给你几个容易落地且适合写进论文的扩展方向。第一个方向是疫苗批次追溯。给疫苗表增加批号字段预约成功后生成接种记录后台可以按批号查询所有接种该批次疫苗的用户名单。这个功能在“疫苗接种安全性”背景下非常有现实意义。第二个方向是在线问诊或留言模块。用户接种后可以提交不良反应反馈管理员在后台回复。这个功能能丰富系统交互深度实现难度也不大本质上就是一对多的评论系统。第三个方向是消息推送。利用 WebSocket 给用户推送预约成功提醒、接种日前一天提醒。这种功能实现一个简易版即可但能显著提升系统的“实时感”。第四个方向是数据大屏。做一个管理端首页的统计大屏用 ECharts 展示今日预约量、累计接种量、疫苗库存预警等核心指标。视觉效果在演示时很占优势而且图表的数据全部来自数据库实时查询不是写死的。7.2 代码质量的几个“隐形加分点”代码质量的提升不一定是功能层面的有时候只是养成几个好习惯就能让项目看起来完全不一样。日志打印一定要规范。每个核心操作的入口打印入参信息每个业务流程结束后打印处理结果。不要在代码里留 System.out.println而是用 Slf4j 的 Logger。自定义异常要做好区分疫苗库存不足、预约时间冲突、用户已存在这些业务异常要用自定义异常类抛出来由全局异常处理器统一捕获返回友好的前端提示。接口参数校验必须做。使用 Spring 的 Validated Hibernate Validator 注解给 DTO 字段加上 NotBlank、NotNull、Min 等约束避免脏数据进入数据库。这个细节在代码审查时非常加分也说明你具备工程化意识。配置信息不要硬编码。数据库账号密码、JWT 密钥、文件存储路径这些配置项统一放到配置文件里必要时用 profile 做环境区分。这一点在部署到云服务器的时候体现得最明显。7.3 测试用例与演示准备论文里的系统测试章节建议按照“功能测试表 核心接口测试 性能测试说明”的格式来写。功能测试表用表格列出测试用例编号、测试项、输入数据、预期结果、实际结果。核心接口测试可以放几张 Postman 的请求响应截图。性能测试则使用 JMeter 模拟 100 个并发用户同时预约观察事务成功率和响应时间把结果截图放进论文。现场演示环节有两点特别提醒。第一准备一套干净的演示数据疫苗、接种点、号源数量要在演示前手动调整好确保页面视觉效果好看预约流程能一路顺下来。第二把数据库也提前准备好避免演示中途去命令行操作那种停顿非常影响观感。8. 部署文档编写要点与踩坑记录8.1 部署文档应该覆盖哪些内容一份合格的部署文档不是简单贴几条命令而是应该让一个从零开始的新手按照文档一步步操作就能把系统跑起来。我的建议是覆盖以下内容环境要求清单JDK 版本、MySQL 版本、Node 版本、Nginx 版本、数据库初始化操作建库命令、导入 SQL 的路径、后端打包启动步骤、前端打包步骤、Nginx 配置内容、常见问题排查。写部署文档时有一个关键技巧所有命令必须写完整版不要用省略号或者“略”字。文档里类似“这里操作一下”这种模糊表述会让读者直接卡住。8.2 我在实际部署中踩过的真实坑分享几个我部署这类项目时真实遇到过的坑希望对你有帮助。第一个坑是 MySQL 8.0 的认证插件问题。MySQL 8.0 默认使用 caching_sha2_password 认证插件而某些旧版本的 MySQL Connector/J 驱动不支持这个插件导致后端启动时报 Unable to load authentication plugin 错误。解决方法有两个改用 MySQL Connector/J 8.x 版本或者在创建用户时指定 mysql_native_password 认证方式。第二个坑是 Linux 服务器上的中文字符乱码。如果数据库表都是用 utf8mb4 建的但 Linux 系统或 MySQL 的默认字符集不是这个插入中文数据后显示乱码。解决方案是在 MySQL 配置文件 my.cnf 的 [mysqld] 段下设置 character-set-serverutf8mb4并重启 MySQL 服务。第三个坑是云服务器部署后前端请求不到接口。一个典型场景是前端已经在服务器上部署好了页面能正常打开但请求接口时走的是 localhost而不是服务器的公网 IP。原因是前端代码里 Axios 的 baseURL 配置写死了 localhost。正确做法是用 Nginx 的 /api 代理转发前端代码中只用相对路径或者环境变量控制地址。说句实在话做好这个毕业设计你的收获不在于“跑通了源码”而在于你把“系统设计、数据库建模、接口封装、部署运维”这整条链路走通了一遍。我一开始也经常卡在环境配置上后来逐渐养成了一个习惯拿到任何一个项目先把数据库脚本读一遍把核心表的关系画出来再去读代码和文档。这套方法对于这类 SpringBoot Vue 项目来说效率非常高。如果你现在正在做类似的系统我最想叮嘱的一句话是不要把部署留到答辩前一天。提前一个星期就在一台干净的服务器上按部署文档完整走一遍把该踩的坑都踩完答辩时你会轻松非常多。祝顺利。
返回列表