☰
SpringBoot+Vue+MySQL疫情隔离管理系统毕设完整项目解析
2026/10/7 18:06:49 网站建设 项目流程

1. 疫情隔离管理系统毕设项目:从定题到交付的完整拆解

如果你正在准备毕业设计,还在众多系统中纠结做什么题目,我建议把这类“疫情隔离管理系统”列入备选。理由很直接:它属于典型的信息管理类系统,业务边界清楚、角色划分明确、功能点刚好覆盖一个完整全栈项目该有的模块,不会有科研压力,也不会出现犹豫“这个功能到底做不做得出来”的问题。而且“SpringBoot + Vue + MySQL”这套组合,无论站在毕设答辩角度,还是以后找工作展示项目经验的角度,都是目前企业里最主流的开发栈组合。

有一个经验要先说:疫情隔离管理系统,本质是一个"特殊场景下的资源分配与状态跟踪系统"。它的核心不是医学,而是把人、房间、时间、健康记录四条线串起来。只要想明白这四条线,数据库设计、后端接口、前端页面就都能顺理成章地定下来。本文我就按自己实际做这类项目的流程,从选型原因、数据库设计、后端实现、前端页面、打包部署、论文答辩,到最后整理的避坑经验,完整讲一遍。

2. 选型思路:为什么 SpringBoot + Vue + MySQL 最稳

2.1 前后端分离是主流,也是毕设的加分项

早些年做管理系统,很多人的做法是 Thymeleaf 模板引擎渲染,页面顺手往 static 目录里一扔,虽然也能完成毕设,但放到现在来看,明显落后于企业实际开发模式。企业里前端是前端,后端是后端,通过 JSON 接口交互,各自独立开发、独立部署。SpringBoot 负责提供接口,Vue 负责渲染页面,MySQL 负责存储数据,这就是最标准的“前后端分离”架构。

这个选择放到答辩时非常好讲。老师问“为什么这么设计”,你可以直接回答:为了降低前后端耦合,方便团队并行开发,后端只要保证接口稳定,前端页面怎么改都不会影响业务逻辑。这句话一出来,评委就知道你确实理解这个架构。

2.2 框架选型要讨好学过的知识,不盲目追新

很多同学纠结到底用 SpringBoot 还是 SSM,用 Vue2 还是 Vue3。我的个人建议是:如果学校教过 SSM,你可以升级到 SpringBoot,但没必要去搞微服务、分布式那一套。毕设评审老师重点看的是“你掌握了多少”,不是“项目里堆了多少”。

Vue 这边,如果基础一般,用 Vue2 + Element UI 完全没问题,资料最多,坑已经被人踩平了。如果对新语法有信心,直接用 Vue3 + Vite + Element Plus 也完全可以。我这次用的就是 Vue3 + Element Plus,因为 Vue 3 目前已经是主流,相关资料也够多,但对新手来说,Vue2 和 Vue3 在模板语法上的差异不大,核心是生命周期和响应式的变化,毕设阶段不会踩太深。

2.3 MySQL 为什么不用别的数据库

管理系统最常用的就是关系型数据库,MySQL 是其中应用最广的。Oracle 太重,SQL Server 在部分学校有版权问题,PostgreSQL 虽然优秀,但在国内遇到问题不容易搜到中文方案。MySQL 安装简单、工具成熟(Navicat、DataGrip 都支持),而且面试时问数据库基本也绕不开 MySQL。

我个人建议装 MySQL 8.0 以上版本,字符集直接用 utf8mb4,因为后面存储姓名、备注这类内容时,utf8mb4 比 utf8 更安全,不会出现表情符号或生僻字存不进去的诡异问题。

3. 数据库设计是地基:表结构怎么定,项目就稳了一大半

3.1 核心数据关系梳理

