1. 这个项目到底解决什么问题
先聊点实际的。做过高校信息化项目的人应该都有同感:师生健康数据往往是"最需要管、又最没人愿意好好管"的一块。以前很多学校都靠Excel表格加微信接龙来收集信息,导员汇总晨检数据,校医室再人工录入系统,一趟流程走下来,数据滞后不说,还经常对不上。生病的同学有没有按时复查、某个班级的出勤异常有没有触发关注,全靠个人记忆。
这套基于SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0的师生健康信息管理系统,本质上就是把这个线下流程搬到线上。管理员统管基础数据,辅导员或班主任维护所带班级的学生健康台账,校医室负责异常记录与处置跟踪,学生端填报基本信息、查看个人健康档案,各角色各司其职。整个系统围绕"一人一档、实时可查、异常可追踪"来设计,核心价值是让健康数据从零散表格变成可检索、可统计、可持续更新的结构化资产。
这套项目特别适合几类人参考:一是计算机相关专业的同学做毕业设计或课程综合实践,前后端分离、权限管理、报表统计这些点都非常适合拿来当论文切入点;二是想快速搭建一套内部管理系统的开发人员,技术栈很通用,改改业务就能复用到别的管理场景;三是高校信息中心、后勤或校医室的技术支持人员,可以用它作为需求蓝本,梳理清楚健康管理到底需要哪些角色、哪些表、哪些状态流转。
我拿到这个标题的时候,第一反应是"这不就是一个标准的管理系统吗?"但细看技术栈组合,其实它比那种纯增删改查的Demo要成熟不少。SpringBoot2负责后端接口与安全控制,Vue3负责前端交互,MyBatis-Plus把单表操作简化到极致,MySQL8.0负责数据持久化。整条链路上没有冷门框架,配上文档,既适合教学展示,也具备直接改造成生产项目的底子。下面我按实际开发者的视角,把这套系统的设计思路、核心模块、启动方式、问题排查和扩展方向完整拆一遍。
2. 技术栈选型为什么是这套组合
很多初学者拿到项目源码第一件事就是急着跑起来,但我建议先想明白一个问题:为什么作者偏偏选了这套技术组合,而不是SpringCloud、不是SSM、也不是前后端不分离的Thymeleaf?把这个问题想通了,后续改代码、写论文、做答辩都会顺畅很多。
2.1 SpringBoot2后端为什么仍然能打
虽然SpringBoot3已经发布不短时间了,但SpringBoot2.x在企业级和教学项目中的存量依然非常大。原因很简单:稳定。2.7.x版本的生态非常成熟,网上能搜到的资料、第三方starter、问题解决方案覆盖面都极广。对于这个项目来说,SpringBoot2带来的核心价值有三块。
第一是自动配置。以前SSM时代写一个接口要配数据源、配事务管理器、配Mapper扫描,一长串XML看得人头疼。SpringBoot2通过starter机制把这些配置收敛了,比如引入spring-boot-starter-web之后,内嵌Tomcat、JSON序列化、静态资源映射全部就绪,开发人员只需要关注Controller里的业务逻辑。
第二是统一的生命周期管理。健康信息管理系统里有大量定时任务场景,比如每天早上自动生成各班晨检汇总、定时清理过期token、夜间备份数据等。SpringBoot2的@Scheduled加上@EnableScheduling就能轻松搞定,不需要额外引入Quartz。这种轻量级方案在中小型系统里完全够用。
第三是监控与扩展能力。spring-boot-starter-actuator可以提供健康检查端点,部署到服务器后,运维人员只需请求/actuator/health就能知道应用是否存活。再配合SpringBootAdmin之类的组件,还能看到内存、线程、请求量等指标。对于要写进文档的"系统可靠性设计"章节,这些都是实打实的加分项。
2.2 Vue3+Element Plus前端组合的取舍
前端选Vue3而不是Vue2,不是因为Vue2不好,而是Vue3的组合式API确实更适合中后台项目的组织方式。健康管理系统虽然业务不算特别复杂,但角色多、页面多,每个页面都有表格、表单、弹窗、校验。用Options API写页面一多就会出现"一个组件几百行代码"的情况,而Composition API把同一逻辑的变量和方法聚在一起,比如用户管理页里的查询条件、分页参数、加载状态、提交方法都能放在同一个setup逻辑块里,维护起来清晰很多。
搭配的Element Plus是Vue3生态里最成熟的中后台UI组件库。表格的el-table、表单的el-form、弹窗的el-dialog、消息提示的ElMessage,基本都是开箱即用。这套系统在界面上通常长这样:左侧是菜单树,顶部是用户信息和退出按钮,中间内容区根据不同角色渲染不同页面。学生端和教师端可能有不同的首页卡片,管理端则有数据看板和各类管理入口。
还要注意一个容易忽略的点:Vue3项目里路由守卫是前端权限控制的第一道关卡。系统通常会定义permission.js这样的文件,在每次路由跳转前检查本地是否存有token,没有token就重定向到登录页;有token但当前用户没有对应角色权限,就拦截并提示无权限。这套逻辑写好后,菜单是根据用户角色动态生成的,而不是写死在路由表里,这样后端接口就算被人猜到,也会被后端的权限校验挡回去。
2.3 MyBatis-Plus对增删改查的效率提升
MyBatis-Plus在中小型管理系统里的地位,基本相当于"物理外挂"。它不是一个新框架,而是MyBatis的增强工具,核心思想是"只做增强不做改变"。引入后,普通的单表CRUD根本不用写SQL,继承BaseMapper<T>接口就能直接调用selectById、selectList、insert、updateById、deleteById这些方法。比如用户管理里最常见的分页查询,代码可以写成这样:
Page<User> page = new Page<>(current, size); LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.like(StringUtils.hasText(keyword), User::getRealName, keyword) .eq(Objects.nonNull(status), User::getStatus, status) .orderByDesc(User::getCreateTime); userMapper.selectPage(page, wrapper);这段代码的核心价值在于LambdaQueryWrapper。它用lambda表达式代替字符串字段名,编译期就能发现字段名拼写错误,同时还能看到IDE自动补全。条件里的StringUtils.hasText(keyword)写法非常常用:当keyword为空时,这个条件自动失效,SQL里不会带WHERE部分;当keyword有值时,才追加模糊查询。这样就不用自己拼SQL、自己判断条件是否为空了。
更贴心的是MyBatis-Plus的自动填充功能。创建时间、更新时间、逻辑删除标记这些字段,几乎每张表都有。在实体类字段上标上@TableField(fill = FieldFill.INSERT),然后写一个MetaObjectHandler实现类,insert的时候就会自动填入当前时间,不再需要业务代码里手动set。逻辑删除也是,表里加一个deleted字段,实体上标@TableLogic,所有deleteById操作就会自动变成update ... set deleted = 1,数据不物理删除,后续还能追溯历史记录。这个设计在健康档案场景里尤其重要——误删一条健康记录可能引发麻烦,逻辑删除保留了恢复的可能。
2.4 MySQL8.0需要注意的细节
MySQL8.0相比5.7,默认字符集变成了utf8mb4,对emoji和生僻字的支持更好。但正因为这个变化,配置数据库连接时有一些细节要处理。驱动要换成com.mysql.cj.jdbc.Driver,URL里建议显式加上useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false。特别是serverTimezone,不指定的话会报时区错误,因为MySQL驱动默认取的是UTC时间,而系统部署在国内服务器上,数据库时间会差8小时。
连接池方面,SpringBoot2默认使用HikariCP,性能非常好,基本不需要额外调优。如果后面并发量大了,可以把maximum-pool-size从默认的10调到20或者30。要注意的是,当数据库连接断开时,HikariCP需要一段时间来剔除失效连接,所以每次服务器重启后,第一次请求偶尔会报错说连接不可用。解决办法是在JDBC URL里加autoReconnect=true,同时把connection-test-query设为SELECT 1,让连接池每隔一段时间主动探测连接有效性。
还有一个许多人忽略的性能问题:MySQL8.0默认的caching_sha2_password认证插件。老一点的数据库工具或驱动版本可能不认这个插件,如果连接时报"Public Key Retrieval is not allowed",在URL后面加allowPublicKeyRetrieval=true即可。另外,生产环境建议单独创建专用账号,只给业务库授权,不要用root操作,这样既安全又方便后续追责。
3. 核心模块设计与数据库拆解
这个系统的业务核心可以拆成四块:用户与权限、健康档案、日常上报与异常追踪、统计看板。每一块对应若干张数据库表,我挑几个最重要的展开说,因为文档里通常有表结构定义,但很少有人讲清楚为什么这样设计。
3.1 角色权限模型的落地方式
师生健康管理系统里至少有三种角色:管理员、教师(辅导员/班主任)、学生。有的版本还会拆出校医角色。权限模型一般用RBAC(基于角色的访问控制),核心是"用户-角色-权限"三层关系。
传统做法建五张表:用户表、角色表、权限表、用户角色关联表、角色权限关联表。但对于这类管理系统,权限可以不用细到按钮级,做到"角色-菜单"级别就够了。也就是说,用户登录后返回的不是权限编码数组,而是菜单树。前端根据菜单树渲染左侧导航,后端根据角色判断接口是否允许访问。
如果项目规模不大,还有一种简化方案:用户表直接加一个role字段,比如0代表管理员、1代表教师、2代表学生。用户登录后根据角色动态生成菜单。这种方案看起来有点low,但代码量和表数量都少了一半,适合毕设和课程设计。文档里如果能说明白"为什么选择RBAC或角色字段方案",会让评审觉得你对权限设计有思考。
3.2 健康台账、晨检记录与异常预警表设计
健康台账是整个系统的核心。学生每次体检、接种、就诊、请病假恢复的记录,都应该归档到个人健康档案里。对应的表至少要有这些字段:主键id、学生id、记录类型(体检/就诊/请假/晨检)、具体内容、体温、诊断结果、处理意见、记录人id、记录时间。这类表的数据量增长很快,建议从一开始就加上create_time索引和student_id索引,查一个学生的历史记录时避免全表扫描。
晨检记录表是另一张重要表。每天每个班级每个学生一条记录,字段包括学生id、班级id、日期、体温、症状描述、状态(正常/异常/请假/已隔离)、填报人id。这里有个典型的查询模式:查某一天全年级异常情况,或者查某个学生最近30天的体温趋势。这个场景的SQL条件比较固定,可以在(class_id, record_date)上建联合索引。如果整个学校有几千个班,每天产生的晨检记录可能上万条,联合索引在统计查询时能省下大量时间。
异常预警模块则是把"被动记录"变成"主动干预"的关键。实现方式不复杂:定时任务或写入时触发检查,如果检测到体温大于37.3摄氏度、症状描述里包含"发热""咳嗽"等关键词,或者同一班级当天异常人数超过阈值,就自动生成一条预警记录,推送给对应辅导员和校医。预警表建议设计成:id、学生id、类型、级别、内容、状态(待处理/已处理/已关闭)、处理人id、处理时间。这样校医登录后第一眼能看到还有几条待处理预警,处理完留痕,后续还能统计分析哪一栋宿舍楼、哪个年级的异常上报最多,为后勤消毒和物资调配提供参考。
3.3 文档里最容易忽略的内容
这个项目标题里特别写了"含文档",但很多同学拿到文档后只翻README,这很亏。真正有参考价值的是三块:数据库设计说明、接口文档、部署说明。
数据库设计说明一般会包含ER图和字段注释。看的时候不要只看建表语句,要重点看每张表的外键关系和状态字段取值。比如用户表的status字段是1正常还是0停用,健康记录表的record_type都定义了多少种取值,这些枚举值不统一的话,后期联调接口时会发现返回的数据和自己预期完全对不上。
接口文档是前后端协作的桥梁。如果文档里有每个接口的请求方式、路径、请求参数、返回结构,那么你完全可以把前端跑起来之后,用浏览器开发者工具或者Postman逐个验证。这种"对照文档测接口"的过程比直接看代码更高效,能快速理解整个系统的数据流向。有些项目的返回结构很统一,比如{code: 0, message: "success", data: {...}},这种封装好的统一响应体在改造时非常省事。
部署说明解决的是"跑不起来"的最后一公里问题。文档里通常会有JDK版本要求、Maven配置、Node版本、npm源设置、MySQL初始化脚本位置。这里我强烈建议:拿到项目的第一个小时,先按部署文档把环境和依赖搞定,别上来就埋头读代码。环境通了之后,代码里不懂的地方随时可以打断点调试,学习效率会翻倍。
4. 从零跑通项目的实操步骤
不管你是拿来学习还是做二次开发,先让项目在本地跑起来是第一步。下面的步骤基于最常见的开发环境:Windows或macOS,IDEA,Navicat或命令行MySQL客户端。我按照"先环境、后数据、再后端、最后前端"的顺序讲,这套顺序能避开大部分启动坑。
4.1 环境与版本准备清单
建议装以下版本,别贪新:
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| JDK | 1.8或11 | SpringBoot2.7.x在JDK8上运行最稳 |
| MySQL | 8.0.x | 项目用到了MySQL8特性 |
| Maven | 3.6及以上 | 配置阿里云镜像更利于依赖下载 |
| Node.js | 16或18 LTS | Vue3+Vite对Node版本有要求 |
| IDEA | 2021.x及以上 | 社区版也可以跑前后端 |
这里需要特别提醒的是Node版本。Vite项目在Node 16以下经常报"digital envelope routines::unsupported"之类的OpenSSL错误,这是Node版本过旧导致的。而Node 20以上又可能和某些老版本依赖不兼容。如果使用Vite 4或Vite 5,Node 16.18以上或18.12以上是稳妥区间。
4.2 后端启动步骤
第一步,用IDEA打开后端目录,等待Maven自动导入依赖。如果导入特别慢,检查一下Maven的settings.xml里是否配置了阿里云镜像。没有配置的话,在<mirrors>节点加入:
<mirror> <id>aliyunmaven</id> <name>Aliyun Maven Mirror</name> <url>https://maven.aliyun.com/repository/public</url> <mirrorOf>central</mirrorOf> </mirror>第二步,修改application.yml里的数据库连接配置。重点改三个值:url里的数据库名、username、password。如果你是第一次用MySQL,大概率会遇到"Access denied for user"这类错误,排查顺序是:确认密码是否正确、确认账号是否有权限、确认MySQL服务是否启动。
第三步,在本地MySQL里创建数据库并导入初始化SQL。通常项目里有个sql目录,里面放着init.sql或school_health.sql。在Navicat里新建数据库,字符集选utf8mb4,排序规则选utf8mb4_general_ci,然后运行SQL脚本。脚本执行成功后,打开sys_user表,看看里面有没有初始账号,比如admin / 123456这类,后面登录要用。
第四步,启动后端主类。主类一般叫Application或SystemApplication,上面标着@SpringBootApplication。启动后观察控制台日志。看到类似Tomcat started on port(s): 8080就说明后端成功。如果端口被占,在配置里改server.port,比如改成8081,同时记得前端的代理配置也要对应改。
4.3 前端启动步骤
前端目录一般是vue3-frontend或web。打开终端,执行:
npm install这一步时间取决于网络和依赖数量。如果卡住不动,大概率是镜像问题,可以执行:
npm config set registry https://registry.npmmirror.com然后删除node_modules重新install。装完依赖后,关键一步是确认前端代理配置。Vite项目的代理在vite.config.js里:
server: { port: 3000, proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } } }意思是前端所有以/api开头的请求都会转发到后端的8080端口。很多同学前后端各自启动成功后页面登录报错,十有八九是后端端口和这里target端口不一致。
一切正常后执行:
npm run dev看到Local: http://localhost:3000后,浏览器打开这个地址。如果后端需要从8080启动,而前端是3000,跨域问题由Vite代理解决,浏览器里不会出现跨域报错,因为请求是同源的。
4.4 初始化数据与登录账号说明
登录是理解整个系统角色划分最好的入口。一般初始数据里有三个账号,分别对应三种角色。我用它来演示数据权限的设计思路:
| 账号 | 密码 | 角色 | 登录后可见内容 |
|---|---|---|---|
| admin | 123456 | 管理员 | 全部菜单:用户管理、班级管理、健康台账、统计报表 |
| teacher | 123456 | 教师 | 本班学生列表、晨检填报、异常记录处理 |
| student | 123456 | 学生 | 个人档案、体检记录、请假申请、健康填报 |
用学生账号登录后,你会发现接口返回的数据都自动过滤成当前用户自己的记录;用教师账号登录,只能看到本班学生。这个过滤逻辑藏在前端路由守卫和后端用户上下文里。后端每个接口通过TokenUtil.getCurrentUser()之类的方法拿当前登录用户,再根据其角色和关联班级拼SQL条件。理解这层机制后,你就掌握了整个系统的权限核心。
5. 部署与常见问题排查实录
跑通本地之后,很多同学会尝试把系统部署到服务器上。这个阶段踩坑最多。我把自己测试时遇到过的问题和排查思路整理成速查表,每个问题后面给两种解决路径,帮助你在不同场景下手忙脚乱时快速定位。
5.1 启动类报错与数据库连接失败
后端启动直接报红,最常见的错误长这样:
Cannot create PoolableConnectionException原因几乎必然是数据库连接对不上。排查步骤固定:先看一眼MySQL服务有没有起来,在命令行执行mysql -u root -p,能进去说明服务正常;再核对配置里的用户名密码和实际账号是否一致;再确认数据库名存在且表已导入。最后看URL里有没有写错端口,MySQL默认是3306,如果本地装的是MariaDB或者改了端口,这里也要跟着改。
如果报的是时区错误:
The server time zone value '�й���ʱ��' is unrecognized这个中文乱码其实是CST时区不被识别,解决方式就是在URL末尾加上serverTimezone=Asia/Shanghai。所有数据库连接问题里,时区至少占三成,记牢这个参数。
5.2 前端登录后接口返回404或跨域报错
前端能打开登录页,但点登录后控制台报404,这个场景太常见了。先说跨域和404的区别:浏览器控制台如果出现CORS policy字样,那是跨域问题;如果只有404,那基本是前端请求路径和后端接口路径对不上。
跨域问题的根源是前后端域名或端口不一致。如果你的代码里没有配置Vite代理,而是直接用axios请求http://localhost:8080,那么浏览器会因为"不同源"而拦截响应。解决办法有二:一是后端加一个全局CORS配置类,允许指定域名跨域;二是前端在vite.config.js里配代理。在我实际测试中,配代理更优雅,因为生产环境只需要改代理目标,不需要动后端代码。
还有一种特殊情况:后端接口路径带/api前缀,前端请求也带/api,但代理配置把/api剥掉了,结果后端404。排查时可以打开浏览器开发者工具的Network面板,看请求URL和后端Controller的@RequestMapping值是否一致,这个方法比猜效率高得多。
5.3 接口调用成功但数据不显示或显示空白
后端接口通了,但页面表格是空的,或者提示Cannot read properties of undefined。这类问题分为两种。
第一种是字段名对不上。后端返回的JSON字段叫createTime,前端却在读create_time,结果永远是undefined。SpringBoot默认开启驼峰映射,Java实体里的createTime字段对应数据库里的create_time,JSON序列化后是createTime。如果前端拿到了createTime却没有渲染,就要看前端表格的prop是否保持一致。这种不一致在联调时非常磨人,建议用Postman先看后端真实返回,再比对前端数据绑定字段。
第二种是返回数据结构嵌套层级对不上。比如统一返回体是{code, message, data},如果后端把列表放在data.list里,前端却试图直接拿data当数组遍历,那必然是空或报错。拿到项目后先看一下通用的Result类怎么写的,再打开一个页面对照,就能避免这个坑。
5.4 Linux服务器部署的注意点
把前后端部署到云服务器时,至少有两种方案。方案一是前后端分开部署:后端打成Jar包,用nohup java -jar xxx.jar > log.log 2>&1 &启动;前端构建成静态文件,交给Nginx托管。方案二是前后端打包到一起:前端npm run build后把dist目录里的静态资源复制进后端src/main/resources/static,后端直接一并提供静态资源。方案二简单些,适合并发量不高的内部系统。
如果选方案一,Nginx配置里必须设置API反向代理。比如前端build后放在/usr/share/nginx/html,Nginx配置:
server { listen 80; server_name your_domain; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }这里坑点有两个:一是try_files那句不能少,Vue是单页应用,路由刷新时如果Nginx找不到对应路径就会404,这一行的作用是让所有路径都回退到index.html;二是proxy_pass末尾的斜杠问题,proxy_pass http://127.0.0.1:8080/表示把/api/xxx转发为/xxx,如果后端接口本身就没有/api前缀,这个斜杠正好去掉前缀,相当于前端所有请求都走/api,后端实际接口不带/api,完美匹配。
MySQL Server也别忘了放开端口和账号权限。云服务器安全组里3306端口默认是不对外开放的,本地连接服务器数据库时会超时。如果只是后端Tomcat在服务器本机连数据库,其实不需要对外开放3306,用localhost连接更安全。让后端坚持用jdbc:mysql://localhost:3306/xxx而不是云主机公网IP:3306,能少暴露一个攻击面。
6. 定制化扩展方向:这套骨架还能怎么改
系统跑通之后,很多人的下一步是"我要加功能"。这时候怎么改代码而不把系统改崩,比学会启动更重要。我根据自己的经验,讲几个低成本高价值的扩展点。
6.1 从管理端到预约与问卷模块
现有系统大多只有信息的录入与查看,交互链路相对单一。比较实用的扩展是加"预约"功能,比如校医室预约、心理咨询预约。实现思路完全可以复用现有代码结构:新增appointment表,字段包括预约人id、被预约人id(医生或咨询师)、时间段、状态(待确认/已确认/已完成/已取消)、备注。后端写一套标准CRUD加状态流转接口,前端新增三个页面——学生端发起预约、管理端配置排班、医生端处理预约。这个功能改动不大,但业务完整性会明显提升。
问卷模块同理。疫情之后健康问卷是刚需——每日健康打卡、返校申报、疫苗接种统计都可以抽象成"问卷模板 + 问卷提交记录"两张表。模板表存问题内容,提交表存用户答案,统计时用条件聚合就能生成数字报表。加这个模块的核心价值是让系统从"管理台账"变成"数据采集平台"。
6.2 消息通知与统计图表
健康管理系统的灵魂是"异常要有人看得见"。目前大多数项目的通知都是站内信,比如在页面右上角有个铃铛图标,点开是通知列表。实现方式也很简单:新增notification表,字段是接收人id、标题、内容、是否已读、创建时间。后端在生成异常预警时同时写入通知记录,前端轮询或使用WebSocket实时拉取。WebSocket用Spring的STOMP + SockJS就能集成,Vue3里用sockjs-client + stompjs两个库对接,网上例子多,注意版本兼容就行。
统计图表是另一个亮点。健康数据可视化能直观反映全校状况:以班级为单位展示体温异常趋势、按性别和年级统计体检指标分布、用饼图展示疾病类型占比。图表组件首推ECharts,Vue3下用echarts的封装库即可。后端提供聚合接口返回统计结果,前端渲染折线图、柱状图、饼图。这段代码很好写,但效果在演示和答辩时非常加分。
6.3 代码分层如何组织避免混乱
项目二次开发最怕的就是"往Controller里堆业务逻辑"。刚开始加几个功能觉得方便,后面改一个需求时牵一发动全身。我的习惯是严格分层:Controller只负责接收参数和返回结果;Service层写业务逻辑;Mapper层只做数据库交互;DTO/Entity专门承载数据。如果要用MyBatis-Plus,建议实体类和数据库一一对应,但接口入参出参用VO或DTO,避免把数据库字段直接暴露给前端。
拿"新增一条晨检记录"这个场景举例,标准流程是Controller接收前端传来的MorningCheckDTO,先做参数校验(体温范围、日期格式),再交给Service;Service里根据当前登录角色判断是否有权限填报该班级,查到学生信息做关联,写入主表后如果体温异常再去调预警Service。Controller只有三五行,业务逻辑全在Service里。这样做的好处是单元测试好写,将来把单机服务改造成微服务时,业务逻辑可以直接搬运。
6.4 数据备份与日志规范
运维层面最容易翻车的是数据备份。健康数据属于敏感数据,丢了就是事故。我建议至少配一个每天凌晨的MySQL定时备份任务,最简单的写法是用crontab:
0 2 * * * mysqldump -u root -p密码 health_db > /backup/health_$(date +\%Y\%m\%d).sql如果服务器空间有限,备份脚本里再加一个保留7天备份的清理命令。这个没人写进文档,但实际部署时必须考虑。
日志规范同样重要。SpringBoot默认日志到控制台,服务器上重启后之前的日志就没了。在application.yml里配置logging.file.name指向固定路径,或者引入logback-spring.xml按天滚动,这样排查问题时才有据可查。日志级别在调试阶段用debug,正式环境切回info,否则日志文件增长极快,会把磁盘塞满。
7. 个人实操体会与收尾建议
折腾这套系统下来,我最大的体会是:技术与业务是两件事,但缺一不可。SpringBoot2、Vue3、MySQL8.0这些技术再怎么熟练,如果不懂师生健康管理的场景,做出来的东西也只是一个空壳。反过来,如果只看业务不做工程化设计,系统活不过一个学期。
几个印象深刻的点顺手分享一下。第一,数据库设计是整个项目的地基,能多考虑半年后的查询需求就多考虑一点,比如给高频查询字段提前建索引,避免数据量大了之后夜长梦多。第二,权限模型的边界一定要舍得花时间设计,学生、教师、管理员、校医的角色差异如果不从token校验和SQL过滤双层控制,早晚会出现越权访问。第三,文档不光是给别人看的,更是给自己未来三个月后的自己看的——写清楚每个接口的入参出参、每个枚举值的含义,等于给未来的改造铺好了路。
如果你打算拿这个项目做二次开发,我建议按这个顺序来:先完整跑通并对着文档理解权限逻辑,然后加一个最简单的预约模块,再尝试加一个图表看板,每一步都保持代码可运行。这样积累的信心和代码经验,比直接复制一个新项目要扎实得多。这个系统看着普通,但它覆盖的技术链路非常完整,值得花一个周末把它吃透。
最后再分享一个小技巧:拿到项目先把application.yml、vite.config.js、pom.xml这三个文件完整读一遍。这三个文件基本定义了整个项目的运行环境和依赖边界。读懂它们,再复杂的系统都能顺着线索摸进门。