ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Spring Boot+Vue构建社区独居老人健康管理系统全攻略

Spring Boot+Vue构建社区独居老人健康管理系统全攻略

最近不少同学来找我聊课程设计和毕业设计选题,社区独居老人健康管理系统出现的频率相当高。这个题目看起来不复杂,但真要做得有亮点、能过答辩、让人愿意用,还是有不少门道的。我前后带过几轮这类项目,自己也完整搭过一版基于 Spring Boot + Vue 的方案,源码、数据库、万字文档一条龙配齐。这篇文章就把我实际做这个项目的思路、踩过的坑、核心代码怎么组织,一次性讲清楚。不管你是准备照着自己写一份,还是想搞懂这类管理系统该怎么拆解,都能直接参考。

1. 项目概述与需求拆解

1.1 系统定位与解决的核心痛点

社区独居老人健康管理系统,本质上是给社区基层工作人员和老人家属提供一个线上的健康管理工具。独居老人这个群体有一个很现实的问题:社区工作人员负责多位老人,家属又不一定能随时陪伴,老人的血压、血糖这些健康数据如果靠纸质记录或口头沟通,信息很容易断掉,异常情况也没法及时被发现。

做一个这样的系统,最核心的价值就是把“健康数据采集 -> 记录归档 -> 异常预警 -> 走访跟进”这条链路串起来。老人每天的血压、心率、用药情况,社区人员定期走访的记录,家属远程查看的健康报告,全部汇到一个平台里。谁在什么时间关注了什么数据,系统里一目了然。

这个项目的定位非常适合课程设计和毕业设计,原因很直接:业务边界清晰,角色不过度复杂,前端后端各有发挥空间,数据库设计也足够撑起一篇论文的核心章节。再加上养老和社区治理是这几年持续被关注的领域,选题本身就有现实意义,答辩时也更容易说清楚“为什么要做”。

1.2 角色划分与业务流程梳理

我在设计这个系统时,把角色定为三类,没有过度拆分。第一类是系统管理员,负责老人档案的录入、社区人员的账号管理、系统基础数据的维护。第二类是社区工作人员,也是系统日常使用频率最高的角色,负责给老人建立健康档案、录入每日监测数据、记录走访情况、处理预警信息。第三类是老人家属,通过系统查看老人的健康趋势和走访记录,接收异常提醒。

业务流程上,一条主线是“健康管理”:家属或老人在终端(通常是社区工作人员代为录入)产生健康数据,系统经过校验后写入档案表,后台根据设定的阈值判断是否存在异常,如有异常则生成预警记录,并通知到工作人员端。另一条主线是“服务跟踪”:工作人员按计划走访老人,走访后填写记录,内容包括身体状况、居住环境、心理状态等,这些记录后续可以按时间维度汇总成老人的服务档案。

把这两个流程想清楚,后面所有功能模块的划分就都顺了。很多同学一上来就写代码,表结构建得七零八落,根本原因就是没有先把角色和流程画出来。我建议你在动手前,哪怕用一张纸画一下角色和功能的关系,后面能少走很多弯路。

2. 技术选型的思路与取舍

2.1 为什么是 Spring Boot 而不是 SSM 或微服务

技术选型是这个项目里第一个要解释清楚的点。很多人可能会问,课程设计用 Spring Boot 是不是有点重?实际上恰恰相反,对这类管理系统,Spring Boot 是目前性价比最高的选择。

如果用传统的 SSM(Spring + Spring MVC + MyBatis),配置文件的繁琐程度会吃掉大量时间。XML 配置、事务管理器、扫描器全都要手动维护,对做课程设计的同学来说,这些配置工作完全没有收益。而 Spring Boot 的核心价值就是“约定优于配置”,内嵌 Tomcat,起步依赖一把梭,几分钟就能把工程跑起来。同样的功能,SSM 可能要忙活一两天搭骨架,Spring Boot 半天就能进入业务代码的编写。

