ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SpringBoot+Vue实战:夕阳红公寓管理系统设计与实现全解析

SpringBoot+Vue实战:夕阳红公寓管理系统设计与实现全解析 1. 夕阳红公寓管理系统这个毕设到底在做什么每年到毕设季总能看到一堆人卡在选题上犹豫不决。管理系统类题目确实烂大街但夕阳红公寓管理系统这个方向其实挺有意思——它是那种典型的、做完之后你能讲清楚为什么做的项目答辩的时候不会心虚。老年人公寓管理有一套自己的业务流程跟普通的酒店管理、学生宿舍管理不完全一样这里面的差异就是项目价值所在。先把这个系统做的事情说清楚。夕阳红公寓管理系统本质上是一套面向养老公寓运营方和住养老人双方的业务管理平台覆盖的核心流程包括老人入住登记、房间床位分配、护理记录登记、费用缴纳与账单统计、家属来访登记、系统用户权限管理等等。技术上就是标题里写的三件套SpringBoot 做后端接口服务Vue 做前端管理页面MySQL 存所有业务数据。从技术角度看这个题目覆盖了Web开发全链路数据库设计、后端接口开发、前端页面交互、前后端联调、打包部署。从业务角度看它涉及多个角色管理员、护理员、护士、家属存在完整的状态流转入住申请、入住确认、退住申请、退住审批还有统计报表需求。所以不管你是想拿个好分数还是想通过这个项目补一下全栈技能这个选题都是能撑住的。适合谁参考两类人一类是正在做管理系统类毕设、脑子里只有增删改查四个字但不知道怎么把CRUD做出花来的学生另一类是打算用 SpringBoot 和 Vue 做实战练习、想找一个完整项目练手的开发者。下面内容我按从设计到实现的顺序讲从技术选型到数据库表结构从核心模块代码思路到论文提纲最后是部署上线和踩坑记录全部是基于这套经典技术栈的实战经验。2. 技术选型为什么是SpringBootVueMySQL这个黄金组合2.1 各司其职为什么这三个技术能凑到一起这三个技术的组合可以说是国内Java后端类毕设最常见的选择原因不只是大家都在用这么简单。SpringBoot解决了后端开发的配置地狱问题。如果你用过SSHStrutsSpringHibernate或者裸Spring你就知道光配XML文件就能配一整天。SpringBoot直接用自动配置和起步依赖Starter把这些事全部屏蔽掉了创建一个Web项目只需要引入 spring-boot-starter-web内置Tomcat一启动就能跑。这对开发效率的提升是决定性的——你的时间应该花在业务代码上而不是花在调配置文件上。Vue选它的原因是渐进式框架的上手曲线相当平滑。管理系统的前端无非就是表格、表单、弹窗、菜单、统计图这几样东西Vue的组件化开发让页面可以按功能拆成独立的组件维护起来后面会轻松很多。配合 Vue Router 做页面路由、Vuex 或 Pinia 做用户登录态管理一个标准的中后台前端就搭起来了。MySQL则是最经典的关系型数据库它的安装和运维资料比任何数据库都多社区讨论量大遇到问题解不开的概率极低毕设场景下稳定压倒一切。2.2 版本选择第一个隐藏的坑版本问题是我第一个想提醒你的。很多同学做毕设的时候照着网上的教程一步步配置结果莫名其妙跑不起来最后发现是版本不兼容。SpringBoot 目前主流分两条线2.x 系列比如2.7.x和3.x 系列如3.2.x、3.3.x。3.x 要求 JDK 172.x 可以用 JDK 8 或 11。对毕设来说我强烈建议用 SpringBoot 2.7.x JDK 8/11 的组合原因很朴素大部分教学楼机房的 JDK 版本不会太高而网上能找到的参考代码、教程、视频课多数也是基于 2.x 写的如果你选了3.x遇到个别依赖不兼容排查成本较高。当然如果你本机已经装了 JDK 17那直接 3.x 也完全可行。关键是要保证 Java 版本、SpringBoot 版本、依赖版本三者匹配。Vue 这侧也有选择Vue 2 还是 Vue 3现在新项目基本都是 Vue 3。Vue 3 配合 Element Plus 组件库做管理系统相当顺手跟后端联调的时候心智负担小。前端构建工具现在标准选型是 Vite而不是老一代的 Vue CLI启动速度快很多。Node.js 版本要 16这是我踩过的坑Node 版本太低直接跑不起 Vite。为了让你对版本有个直观参考下面是我实测稳定的一套组合组件推荐版本必装工具JDK1.8 或 11jdk安装包配好JAVA_HOMESpringBoot2.7.xMaven 3.6 或直接 IDEA自带Vue3.xNode.js 16.18npm或pnpm前端UI库Element Plus通过npm安装即可MySQL8.0.xMySQL Server Workbench2.3 初始化项目的完整命令后端使用 IDEA 创建项目时直接在 Spring Initializr 里选好 SpringBoot 2.7.x 版本依赖勾上 Spring Web、MyBatis或 MyBatis-Plus、MySQL Driver、Lombok 就够了。如果是用命令行也可以用curl https://start.spring.io/starter.zip \ -d typemaven-project \ -d languagejava \ -d bootVersion2.7.18 \ -d groupIdcom.example \ -d artifactIdapartment \ -d dependenciesweb,mybatis,mysql,lombok \ -o apartment.zip前端的话npm create vitelatest apartment-web -- --template vue cd apartment-web npm install npm install element-plus axios vue-router pinia这样前后端骨架就都出来了。说实话不要在这一步追求太花哨的框架组合比如非要去整 Spring Cloud 或者微服务毕设场景下单体应用是最合理的选择你只需要在论文的技术选型章节把单体架构适合中小型系统的理由讲清楚就行。3. 数据库设计公寓系统的表结构是成败关键3.1 先梳理业务实体和关系数据库设计一定要在动手写代码之前做。我见过太多人上来就建表结果写业务逻辑的时候发现少字段、表关系理不顺后面改得想哭。公寓管理系统核心要管理的几个实体老人住养老人档案、房间/床位、入住记录、护理记录、缴费记录、系统用户、家属/来访登记。这些实体之间的关系其实很清晰一个用户可以对应多个角色但毕设场景为了简单直接在用户表里放 role 字段即可。一个房间有多个床位一个床位同一时刻最多被一个已入住的老人占用。一个老人有多次入住记录住进来、搬走、又住进来所以要用独立的入住表。一次入住对应多条护理记录每天/每周可能多挑记录。一次入住对应多条缴费记录每月生成一笔床位费和护理费。这样一梳理表的边界就出来了。毕设的数据库一般10到12张表是一个比较舒服的量太少显得没工作量太多答辩容易被往死里问。核心表如下数据表核心字段作用userid, username, password, real_name, role, phone系统登录用户elderid, name, gender, id_card, birthday, health_status, phone, emergency_contact老人基本信息档案roomid, room_no, floor, room_type, status房间信息bedid, bed_no, room_id, status(0空床/1占用)床位信息check_in_infoid, elder_id, bed_id, check_in_date, check_out_date, status, operator入住退住记录care_recordid, elder_id, check_in_id, care_date, content, nurse_name每日护理记录payment_recordid, elder_id, check_in_id, fee_type, amount, pay_date, status费用管理visitor_logid, elder_id, visitor_name, relation, visit_time, remark来访登记3.2 为什么强烈建议保留 status 字段做状态流转做管理系统最重要的一件事就是别把记录直接删掉而是用状态控制流程。比如老人退住你不应该把入住记录 delete 掉而是把 check_in_info.status 从已入住改成已退住。这背后对应的业务逻辑是退住之后你仍然要能查到这个老人曾经住过哪些房间、交过多少费用、产生过哪些护理记录。如果删了数据后面做统计报表会非常被动。状态字段的设计在各张表里蕴含了一些业务智慧。以 room 表为例除了 status 之外room 表要和 bed 表联动——房间的状态应该根据床位状态动态计算而不是由用户手动修改房间状态。我见过一些项目的设计是房间和床位分开管理前台显示的时候房间状态错乱这是因为房间的空闲/全满没有根据床位实时计算。你要么在查询的时候用SQL子查询现算要么在安排床位的业务代码里同时更新两张表的状态二选一但绝不能两不管。3.3 金融类字段要用 decimal别用 double费用表里的 amount 字段必须用 DECIMAL(10,2)这是做财务相关功能的基本素养。double 在MySQL里是浮点类型会有精度问题比如你存一个 1234.56运算的时候容易出现 1234.5599999 这种诡异结果。虽然毕设系统涉及的金额笔数不多精度损失大概率也暴露不出来但论文写数据库设计的时候如果被问到为什么用 double你会很难解释。DECIMAL 是定点数用十进制的精度存储不会出这种问题。另外要留意的是金额单位一律用元不要出现分元混用。我的建议是无论哪张表都统一加上这几个公共字段create_time、update_time、deleted逻辑删除标记。MyBatis-Plus 支持 TableLogic 注解做逻辑删除这样就算哪天误删了数据也还能在数据库里兜底找回来不会为毕设答辩准备的事实数据发愁。3.4 几张核心表的 SQL 片段老人信息表的核心字段设计CREATE TABLE elder ( id int NOT NULL AUTO_INCREMENT COMMENT 主键, name varchar(50) NOT NULL COMMENT 姓名, gender tinyint DEFAULT 1 COMMENT 1男 2女, id_card varchar(18) DEFAULT NULL COMMENT 身份证号, birthday date DEFAULT NULL COMMENT 出生日期, phone varchar(20) DEFAULT NULL COMMENT 联系电话, health_status varchar(255) DEFAULT NULL COMMENT 健康状态描述, emergency_contact varchar(50) DEFAULT NULL COMMENT 紧急联系人, emergency_phone varchar(20) DEFAULT NULL COMMENT 紧急联系电话, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, deleted tinyint DEFAULT 0 COMMENT 逻辑删除标记, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT老人档案表;入住表的设计要注意关联字段和联合唯一索引CREATE TABLE check_in_info ( id int NOT NULL AUTO_INCREMENT, elder_id int NOT NULL COMMENT 老人ID, bed_id int NOT NULL COMMENT 床位ID, check_in_date date NOT NULL COMMENT 入住日期, check_out_date date DEFAULT NULL COMMENT 退住日期, status tinyint DEFAULT 1 COMMENT 1在住 0已退住, operator varchar(50) DEFAULT NULL COMMENT 办理人, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_elder (elder_id), KEY idx_bed (bed_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT入住记录表;字符集记得用 utf8mb4不要用 utf8。utf8mb4 是 MySQL 8 之后推荐的标准字符集和 utf8 相比能存储 Emoji 表情和生僻字。身份证号、姓名这些字段如果有人录入了生僻字用老版 utf8 就会出现乱码问号这种低级问题能avoid就avoid。4. 从零实现核心业务模块理清前后端逻辑4.1 登录认证JWT的基本用法管理系统第一个要做的就是登录。传统做法用 SessionCookie但前后端分离架构下更标准的是用 JWT。JWT 的原理我这里用大白话讲用户登录成功后后端生成一串加密的Token发给前端前端每次请求都在 Header 里带上这个Token后端验证Token的合法性就知道你是哪个用户、什么角色。不需要在服务端存Session这对于一个要部署到生产服务器的毕设系统来说很方便。SpringBoot 集成 JWT 的方式核心就三步第一引入依赖jjwt第二写一个工具类生成Token和解析Token第三写一个拦截器校验Token并放行 LoginController。这里面我要提醒两个细节拦截器实现 HandlerInterceptor 之后记得通过 WebMvcConfigurer 注册还要用 excludePathPatterns 把登录接口、静态资源路径放行。否则会出现前端调登录接口后端返回401/403的错误。JWT 密钥不要写在代码里写死放到 application.yml 里jwt: secret: your-256-bit-secret-key expire: 86400密钥长度必须够长至少32位否则 JJWT 会报错。过期时间按秒算86400秒就是24小时演示的时候够用。给前端的返回结构可以统一用 Result 类包装包含 code、msg、data 三个字段Data public class ResultT { private Integer code; private String msg; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMsg(操作成功); result.setData(data); return result; } public static T ResultT error(String msg) { ResultT result new Result(); result.setCode(500); result.setMsg(msg); return result; } }4.2 老人入住和退住一张床位状态的状态机入住退住是这个系统里比较复杂的一个业务场景值得好好设计。入住流程是选择老人档案 → 选择空闲床位 → 设置入住日期 → 提交系统要做这几件事——校验老人是否有未退住的在住记录防止重复入住、修改床位状态为占用、写入入住表状态为在住。退住流程就是反着来修改入住记录状态为已退住、填写退住日期、把床位状态改回空闲。但不是所有退住都能直接成功比如老人还有未缴清的费用应该在退住的时候拦截。这个校验逻辑不要只在前端做后端 Service 层必须再做一次接口层面把关才是真正的校验。前端拦截只是用户体验后端拦截才是数据安全。这里我建议你用后端 Service 事务来保证数据一致性不要在一个 Controller 里调多个 Mapper 方法。比如入住的Controller只调 checkInService.checkIn(elderId, bedId, date) 这一个方法方法内部加上 Transactional 注解里面依次做床位状态更新、插入入住记录、更新老人表状态。一旦中间某一步抛异常事务回滚不会出现床位被占了但入住表没记录的脏数据。这是毕设论文里可以写进系统设计亮点的内容答辩老师喜欢问事务相关的问题。4.3 费用管理月度账单怎么自动生成费用管理是整个系统里最体现业务思维的模块。公寓的收费模式一般是每月固定床位费和护理费另外可能有餐费、医疗费等按次消费。毕设里最合适的方案是退住时或每月月初根据入住天数自动计算应收费用生成缴费记录。如果你想做得更有亮点可以在系统里做一个月度结账的接口或定时任务。思路是查所有在住记录按老人和当月天数算出账单金额写入缴费记录表并标记为待缴。这个用SQL就可以实现比如INSERT INTO payment_record (elder_id, check_in_id, fee_type, amount, pay_date, status) SELECT c.elder_id, c.id AS check_in_id, 床位费, r.price * DATEDIFF( IFNULL(c.check_out_date, DATE_FORMAT(NOW(), %Y-%m-%d)), c.check_in_date ) AS amount, NOW(), 0 FROM check_in_info c JOIN bed b ON c.bed_id b.id JOIN room r ON b.room_id r.id WHERE c.status 1 AND c.check_in_date DATE_FORMAT(NOW(), %Y-%m-%d);这里 DATEDIFF 是计算入住天数因为月份有长有短按天计算是最贴合实际的。缴费状态改成一个独立的支付状态字段前端用标签展示已缴/未缴形成简单的账务闭环。这些设计细节写进论文里非常加分的——它说明你不是在机械地写增删改查而是理解了业务规则。4.4 护理记录和来访登记两个容易被忽略的模块护理记录就是一张流水表每天由护理员给在住老人登记一条护理情况比如早餐后测血糖数值正常下午协助下楼散步30分钟。这个模块的列表查询需要带关联查询——查出老人姓名和房间号所以SQL要连三张表SELECT cr.*, e.name AS elder_name, r.room_no, b.bed_no FROM care_record cr LEFT JOIN elder e ON cr.elder_id e.id LEFT JOIN check_in_info ci ON cr.check_in_id ci.id LEFT JOIN bed b ON ci.bed_id b.id LEFT JOIN room r ON b.room_id r.id WHERE cr.elder_id #{elderId} ORDER BY cr.care_date DESC来访登记更简单就是一个表单加列表。但你可以在访客表的设计上做点文章比如记录来访人姓名、与老人的关系子女/亲戚/朋友、来访时间、离开时间形成一个完整的访客记录后面答辩问你这个系统数据从哪来的时候你可以说模拟了真实的公寓运营场景事实数据全链路闭环。4.5 前端实现Vue页面级联动的设计前端部分核心就是路由和页面组织。页面结构大致登录页、管理首页侧边栏内容区、老人管理页、房间床位管理页、入住退住管理页、护理记录页、缴费管理页、统计报表页。前端关键组件是表格 弹窗表单 分页。Element Plus 的 el-table、el-dialog、el-form 三件套足以支撑90%的管理页面。老人管理页面的示例思路template div classelder-page el-card el-form inline el-input v-modelqueryParams.name placeholder老人姓名 clearable / el-button typeprimary clickloadElderList查询/el-button el-button typesuccess clickopenElderDialog新增老人/el-button /el-form el-table :dataelderList border stripe v-loadingloading el-table-column propname label姓名 / el-table-column propgender label性别 / el-table-column propphone label联系电话 / el-table-column prophealthStatus label健康状况 show-overflow-tooltip / el-table-column label操作 width200 template #default{ row } el-button link typeprimary clickeditElder(row)编辑/el-button el-button link typedanger clickdeleteElder(row)删除/el-button /template /el-table-column /el-table el-pagination v-model:current-pagequeryParams.pageNum :page-sizequeryParams.pageSize :totaltotal current-changeloadElderList / /el-card /div /templateaxios 请求封装上用拦截器统一在请求头里加 Token、统一处理响应状态码和错误提示。这个封装做完一次后面所有页面都能复用。前后端联调阶段常见的坑有三个。第一个是跨域问题——前端端口比如5173和后端端口比如8080不一致必须解决。最容易的方案是后端写一个 CorsConfig 配置类允许所有来源。第二个是时间格式问题——后端 LocalDateTime 序列化默认格式是一长串前端不认得。解决方案是在 application.yml 里配置 Jacksonspring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8第三个是分页参数不一致——前端传给后端的是 pageNum 和 pageSizeMyBatis-Plus 分页插件默认接收 current 和 size。两种方案要么前端适配后端要么前端传 pageNum 后端用 Page 的构造器转成 current。我习惯用一个公共 PageQuery 对象接收前端参数再转换成 MP 的分页对象这样前端代码不用改来改去。// 前端 response.data.total 等字段可以通过拦截器统一处理后端返回的 Result 结构// request.js 封装 import axios from axios import { ElMessage } from element-plus import router from /router const request axios.create({ baseURL: /api, timeout: 10000 }) request.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers.Authorization token } return config }) request.interceptors.response.use( response { const res response.data if (res.code ! 200) { ElMessage.error(res.msg || 请求失败) return Promise.reject(new Error(res.msg)) } return res }, error { if (error.response error.response.status 401) { ElMessage.error(登录已过期请重新登录) localStorage.removeItem(token) router.push(/login) } else { ElMessage.error(网络异常请稍后重试) } return Promise.reject(error) } ) export default request5. 毕设论文怎么组织一份能过盲审的写作框架很多学生代码写完了论文不知道怎么写。这里我直接给你一份经过实战检验的论文大纲每一章的写作方法都讲清楚。5.1 论文章节参考大纲第一章 绪论写选题背景与意义老龄化社会趋势 公寓管理信息化需求、国内外研究现状国外主要讲养老信息化系统起步早国内讲近些年的智慧养老平台越来越多、研究内容与目标、论文组织结构。第二章 相关技术介绍SpringBoot、Vue、MySQL、MyBatis-Plus、JWT分别是什么有什么特点为什么适合本项目。这章不要写太长核心是证明你用了合适的技术而不是堆概念。第三章 系统需求分析可行性分析技术/经济/操作、功能需求用用例图和用例表格描述角色与功能、非功能需求性能、安全、易用性。第四章 系统设计总体架构设计B/S架构、前后端分离结构说明、功能模块设计画功能结构图、数据库设计ER图 每张表的字段说明。第五章 系统实现按业务模块写实现过程每个模块描述页面效果 核心代码片段 业务流程。重点模块就是老人管理、入住退住、费用结算、统计报表这四个。第六章 系统测试测试环境说明、功能测试用例表用例编号、测试项、预置条件、操作步骤、预期结果、实际结果、兼容性测试、性能测试简单描述。第七章 总结与展望总结做的内容提出不足比如没有移动端、没有消息提醒展望后续改进方向。5.2 答辩老师最在意的几个点答辩的时候老师常问的几个问题我必须提前预警一下。第一个问题必然是这个系统的核心业务逻辑是什么你要能把入住退住这个状态流转过程用语言清晰地表达出来。第二是为什么用JWT不用Session这个问题的标准答法前后端分离架构下后端不再维护Session状态JWT无状态、适合分布式部署、减轻服务端存储压力但是要注意Token过期管理和续签问题。第三是数据库为什么要这么设计——这就是我前面反复强调字段注释、逻辑删除、DECIMAL类型这些细节的原因。系统测试这章很多学生随便写两句就带过了。我的建议是做一个表格至少列出10条功能测试用例覆盖登录、老人增删改查、入住、退住、费用生成、统计报表等核心流程每条都写清楚预期结果和实际结果一致。测试截图放上老师一眼就看到工作量。这个表设计得好基本不会被问倒。5.3 谁说毕设只能做不能包装论文里有一个很多学生没意识到的地方需求分析章节的用例图描述的是角色行为这能直接体现你对业务的理解。比如办理入住这个用例参与者是管理员前置条件是有空闲床位和未在住老人档案主事件流是选择老人、选择床位、确认入住日期、系统校验、保存记录。你能把用例事件流写出来说明你真的理解了这个业务的执行路径。这个在论文里是很大的加分项因为多数学生只会堆功能列表。另外截图规范也要注意。系统截图不要用手机拍屏幕用系统自带的截图工具截高清图统一缩放比例。所有截图标注好图号和图名正文引用的时候写如图5-3所示。这些细节决定了论文拿良还是拿优。6. 从源码到部署上线开发阶段的实践与部署踩坑记录6.1 本地开发环境准备做这个项目之前先花半天把环境装好。你需要的软件清单如下JDK 1.8 或 11安装后配环境变量 JAVA_HOME 和 PATH命令行输入 java -version 验证。MavenSpringBoot项目用Maven管理依赖。IDEA内置Maven的话可以不用单独装但命令行跑构建建议装一个配置阿里云镜像加速依赖下载。Node.js 16前端环境。安装完用 node -v 和 npm -v 验证。MySQL 8.0安装时记住 root 密码。用 Navicat 或 MySQL Workbench 作为可视化工具。IDEA / VS Code后端推荐IDEA终极版社区版也能跑SpringBoot但一些功能受限前端VS Code够用。Maven 的 settings.xml 里我会加阿里云镜像不然首次下载依赖会等到怀疑人生。mirror idaliyunmaven/id mirrorOfcentral/mirrorOf urlhttps://maven.aliyun.com/repository/public/url /mirrornpm 这边同理把源切到国内镜像npm config set registry https://registry.npmmirror.com6.2 导入源码和运行项目的标准流程拿到一套完整的项目管理源码之后运行流程是有固定套路的。后端项目导入IDEA后第一步是等待Maven自动下载依赖。等右下角进度条走完以后改三处配置application.yml 里的数据库连接用户名密码、端口号、文件上传路径。第二步是执行项目自带的 sql 脚本用 Navicat 新建数据库导入 init.sql建库建表语句和 data.sql初始数据。这里有个很多人犯的错不新建数据库直接导入或者是把两张表的SQL放在一个文件里运行顺序错了导致外键关联失败。正确的做法是-- 第一步创建数据库指定字符集 CREATE DATABASE IF NOT EXISTS apartment_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE apartment_db; -- 第二步执行建表和初始数据SQL source /path/to/apartment_db.sql;前端项目导入VS Code后终端执行 npm install 装依赖然后npm run dev启动后访问 http://localhost:5173能看到登录页说明前端通了。后端启动后访问 http://localhost:8080/api/test 之类的测试接口能返回JSON说明前后端基础联通没问题。默认账号密码在 data.sql 里都写好了一般是 admin/admin 或者 admin/123456登录进去就能看到完整功能。6.3 打包部署从本机到云服务器的完整流程开发完要上线演示或者给老师演示时不想依赖本地环境就得部署到服务器。部署方案我用的是前端 Nginx 后端 Jar 包 MySQL 放服务器三方组合。后端打包命令mvn clean package -DskipTests打包完成后target 目录下会有 apartment-0.0.1-SNAPSHOT.jar。注意打包前请确认 application.yml 里的数据库地址改成服务器的IP比如 jdbc:mysql://服务器IP:3306/apartment_db不要用 localhost除非你就是部署在同一台机器上。把 jar 包上传到服务器比如 /opt/apartment 目录然后后台启动nohup java -jar apartment-0.0.1-SNAPSHOT.jar app.log 21 前端打包npm run build这会生成 dist 目录里面是纯静态文件。把 dist 内容上传到服务器 Nginx 的 web 目录然后改 nginx.confserver { listen 80; server_name your-domain-or-ip; # 前端静态资源 root /usr/share/nginx/html; index index.html; # 所有 /api 开头的请求反向代理到后端8080端口 location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # Vue 路由 history 模式配置 location / { try_files $uri $uri/ /index.html; } }注意两个关键配置第一个是/api/的代理这是前后端分离部署的核心——前端请求的还是自己的域名Nginx把带 /api 前缀的请求转发给后端Java服务解决了跨域问题。第二个是 try_files 配置Vue Router 用 history 模式createWebHistory时用户直接访问某个子路径如 /dashboard会404加了 try_files 就自动回退到 index.html 交给前端路由处理。如果你不想配置代理后端CORS打开也行但我实测还是用Nginx代理最稳。6.4 这一路踩过的坑整理成清单给你最后整理一份我实际部署时遇到的问题清单希望你能绕开。MySQL 8.0 的驱动配置和旧版不一样driver-class-name 是com.mysql.cj.jdbc.DriverURL 里必须带serverTimezoneAsia/Shanghai和useSSLfalse否则会报时区错误或SSL警告问题。Linux 服务器上如果 MySQL 服务没起来SpringBoot 项目启动会报Communications link failure排查第一步先确认服务器上的 MySQL 状态systemctl status mysqld。前端部署后刷新页面404就是 Nginx 少了 try_files 配置上面已经给了解决方式。文件上传如果系统里做了图片上传要配一个独立的路径不要放在 jar 包内部否则每次重新部署jar包会导致图片被清空。服务器内存低于2G不建议部署完整的MySQLJavaNginx三件套实测1核2G的配置跑这个小项目还算流畅但别用512M的小机器会被MySQL直接卡死。数据库连接池如果用的是默认的 HikariCP最大连接数默认 10 就够毕设用了没必要调大但连接超时时间建议设到 30 秒以上防止服务器冷启动时首次数据库连接失败。结尾一点实在的建议这套系统整套做完从选题到答辩我花了大半个月每天大概三个小时左右。说实话SpringBoot和Vue的单点知识你在B站看两个视频就会了真正让你成长的是把这两条线串起来、把业务逻辑落成表和接口的过程。如果让我重新做一次我会把更多精力花在数据库设计的预研和状态流转的梳理上因为代码写错了可以改但表结构设计错了改动成本是很高的。给后面做管理系统类毕设的同学一个建议不要只盯着增删改查试着在系统里加入一些业务规则比如费用自动计算、床位状态联动、退住前费用校验这些小小的设计会让你的系统真正像一个管理系统而不仅仅是一个写着管理两个字的CRUD Demo。答辩的时候也正是这些业务细节能帮你跟其他人拉开差距。技术栈可以简单想法不能简单。余下的路你自己走一遍就知道了。
返回列表