2026年软件学院创新项目实训|智能居家养老健康守护系统·第七周工作博客 2026年山东大学软件学院创新项目实训 小组周报第七周一、本周工作概述本周小组围绕AI 对话系统全面落地 安全加固 鉴权联调 新功能上线推进开发主要完成以下工作后端——AI 多角色对话系统实现与安全加固完成 5 个 Agent情感陪伴/健康陪诊/健康干预/用药安全/家属辅诊的完整对话接口开发每个 Agent 提供普通对话、流式 SSE、会话列表、会话详情、会话删除共 5 个接口修复 15 个会话管理接口的用户隔离漏洞修复家属辅诊familyId可被伪造的安全问题新增对话记忆滑动窗口防止 Token 超限。后端——JWT 统一身份识别与数据归属校验重构登录态体系将用户主键写入 JWT subject新增全局过滤器与线程上下文在健康数据、用药计划、病历等模块按「老人本人 / 家属已绑定老人」过滤读写范围。后端——用药提醒数据层基础设施设计medication_reminder_log表结构及索引完成实体映射、定时任务线程池配置、短信模板扩展。后端——健康报告生成与 OCR 医疗单据识别新增基于 7 天体征数据的 AI 健康报告生成含多轮追问新增 OCR 医疗单据识别功能调用 qwen3.6-plus 多模态模型自动结构化入库。前端——JWT 鉴权全链路联调适配后端登录响应字段增强请求拦截器统一注入 Bearer 令牌完善双层 401 拦截机制完成数据归属参数传递与全链路验证。二、具体工作内容2.1 AI 多角色对话系统实现1系统架构采用统一基座 差异化 Prompt架构所有 Agent 共享同一套会话管理ChatSessionService和大模型调用基础设施通过不同的 System Prompt 定义角色能力边界。调用链路用户消息 → Controller → resolveSession() → ElderlyContextService.getFullContext()加载健康档案 → ChatMemoryService.buildMessages()构建消息数组 滑动窗口截断 → DeepSeek API/v1/chat/completions → 保存会话 → 返回响应2Agent 矩阵Agent名字接口前缀核心能力温度情感陪伴暖心/api/companion心理慰藉 / 陪诊助手0.8健康陪诊康伴/api/health-companion全科健康问答、导诊0.6健康干预养怡/api/health-intervention饮食/运动/作息个性化方案0.5用药安全审核—/api/medication-safety药物配伍禁忌筛查0.3家属辅诊家护/api/family-assist跨角色健康分析与照护建议0.43每个 Agent 提供 5 个接口接口方法说明/{prefix}/chatPOST普通对话等待完整回复/{prefix}/chat/streamPOST流式对话SSE 逐字输出/{prefix}/sessionsGET当前用户的会话列表/{prefix}/sessions/{sessionId}GET会话详情含完整消息/{prefix}/sessions/{sessionId}DELETE删除会话4个性化健康上下文注入每次对话自动从数据库加载老人健康档案注入 System Prompt基本信息姓名、年龄、性别、疾病列表、当前用药计划、近期病历记录最近 5 条、最新体征数据。家属端采用显式注入“请基于这些数据回答”老人端采用隐式注入“不要主动提及已知信息”。5对话记忆滑动窗口问题历史消息全量发送给大模型对话轮次过多时超出上下文窗口导致 API 报错解决新建ChatMemoryService统一管理消息构建逻辑超过 30 条消息自动截断保留最近记录5 个 Agent 的buildMessages()统一改为调用chatMemoryService.buildMessages()新增配置项chat.memory.max-context-messages: 30约 15 轮对话2.2 安全加固1AI 对话用户隔离修复问题5 个 Agent 共 15 个会话管理接口没有用户隔离任意用户可查看/删除其他用户的对话修复ChatSessionServiceImpl注入ElderlyAccessService所有会话操作增加归属校验5 个 Agent Controller 的会话接口统一从JwtUserContext取用户信息操作隔离逻辑列出会话老人elderlyId 自己家属familyId 自己查看/删除校验 session 归属不匹配抛 403创建会话assertCanAccessElderly(elderlyId)2家属辅诊身份修复问题FamilyAssistController的familyId从请求体获取可被伪造修复Controller 层用JwtUserContext.requireFamilyId()覆盖请求体中的值非家属账号调用直接 403同时校验绑定关系无绑定返回 4032.3 JWT 统一身份识别与数据归属校验1登录与令牌重构JwtServiceImpl.generateAccessToken将 userId 写入 JWT 标准字段subjectuserType、phone、openId 写入自定义 claimsJwtService.resolvePrincipal(authorization)统一解析 Bearer 令牌封装JwtPrincipal(userId, userType, phone, openId)短信登录返回SmsLoginResponse含 accessToken、userId、elderlyId前端持久化后携带身份访问业务接口2全局过滤器与线程上下文新增JwtAuthFilterOncePerRequestFilter除登录、发码、Swagger 等白名单路径外默认要求有效 JWT解析成功后写入JwtUserContext请求结束 finally 清理 ThreadLocal 防止线程池复用串用户JwtUserContext提供requireUserId()、requireFamilyId()、requireElderlyId()等静态方法3数据归属校验体系新增ElderlyAccessServiceassertCanAccessElderly(elderlyId)校验当前用户能否访问指定老人数据——老人仅本人家属仅bindStatus1的绑定老人新增ElderlyScopedCrudSupport封装带 elderlyId 实体的权限模板各模块 Controller 改造为listForCurrentUser()/getForCurrentUser(id)等方法解决ElderlyAccessService与ElderlyFamilyService循环依赖绑定关系查询改为注入ElderlyFamilyMapper2.4 用药提醒数据层与定时任务基础设施1数据库设计新建medication_reminder_log表记录用药提醒全生命周期待发送 → 已发送短信 → 已确认服药CREATETABLEmedication_reminder_log(id BIGSERIALPRIMARYKEY,schedule_time_idBIGINTNOTNULL,elderly_idBIGINTNOTNULL,plan_dateDATENOTNULL,dose_timeTIMENOTNULL,remind_statusSMALLINTDEFAULT0,-- 0待发送 1已发送 2已确认push_timeTIMESTAMP,confirm_timeTIMESTAMP,created_atTIMESTAMPDEFAULTnow(),CONSTRAINTuk_schedule_dateUNIQUE(schedule_time_id,plan_date));2索引与配置索引用途idx_reminder_elderly_date查询老人今日用药计划idx_reminder_status查询未确认的提醒idx_reminder_dose_time定时任务按时间扫描定时任务线程池配置5 线程前缀medication-支持优雅关闭。短信配置扩展reminderTemplateCode用药提醒模板编码。2.5 健康报告 AI 生成与 OCR 医疗单据识别1健康报告生成基于老人最近 7 天体征数据AI 自动生成健康趋势分析报告含数据总览、趋势分析、异常预警、综合评估、健康建议报告存储在medical_record表支持普通追问/api/health-report/chat和 SSE 流式追问/api/health-report/chat/stream提供历史报告列表与详情查询接口2OCR 医疗单据识别调用 qwen3.6-plus 多模态模型识别医疗单据图片自动提取生化指标并结构化入库识别结果存入medical_record表体征数据自动写入elderly_health_data表支持识别生命体征、身体测量、血常规、炎症指标、影像检查描述等返回结构化指标列表含指标名、数值、单位、参考范围、是否异常2.6 前端——JWT 鉴权全链路联调1登录响应字段适配后端登录接口返回结构变更前端同步适配登录成功后持久化 accessToken、tokenType、userId、elderlyId、userInfo 到本地缓存。2请求拦截器增强所有业务服务统一通过base.request()发起请求自动调用auth.buildAuthHeader()注入 Authorization: Bearer *** 头杜绝各服务重复手写。3双层 401 拦截机制层级拦截方式说明第一层HTTP 状态码拦截statusCode 401时清除缓存并跳转登录页第二层业务消息拦截响应体中匹配 token 过期关键词时触发相同跳转第三层错误消息标准化映射为用户友好中文提示4数据归属参数传递老人端elderlyId登录时已存入本地缓存查询时自动携带家属端从绑定关系获取boundElderlyId操作老人数据时作为参数传递三、联调与测试验证模块验证项状态5 个 Agent 对话角色设定生效回复符合预期✅ 通过SSE 流式输出逐字输出正常120s 超时处理正确✅ 通过会话用户隔离老人/家属只能操作自己的会话越权返回 403✅ 通过家属辅诊身份familyId 从 JWT 获取不可伪造✅ 通过JWT 鉴权所有业务请求携带 Bearer 令牌无 token 返回 401✅ 通过数据归属老人仅查本人数据家属仅查绑定老人数据✅ 通过双层 401 拦截HTTP 状态码 业务消息双层均生效✅ 通过编译验证Maven 编译通过✅ 通过四、待解决问题与风险问题当前状态处理计划会话模块 DB 持久化与 ownerUserId 归属校验未完全对齐4 个会话文件暂对齐 master 版本master 合并 JWT 后统一迭代用药提醒短信模板编码未配置配置项已预留值为空阿里云控制台申请模板后填入Token 刷新机制未实现token 过期后直接跳转登录后续增加静默续期健康指标数值范围校验尚未补充录入仅校验 ID 非空与产品/医学侧确认阈值后补充对话过长 Token 超限滑动窗口已兜底但无摘要压缩后续引入摘要压缩策略五、下周计划最终联调完成项目全模块前后端联调确保鉴权、归属校验、会话管理等全链路无遗漏会话模块对齐master 合并 JWT 能力后将会话模块 DB 持久化与 ownerUserId 归属校验统一Token 刷新增加 token 自动刷新机制在即将过期时静默续期健康指标校验完善录入数值范围校验提升数据质量用药提醒业务层配合完成定时扫描与短信发送的业务层实现健康报告与 OCR 联调与前端对接健康报告生成、追问及 OCR 识别接口