那为什么不用微服务?道理更简单:这个系统的用户量级、数据规模和业务复杂度,根本到不了需要拆分服务的程度。一个单体应用就能搞定的事情,强行拆成注册中心、网关、多个服务,只会给自己挖坑。答辩时老师问一句“你拆这么细的依据是什么”,如果答不上来,反而成为扣分项。单体架构配合模块分包,就是这个规模项目最合理的答案。

2.2 前端为什么选 Vue + Element UI

前端我选了 Vue,配合 Element UI 组件库。这个组合在国内的管理系统开发中非常主流,教程多、资料全、遇到问题容易搜到答案,这点对课程设计来说特别重要。

Vue 2 和 Vue 3 的选择上,我做项目时用的是 Vue 2 + Element UI 的稳定组合。原因很简单:Element UI 对 Vue 2 的适配最完整,网上能找到的现成后台管理模板、组件示例也最多。如果你选 Vue 3,对应的是 Element Plus,虽然也成熟,但部分组件的 API 有变化,遇到问题能参考的案例相对少一些。考虑到项目周期,优先选最稳妥的方案。

前端在这里承担的事情包括:登录页、后台管理主界面、老人档案的表格展示与表单录入、健康数据的可视化图表、预警消息的提醒面板。这些用 Vue 的组件化开发来组织非常合适,一个页面拆成几个组件,互不干扰,也方便复用。

2.3 辅助工具的选型

除了主框架,几个辅助工具也值得提前定好。数据库我用 MySQL 8.0,关系型数据库对这种结构化数据的管理最合适,也方便导出和导入,答辩演示时可以直接展示数据表。

ORM 层我用的 MyBatis-Plus,理由很实际:单表的增删改查不用写 SQL,内置的 BaseMapper 直接搞定,分页插件也很方便。遇到多表关联查询,又能回到原生 SQL 灵活处理。比单纯的 MyBatis 少写大量重复代码,比 JPA 更容易掌控查询逻辑。

权限认证方面,我这一版用的是简单实用的方案:JWT 做登录令牌,配合拦截器校验请求。前端登录成功后拿到 token,存在本地存储里,每次请求在请求头带上,后端拦截器判断 token 有效性,角色权限则在后端接口上做控制。这个方案在课程设计层面足够清晰,代码量不大,又能在文档里讲出设计理由。

提示:选型这部分在文档里不要只写“我用了什么”,而是要写“为什么选它”。把每个选型的理由用一两句话说清楚,答辩时就能体现你真的思考过,而不是随便抄了一个框架。

3. 数据库设计:核心表与字段规划

3.1 实体关系梳理

数据库设计是整个项目的地基,也是我经常提醒同学重点花时间的地方。表结构建得合理,后面的代码会很顺;建得乱,写什么功能都别扭。

这个系统的核心实体有这些:老人信息、家属信息、用户账号、健康档案记录、走访记录、用药提醒记录、预警记录、系统公告。它们之间的关系大致是这样的:一个老人对应多条健康档案记录和走访记录,一个老人可以绑定多个家属,用户账号通过角色字段区分管理员、工作人员和家属。

画实体关系图的时候,建议把老人作为核心实体放中间,向外辐射健康记录、走访、用药、预警这些子实体。这个过程看起来很简单,但决定了整个系统的数据流向。我见过有同学把健康数据单独建一个库,还取名叫“监测库”,结果数据关联搞得非常痛苦,完全没有必要。

3.2 核心表设计详解

老人信息表是整个系统最重要的一张表,字段设计直接影响后续功能的实现难度。我把关键字段列一下,实际建表时可以在此基础上扩展:

