尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于Spring Boot的社区老年康养管理系统:个性化提醒设计全攻略

基于Spring Boot的社区老年康养管理系统:个性化提醒设计全攻略 每年到这个时间点总有一批大三、大四的学生私信我问同一个问题老师毕设到底选什么题目好尤其是Java方向的十个里有八个想做后台管理系统然后做出来的东西你一看——就是一个增删改查换个表名换个字段连前端样式都懒得调。说实话这种项目应付答辩可以但想拿高分、想自己真正学到东西很难。我今年带的一个项目叫基于Spring Boot的社区老年康养管理系统光听名字好像也没什么但它有一个很多人会忽略的亮点——个性化智能提醒。这五个字把系统从信息登记表提升到了有业务逻辑、有算法触发点、有实际应用价值的高度。这篇文章我不谈虚的直接把这个项目从选题、架构、核心代码到调试部署、论文写作、答辩准备的完整链路拆给你们。源码、文档、讲解、调试运行、定制这些环节我后面都会说到尤其是个性化提醒模块我会把触发逻辑、数据模型、定时任务这些关键代码都贴出来讲明白。不管你是准备拿这个题目做毕设还是想了解Spring Boot项目到底怎么落地这篇都值得你读完。1. 为什么这个题目比普通管理系统更适合做毕设先说说选题这件事。很多学生选题目的时候第一反应是老年健康管理系统社区养老管理系统结果查来查去发现网上全是类似的代码抄来抄去答辩老师一眼就能看出来。但如果你在康养管理前面加上个性化智能提醒这就不是单纯的信息管理了而是涉及到了健康数据采集、规则判断、消息推送这一整条链路。1.1 从社区实际需求出发业务场景站得住脚社区老年康养本质上讲的是这么一件事社区里住着一批老年人他们有的人有慢性病需要定期复查有的人每天要吃降压药、降糖药有的人报了社区的合唱团、太极班。以前靠社区工作人员用Excel表格手工登记人去提醒效率低还容易漏。这个系统要解决的就是把老人档案、健康数据、活动安排、用药计划全部数字化然后通过系统自动算出谁该量血压了谁该去领药了谁今天有体检项目提前推送提醒给老人本人或者家属、护工。这个场景不是凭空捏造的它真实存在于每一个城市社区。你去做需求分析的时候能明确说出用户的痛点能画出业务流程图能讲清楚每一个角色在系统里做什么。这对于毕设答辩来说太重要了——老师最烦的就是这个系统是干嘛的你都说不清楚。1.2 个性化是技术亮点能明显区分于普通CRUD大多数管理系统所谓的提醒就是全局发一条广播请各位老人明天来体检。但康养场景下每个老人的情况完全不同张奶奶82岁II型糖尿病每天要测血糖胰岛素注射时间是早晚各一次李爷爷75岁刚做完心脏支架手术需要每周到社区康复中心做两次理疗王大爷68岁身体没什么大毛病但是报名了每周三上午的书法课。如果系统只能发统一通知那跟微信群接龙有什么区别所以个性化就要做到提醒内容、提醒时间、提醒频率、提醒渠道都按照每个老人的健康档案和活动计划单独计算。怎么实现不是花里胡哨的什么AI算法而是基于规则引擎的思路把老人的健康指标阈值、用药间隔、活动日程变成可配置的规则数据再由定时任务去扫描匹配。这个设计思路写在论文里可以讲一章节答辩老师一听到基于规则的个性化提醒策略就会觉得你有思考而不是光会调用select * from user。2. 技术选型不盲目追新只选毕设最稳的组合技术栈直接决定你开发过程的痛苦程度也决定你调试运行的时候会不会中途崩溃。我见过太多人选了 Spring Boot 3.x JDK 17 微服务整套结果租个云服务器内存不够跑都跑不起来。对于毕设项目我的建议是用你熟悉的、生态成熟的、文档多的而不是用最新的。2.1 后端框架Spring Boot 2.7.x 是毕设黄金版本话先说清楚Spring Boot 3.x 现在已经很成熟了但毕设项目我依然推荐 2.7.x。为什么2.7.x 基于 Java 8跟你学校教的语法完全一致不用处理新版 JDK 各种模块限制网上搜问题90% 的答案都是针对 Spring Boot 2.x 的你遇到坑能快速找到解决方案2.7.x 已经支持了很多企业级功能做管理系统的功能绰绰有余如果你的环境里装的是 JDK 1.8选择 2.7.x 不需要重新配环境省很多事。这个项目是在 Spring Boot 骨架基础上持久层用 MyBatis-Plus。为什么要用 MyBatis-Plus因为它自带BaseMapper单表 CRUD 不用写 SQL能省下大量时间。但要注意它只是增强不是替代复杂的多表关联查询比如健康提醒需要关联老人表、健康档案表、提醒规则表还是需要自定义 XML 或注解 SQL。这一点在论文里可以写MyBatis-Plus 负责基础数据访问手写 SQL 负责核心业务查询两结合保证性能和可维护性。2.2 前端方案Vue 2 Element UI 对毕设最友好前端的选型比较敏感因为有的学生不会前端看到 JS 就头疼。要是让你从零学 React那毕设基本就黄了。我的建议是用 Vue 2 Element UI。Vue 2 的教程、现成代码、问答社区内容最多你遇到问题直接搜Vue 2 Element UI bug基本都有答案Element UI 组件库里表格、表单、弹窗、日期选择器都是现成的搭页面就是拼积木后端接口用 RESTful 风格返回 JSON前端通过 Axios 调用前后端分离的开发模式在答辩时也能加分证明你懂现代 Web 开发的协作方式。当然如果你确实一点前端都不熟也有备选方案直接用 Thymeleaf 模板引擎后端渲染页面。这样的好处是项目结构更简单不用处理跨域、不用单独装 Node 环境一个 Spring Boot 应用直接跑起来坏处是页面交互体验比较老派而且答辩时亮点弱一些。权衡下来我还是建议用前后端分离毕竟管理系统的页面本身并不复杂Vue 2 学习成本很低。2.3 数据库与中间件MySQL Redis 的合理分工数据存储用 MySQL 8.0这是标配。数据库字符集统一 utf8mb4排序规则 utf8mb4_general_ci避免中文乱码。Redis 在毕设项目里用不用我的看法是如果只是为了用而用没必要硬上。但在这个项目里Redis 有一个非常合适的用途——存放登录 Token 和验证码。另外个性化提醒的高频查询比如判断某位老人今天是否已经提醒过也可以先用 Redis 做一层缓存防止定时任务重复扫描导致重复提醒。如果你不想引入 Redis也可以用内存 Map 或者数据库状态字段实现同样的效果但引入 Redis 会给论文加分答案是我考虑了并发环境下的性能和状态管理。自动化构建工具就用 Maven别用 Gradle。Maven 三个词就能说清楚pom.xml加依赖mvn clean package打 jarjava -jar跑起来。Gradle 语法虽然简洁但国内教材和资料相对少遇到构建问题不好查。技术栈汇总如下层次技术说明前端Vue 2 Element UI Axios前端页面与接口交互后端Spring Boot 2.7.x MyBatis-Plus核心业务逻辑与数据访问数据库MySQL 8.0 Redis可选持久化存储与缓存开发工具JDK 1.8 Maven 3.8 IDEA开发与构建环境部署方式Spring Boot 内嵌 Tomcat Nginx可选前后端部署3. 核心功能模块拆解这些功能到底在做什么很多学生拿到题目后第一反应是先登录然后写一个老人的增删改查。但一个真正能拿出手的康养管理系统功能是需要分层的。下面我把这个项目的功能拆成五个模块每个模块都有它存在的理由。3.1 基础信息管理不是增删改查那么简单基础信息管理包括社区管理员账号管理、老人档案管理、护工/家属账号管理、房间/床位管理、健康档案管理。老人档案是核心中的核心字段需要仔细设计基本信息姓名、性别、出生日期、身份证号、联系电话、紧急联系人、住址健康属性身高、体重、血型、过敏史、既往病史高血压、糖尿病、冠心病等、当前用药列表社区信息所属社区、楼栋、房号、床号、入住日期、服务等级自理/半自理/全护理。为什么这些字段很重要因为后面个性化提醒的触发条件全都要引用它们。比如一个老人既往病史里有高血压那么系统就要自动给他创建每天上午10点提醒量血压的规则如果服务等级是半自理那么洗澡提醒翻身提醒等护理提醒就要定时触发。在设计表结构时老人表elder、用户表sys_user、健康档案表health_record、提醒规则表remind_rule、提醒记录表remind_log这五张表是必须的而且外键关联关系要想清楚。比如健康档案表的具体指标血压、血糖、心率建议单独建一张health_metrics表这样未来扩展新指标时不需要改表结构。3.2 健康监测数据管理数据从哪来怎么用健康监测数据是这个系统的血液。数据来源通常有这么几个途径社区体检导入通过 Excel 导入老人年度体检数据手工录入护工每天上门测量血压、血糖、体温等数据后手动录入对接智能设备硬件设备通过 HTTP 接口推送测量结果。在毕设阶段不建议真的去对接硬件那需要物联网知识。最稳妥的做法是在系统里做一个健康数据录入页面模拟设备上报同时提供 Excel 导入模板。论文里可以写清楚数据采集方式有两种——人工录入和接口对接其中接口对接预留了接口文档方便以后扩展。健康指标的计算逻辑是这里的关键。比如血压数据的判定收缩压 90 mmHg 或 140 mmHg提示异常 舒张压 60 mmHg 或 90 mmHg提示异常 心率 60 次/分 或 100 次/分提示异常。这些阈值不能写死在代码里要设计成系统参数或者个人化阈值。为什么因为每个老人的基础情况不同。80岁的老人血压比年轻人稍微高一点是正常的不能一律按国家标准去判。所以个性化的第二层含义就出来了同一个指标针对不同老人判断异常的阈值可以不同。比如系统管理员可以在老人健康档案里设置该老人收缩压个人预警值如果设置了就用个人值否则用系统默认值。3.3 个性化智能提醒模块系统的灵魂这个模块是全文的重点单独放一节讲见第4节。我先说它的整体定位它决定了你的系统能不能在答辩时让人眼前一亮。提醒的类型要覆盖实际康养场景用药提醒根据医嘱时间生成到点该吃降压药了健康指标测量提醒比如今天该测空腹血糖康复训练/活动提醒下午3点一楼有康复操记得参加体征异常预警系统读取最新健康指标后发现异常则立即发送预警给家属/护工生日/节日关怀提醒。每种提醒都有不同的触发时机和数据要求。用药提醒是固定时间点触发体征异常预警是数据变化触发。你要在系统里把这几种触发模式都实现那这个项目基本就是优秀级别了。3.4 活动与护理服务管理这部分本质上是帮助管理员安排社区日常服务。包括活动管理发布活动合唱、书法、太极、健康讲座设置报名人数、活动时间、活动地点老人或家属可在线报名护理任务管理护工领取护理任务送餐、洗澡、康复陪护完成后填写记录服务预约老人或家属可以预约上门服务。这个模块和提醒模块是联动的活动创建成功后系统会给报名老人/老人的家属发送一条您预约的书法课周三上午9点开课护理任务创建后会给护工推送今天有3位老人需要做康复理疗。3.5 数据统计与分析毕设答辩时老师非常喜欢看图表。ECharts 加进来——统计社区老人的年龄段分布、健康异常比例、活动参与率、提醒触达率。后端用 SQL 按条件聚合前端用 ECharts 画折线图和饼图。这功能技术含量不高但展示效果好而且论文里可以写数据可视化有助于管理人员直观掌握康养服务情况。4. 个性化智能提醒数据模型、触发策略与核心代码前面讲的都是铺垫现在深入这个项目的灵魂——个性化智能提醒。很多学生拿到类似项目不知道智能两个字怎么落地。我给你们一个结论在毕设层面不需要引入什么复杂算法用基于规则的触发机制完全足够了。它的逻辑很清晰把提醒条件做成数据用定时任务去匹配匹配上了就生成提醒记录并推送。下面直接看实现。4.1 提醒规则的数据模型设计要做一个灵活的提醒规则首先得让规则本身是可配置的。我在这个项目里设计了这样一张remind_rule表字段名类型说明idbigint主键elder_idbigint老人IDnull 表示通用规则rule_typevarchar提醒类型medication/exercise/measure/activityrule_namevarchar规则名称如早上降压药trigger_modevarchar触发模式fixed_time固定时间/ interval间隔/ condition条件trigger_valuevarchar触发值如08:30:00或6小时condition_sqlvarchar条件表达式如 latest_systolic null or latest_systolic 140channelvarchar推送渠道system/email/smsenabledtinyint是否启用create_timedatetime创建时间这里的关键是在trigger_value和condition_sql上。固定时间提醒最简单每天08:30触发一次。间隔提醒则适用于需要周期性提醒的场景比如每6小时提醒一次监测体温。条件提醒则要配合健康指标表比如当最新收缩压高于140时触发预警。实际代码中条件表达式的解析不能直接用 SQL 字符串拼接那样很危险也不优雅。我建议的简化做法是将condition_sql做成一串 JSON 格式的规则条件比如{ conditions: [ { field: systolic, operator: , value: 140 }, { field: diastolic, operator: , value: 90 } ], logic: OR }在 Java 代码里写一个规则校验器遍历条件列表从健康数据表里查出对应的指标值用运算符比较。这样以后要改阈值不需要改代码只需改数据库里的 JSON。4.2 定时任务扫描与提醒生成提醒任务的触发是基于 Spring Boot 自带的Scheduled注解实现。启动类加EnableScheduling然后新建一个定时任务类每隔一分钟跑一次Component public class RemindScheduleTask { Resource private RemindRuleMapper remindRuleMapper; Resource private ElderMapper elderMapper; Resource private HealthMetricsMapper healthMetricsMapper; Resource private RemindService remindService; // 每60秒执行一次扫描所有启用的规则 Scheduled(fixedDelay 60000) public void scanAndTrigger() { ListRemindRule rules remindRuleMapper.selectList( new LambdaQueryWrapperRemindRule() .eq(RemindRule::getEnabled, 1) ); ListLong processedElderIds new ArrayList(); for (RemindRule rule : rules) { ListElder targetElders loadTargetElders(rule); for (Elder elder : targetElders) { if (remindService.shouldTrigger(rule, elder)) { remindService.createRemindLog(rule, elder); // 防止同一规则同一老人重复提醒 processedElderIds.add(elder.getId()); } } } } private ListElder loadTargetElders(RemindRule rule) { if (rule.getElderId() null) { // 通用规则加载所有启用提醒服务的老人 return elderMapper.selectList( new LambdaQueryWrapperElder() .eq(Elder::getRemindEnabled, 1)); } else { return Collections.singletonList( elderMapper.selectById(rule.getElderId())); } } }代码逻辑看起来简单但工程上有个大坑如何防止重复提醒。如果你每分钟跑一次某条规则在这个分钟刚刚触发了下一次扫描又满足条件那就重复提醒了。所以必须有重复判断。我在remind_log表里设计了trigger_time字段并且加了一个简单的去重逻辑public boolean shouldTrigger(RemindRule rule, Elder elder) { // 最近一次提醒时间 LocalDateTime lastTime remindLogMapper.selectLastTriggerTime( rule.getId(), elder.getId()); if (lastTime null) { return true; } // 固定时间提醒同一天只触发一次 if (fixed_time.equals(rule.getTriggerMode())) { return !lastTime.toLocalDate().equals(LocalDate.now()); } // 间隔提醒看距离上次触发是否达到间隔 if (interval.equals(rule.getTriggerMode())) { long gapMinutes Duration.between(lastTime, LocalDateTime.now()).toMinutes(); long requiredMinutes Long.parseLong(rule.getTriggerValue()); // 单位分钟 return gapMinutes requiredMinutes; } // 条件提醒除了满足条件间隔还要看指标是否更新 return isConditionMatched(rule, elder); }这里有一个细节值得注意fixed_time模式的去重是同一天只提醒一次但有些场景要求更严格比如08:30的用药提醒如果有人08:29手动补录了已服药到08:30就不应该再提醒了。所以我在remind_log里还会记录一个status字段如果老人当天已经处理过该提醒状态就是已完成系统会跳过。4.3 条件式提醒的指标判断条件式提醒是最能体现个性化的部分。我举个例子董奶奶78岁高血压系统里设置的规则是当最新收缩压大于150时给家属发送预警。这个规则对应一条remind_rule记录elder_id指向董奶奶rule_type measuretrigger_mode conditioncondition_sql保存 JSON 条件。定时任务扫描到这条规则后调用一个指标解析服务public boolean matchCondition(String conditionSql, Long elderId) { RuleCondition conditions JSON.parseObject(conditionSql, RuleCondition.class); // 查询该老人最新一条健康指标记录 HealthMetrics latest healthMetricsMapper.selectLatestByElderId(elderId); if (latest null) { return false; // 没有数据就不触发 } for (ConditionItem item : conditions.getConditions()) { Object fieldValue getFieldValue(latest, item.getField()); double value Double.parseDouble(String.valueOf(fieldValue)); boolean match compare(value, item.getOperator(), item.getValue()); if (AND.equals(conditions.getLogic()) !match) { return false; } if (OR.equals(conditions.getLogic()) match) { return true; } } return AND.equals(conditions.getLogic()); }我特意用反射工具getFieldValue去动态读取HealthMetrics对象的属性这样新增指标字段时不用改动规则判断核心代码只需把新字段名配置到规则里。这套设计的优点在论文里非常容易展开规则与代码解耦运营人员可通过配置生成新的提醒策略无需重新发版。4.4 提醒消息的推送实现提醒生成之后要触达用户。毕设环境下不建议接短信服务需要申请签名、花钱也不建议接微信公众号模板消息企业号认证麻烦。最稳妥的方案是站内信在系统首页的轮询接口里拉取当前用户/老人家属的未读提醒显示在顶部通知栏邮件如果用户填了邮箱通过 Spring Boot 的JavaMailSender发送邮件模拟短信打印日志或写入sms_log表假装调用了三方短信网关。这个写论文时可以大大方方说预留了短信网关扩展接口实际演示环境以站内信和邮件为主。站内信接口很简单RestController RequestMapping(/api/remind) public class RemindController { Resource private RemindLogMapper remindLogMapper; GetMapping(/unread/{userId}) public Result listUnread(PathVariable Long userId) { ListRemindLog logs remindLogMapper.selectList( new LambdaQueryWrapperRemindLog() .eq(RemindLog::getReceiveUserId, userId) .eq(RemindLog::getReadStatus, 0) .orderByDesc(RemindLog::getTriggerTime) ); return Result.success(logs); } PutMapping(/{id}/read) public Result markRead(PathVariable Long id) { RemindLog log new RemindLog(); log.setId(id); log.setReadStatus(1); remindLogMapper.updateById(log); return Result.success(); } }前端在全局路由守卫里加一个轮询进入系统后每隔30秒调一次/api/remind/unread返回结果有未读数就弹 red dot。这块代码逻辑很直观你要自己会写别到答辩时说是抄的。4.5 提醒模块的边界条件与常见坑提醒模块看起来就这些代码但实际调试时坑不少总结几个我记得最深的时区问题LocalDateTime.now()用的是服务器时区。如果服务器在别的地区你设置的08:30可能在你本地时间 16:30 才触发。部署演示前要检查date命令的时区必要时在启动参数里加-Duser.timezoneAsia/Shanghai。定时任务重复执行如果你部署了多个实例每分钟扫描会重复。毕设阶段用单机部署就好但在论文里可以提一句分布式场景下应使用分布式锁如 Redis 锁或 Quartz 集群模式保证任务只执行一次。Redis 缓存一致性如果你用了 Redis 缓存老人的最新指标那么护工录入新指标后要记得删缓存或更新缓存否则定时任务读到的还是旧值。我建议在指标录入的 Service 层显式调用缓存更新而不是依赖过期时间。空指针selectLatestByElderId可能返回 null老人没有健康记录时条件式提醒会直接跳过。这个处理要看业务需求如果老人完全没有指标数据是应该触发您还没有录入健康数据的提醒还是静默跳过我当时做了两种模式默认静默跳过但提供手动配置。5. 调试运行的完整实录从零到能演示的每一步这个项目做完很多学生卡在最后一步怎么把项目跑起来尤其当你拿到的是别人给你的源码电脑上的环境五花八门。光运行不起来这一件事就能劝退一大半人。下面我按实际调试的顺序把每一步可能遇到的问题和解决办法写出来。5.1 本地环境要求先对照检查在导入项目之前先把下面几个东西装好版本别乱换JDK 1.8确认java -version显示 1.8不要装 JDK 17 硬跑 2.7 的 Spring Boot会有IllegalAccessError之类的问题Maven 3.6.3 或 3.8.x不要用 3.9 最新版有的老仓库插件不兼容MySQL 5.7 或 8.0安装后要能mysql -u root -p登录成功Redis如果用的话Windows 用户可以用Redis-x64-5.0.14.1压缩包解压后直接运行redis-server.exeIDEA 2022.2 以上社区版也能跑但数据库相关的插件没旗舰版方便实在没有就先用命令行客户端。5.2 导入源码与数据库初始化拿到源码压缩包后先解压到一个纯英文路径下比如D:\project\kangyang。如果你的路径里有中文Maven 编译时会出现编码相关的奇怪错误非常难受。然后用 IDEA 的Open选择解压后的后端目录等待 Maven 下载依赖。这一步有个常见坑依赖下载特别慢或者直接报红。解决办法是检查 Maven 的settings.xml是否配置了阿里云镜像mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror然后执行mvn clean compile如果还报红看 IDEA 右下角的 Maven 进程有没有报错再考虑是否切换 Maven home directory。数据库初始化用 Navicat 或命令行执行项目里自带的kangyang.sql脚本。注意 SQL 脚本的字符集和 MySQL 的排序规则。如果表里已经有测试数据不要删可能接口就是依赖这些数据才展示效果。初始化后检查一下sys_user表里的初始账号密码通常会有admin/admin123之类的。先把密码理解清楚免得登录页面进不去。5.3 修改后端配置并启动后端需要改的核心配置文件是application.ymlserver: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/kangyang?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/Shanghai username: root password: 你的密码 driver-class-name: com.mysql.cj.jdbc.Driver redis: host: localhost port: 6379 mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl改完之后启动类上右键 Run第一次启动如果报数据库连接失败先别怀疑代码去 MySQL 命令行执行select 1;看数据库本身通不通。还有很多人栽在serverTimezone这个参数上MySQL 8 默认时区是美国不指定会差13个小时提醒功能会显得不准时。启动成功的标志是看到 Spring Boot 的 banner 和 Started Application in xx seconds然后浏览器访问http://localhost:8080如果后端单独开发了接口应该能看到接口返回的 JSON或者一个默认的 swagger 页面如果项目里配了 knife4j 的话。5.4 启动前端项目如果你用的是前后端分离那前端要单独起一个 Node 服务。进入frontend目录依次执行npm install npm run devnpm install是前端最让人痛苦的一步。网络不好时经常装到一半失败解决方法是换淘宝镜像源npm config set registry https://registry.npmmirror.com/装完之后npm run dev看到App running at: http://localhost:5173就说明起来了。前端项目默认端口可能是 5173Vite或 8081Vue CLI。如果后端运行在 8080前端请求接口会跨域。解决办法是在前端项目的vue.config.js里配置代理module.exports { devServer: { port: 8081, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } };这样前端页面里所有/api开头的请求都会被代理到后端避免跨域问题。这一步非常重要很多学生页面能打开但表格显示空白90% 都是跨域没有配好。5.5 启动后必踩的坑与排查链路下面把我在调试康养系统中遇到的高频问题列个清单你们可以直接对照端口占用启动后端报Port 8080 was already in use。运行netstat -ano | findstr 8080查进程杀掉对应 PID或者换一个端口。但换端口之后记得前端代理目标也要一起改。Mapper XML 找不到启动报Invalid bound statement (not found)。检查application.yml里mapper-locations是否指向了.xml所在目录且 XML 文件里的namespace必须和 Mapper 接口的全限定名一致。数据库表前缀/字段不匹配报Unknown column或字段xxx不存在。检查实体类里是否用了TableName、TableId、TableField注解。MyBatis-Plus 默认会把驼峰转下划线如果你数据库字段就是驼峰命名要配置map-underscore-to-camel-case: false。登录接口 401/404先看后端日志如果是 404 大概率是前端代理没生效或请求路径不对如果是 401是 Token 失效清理一下浏览器本地存储重新登录即可。提醒不触发三步排查第一检查规则表里enabled是否为 1第二检查老人的remind_enabled字段是否为 1第三看定时任务日志有没有打出来如果fixedDelay是 60000说明每分钟都会执行一次日志里应该能看到扫描行为。如果日志都没有那说明EnableScheduling没加或者应用根本没启动成功。这些坑的排查思路建议在论文的系统测试章节里写一小节列一个故障及解决方案表老师会认为你确实经过了充分的测试验证。6. 从源码到论文文档怎么写和答辩怎么讲项目代码跑起来了但最后决定成绩的往往还有论文和答辩。很多学生技术做出来了却输在不会表达。我讲讲这个项目怎么把它写成一篇文章以及答辩时回答问题的策略。6.1 毕业论文结构建议标准的毕设论文结构是这样但内容要贴合本项目第一章 绪论背景写老龄化社会背景下社区康养服务的数字化需求国内外研究现状不要写太多嵌套理论写国外有 XX 平台、国内有 XX 系统即可重点是说明个性化提醒的空白第二章 相关技术介绍Spring Boot、MyBatis-Plus、Vue、MySQL每个技术别介绍超过一页控制篇幅第三章 需求分析画用例图老人、家属、护工、管理员数据流图提醒触发流程最好用用例表把功能场景写清楚第四章 系统设计数据库表结构设计给出 ER 图核心模块设计重点讲个性化提醒模块的规则模型和触发流程第五章 系统实现每个功能附一个关键界面截图 核心代码片段不要贴大段源码贴最能体现设计思路的部分第六章 系统测试功能测试表 测试用例 测试结果再列一下发现的 bug 和修复过程。亮点是在第四章里的个性化提醒模块的设计。你要画一张图展示这个过程管理员配置规则 → 定时任务每分钟扫描 → 加载老人档案与健康指标 → 判断触发条件 → 生成提醒记录 → 站内信/邮件推送。这么一条链路图画出来答辩老师一眼就知道你在做什么。6.2 演示功能时的路线规划答辩现场只有三五分钟演示不要把时间浪费在基础信息管理上。我的建议按这个顺序演示登录系统展示首页的数据看板和未读提醒15秒进入老人档案选一位老人展示针对性体检数据20秒进入提醒规则展示如何为某位老人配置个性化用药提醒强调定时 条件 渠道三个维度1分钟演示数据录入手动录入一条超出阈值的血压数据等待下一次定时任务扫描或者点击手动触发按钮然后切回老人家属账号看到突发预警消息弹出1分半展示消息已读状态和提醒历史记录30秒。这套流程几乎完整覆盖了系统的所有亮点。如果你把时间花在演示老人信息增删改查上答辩老师会直接打断你问你这个和某某管理系统有什么区别到时候就很难回了。6.3 答辩被追问的高频问题和回答思路答辩老师最喜欢针对个性化智能提醒提问我准备几个典型问题Q你的个性化体现在哪里规则可以实时修改吗A个性化体现在三个层面提醒内容的个性化、提醒频率的个性化、提醒条件的个性化。规则存储在数据库管理员可在界面上动态调整修改后定时任务在下一次扫描时自动生效不需要重启服务。Q如果同一个老人在同一时间命中了多条提醒规则怎么处理重复问题A系统通过提醒记录表去重如果同一条规则在同一天已经触发过默认不再触发同时支持设置优先级比如体征异常的优先级高于活动提醒会优先展示和推送活动提醒则排队发送。Q如果你的系统要接到真实场景你觉得最需要改什么A一是接入真实的短信/电话语音网关因为老年人不太会看站内信二是对接社区现有的健康监测设备让指标数据自动采集三是增加人脸识别或二维码签到方便社区活动出入管理。Q系统有没有考虑并发场景比如上千个老人同时量血压A目前系统面向单社区规模几百位老人数据库相关性能足够。如果数据量大可以在定时任务里加分布式锁指标录入接口加 Redis 缓存、引入消息队列削峰。这部分在论文里作为系统展望写了。不一定非要做到但你要能说出来思路6.4 源码、文档、定制这些资源怎么善用最后说说源码文档、讲解、调试运行、定制这几个资源的价值。很多同学拿到资源后只会解压、导入、跑起来就算完事这其实浪费了最大的一部分。真正学习的方式是拿到代码先看pom.xml和application.yml理解项目用了什么技术栈、有哪些配置从sys_user登录开始跟踪一次新增提醒规则→触发提醒→查看提醒记录的完整数据流转找到RemindScheduleTask这个类自行打断点观察定时任务里每一行变量值的变化尝试修改一个阈值、增加一个提醒类型看看系统是否按照预期变化。如果你能完成这一步说明你已经具备独立扩展项目的能力。如果请人讲解、调试运行也不要当甩手掌柜。调试时你会看到一堆报错别害怕这是最好的学习机会。我接手过不少学生连线到一个小时看着他一步步把报错解决那种成就感比看十遍教程都强。定制方面有的同学想让界面换个主题、增加一个公告模块、或者改一下提醒的推送渠道这些都属于小改动但你要能说清楚你想改的页面在哪个路由文件、字段在哪个表这样双方沟通效率会高很多。我个人的体会是毕设项目的价值不取决于题目有多高端而在于你有没有把一个点做深。这个康养系统技术全是主流框架没有冷门的黑魔法但它真正打动人的是个性化提醒这个业务设计——用一个定时任务加一张规则表就把智能两个字落地了。你做完了回头看会发现原来复杂系统拆开也就是一个个模块的有序组合。希望这篇分享能让你少走一些弯路也祝你调试顺利、答辩稳过。
返回列表