做这类项目第一件事不是写代码,而是画清楚数据关系。疫情隔离管理系统的核心流程大概是这样的:

  • 系统里有三种人:管理员、工作人员(比如隔离点医护人员或后勤人员)、被隔离人员。
  • 被隔离人员登记入住时,需要分配房间、记录隔离周期。
  • 隔离期间,被隔离人员每天要上报体温和身体状况(健康打卡)。
  • 工作人员根据上报情况做记录、发布通知或处理异常。
  • 隔离期满,管理员办理“解除隔离”操作,生成历史记录。

基于这个流程,最少需要这几张表:用户表、隔离人员表、房间表、入住记录表、健康打卡表、通知/任务表。如果再加一点扩展,比如角色权限表(虽然结构上可以直接用字段区分角色),可以让系统显得更完整,但代价是增加管理页面的复杂度,毕设如果时间紧,角色字段用数字区分就足够了。

3.2 关键表结构设计与字段说明

下面直接把最重要的一张表拿出来讲,隔离人员表。

CREATE TABLE `isolation_person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `person_no` varchar(32) DEFAULT NULL COMMENT '隔离编号', `name` varchar(50) NOT NULL COMMENT '姓名', `id_card` varchar(18) DEFAULT NULL COMMENT '身份证号', `phone` varchar(20) DEFAULT NULL COMMENT '联系电话', `gender` tinyint(4) DEFAULT NULL COMMENT '性别:0女 1男', `address` varchar(200) DEFAULT NULL COMMENT '来源地', `room_id` bigint(20) DEFAULT NULL COMMENT '房间ID', `isolation_start` date DEFAULT NULL COMMENT '隔离开始日期', `isolation_end` date DEFAULT NULL COMMENT '隔离结束日期', `status` tinyint(4) DEFAULT NULL COMMENT '状态:0待入住 1隔离中 2已解除 3已转出', `remark` varchar(500) DEFAULT NULL COMMENT '备注', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, `deleted` tinyint(4) DEFAULT 0 COMMENT '逻辑删除标记', PRIMARY KEY (`id`), KEY `idx_room_id` (`room_id`), KEY `idx_status` (`status`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='隔离人员表';

这个表有四个细节非常容易被新手忽略,却在实际使用中非常重要。

第一个是person_no。如果完全用自增 id 当业务编号,一旦数据删除,编号会出现空缺,而且 id 是数字,外人很容易猜测系统里一共有多少人。加一个随机生成的业务编号,可以用时间戳加几位随机数生成,会给系统增色不少,答辩时还能作为“业务安全”的点来讲。

第二个是deleted字段。不要用物理删除,而是逻辑删除。为什么?因为健康打卡记录、入住记录都外键关联着这个人,一旦物理删除,历史数据可能连锁出错。更关键的是,这种系统有审计需求,记录不能随便抹掉。加个deleted字段,查询时统一带上deleted = 0条件即可。

第三个是status状态值。用tinyint存数字状态比存字符串方便得多,状态流转在后端代码中统一控制。比如从“待入住”变成“隔离中”,必须伴随房间分配和日期初始化,不能用前端想怎么改就怎么改。

第四个是时间字段。日期用date,时间为datetime。很多新手统一都用varchar存时间,结果排序和比较特别麻烦。数据库里能用时间类型就别用字符串,这是铁律。

3.3 房间表、打卡表和通知表的关联逻辑

房间表相对简单,核心字段就是房间编号、楼层、最大容量、已住人数、状态(空置/占用/消毒中/停用)、备注。这里有一个需要注意的业务规则:一个房间可以住多人,也可以单人单间,看业务需求。如果做单人单间,房间表里加一个current_person_id字段就够了。如果做多人间,则要单独考虑容量校验,这里我建议毕设直接做单人单间,逻辑简单,页面展示也清晰。

健康打卡表是每天产生的数据,核心字段:打卡人ID、日期、体温、是否有咳嗽/乏力等症状、是否接触过可疑人员、备注。特别注意要给“人 + 日期”加唯一索引,防止同一人同一天被重复提交。

ALTER TABLE `health_report` ADD UNIQUE KEY `uniq_person_date` (`person_id`, `report_date`);

通知表一般叫notice或者task,字段包括标题、内容、类型、发布人、接收人、是否已读。如果做到这里还有时间,可以把“已读未读”功能加上,这个功能在答辩演示时特别有视觉效果。

4. SpringBoot 后端实现:分层清晰,接口稳定

4.1 项目目录结构与分层

后端包结构建议按功能分层,同时兼顾业务模块。比如:

com.example.isolation ├── common // 通用类:返回结果、异常、常量 ├── config // 配置类:跨域、拦截器、JWT配置 ├── controller // 控制层 ├── entity // 实体类 ├── mapper // 数据访问层接口 ├── service // 业务层接口 │ └── impl // 业务实现类 └── util // 工具类:JWT、日期处理、随机编号

很多人做毕设时把 Controller 里塞了一堆业务代码,这是最大的坏习惯。比如“办理入住”这个操作,它不是一个简单的 insert,而是要同时做三件事:修改房间状态、新增入住记录、更新人员状态。如果全写在 Controller,不仅代码长到没法看,而且遇到中途报错就很难做到数据一致。正确做法是放在 Service 里,加上@Transactional事务注解,保证这几步操作要么全成功,要么全回滚。

4.2 统一返回结果和全局异常处理

我强烈建议所有接口都返回统一结构的 JSON,格式可以是:

{ "code": 200, "message": "操作成功", "data": {} }

前端 axios 拿到这个结构后,先判断 code 再取 data,逻辑就非常统一。

后端要有一个Result类,然后配合全局异常处理器,把所有已知异常转成对应 code 返回。比如登录失败返回 401,没有权限返回 403,参数校验失败返回 400,数据不存在返回 404。这一套做完,前端处理错误只需要看 code,不用每次都对着一堆莫名其妙的后端堆栈信息发愁。

4.3 JWT 登录认证是实现权限控制的核心

因为这个项目涉及角色权限,登录接口必须用 Token 方案来做认证。流程是:用户登录 -> 后端校验用户名密码 -> 生成 JWT 返回给前端 -> 前端每次请求在 header 带上 Token -> 后端拦截器校验 Token 并识别用户角色。

核心依赖和拦截器配置我就不做完整代码演示了,但有一个关键点必须注意:Spring Security虽然功能强大,但学习成本高,配置复杂。如果你只是想做一个能跑通的毕设,用拦截器 + JWT 就够了。我自己这次就是这么做的,实现起来五十行左右搞定,而且代码一目了然,比引入安全框架省心得多。

拦截器里主要做三件事:从请求头取 Token、解析 Token、把用户信息放到 ThreadLocal 里供后续业务使用。没有 Token 或 Token 过期直接返回 401。如果某些接口需要特定角色才能访问,可以在接口上加自定义注解,然后在拦截器里判断用户角色和注解权限。

4.4 核心接口设计与实现思路

我把核心接口分成几类:

  • 登录认证接口:登录、退出、获取当前用户信息。
  • 人员管理接口:分页查询隔离人员、新增登记、编辑、办理入住、办理解除、办理转出、删除。
  • 房间管理接口:房间列表、新增、编辑、状态修改。
  • 健康打卡接口:提交打卡、查询某人的打卡记录、按日期范围统计。
  • 通知公告接口:发布通知、接收人列表、标记已读。
  • 首页统计接口:卡片数据(总人数、今日打卡人数、空余房间数、隔离中人数的实时统计)。

这里提一下“办理入住”和“解除隔离”两个核心操作。它们都属于多步事务操作。办理入住至少要更新人员状态、占用房间、创建入住记录,而解除隔离要更新人员状态、释放房间、更新入住记录的结束日期。这些操作如果拆分成多个接口让前端去调,不仅浪费流量,还会带来中间状态数据不一致的风险。所以设计接口时必须把这个完整动作封装在后端一次完成。

@Transactional(rollbackFor = Exception.class) public void checkIn(CheckInRequest request) { // 1. 校验隔离人员是否存在且状态为待入住 // 2. 校验房间是否存在且状态为空置 // 3. 更新隔离人员状态为隔离中,设置房间ID和隔离起止日期 // 4. 更新房间状态为已占用 // 5. 插入入住记录,初始状态为隔离中 }

这种写法在答辩时非常加分,因为老师看到@Transactional就知道你理解数据一致性。

4.5 MyBatis-Plus 还是 JPA

二选一的问题,我建议毕设直接用 MyBatis-Plus。它对新手特别友好,内置的单表 CRUD 方法几乎不用写 SQL,通过 LambdaQueryWrapper 就能完成条件查询。分页也有现成的分页插件,几行配置就搞定。JPA 虽然也行,但它对 lazy loading 和 N+1 查询问题的处理对新手很不友好。

当然,重要业务还是要手写 SQL。比如统计“今日体温异常人数”,用 MyBatis-Plus 的普通 Wrapper 处理不了聚合统计,就得在 Mapper 里写自定义 SQL,这个反而简单。下面是一个实际可用的统计查询示例:

SELECT COUNT(DISTINCT person_id) as count FROM health_report WHERE report_date = CURDATE() AND temperature > 37.3 AND deleted = 0

5. Vue 前端实现:从页面骨架到接口联调

5.1 前端技术栈组合与初始化

前端我用的是 Vue3 + Vite + Element Plus + Pinia + Axios。如果你用 Vue2,把 Element Plus 换成 Element UI,Pinia 换成 Vuex,思路完全一样。

Vite 初始化命令很简单:

npm create vite@latest isolation-web -- --template vue cd isolation-web npm install npm install element-plus axios pinia

初始化完成之后,我习惯先把目录结构搭出来,分成 api、router、store、views、components、utils 几个目录。很多人写前端时把所有接口请求直接写在页面组件里,导致同一个接口在多个页面用到时复制三遍。正确的做法是在 api 目录下按业务模块拆文件,比如api/person.js、api/room.js,每个文件导出函数,页面里只 import 函数。

5.2 Axios 封装与 Token 统一处理

axios 请求封装是必做项,否则每个页面都要写一遍headers: { token: xxx }的重复代码。我封装时主要做了三件事:设置 baseURL,设置请求拦截器从 localStorage 拿 token 塞进 header,设置响应拦截器判断 code,统一处理 401 跳回登录页。

关键代码片段如下:

// utils/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'] = 'Bearer ' + token } return config }) request.interceptors.response.use( response => { const res = response.data if (res.code !== 200) { if (res.code === 401) { router.push('/login') } ElMessage.error(res.message) return Promise.reject(new Error(res.message)) } return res.data }, error => { ElMessage.error('网络异常,请稍后重试') return Promise.reject(error) } )

有一个坑要特别提醒:baseURL设为/api后,又要配合后端做反向代理,不然开发环境请求会跨域。这个放到后面部署章节专门讲。

5.3 路由守卫与角色权限控制

前端不能只依赖隐藏菜单来控制权限,因为懂点技术的用户可以直接输入 URL 访问页面。所以必须在路由层面做控制。

我的做法是,路由配置时给需要权限的路由加上meta字段,比如requiresAuth: true、role: 'ADMIN'。然后写一个全局前置守卫,每次路由跳转前检查:

router.beforeEach((to, from, next) => { const token = localStorage.getItem('token') if (to.path === '/login') { next() return } if (!token) { next('/login') return } const role = localStorage.getItem('role') if (to.meta.role && to.meta.role !== role) { next('/403') return } next() })

这样即使有人手动输入管理员的 URL,也会被拦下来跳转到错误页。这个细节在答辩时讲出来,评委印象分直接拉高。

5.4 核心页面拆解:列表、弹窗、状态流转

页面开发有一个方法论:百分之八十的管理系统页面,本质上是“列表 + 表单弹窗”的变体。

首页仪表盘:显示统计卡片和趋势图。可以用 ECharts 画一张最近七天打卡人数折线图,数据由后端接口提供。注意图表在表格页面不要滥用,首页放一个趋势图就足够撑场面了。

隔离人员管理页:核心是表格。表格列包括编号、姓名、身份证号、房间号、隔离开始/结束日期、状态、操作按钮。操作按钮根据状态动态显示。比如状态为“待入住”时显示“办理入住”,状态为“隔离中”时显示“办理解除”“查看打卡”。这里有一个非常容易踩的坑:状态标签不要只显示数字,要用 Element Plus 的el-tag配合不同颜色映射,1 对应蓝色“隔离中”,2 对应绿色“已解除”,否则用户根本看不懂列表里 0、1、2 是什么意思。

健康打卡页:给被隔离人员用的页面,就是一个表单,一个日期选择器加几个输入项,提交成功后清空表单再提示成功。工作人员端则是一个按日期查询的表格,可以按异常体温过滤。

房间管理页:一样是表格加弹窗,额外加一个“房间状态看板”,用卡片展示空置、占用、消毒中的房间数量。房间状态看板做得好,视觉效果好,又给首页统计的数据提供了直观来源,这个功能特别适合演示时直接切过去给老师看。

5.5 前端表单校验别只靠后端

很多同学在后端已经做了参数校验,前端就不做了,这样体验很差。用户在页面上填完身份证号,格式不对,直接点提交后弹一个“参数校验失败”,还要让后端报错出来,确实很没面子。Element Plus 表单的rules只要简单配置就能做,身份证号格式用正则匹配,必填项用required: true,这一块做完之后,前端体验好很多,后端也减少了很多无效请求。

要注意的是:前端的校验只是为了用户体验,真正的安全校验必须放在后端。如果只信前端,攻击者绕过页面直接调接口,什么校验都没有。

6. 从本地到部署:环境配置、打包与上线

6.1 本地环境搭建

开发时我一般装这些工具:JDK 1.8(或者 11)、Maven 3.6+、Node.js 16+、MySQL 8.0、Navicat 或者 DataGrip。IDEA 和 VS Code 分别是前后端开发的编辑器。

MySQL 安装完成后的第一件事,是创建一个独立的数据库账号,不要直接用 root 跑项目:

CREATE DATABASE isolation_system DEFAULT CHARACTER SET utf8mb4; CREATE USER 'isolation_user'@'localhost' IDENTIFIED BY 'YourPassword123'; GRANT ALL PRIVILEGES ON isolation_system.* TO 'isolation_user'@'localhost'; FLUSH PRIVILEGES;

这样做的好处是避免项目配置里的密码跟 root 一致,降低安全风险,也方便后来部署时只改一处配置。

6.2 后端配置文件的多环境切换

实际开发中我通常会分application-dev.yml和application-prod.yml。开发环境连本地数据库,部署环境连服务器数据库。通过spring.profiles.active切换。

配置数据库连接时特别注意两个参数:时区和连接编码。characterEncoding=utf8是常识了,serverTimezone=Asia/Shanghai也必须写对,否则日期类型插入 MySQL 时会出现“相差8小时”的怪问题,这是新手最容易抓狂的情况之一。

项目端口我习惯用 8088,避免和本地其他服务冲突。同时注意配置 multipart 文件大小限制,如果后面做图片上传功能,不配置的话超过默认大小后端直接报错。

6.3 前端打包放进 SpringBoot:一体化部署的技巧

整个项目交付时,最省事的方式是把前端构建后的静态文件打包进后端的 jar 中,一个命令启动,一个进程运行,部署最简单,答辩演示也最省心。

具体做法是:前端项目下执行npm run build,会生成一个dist目录。把这个目录下的所有文件复制到后端项目的src/main/resources/static,SpringBoot 会自动把它们作为静态资源处理,和 Controller 接口共用一个端口。

但是有一个非常关键的问题:前端请求接口用的是/api前缀,而前端静态页面直接和 jar 在同一个端口,跨域问题反而没了。如果项目部署端口和请求路径不一致,才需要 Nginx 反向代理。

如果用 Nginx 部署,配置也简单。把前端 build 出的 dist 目录指向 Nginx 的 root,然后配置/api开头的请求反向代理到后端服务:

server { listen 80; server_name your-domain.com; root /var/www/isolation-web/dist; index index.html; location /api/ { proxy_pass http://127.0.0.1:8088/api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { try_files $uri $uri/ /index.html; } }

这里面try_files那一行,是为了解决 Vue Router 的 history 模式刷新 404 问题。如果你用 hash 模式,可以不用这一段,但历史模式看起来更专业,我建议留着。

6.4 服务器端部署实操记录

我在一台 CentOS 服务器上部署时,简单记录了一下步骤,直接照抄都能用:

  1. 安装 JDK:yum install java-1.8.0-openjdk。
  2. 安装 MySQL 8.0,按官方文档配置完毕后,导入项目提供的isolation_system.sql脚本。
  3. 使用mvn clean package -DskipTests打包,得到isolation-admin.jar。
  4. 上传 jar 到服务器目录,使用nohup java -jar isolation-admin.jar --spring.profiles.active=prod > app.log 2>&1 &启动。
  5. 安装 Nginx,把前端 dist 上传到/var/www/isolation-web/dist,按上面的配置写好文件,nginx -s reload。

启动后检查服务状态,可以用jps -l看 Java 进程,用tail -f app.log看日志输出。如果发现启动时报数据库连接失败,99% 的情况是application-prod.yml里的数据库 IP、账号、密码写错,或者是 MySQL 没有开启远程访问权限。

7. 毕设论文与答辩准备:项目做完了,怎么把它讲明白

7.1 论文结构怎么搭

写论文时最忌讳从零开始埋头写。正确的顺序是先写系统设计的图,再按图写文字。论文里必有的几张图是:系统架构图、功能模块图、数据库 ER 图、核心业务时序图。这些图如果自己画不好,可以用代码生成的思路反推,但一定不要照抄网上的图,因为连字段都对不上非常尴尬。

论文章节一般是:绪论(背景、意义、现状) -> 需求分析(角色分析、功能需求、非功能需求) -> 系统设计(总体架构、模块设计、数据库设计) -> 系统实现(核心代码加截图) -> 系统测试(测试用例和结论) -> 总结与展望。重点放在系统设计与实现,这两章占全文篇幅的一半以上。

7.2 源码和数据库脚本的整理规范

给出去的东西,使用体验也很重要。交付源码时我应该把三样东西分开放置:源码目录(后端和前端分开放)、数据库目录(包含 sql 脚本和初始化数据)、部署文档。很多人直接打包发一个 zip 完事,但项目是否有清晰的README.md,往往能让人第一印象产生明显差别。

README.md里至少要写:项目介绍、技术栈、运行环境、数据库初始化方法、本地启动步骤、默认账号密码。特别是默认账号密码,如果不写,对方拿到源码还要翻几个月前的聊天记录才知道。

数据库脚本里要同时包含建表语句和预设数据。预设数据非常重要,因为如果不预先插入一个管理员账号,别人拿到项目连登录页都进不去,还得去数据库手动插数据,体验极差。

7.3 答辩常问的题目,提前准备答案

根据我自己的答辩经历,老师最常问的就是:为什么选这个题目?你的系统有哪些角色?核心表设计关系是怎样的?你的系统用什么方案做身份认证?如果并发变大了怎么办?系统数据一致性怎么保证?

其中“如何处理并发入住同一个房间”这类问题,可以通过乐观锁和唯一索引约束来回答:“房间表加版本号字段,更新时对比版本号;入住记录表给房间和时间加唯一索引,从数据库层面约束同一房间同一时间段不能二次入住。”把这两句话说清楚,比一堆空理论有用得多。

另一个高频问题是“系统有什么不足”。千万别回答“没有不足”。要说“我认为还有三个可以优化的方向:一是目前缺少消息推送机制,后续可以集成 WebSocket;二是健康数据只是收集展示,后续可以在清洗判断上做数据分析;三是目前没有做文件备份策略,生产环境需要定时备份数据库”——把自己的不足说成规划,反而是加分项。

8. 这套系统的避坑清单和扩展方向

8.1 前后端联调期的典型问题排查

开发过程中,大家几乎都会遇到几个典型问题,我直接列成速查表,方便你收藏后对照解决:

现象实际原因解决方案
前端请求后端接口报跨域前后端端口不一致,后端没放开跨域后端配置 CORS 过滤器,或部署时用同一域名反代
日期字段存入数据库少8小时JDBC 驱动连接串缺少 serverTimezonejdbc 连接加serverTimezone=Asia/Shanghai
前端登录成功后刷新页面又跳回登录Vuex/Pinia 状态被重置,没有持久化用户信息登录后把 token 和用户信息写入 localStorage,并做初始化恢复
列表分页数据总对不上前端把页码从0开始,后端从1开始统一分页参数语义,推荐前端传 current 从1开始
打包后前端页面刷新404Vue Router 使用 history 模式,Nginx 没配置 fallbackNginx 增加try_files $uri $uri/ /index.html;
健康打卡重复提交前端没做防抖,后端也没做唯一索引表加联合唯一索引,后端在保存前查询再次校验
删除隔离人员后关联打不开用了物理删除导致关联丢失改用逻辑删除deleted字段

8.2 逻辑删除到底怎么做最省心

既然提到逻辑删除,展开说一下。最简单省心的方式是在所有查询 SQL 里默认带上deleted = 0条件。但问题在于——每次都写在 SQL 里,容易漏,而且多张表都带这个条件,代码很冗余。

MyBatis-Plus 对逻辑删除支持得很优雅。在实体类字段上加上@TableLogic注解,配置文件中设置逻辑删除和未删除的值,之后调用删除方法时,MyBatis-Plus 会自动改成 update,查询时也会自动带上删除条件。这大概是毕设阶段最优雅的解决方案。

如果是纯 SQL 手写,那么原则上要求是:所有需要展示历史数据的表都加deleted字段,查询时手动加条件;关联查询时,比如查询隔离人员和健康打卡记录,也必须在 JOIN 时带上deleted条件,否则会出现“人已经删了但记录还在列表里”的情况。

8.3 给未来项目留的扩展点

这个系统做完之后不要扔,后续可以扩展的地方其实不少。

如果想从技术上加深一下,可以给健康打卡模块加统计分析和可视化大屏。比如用定时任务每天汇总前一天上报率,再交给 ECharts 渲染成图表展示。这个加进去之后,项目就多了一个“数据分析”亮点,答辩时更好讲。

如果想把“通知公告”做到实时提醒,可以引入 WebSocket,在健康打卡异常时后端实时推送消息给工作人员。技术难度不大,但会让系统体验上一个档次。

如果考虑到多隔离点场景,可以在顶层加一个“隔离点”实体,房间、人员、工作人员都归属于某个隔离点。这样系统就从单点管理变成了多点管理,逻辑上更完整,但工作量也会显著增加。如果毕设时间充足,可以考虑这个方向。

如果对安全问题感兴趣,可以把登录模块做成带验证码的形式,用 Redis 做限流,防止接口被恶意刷。虽然毕设答辩可能不会深究,但你的实际工程能力会明显高于同组其他人。

这个项目做完之后,我最真实的几点体会

最后说点别的文章里不会写的。做毕设项目最重要的不是代码量,而是“闭环”。从需求分析到数据库设计,从后端接口到前端页面,从本地能跑到部署到 Linux 上,每一步都真实地走一遍,你就能在答辩时从容地告诉老师“这个系统是我自己一步步搭起来的”。这个过程的收获,比项目本身那几十分要值钱得多。

另外提醒一句:网上确实有现成的源码和论文,但直接拿去提交风险很大,重复率检测那关就很难过。即便是参考别人的设计,也要把表结构重新梳理一遍,把界面重写一遍,把业务逻辑按自己的理解改掉几个关键点。只有自己真正全程走一遍,答辩时才能答得出细节,项目经验才能写在简历上。

这套 SpringBoot + Vue + MySQL 的组合,我建议做完之后不要急着删,把前后端打包流程跑熟,把部署文档整理干净,以后找工作拿来当项目经验的素材,比临时抱佛脚强得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询