字段名类型说明
idbigint主键,自增
namevarchar老人姓名
gendertinyint性别,1男2女
ageint年龄
id_cardvarchar身份证号,设唯一索引
phonevarchar老人本人电话,可能为空
addressvarchar详细住址,精确到门牌号
house_typevarchar居住类型,如独居、与配偶同住
health_statusvarchar基础健康状况描述
chronic_diseasesvarchar慢性病史,多个用逗号分隔
emergency_contactvarchar紧急联系人姓名
emergency_phonevarchar紧急联系人电话
community_idbigint所属社区,关联社区表
create_timedatetime建档时间

健康档案记录表承担数据录入的核心功能。字段不能只设一个“health_value”应付了事,那样后续做类型化统计和阈值预警都会很尴尬。我建议这样设计:

字段名类型说明
idbigint主键
elder_idbigint关联老人ID
record_typevarchar数据类型:血压、血糖、心率、体重等
record_valuevarchar数据值,如 130/85
record_unitvarchar单位,如 mmHg、mmol/L
record_datedatetime记录时间
recorder_idbigint记录人ID
remarkvarchar备注

这里的 record_type + record_value 的组合设计,是我实际项目中验证过比较顺手的方案。它避免了为每种数据类型单独建一张表的过度设计,也保留了扩展性,新增一种监测指标时,只需要在字典里加一个类型,不用改表结构。

走访记录表的关键字段包括老人ID、走访时间、走访人员、身体状况描述、居住环境评分、精神状态描述、需跟进事项、附件图片路径。预警表的字段则包括老人ID、预警类型、预警内容、严重程度、处理状态、处理人ID、处理时间。这两张表在论文里可以重点写,因为它们体现了系统在业务逻辑上的完整度。

3.3 字段约束与设计心得

设计字段时,有几点经验值得分享。第一,关联字段的类型必须一致,父子表的 id 都是 bigint,建外键索引要统一,不然联表查询的性能和正确性都会出问题。第二,时间字段建议直接用 datetime,避免使用 varchar 存时间导致的查询麻烦。第三,状态类字段用 tinyint 加注释,比如处理状态 0未处理 1已处理,而不是存中文,这样代码里判断更简洁,数据量大了以后也更省空间。

注意:我在这个项目里没有过度使用外键约束,而是靠逻辑关联加索引。原因是在删除老人档案等操作时,外键约束可能引发级联问题,调试起来很麻烦。课程设计阶段,索引加逻辑关联的组合更灵活,也不影响文档里讲清楚关系。

4. 后端核心功能的实现拆解

4.1 登录认证与角色权限

后端代码的组织,我按 controller、service、mapper、entity、common 这几个包来分。登录认证放在 common 包下做拦截器逻辑,业务代码里只需要在需要校验的接口上用注解或路径规则声明一下即可。

登录接口的设计思路是这样的:前端提交用户名和密码,后端查询用户表,用 MD5 加盐或 BCrypt 做密码比对,比对通过后生成一个 JWT token,token 里包含用户ID和角色信息,返回给前端。前端后续请求带着 token,后端拦截器先校验 token 是否有效,再从 token 里取出角色判断是否有权限访问该接口。

具体到代码,拦截器里的核心逻辑大致是这个样子:

public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 放行登录接口 if (request.getRequestURI().contains("/api/login")) { return true; } String token = request.getHeader("Authorization"); if (token != null && JwtUtil.verify(token)) { return true; } response.setStatus(401); return false; } }

写完拦截器后,不要忘记在配置类里注册,并设置放行路径。我踩过的坑就是只配置了拦截器却忘记注册静态资源路径,导致前端访问图片和静态文件全部 401,排查了半天才发现是拦截器把所有请求都拦了。

4.2 健康档案与数据录入

健康档案这块,后端主要提供三类接口:新增记录、查询某老人的记录列表、按时间段统计健康趋势。新增记录时要做基本的数据校验,比如血压值不能为空、数值范围要合理,这些校验写在 service 层而不是 controller 层,便于统一管理和复用。

