2026年山东大学软件学院创新项目实训博客(八)

发布时间:2026/6/23 12:56:19
2026年山东大学软件学院创新项目实训博客(八) 一、工作进展本阶段主要完成了与组内同学的进度对齐工作在对齐过程中发现前七篇博客描述的部分实现方案与当前代码存在差异。本篇博客对上述差异进行逐项说明并阐述当前最新的实现方式。本人工作对齐组内同学进度梳理各模块实际代码与博客描述之间的出入点补全若干博客中列为后续计划但实际已落地的功能。重构登录流程新增微信静默登录、手机号后绑含 openId 转移、扫码绑定等路径并在 JWT 中增加 phoneRequired 标志位配合 JwtAuthFilter 做强制引导。升级用药提醒通道从纯短信升级为微信订阅消息优先 短信补充的双通道方案幂等控制从 Redis SETNX 改为数据库日志查重并补建 medication_reminder_log 表。用药计划新增原子操作接口支持计划与服药时刻在同一事务内保存/差量更新解决时刻与提醒日志之间的外键约束问题。病历与 OSS 模块补全新增本地服务器上传备用通道并接入 OCR 医疗单据识别能力支持 AI 自动识别生化指标结构化入库。健康分析模块补全权限校验将博客六计划但未完成的 JWT 身份校验接入 HealthAnalyticsServiceImpl与整体权限体系对齐。二、具体内容由于和其他组员的进度对齐和一些具体实现的讨论最后联调阶段重构了之前的很多实现本篇博客的核心目的是说明当前最新实现与之前的差异以下按模块逐项展开。登录与鉴权模块对应博客三、七博客三描述的登录体系以微信首次登录自动注册、家属/老人各有独立微信登录入口为核心博客七在此基础上补充了 JWT 全链路鉴权。当前代码对登录流程进行了系统性重构主要变更如下微信静默登录与手机号分离新增 POST /api/auth/wx/auto-login通过 wx.login 返回的 code 换取 openId查找已有用户实现静默登录不自动注册新用户适配小程序启动时的自动续登场景。若未找到关联账户则返回 401引导用户通过手机号完成首次登录并绑定 openId。手机号后绑流程博客三提到首次微信登录可能缺少手机号当时的处理方式是在表结构上将 phone 字段设为可空。当前最新实现新增了 POST /api/auth/bind-phone 接口并在 JWT 中引入 phoneRequired 标志位微信首次登录无手机号时签发带 phoneRequiredtrue 的令牌JwtAuthFilter 检测到该标志位后除 bind-phone、profile、sms/send-code 三个接口外其余所有业务请求均拦截并返回 HTTP 425强制引导完成手机号绑定。绑定时若手机号已存在其他账户则自动将 openId 转移到已有账户并回收临时空账户避免重复建档。扫码绑定能力新增老人端生成绑定令牌接口GET /api/auth/family/bind-token后端将老人 id 以 bind_token:{uuid} 为 key 写入 RedisTTL 5 分钟令牌为一次性家属扫码后调用 POST /api/auth/family/bind-by-token后端读取并立即删除 key再执行绑定逻辑与原有手机号短信验证码绑定方式并存。其他补充接口GET /api/auth/family/bound-elderly 返回当前家属已绑定的全部老人列表供家属端切换监护对象使用POST /api/auth/profile 支持修改昵称与头像更新后重新签发令牌并返回最新 profile。用药提醒模块对应博客五博客五的策略说明中明确写道触达采用短信保证老人机无推送 SDK 时仍能收到并提到重复发送风险由 Redis 占坑规避。与组内同学对齐进度后该模块进行了较大调整双通道推送升级定时任务 MedicationReminderTask 优先通过微信订阅消息推送给老人调用 POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send微信 access_token 用 wechat:access_token 为 key 缓存在 Redis 中提前 200s 过期以规避边界问题减少对微信接口的重复请求仅在老人有手机号时额外发送短信作为补充兜底并同步短信通知所有 bindStatus1 的家属告知其家人需要服药。幂等控制方式变更博客五描述使用 Redis SETNX 做按「用药时刻明细 自然日」的幂等控制键设计为 med:remind:{scheduleTimeId}:{yyyy-MM-dd}。当前最新实现改为查询 medication_reminder_log 表是否已存在对应记录scheduleTimeId planDate以数据库为准避免 Redis 数据意外丢失时重复推送同时每次提醒都在日志表中留存完整状态便于后续确认回写与历史查询。medication_reminder_log 表已建博客五提到后续若需已服/忽略回写可在下周与 medical_record 或独立 ack 设计对齐本周未建表则不必展开实现。与同学对齐后已补建该表字段含 remind_status0 未推送 / 1 已推送 / 2 已确认、push_time、confirm_time 等状态流转由 MedicationReminderLogServiceImpl 统一管理。今日服药虚拟预查询getTodayReminders 在定时任务尚未触发今日暂无日志记录时会从 medication_plan medication_schedule_time 推算今日应服药条目返回 remindStatus-1 的虚拟记录前端识别为待提醒状态仅展示不可确认使前端无需等待定时任务触发即可展示当天服药计划。用药计划模块对应博客五博客五描述用药计划管理走基础 CRUD/api/medication-plan 的 list/get/add/update/delete。与前端联调后发现单独保存计划主体与时刻需要两次请求且删除时刻时会因外键约束medication_reminder_log 关联 medication_schedule_time报错。为此补充了以下原子操作接口POST /api/medication-plan/add-with-schedule计划主体与服药时刻在同一事务Transactional内保存计划保存后立即取自增 id再批量插入时刻记录前端一次请求完成建档。POST /api/medication-plan/update-with-schedule差量更新逻辑计算本次传入时刻与库中已有时刻的差集对需要删除的时刻先清理关联的 medication_reminder_log解除外键约束再删除时刻记录最后对新增/修改项分别执行 saveBatch / updateBatchById。GET /api/medication-plan/detail返回计划主体与时刻列表的聚合 VOMedicationPlanWithScheduleVO供前端编辑页回显使用。病历与 OSS 模块对应博客四博客四的方案是前端直传阿里云 OSS后端仅负责签发 STS 临时凭证。当前在此基础上新增了两项能力本地服务器上传备用通道新增 POST /api/oss/upload接收 multipart/form-data 格式的图片文件校验类型image/*与大小≤10MB后保存至服务器本地 uploads/ 目录并通过解析 X-Forwarded-Proto / X-Forwarded-Host 请求头动态拼接可访问 URL 返回。该通道主要供 OCR 识别等不需要持久化到 OSS 的临时上传场景使用。OCR 医疗单据识别MedicalRecordController 新增 POST /api/medical-record/ocr入参为图片 URLOcrRequest调用 OcrService.parseMedicalImage() 后由 AI 识别生化指标并结构化输出OcrResult供前端在病历录入页直接回填减少手动输入成本。健康数据分析模块对应博客六博客六的下周计划中明确写道补充 JWT 身份与 elderlyId 的权限校验防止越权查询与录入。该项工作已在本阶段与博客七的权限体系对齐后完成落地HealthAnalyticsServiceImpl 的 submitToday、getToday、getChartData 三个方法均已接入 ElderlyAccessService.assertCanAccessElderly(elderlyId)实现老人本人 / 家属已绑定老人的数据归属校验与其他模块规则一致。三、联调测试登录界面可以微信一键登录或者在微信不方便的时候可以使用短信登录。登录后最上方为ai对话跳转入口下方为对不同身体指标的记录并且可以查看详情。再下方为六大板块内容分别为记录数据、用药管理、ai健康报告、病历上传、疾病管理、预警记录。健康记录可以每天输入今天的数据ai最后会进行分析。用药管理部分可以自己新建用药计划并且接入微信在微信中可以收到用药提醒。病历上传部分可以直接上传病历并且ai识别文字之后可以再手动编辑在疾病管理部分可以管理疾病在用药计划中与之关联。每天上传的身体数据在预警历史里面会有异常警报。