1. 项目概览:这套系统到底能做什么
先说结论:这是一套典型的前后端分离信息管理系统,技术栈是 SpringBoot + Vue + MyBatis + MySQL,核心功能围绕“人员隔离管理”场景展开,包含登录鉴权、角色权限、隔离人员信息登记、每日健康状态上报、隔离周期管理、到期提醒、数据统计看板等完整闭环。
很多人看到“疫情隔离管理系统”这个名字,第一反应是“这东西现在还用得着吗”。我的看法是:把它当成一个业务背景完整的管理系统案例来学习,价值完全不在具体业务本身。它覆盖了绝大多数据管理类项目都会遇到的问题——多角色权限、一对多数据建模、动态条件查询、前后端接口联调、生产环境部署。这套骨架学会了,换成“学生宿舍管理系统”“志愿者活动管理系统”“客户信息登记系统”,改改字段和页面就能落地。
对三类人尤其适合:
- 正在准备毕设/课程设计的学生:功能完整、技术主流、有部署教程,答辩时能讲清楚设计思路和关键实现。
- 想系统入门前后端分离的开发者:这个项目不是那种只有登录注册的玩具demo,而是真实多表关联、带权限控制的完整小系统,踩坑点和生产场景高度一致。
- 想做通用信息管理底座的个人开发者:把业务模块抽掉,剩下的权限、统一返回、异常处理、部署方案可以直接复用到下一个项目。
我基于这套架构完整走了一遍开发、联调、打包、部署的全流程,下面把经验和代码全部拆开讲。内容不吹不黑,只讲实际踩过的坑和验证过的方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型的取舍与整体架构思路
2.1 为什么是这套组合,而不是别的
现在做前后端分离,方案很多:前端可以是 React、Vue,甚至 Svelte;后端可以是 SpringBoot、SpringCloud、Node.js、Go。这个项目选择 SpringBoot + Vue + MyBatis + MySQL,不是偶然,而是信息管理类系统里性价比最高的组合。
先看后端。SpringBoot 相比传统 SSM(Spring + SpringMVC + MyBatis)最大的优势是约定优于配置。内嵌 Tomcat,不用额外部署 war 包到外部容器;起步依赖一套,Maven 自动把版本管理好;application.yml 一个文件搞定数据源、端口、日志等配置。对比一下:SSM 时代搭一个能跑的环境要配 web.xml、spring-mvc.xml、mybatis-config.xml、数据源 bean,一上午没了;SpringBoot 起步 spring-boot-starter-web + mybatis-spring-boot-starter,十分钟就能启动一个带数据库连接的项目。
再看前端。Vue 相比 React 学习曲线更平缓,模板语法直观,组件化开发模式对中小型系统非常友好。配合 Element UI 这种组件库,表格、表单、弹窗、分页这些管理系统高频组件开箱即用,不需要自己从零封装 UI。React 当然也强,但在这个体量的项目中,Vue 的开发效率明显更高。
MyBatis 和 MySQL 就更不用纠结了。MyBatis 的定位是“半自动 ORM”,SQL 掌握在开发者手里,复杂多表关联、动态条件查询都能精确控制,比起完全自动化的 JPA/Hibernate,遇到性能问题时排查思路更清晰。MySQL 则是开源关系型数据库里最普及的选择,部署简单、文档全、社区问题答案多。
一句话总结这套组合的定位:SpringBoot 省配置,Vue 省页面开发时间,MyBatis 省 SQL 失控的担忧,MySQL 省部署成本——四个省叠加在一起,就是信息管理系统最快落地路径。
2.2 前后端分离架构的运行链路
很多初学者对“前后端分离”的理解停留在“前端用 Vue,后端用 SpringBoot”,但真正面试或者自己动手做的时候,需要把请求链路讲清楚。
整条链路是这样的:
- 浏览器访问前端站点(开发环境是
http://localhost:8080,生产环境是 Nginx 托管的静态资源) - 前端 Vue Router 根据 URL 加载对应页面组件
- 页面中的 JS 通过 Axios 发起 HTTP 请求,比如
GET /api/person/list?page=1&size=10 - 请求到达后端 SpringBoot 的 Controller,经 Service 层处理业务逻辑,Mapper 层读写数据库
- 后端返回统一格式的 JSON 数据,前端拿到后渲染到页面上
关键点在于:前端和后端是两个独立应用,只通过 HTTP 接口通信。前端不直接连数据库,后端不生成 HTML 页面。这意味着前端开发可以用 mock 数据,后端开发可以用 Postman 调试接口,两边并行推进,只要接口约定一致,最后联调成本很低。
这里有一个容易踩坑的细节:因为在开发环境中,前端和后端跑在不同端口(Vue 默认 8080,SpringBoot 默认 8080 或 8081),浏览器会发起跨域请求。跨域不是后端拒绝,而是浏览器层面的同源策略拦截响应。这个问题我在第 4 节详细展开,这里先记住结论——开发环境用 Vue 的代理转发,生产环境用 Nginx 反向代理,基本能绕开 90% 的跨域困扰。
2.3 前端工程结构设计
前端沿用 Vue CLI 创建的标准工程结构,但我会根据管理系统特点做分层:
text复制src/
├── api/ // api 接口层
│ ├── login.js
│ ├── person.js
│ └── record.js
├── assets/
├── components/ // 公共组件
├── router/
│ └── index.js // 路由配置,含路由守卫
├── store/ // Vuex 状态管理
├── utils/
│ └── request.js // Axios 二次封装
└── views/ // 页面组件
├── Login.vue
├── Layout.vue
├── person/
├── record/
└── dashboard/
这个结构的好处是:api 层集中管理所有接口请求,页面里不直接出现 Axios 调用。改接口地址时只动 api 目录,后端接口变更时只排查一个文件,维护成本极低。utils/request.js 统一封装了请求拦截器(自动带 Token)、响应拦截器(统一处理错误码和 401 跳登录),这属于必做项,能避免每个页面重复写错误处理逻辑。
3. 核心功能实现与重难点解析
3.1 后端分层架构与统一响应封装
后端我采用的是经典 Controller-Service-Mapper 三层结构,同时把请求参数和返回数据用 DTO/VO 做了隔离。没有过度设计,但对这个体量的项目刚好合适。
text复制com.example.quarantine
├── controller/ // 接收请求,参数校验
├── service/ // 业务逻辑
├── mapper/ // MyBatis 数据访问接口
├── entity/ // 数据库实体类
├── dto/ // 请求参数对象
├── vo/ // 响应数据对象
├── config/ // 配置类(跨域、拦截器)
├── common/ // 统一响应、异常处理、工具类
└── QuarantineApplication.java
统一响应体是我特别建议所有信息管理系统都做的第一件事。提前定义好约定,前后端联调才能顺畅:
java复制public class Result<T> {
private Integer code; // 200成功,其他失败
private String msg; // 提示信息
private T data; // 业务数据
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>();
result.setCode(200);
result.setMsg("success");
result.setData(data);
return result;
}
public static <T> Result<T> error(String msg) {
Result<T> result = new Result<>();
result.setCode(500);
resul