录入接口的代码结构很常规,但有一个细节值得注意:record_type 参数要跟前端下拉框的字典值严格对应,否则存进去的数据查不出来。我在项目里做了一个常量类统一管理这些字典值,避免字符串写死在业务判断里。

public class RecordTypeConstant { public static final String BLOOD_PRESSURE = "blood_pressure"; public static final String BLOOD_SUGAR = "blood_sugar"; public static final String HEART_RATE = "heart_rate"; public static final String WEIGHT = "weight"; }

查询健康趋势时,我按 record_type 分组取 date 范围内的所有记录,返回给前端由 ECharts 渲染折线图。这个方案比后端正则拼接 JSON 数据更清晰,前端拿到原始数据自己做数据映射,扩展图表类型时也不用改后端接口。

4.3 用药提醒与预警机制

预警机制是这个项目体现“智能感”的地方,值得多花点心思。我的实现逻辑很简单:每次新增健康记录后,后端根据老人档案里的慢性病史和当前记录类型,查阈值配置表(比如高血压老人的血压上限),如果超出范围,自动生成一条预警记录,同时标记为未处理,社区工作人员登录后就能在预警列表里看到,处理完后更新状态和备注。

用药提醒我用的是定时任务方案。项目里加一个定时任务,每天在设定时间扫描用药提醒表,找到当天需要提醒并且还没生成提醒记录的老人,生成提醒记录写入数据库。前端首页展示最近待办的提醒事项,工作人员的界面和家属的界面分别展示各自关注的老人提醒。

定时任务这一块的代码虽然不多,但注意要处理“重复提醒”的问题。我用的方法是每次扫描时先查当天是否已有同类型提醒记录,有就跳过,加上这个判断后就不会出现重启项目导致重复提醒的尴尬情况。

4.4 统一返回体与全局异常处理

后端接口的返回格式统一是我强烈建议从一开始就做好的事情。所有接口返回格式固定为 { code, message, data },前端 Axios 拦截器统一处理,这样前端代码里不用每个请求都写一遍成功失败的判断逻辑,而且排查问题时很容易定位是接口报错还是前端处理出错。

统一返回体的代码很简单,一个泛型类加一个静态工厂方法就能搞定:

public class Result<T> { private Integer code; private String message; private T data; public static <T> Result<T> success(T data) { Result<T> result = new Result<>(); result.setCode(200); result.setMessage("success"); result.setData(data); return result; } }

全局异常处理用 @RestControllerAdvice 实现,捕获业务异常和系统异常,返回标准格式的错误信息。这样做最大的好处是,前端不会看到一堆乱七八糟的异常堆栈,用户的体验也会好很多。做这个项目时把异常处理写好,答辩时老师问“系统健壮性怎么保障”,这就是一个很实在的回答。

5. 前端页面与交互实现

5.1 工程结构与路由配置

前端工程我用了标准的 Vue CLI 创建的项目结构,src 目录下划分了 router、store、api、views、components 几个目录。路由配置里主要包含登录页、系统主页,主页下面挂载老人档案管理、健康记录、走访记录、预警中心、用药提醒、统计报表等子路由。

这里有一个实用的技巧:主页面的布局用 Element UI 的 Container 组件搭起来,左边是菜单栏,上面是顶栏,中间是内容区。路由采用嵌套路由的方式,所有功能页面挂在同一个布局下,切换页面时菜单状态和顶栏信息都能保留。

菜单项的配置要注意跟后端权限对应起来。我在菜单数据里加了角色字段,前端根据登录用户返回的角色信息,动态过滤菜单项。比如家属登录后看不到“走访记录录入”这个菜单,这种前端权限控制虽然不能替代后端权限校验,但对用户体验的提升是明显的。

5.2 核心页面实现思路

老人档案管理页面是系统的门面,使用频率最高。页面结构是左侧一个条件搜索区,中间是表格展示区,右侧是操作按钮区。搜索条件包括老人姓名、所属社区、慢病类型,表格展示老人的基本信息和操作按钮。新增和编辑用弹窗表单,表单校验用 Element UI 自带的 rules 规则实现。

健康记录页面我用了两个 tab 来组织:一个 tab 是记录录入,工作人员选择老人、选择记录类型、填写数值,提交后刷新列表;另一个 tab 是历史数据列表,支持按类型和时间范围筛选。这个设计的考虑是录入和查看是两种不同的心智模型,混在一起容易操作混乱,拆开反而更清晰。

走访记录页面则以卡片和表格结合的方式展示,卡片是最近一条走访摘要,表格是全部历史记录。点击某条记录可以查看详情,包括走访时的照片、跟进事项的完成情况。这里的图片上传我用的是组件加后端文件存储接口的方案,上传后返回文件路径,存到记录字段里。

5.3 Axios 封装与跨域处理

前端请求后端必然要面对跨域问题。开发环境下,我在 Vue 的 vue.config.js 里配置了代理,把 /api 前缀的请求转发到后端端口,这样前端请求地址和后端接口地址不同源的问题就解决了。生产环境如果前后端部署在同一台服务器,通过 Nginx 配置反向代理同样可以解决。

Axios 封装这块,我建了一个 request.js,统一设置 baseURL、超时时间、请求拦截器和响应拦截器。请求拦截器负责在每次请求时从 localStorage 取出 token,加到请求头里;响应拦截器负责统一处理返回码,code 为 200 时直接返回 data,其他情况弹出错误提示并跳转登录页。

这个封装的好处是,业务代码里的请求调用会非常干净,比如:

// src/api/health.js import request from '@/utils/request' export function addHealthRecord(data) { return request({ url: '/api/health/record', method: 'post', data }) }

业务页面里直接调用 addHealthRecord 就能完成一次带鉴权、带统一错误处理的请求,代码量大幅减少,出错的概率也会下降。

5.4 数据可视化展示

数据统计页面我用了 ECharts,柱状图展示各社区的老人分布,折线图展示某位老人的血压和血糖趋势,饼图展示走访完成率。ECharts 的引入方式很简单,按需引入对应图表类型,避免整个包全量加载导致页面首屏变慢。

图表数据从后端接口动态获取,前端在页面 mounted 生命周期里调用接口,拿到数据后通过 setOption 渲染。这里有一个体验细节:页面大小变化时图表不会自动适应,需要监听窗口 resize 事件并调用 chart.resize() 方法。加上这个处理之后,版式就不会在切换浏览器大小时变形了。

可视化这块在答辩时是加分项。老师看到图表会认为系统真的有数据支撑,不是摆了几张空表格。我在文档里也专门写了一小节,说明每个图表的业务意义,对应到系统里就是“直观展示老人健康变化趋势,帮助工作人员快速识别异常”。

6. 从零到一:完整的实操落地流程

6.1 环境准备与数据库初始化

环境准备这一步要提前确认三样东西:JDK 版本、Maven 版本、MySQL 版本。我建议 JDK 用 1.8,Maven 用 3.6 以上,MySQL 用 5.7 或 8.0。版本之间如果差的太多,容易出现莫名的兼容性问题,比如 JDK 11 配合某些旧版 Lombok 会报错,这个坑我帮同学排查过好几次。

数据库初始化不需要手动一条条建表。我在项目里提供了一个 init.sql,包含全部建表语句和测试数据。执行方式有两种:一种在 Navicat 里直接运行 SQL 脚本,另一种在 MySQL 命令行用 source 导入。测试数据非常重要,没有数据的话系统页面全是空的,既不利于联调测试,答辩演示时也没有内容可展示。

导入数据库后,记得修改后端配置文件的数据库连接信息。还有一个容易忽略的地方:MySQL 8.0 的驱动类名和 5.7 不同,8.0 用的是 com.mysql.cj.jdbc.Driver,时区参数也要加上 serverTimezone=Asia/Shanghai,否则时间字段会出现偏差。

6.2 后端骨架搭建与代码生成

后端工程我用 Spring Initializr 生成基础结构,引入 web、mybatis-plus、mysql、validation 等依赖。生成之后先把配置文件里数据源、MyBatis-Plus 的日志打印、驼峰映射等参数配好,然后启动一次,确认工程能正常跑起来再开始写业务代码。

业务代码我建议从简单模块入手,比如先写老人信息的增删改查。先定义一个实体类,对应数据库表;再写一个 Mapper 接口继承 BaseMapper;然后再写 Service 和 Controller。MyBatis-Plus 在 common 包里配置好分页插件后,新模块的分页查询直接继承一个 BaseService 就能复用,不需要每个模块都从零写一遍。

这里的代码结构我特意保持了简洁,Service 层不搞过度封装,Controller 只做参数接收和调用 Service,事务注解加在 Service 实现类上。课程设计阶段没必要引入 DTO/VO 那一整套分层,把核心逻辑写清楚才是关键。但包名和类名要规范,一个类一个职责,这样文档里画类图时也好看。

6.3 前后端联调与测试

联调阶段最容易出的问题集中在参数传递上。前端提交 JSON 对象,后端用 @RequestBody 接收,两边的字段名必须对得上。我在项目里跟后端同学配合时,约定好字段一律用小驼峰命名,两个端都遵守这个约定,联调时基本不会因为字段名不一致浪费时间。

功能测试可以从主流程开始:先测试登录,验证不同角色能否登录成功;再测试老人档案的增删改查;接着测试健康记录的录入和列表查询;最后测试预警生成和走访记录关联。按这个顺序跑通后,系统的核心链路就没有大问题了。

测试过程中记得多造一些边界数据,比如血压值填成 9999,年龄填成负数,看看系统有没有校验。垃圾分类不在于校验多么严格,而是有校验这块内容后,文档里可以写“系统实现了数据完整性校验”,这也是一项可展示的成果。

6.4 部署上线的选择

课程设计和毕业设计一般不需要真的买服务器部署,但至少要知道怎么打包部署。后端的打包在 Maven 里执行 package 命令,生成 jar 包,然后用 java -jar 启动。前端先执行 npm run build 生成 dist 目录,这是一个纯静态文件目录,可以放到任何静态服务器上或集成到后端静态资源目录里。

如果答辩要现场演示,我建议在本地把前后端都跑起来,准备一份测试账号给评委看。不建议演示时现场改代码或现配环境,提前把环境固定好,演示过程只做操作交互,不出意外才是最重要的。

7. 踩坑实录与常见问题排查

7.1 时间格式与 JSON 序列化问题

前端拿到后端返回的时间字段经常出现格式问题,比如显示成 2024-05-01T10:30:00 而不是 2024-05-01 10:30:00。这是因为后端默认的 JSON 序列化规则没有配置时间格式。解决方式是在配置文件里定制 Jackson 的格式,或者在实体类的日期字段上加 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 注解。

这个坑虽然小,但几乎每个人都会遇到。我的建议是不要在多个实体类上来回加注解,而是统一在配置类里配置全局时间格式,一次搞定,后面所有接口都受益。

7.2 分页查询失效的典型原因

分页查询是管理系统最常用的功能,但 MyBatis-Plus 分页插件没有正确配置时,查询结果会把全部数据返回,前端表格显示所有记录,分页器不工作。这个问题的根源通常是忘了配置分页插件。在 MyBatis-Plus 新版中,分页插件需要显式注册为 Bean,并指定数据库类型。

@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }

还有一个相关小坑:分页查询时如果联表查询字段在两个表里有同名字段,比如都叫 id,返回的结果里 id 字段容易覆盖,导致前端拿到错误的记录 ID。解决方式是在后端 SQL 里给字段加别名,联表查询时尽量把别名字段显示列出来。

7.3 跨域配置不生效

开发环境下配置了 Vue 代理,后端也没有显示跨域问题,但放到生产预览环境后,接口请求还是报跨域错误。原因往往是后端没有配置跨域过滤器,而开发环境只是靠代理绕过了跨域限制。

稳妥的做法是后端同时配置一个 CorsFilter 允许跨域请求,这样无论前端是走代理还是直接请求接口,后端都能正确处理跨域头。需要注意,配置了拦截器之后,CorsFilter 的优先级要在拦截器之前,否则预检请求会被拦截器拦下来,前端还是会报 401。

7.4 前端表格渲染慢的问题

数据量增长到几千条后,表格渲染会有明显卡顿。优化方案有三个:后端接口做分页,前端表格用分页展示,每次只加载一页数据;去掉不必要的图片预览;表格列的宽度适当地固定,避免浏览器频繁计算布局。最核心的还是分页,只要分页逻辑正确,几千条数据完全没有性能压力。

另外提醒一点,表格里不要放太多操作列和详情按钮,按钮过多会让视觉上非常拥挤。通常的做法是:具体操作可以放进一个“更多”下拉菜单里,详情通过点击某行弹出抽屉或弹窗。这些细节在答辩展示时会直接影响评委的第一印象。

8. 文档撰写与答辩准备

8.1 课程设计文档的骨架怎么搭

配套的万字文档是这个项目里很重要的一部分,很多学校对课程设计和毕业设计的文档都有字数要求,这不只是凑字数,而是要把做项目的思考过程完整呈现出来。

我的文档结构一般是这样的:第一章绪论写研究背景、国内外现状、研究意义;第二章需求分析写系统目标、功能需求、非功能需求、用例图;第三章系统设计写架构设计、功能模块设计、数据库设计,数据库部分附上关键字段说明和 E-R 图;第四章系统实现按模块贴核心代码并解释实现逻辑;第五章系统测试写测试用例、测试步骤、测试结果;最后写总结与展望。

数据库设计这一章是最容易出彩也最容易被提问的章节。我在文档里画了 E-R 图,把每个表的字段都列出来,并写了字段设计说明,例如为什么这个字段要设置唯一索引。答辩老师经常盯着数据库设计问问题,把这块写透,等于提前预判了考题。

8.2 答辩演示要提前演练的关键场景

答辩时演示环节通常要控制在一个较短的时间内,多出来的时间是留给老师提问的。所以演示要选最有代表性的功能,不要从头到尾把每个页面点一遍,那样既占用时间,又显得你没有重点。

我建议按这样的顺序演示:登录并说明角色权限;打开老人档案列表,用搜索功能快速定位一位老人;点击查看老人的健康记录页,展示最近几条记录的录入和趋势图表;切换到一个有预警数据的页面,展示预警列表并处理一条预警;最后打开统计报表页说明数据可视化的业务价值。整个过程控制在几分钟内,把系统最核心的能力都覆盖到。

随源码附带的数据库文件里放了一些演示数据,答辩前一定把数据跑起来检查一遍,特别是图表数据,如果没有数据统计页就会空白,演示效果大打折扣。

从我个人的体会来说,做这类系统项目,真正花时间的不是编码本身,而是前面需求分析和数据库设计阶段的思考。把这两块做扎实,后面的代码完全是顺着思路自然写出来的。社区独居老人健康管理系统虽然不算什么高精尖项目,但它的业务链条完整、使用场景清晰、技术上又踩中了 Spring Boot 和 Vue 的主流组合,做成一个拿得出手的课程设计绰绰有余。最后再分享一个小经验:项目里预留一点可扩展的余地,比如记录类型做成字典可配置、预警阈值支持调整,答辩时就能说“考虑到后续接入更多健康监测设备,系统在数据结构上做了预留”,这句话往往比介绍一堆功能效果更好。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进