elder-yudao-pro/docs/芋道框架迁移上下文.md

156 KiB
Raw Permalink Blame History

高原银龄 e 健航:迁移到芋道框架的工作上下文

分析日期:2026-10-05(Asia/Shanghai)。用途:供后续 Codex 在更换项目参考文件夹、甚至没有旧项目源码上下文时继续实施迁移。本文记录的是当前磁盘代码,不是 README 宣称的能力。已实现、存在缺口、迁移建议分别说明。

本轮只做静态分析并生成本文,没有修改业务代码,没有启动服务、连接数据库、调用云服务或验证部署。目标芋道项目尚未提供,因此目标模块名、框架版本和接口路径均是待在新项目核实的建议。

0. 新聊天如何继续

把本文复制到新的芋道项目根目录,向后续 Codex 发出以下任务即可:

读取《芋道框架迁移上下文.md》,先检查当前芋道项目的 AGENTS.md、后端与前端版本、已启用模块、账号和租户模型。
以本文记录的旧系统功能与规则为基线实施迁移。区分旧系统已实现功能与原型/缺失功能,不把示例数据当作真实业务。
先迁移身份与权限、档案、字典、10 类信息采集/量表,再迁移健康干预、运动记录、家属关联、视频推荐和 AI。
采用目标项目自己的安全、响应、分页、文件和数据访问规范;需要业务决策的地方以本文待定项为准,不自行宣称已经确认。
本文附录保留旧表结构、接口、页面入口、字典和前端知识库;若需要精确复刻旧页面或迁移真实数据,再读取旧源码/正式数据库导出。

建议阅读顺序:第 1~4 节理解旧系统,第 5~7 节理解不可丢失的规则,第 8 节看缺口,第 9~11 节决定落地方式;附录用于字段和接口核对。

本文不是完整源码备份,不包含真实用户记录、密钥、全部静态资源、完整行政区划/海拔数据。它足以支持规划和核心逻辑重建,但不能仅凭本文原样恢复全部 UI 或生产数据。

1. 旧系统位置、版本与分析基线

旧工作区绝对路径:C:/Users/Administrator/Desktop/projects/Oldman。以下路径缩写均相对于它:

缩写 实际路径 内容
B health-manager/health-manager Maven 多模块后端项目根
A health-App/health-App uni-app 移动端项目根
U health-manager/health-manager/ruoyi-ui Vue 管理后台根
J health-manager/health-manager/ruoyi-admin/src/main/java/com/ruoyi 大多数定制业务 Java
R health-manager/health-manager/ruoyi-admin/src/main/resources 配置、业务 Mapper XML
F health-manager/health-manager/ruoyi-framework/src/main/java/com/ruoyi/framework 安全、登录、验证码、AI 语音
S health-manager/health-manager/ruoyi-system/src/main/java/com/ruoyi/system 基础系统、老人/志愿者档案

磁盘结构有两层同名目录,迁移时不要少写一层。顶层还有 Redis-x64-5.0.14.1/,只是 Windows Redis 程序,不是业务模块。

Git 基线:顶层 HEAD 为 b04b8952b0df4611015e6a931f80f7ebe88d13cc。A 是 Git gitlink(模式 160000)的嵌套仓库:顶层记录 7af3f5177cd2f004b36b26eea4fae87d9b9431c6,实际移动端 HEAD 为 2787ae9fb01d613671a7a931ea0febc864fc2ba2;分析时移动端自身工作树干净,顶层已有 M health-App/health-App,源于引用提交不同。以实际磁盘移动端版本为本次基线,不要回退它。

层次 当前实现
后端 RuoYi-Vue 3.9.0,com.ruoyi;Spring Boot 2.5.15;Java 编译目标 1.8
安全 Spring Security 5.7.14,BCrypt,JWT + Redis 登录态;Bearer Authorization
持久化 MyBatis + XML,PageHelper 1.4.7;MySQL;Druid 1.2.23
管理端 Vue 2.6.12、Vue Router 3.4.9、Vuex 3.6.0、Element UI 2.15.14、Vue CLI 4.4.6、Axios 0.28.1、ECharts 5.x
移动端 RuoYi-App 派生;uni-app、Vue 2;manifest.json 的 vueVersion 为 2,应用版本 1.2.0;含 uni_modules
文档/导入导出 Springfox Swagger 3;若依 ExcelUtil / POI 4.1.2
外部 SDK OCR ocr20191230:2.0.2;验证码 captcha20230305:1.1.4;OSS 3.17.4;DashScope 2.21.16;Java-WebSocket 1.5.5;Hutool 5.8.25

后端 Maven 模块为 ruoyi-admin、ruoyi-framework、ruoyi-system、ruoyi-common、ruoyi-quartz、ruoyi-generator。大量业务 Controller/Service/Mapper/Domain 直接放在 ruoyi-admin 的 com.ruoyi.system 包下;不能只迁移 ruoyi-system。

运行配置事实:HTTP 8080,数据库连接目标 localhost:3306/elderly,SQL dump 标记 MySQL 8.0.41;Redis 6379 / DB 0;登录 token 有效期 30 分钟。当前本地文件目录 D:/ruoyi/uploadPath。配置见 R/application.yml 和 R/application-druid.yml。管理端走环境变量 API 前缀和开发代理;移动端开发地址 http://localhost:8080,生产地址还是 https://prod-api.example.com 占位值。

2. 业务边界与实际完成度

系统名称是“高原银龄 e 健航”,目标是老年人健康信息采集、评估、运动/饮食干预及家属和志愿者协作。移动端按 elderly、volunteer、dependent 展示三套页面;管理端使用同一套若依用户、角色和权限。

业务 已存在的实现 完成度与迁移含义
登录、注册、个人资料 登录态、用户、密码、头像;阿里验证码;注册身份证 OCR 有实际代码;业务身份与角色闭环存在缺口,见第 3 节
老人/志愿者档案 elderly_info、volunteer_info CRUD、Excel 导入导出;注册后自动建档 后端存在;与问卷基本信息是不同概念
10 类信息采集/量表 基础、慢病、生活方式、用药、家庭、认知、GDS15、跌倒、营养、生活能力 老人端表单 + 后端 CRUD + 管理页面;评分主要在前端
问卷分析/用户画像 汇总五类量表,详情、分析建议、画像 主要是移动端计算和展示,混合服务器记录与本地缓存
健康筛查 运动前风险筛查问卷及建议 只在移动端计算并存本地,无对应持久化表/API
运动处方/饮食建议 管理端数据库知识库 CRUD;移动端静态 JS 知识库 两套内容源并存;移动端当前没有使用后台知识库接口
运动记录 exercise_record CRUD;老人端记录与统计 有实际 API;页面还保存本地 healthRecords,需处理双源
家属关联 sys_dependent_elderly CRUD;查用户、添加/取消关联、认知问卷列表与详情 有调用;安全授权与 ID 命名要重整
家属健康/报告/安全/计划 展示关联老人,血压心率、轨迹、计划、消息等页面 多项内容为静态/模拟/开发中;没有完整设备、告警、报告业务后端
用药提醒 后端 sys_health_reminder CRUD 管理页 system/reminder/index.vue 是空文件;老人端用药提醒是内存示例数组,未接 API
志愿者服务/学习/社区 工单、扫码计时、评价、报告、培训、考试、论坛、排行页面 主要是展示原型和 Toast;没有相应业务表/Controller 闭环
视频素材与推荐 5 张视频表 + 用户标签;管理上传/发布;老人端公开与推荐列表 相对完整;规则与 OSS 实现需要专门迁移,见第 6 节
AI 文本助手 DeepSeek 后端代理 + 移动端聊天 有请求链路,历史在本地;错误时混有固定回复,需区分失败与真实回答
AI 语音 DashScope 双向音频 WS;另有讯飞 ASR/TTS 代理 两条独立集成;浏览器 API 与匿名 WS 不宜直接搬入新框架
通用板块/干预策略 section、strategy CRUD;孤立量表结果 XML SQL 缺表、关联元数据不全;不能等同于通用问卷引擎

老人端 family_monitor/index.vue 明确写“开发中”;volunteer_empowerment/index.vue 也是占位页面。管理端 views/guidance/guidance/index.vue 存在,但未找到对应 guidance 后端业务包。默认先迁移已实现核心;扩展原型功能要明确列为新增开发。

3. 身份模型与授权:迁移第一优先级

3.1 四种容易混淆的 ID

  1. sys_user.user_id:登录账号 ID。大多数问卷、量表、运动记录、提醒、视频标签/推荐记录的 user_id 都是它。
  2. elderly_info.elderly_id:老人档案 ID,另有唯一 user_id。不是登录 ID。
  3. sys_elderly_info.id:一次基础信息采集记录 ID。不是老人档案 ID,也不是登录 ID。
  4. sys_dependent_elderly.id:家属关联记录 ID。dependent_id、elderly_id 命名虽然像档案 ID,但移动端实际将后者用于 /system/user/{elderlyId},添加关系也来自用户搜索,因此当前页面按双方登录用户 ID 使用它们。SQL 没有外键约束,真实历史数据仍应抽样验证。
erDiagram
    SYS_USER ||--o| ELDERLY_INFO : user_id
    SYS_USER ||--o| VOLUNTEER_INFO : user_id
    SYS_USER ||--o{ ASSESSMENT_RECORD : user_id
    SYS_USER ||--o{ EXERCISE_RECORD : user_id
    SYS_USER ||--o{ USER_INTERVENTION_TAG : user_id
    SYS_USER ||--o{ USER_TYPE_PROFILE : user_id
    SYS_USER ||--o{ DEPENDENT_ELDERLY : dependent_id
    SYS_USER ||--o{ DEPENDENT_ELDERLY : elderly_id
    VIDEO_ASSET ||--o{ VIDEO_ASSET_TAG : video_id
    SYS_USER ||--o{ VIDEO_RECOMMEND_RECORD : user_id
    VIDEO_ASSET ||--o{ VIDEO_RECOMMEND_RECORD : video_id

上述是源码推导的逻辑关联,不代表数据库声明了这些外键;ASSESSMENT_RECORD 是对多张固定表的概括,不是实际旧表。

3.2 注册与登录的真实行为

  • F/web/service/SysRegisterService.java:验证码 → 账号/密码长度和重名校验 → BCrypt → 插入 sys_user → 按注册 userType 给 elderly/volunteer 建档。家属没有独立档案创建逻辑。
  • 用户扩展建档在 try/catch 内吞异常,注册账号成功后可能没有对应档案;该链路没有统一事务。
  • J/web/controller/system/SysLoginController.java 实际调用登录服务时只传用户名、密码、验证码参数、request,不使用移动端提交的 userType 验证业务身份;getInfo 返回账号、roles、permissions,未返回可信业务类型。
  • 移动端 A/pages/login.vue 保存前端选择的 userType;A/permission.js 按本地类型跳转三套首页。这只决定 UI,不能作为服务端授权依据。
  • sys_user_type_profile 是单独 CRUD 映射表,无 user_id 唯一约束。A/api/system/userType.js 调用 /system/userType/sync,但后端无此接口,A/config.js 的 enableUserTypeSync 默认 false。有映射表不代表注册/登录自动同步已经完成。
  • SQL 有 admin/common/elderly/volunteer/dependent 五个角色;S/service/impl/SysUserServiceImpl.registerUser 只执行 userMapper.insertUser,注册链路没有插入用户角色关系,因此新注册用户的业务角色/权限分配未闭环。此次 dump 也没有 sys_user_type_profile 初始化记录。

3.3 芋道中的建议做法,等目标代码确认

优先区分管理端用户和移动端业务用户。若目标项目已有 member,老人、家属、志愿者可共享会员主体并通过健康业务资料表定义身份,后台操作员走 system 用户。若目标项目没有会员模块,先检查现有业务用户方案,再决定是否启用会员或统一用户;不要凭同名 system_user 直接导入旧账号。

制定 legacy_user_id → target_user_id 映射;若管理用户与会员 ID 都可能相同,要在业务记录里明确主体类型。统一术语为 userId/memberId、elderlyProfileId、assessmentId、relationId,不要继续让 elderlyId 兼指多个实体。

App 的读写请求由后端从登录态取得本人 ID;家属查询只能覆盖有效且已经授权的关联老人;志愿者权限以服务分配/授权为依据;后台再叠加操作权限和数据范围。老代码主要使用 @ss.hasPermi(...) 管理权限,Controller/Service 未形成可靠的本人/家属资源隔离,不能原样放开 CRUD 给会员。

家属关联建议建成“申请、老人确认/授权、有效、解除”的明确流程;旧表只有 relationship/status,不含确认凭证。这是待确认的新流程,迁移历史关系时需定义如何保留或重新确认。

4. 数据模型与迁移范围

唯一发现的 SQL 是 B/sql/elderly.sql,共 56 张建表定义,是含已有数据的完整 dump,并带 DROP TABLE。不要把整个文件导入芋道数据库:会冲突/覆盖框架基础表,而且含账号、健康记录和操作日志。

4.1 业务表与接口/入口映射

多数业务 CRUD 遵循 GET /list、GET /{id}、POST 根路径、PUT 根路径、DELETE /{ids}、POST /export。以下根路径大小写按当前源码记录;视频接口例外,详见附录 A。

旧表 根路径 / Java 类关键名 移动端或业务用途
elderly_info /system/elderly / ElderlyInfo(S 下) 老人档案;不等于采集表
volunteer_info /system/volunteer / VolunteerInfo(S 下) 志愿者档案
sys_user_type_profile /system/profile / SysUserTypeProfile 移动端业务类型映射 CRUD
sys_dependent_elderly /system/dependent / SysDependentElderly 家属与老人关联
sys_elderly_info /system/elderlyinfo / SysElderlyInfo survey_fill/basic_info.vue
sys_elderly_chronic /system/chronic / SysElderlyChronic survey_fill/chronic_info.vue
sys_elderly_lifestyle /system/lifestyle / SysElderlyLifestyle survey_fill/lifestyle.vue
sys_elderly_medication /system/medication / SysElderlyMedication survey_fill/medication_info.vue
sys_elderly_family_info /system/info / SysElderlyFamilyInfo survey_fill/family_info.vue;父母情况
sys_mental_examination /system/examination / SysMentalExamination survey_fill/intelligence.vue
sys_elderly_depression_gds15 /system/elderlyDepressionGds15 / 同名实体 survey_fill/GDS15.vue
sys_elderly_fallrisk /system/fallrisk / SysElderlyFallrisk survey_fill/fallrisk.vue
elderly_nutrition_assessment /system/elderlyNutrition / ElderlyNutritionAssessment survey_fill/nutrition.vue
sys_elderly_living_ability /system/elderlyLivingAbility / SysElderlyLivingAbility survey_fill/living_ability.vue
exercise_record /system/records / ExerciseRecord 运动类型、分钟数、强度、感受、记录日期
sys_health_reminder /system/reminder / SysHealthReminder title/type/remind_time/is_repeat/status,后端 CRUD
exercise_prescription /system/prescription / ExercisePrescription 按人群/疾病与运动类别保存频率、强度、时长、方式和注意事项
dietary_advice /system/advice / DietaryAdvice 目标人群、饮食类别、内容、priority
elevation /system/elevation / Elevation 省、市、区县及海拔;当前数据库查询 CRUD
admin_division /division/division / AdminDivision 身份证前六位行政区划、名称和层级
video_asset /video / VideoAsset 素材,草稿/发布/下架、公开/定向、文件与封面
video_category /video/category / VideoCategory 分类
video_tag /video/tag / VideoTag 标签字典
video_asset_tag 随视频新增/更新绑定,没有独立 CRUD video_id + tag_code 唯一
user_intervention_tag 表单提交触发,无独立 Controller 用户风险/干预标签及来源、过期时间
video_recommend_record /video/recommend-record(列表) 推荐原因、状态、阅读字段;user_id + video_id 唯一

10 类采集表除档案外都是“记录”,大多只有普通 user_id 索引,没有每用户唯一约束。不能在迁移时未经决定就变成一人一行。优先保留历史记录,并明确“最新有效记录”的选择:建议按记录时间和主键排序,再用于画像和推荐。

4.2 字段语义不能只看名字

  • sys_elderly_info.bmi 是实际体重指数;elderly_nutrition_assessment.bmi 是 0~3 的题项得分。两者不能复用一个计算属性。
  • 身高单位 cm、体重 kg;运动记录 duration 单位分钟,视频 duration_seconds 单位秒;海拔是整数高度。
  • 慢病“空腹血糖”“糖化血红蛋白”字段当前是“是否异常/确诊”的字符串判断,不是连续检测数值;不能当设备血糖读数导入。
  • 多选项常以 JSON 字符串存在 varchar/text 字段中;新 VO 适合数组,但迁移器必须兼容字符串/数组、空值、异常 JSON。字段类型以附录 B 为准。
  • 性别存在两套字典:若依账号/档案使用 0/1 等,业务 gender 字典是 M/F/O。需显式转换。
  • 旧删除标志并不统一:elderly_info/volunteer_info 的 del_flag 用 0/2;家庭与生活方式用 deleted;跌倒用 del_flag;部分 Mapper 即使有标志仍直接物理删除。改成芋道逻辑删除时应定义历史转换和查询范围。
  • create_by/update_by 多为用户名字符串,不是目标框架的用户 ID;迁移审计字段应使用映射或单独保留原值。
  • 旧 Java 常用 Date、Long、BigDecimal。目标 JDK/时间类型确定后再统一,评分小数保留 BigDecimal,避免浮点和整数截断。

4.3 不随业务直接搬入的基础表

sys_user/role/menu/dept/post/dict/config/notice 及关联表、登录/操作日志、gen_table*、sys_job*、qrtz_* 由芋道对应基础设施承接。只迁移需要的账号、业务角色/菜单/字典配置和必要历史,不复制若依安全框架、代码生成器或 Quartz 数据库状态。

sys_user 的定制字段(real_name、id_card_number、id_card_birth、id_card_nation、id_card_address)需要落到健康/会员扩展资料,避免直接污染芋道通用用户实体。附录 B 额外保存其旧 DDL 以便映射。

5. 健康评估规则:当前代码行为

以下是旧实现的技术基线,不是经过独立验证的医学规范。迁移应先记录同输入旧输出,再对已知异常明确选择修正;不要悄悄改变历史评分含义。

项目 当前算法/阈值 核对源码
基础 BMI kg / (cm / 100)^2,保留 1 位;<18.5 过轻;18.5~<22 正常;22~<24 超重前期;24~<28 超重;≥28 肥胖 A/pages/elderly/work/survey_fill/basic_info.vue 的 calculateBMI/calculateBMIScore
GDS15 15 个已经按选项编码的 0/1 得分相加;0~4 无抑郁症状;5~9 轻度;≥10 中重度;另存 clinicalSignificance GDS15.vue;不能把所有“是”固定计为 1,因为有正反向题
生活能力 10 项 ADL 得分相加;≥90 完全自理;60~89 基本自理;40~59 需要帮助;<40 高度依赖 living_ability.vue
跌倒风险 初筛 fallHistory/balanceAbility/gaitObservation 相加;任一项≥5 或初筛总分≥5 → 综合评估;总分=初筛+已展示的综合题得分;<11 低,11~<31 中,≥31 高 fallrisk.vue;原页面文案写 0~10/11~30/≥31,与允许小数时的分段表达应核对
营养评估 6 项初筛,初筛≤11 才继续 12 项完整评估;总分=初筛+已展示完整题得分;≥24 良好,17~<24 风险,<17 不良 nutrition.vue;未完整评估时仍套完整量表阈值,存在低估/误分类问题
认知检查 前端编号 1~20 映射 yearScore 至 drawClockScore,数字得分相加;普通题上限 1,即刻/延迟记忆各 3,减 7 上限 5,时钟 3,累计 30 intelligence.vue;没有后端判级/重算;输入限制与后端校验需要一致

后端各评估 Service 大体只是设时间并执行 Mapper。表单传来的 totalScore/level 直接保存;不应在新 App API 继续信任这些派生字段。建议把校验、计分、分级、版本号放在服务层,App 展示预估结果,服务端保存最终结果;历史评分按旧规则版本保留。

A/pages/elderly/work/health_intervention/screening_questionnaire.vue 的运动前筛查按以下优先级:

  1. medicalHistory 或 symptoms 任一为“是”:高风险。
  2. 无前项,otherHealth 有“是”,riskFactors 计数≥2:中高风险。
  3. otherHealth 有“是”且 riskFactors≤1,或没有其他健康问题但 riskFactors≥1:中低风险。
  4. 所有风险均无:低风险。

结果只有 riskLevel/suggestion/riskLevelClass,存在 screening_result;时间存 screeningStatus.lastScreeningTime,页面按 30 天提示复筛。迁移若需要跨设备使用,应新增筛查记录与版本,而不是假设旧数据库已经有表。

问卷分析由 survey_analysis/index.vue 汇总生活能力、GDS15、认知、营养、跌倒五类列表;detail.vue 按类型取记录并在前端给解释。user_profile.vue 还读取 basic/chronic/lifestyle/screening 本地数据并拼画像,未形成后端统一画像服务。

6. 视频与推荐规则

实现位置:J/video/controller、J/video/service/impl、R/mapper/video;管理页 U/src/views/video/{asset,category,tag,record}/index.vue,移动页 A/pages/elderly/work/health_intervention/video.vue。

6.1 用户标签来源

5 种表单 Controller 在新增/修改成功后调用 UserInterventionTagServiceImpl,先删除同一用户同一 source_form 的标签,再按当前提交记录生成:

来源 source_form 生成条件(旧实现) tag_code
fallrisk riskLevel 含“高”/high,或含“中”/medium fall_risk_high / fall_risk_medium
living_ability abilityLevel 含“轻度依赖/中度依赖/重度依赖/高度依赖” low_intensity_needed
living_ability totalScore≤60 living_ability_decline
lifestyle weeklyActivity 含“<5/<5/少于5/不足/10分钟”任一文本 activity_low + low_intensity_needed
chronic hypertension / hyperlipidemia 为肯定字符串 hypertension / hyperlipidemia
chronic fastingBloodSugar 或 glycatedHemoglobin 为肯定字符串 diabetes
nutrition nutritionLevel 含“不良/风险/malnutrition” nutrition_low
nutrition totalScore≤23.5 nutrition_low(可能重复插入)

旧肯定判断是 substring 命中“是、有、yes、true”,不是严格枚举;包含否定词的文本可能误判。匹配大小写不归一。生活能力页面给的是“生活基本自理/生活需要帮助/生活高度依赖”,与低强度标签关键词存在不一致。营养规则两分支都可写同一标签,标签表无唯一约束。

源表保存与标签刷新位于 Controller 两次调用,不是同一事务;修改历史记录可能把标签变回过去的状态;删除评估没有重建标签。新实现建议在服务事务内保存/更新/删除记录,并按最新有效记录重算该来源标签,去重,统一枚举。

6.2 推荐算法与副作用

  • VideoAssetMapper.selectRecommendedVideoList:只选 status=published 且 visibility_type=targeted 的视频。
  • 视频任一 tag_code 匹配用户任一未过期标签即可,不是全部标签匹配,也没有权重评分。
  • audience_types 是逗号列表,用 find_in_set(userType, audience_types);userType 来自 sys_user_type_profile 第一条查询结果,缺失时放宽人群限制。记录多条时没有稳定的唯一身份保证。
  • 按 sort_order 升序、id 降序排序。这里不含公开视频兜底;移动端所谓公开列表单独调用 /video/list,但 Controller 未强制 visibilityType=public,Mapper 只在传入该参数时过滤,默认会返回所有 published 视频,包括 targeted。新实现需要服务端强制可见性范围。
  • GET /video/recommend/me 使用当前登录用户,生成返回列表同时写 video_recommend_record;有相同 user_id/video_id 时不重复插入,rule_code=FORM_TAG_MATCH,recommend_status=active,is_read=0。没有完整阅读标记/失效处理 API。
  • GET /video/{id} 和 /play-url 没有按已发布状态、人群、用户标签做完整资源权限校验;生成播放 URL 的 Service 只查视频存在。新系统应复用同一可见性校验。
  • 上传后素材默认 draft/public,发布 published,下架 offline。更新素材时清空旧 tag 绑定再插入;删除素材会清理绑定,但文件/历史推荐等关联清理要单独检查。

6.3 文件存储

OssStorageService:objectKey 为 videos/source/{category}/{uuid}{suffix} 或 videos/cover/...;播放有 object_key 则签 OSS GET URL,无 object_key 则用 source_url。签名默认有效 120 分钟。数据库应保存稳定 object key,不保存临时播放地址。

application.yml 有 OSS enabled/endpoint/bucketName/videoDir/coverDir/urlExpireMinutes,但当前未提供 OSS 的 accessKeyId/accessKeySecret 配置值,Service 读取缺失默认空;仅 enabled=true 不能说明上传可用。Servlet 上传限制 10MB 单文件、20MB 请求,不足以保证常规视频上传;目标需要核对前端、反向代理和服务端共同限额。

迁移优先接目标芋道文件接口/文件客户端抽象,同时保留私有资源签名与业务可见性校验。若文件模块不能签名私有 URL,可加健康媒体适配服务,避免把旧 OSS 全套配置塞进公共框架。

7. 前端状态与外部集成

7.1 本地存储不能当成服务器数据

关键 key:userType、survey_basic_info、survey_chronic_info、survey_medication_info、lifestyle、family_info、screening_result、questionnaireStatus、screeningStatus、survey_status、healthRecords、assessmentHistory、chatHistory、dependentChatHistory、deepseek_chat_history。部分页面又读 survey_lifestyle_info,与实际保存的 lifestyle 不同。

现有大量 key 未按用户隔离;Vuex LogOut 清 token/角色/权限和 storage 包装数据,显式删除 questionnaireStatus/screeningStatus,但不能推断清掉了所有直接 uni.setStorageSync 写入的健康和聊天记录。新项目以服务器为权威,草稿/缓存按主体 ID 隔离,退出和换账号需清理。

A/utils/request.js 返回完整若依响应体;GET 缓存 5 秒,key 仅 method+url,未含用户身份,退出未统一清缓存,写操作未自动失效。打印请求 header/data/响应。迁移时重写响应解析、缓存隔离、失效和日志;不要只替换 baseUrl。

另有响应层次不一致:GET /system/user/profile 返回 {code,msg,data:用户,roleGroup,postGroup},多张量表的 getCurrentUserInfo 回退逻辑却把整个 response 当用户,读 response.userId,正常应读取 response.data.userId;Vuex 有 ID 时会掩盖此问题。迁移必须统一用户 VO 和所有调用点。

原运动处方按 cancer → coronary → hypertension → diabetes → copd → osteoporosis → obesity(BMI≥28)→ balance 排序,全部没有才 general;饮食优先级相似但没有 balance。parseHealthData 判断高血压/糖尿病/高血脂的中文“是”,从 plateauDiseaseDetails 解析冠心病、癌症、骨质疏松、跌倒史;hasCOPD 初始化 false 后没有赋值,即便知识库有 COPD,当前解析器也不会选中。正文与附录 E 都保留这一事实,统一后端知识库时需补充或明确维持兼容。

管理端需要迁移业务表单字段、列表筛选、ECharts 统计和菜单语义。若目标为 Vue3/TS/Element Plus,旧 Vue2 .vue 不能原样复制;以目标项目相似 CRUD 页为范本,保留业务交互。

移动端可先保留 uni-app Vue2 页面并替换 API 适配层,或者在目标移动端工程重写,取决于实际参考项目。语音页使用浏览器 WebSocket、navigator.mediaDevices、AudioContext 等,不能据 uni-app 名称认定小程序/原生 App 全支持;分别核对平台能力。

7.2 验证码与 OCR

登录/注册验证码:F/web/service/AliyunCaptchaService.java,移动端 utils/aliyunCaptcha.js,后台登录页和注册页也有接入。客户端提交 captchaVerifyParam,服务端校验;匿名 GET /login/captcha-config 下发必要配置。沿用阿里验证码还是用目标自带方案,待目标项目确定。

OCR:匿名 POST /aliyun/ocr/idCard,multipart 字段 file,阿里身份证正面识别;响应含 data,face 存在时额外放 name/idNumber/gender/address。注册页上传并把识别信息填入账号注册参数。迁移时将响应统一为专门 VO,控制图片留存与访问权限。

7.3 DeepSeek 文本助手

J/web/controller/tool/DeepseekController.java 是 @Anonymous;POST /deepseek/** 剥离前缀并代理 https://api.deepseek.com;移动端调用 /deepseek/chat/completions,model=deepseek-chat,stream=false,temperature=0.7,超时 60 秒。历史最多保留 10 条消息,在本地而非数据库。

系统提示定义助手“航航”,面向老年健康、护理、心理,使用通俗语言并建议咨询医生。旧 Controller 用 AjaxResult.success(String),字符串按 Java 重载进入 msg,不是结构化 data,前端因此尝试 JSON.parse(msg)。目标应统一输出 VO(如 reply/conversationId)或采用目标 AI 模块的契约,不能假定原生 DeepSeek 格式直接透传。

旧源码有硬编码 DeepSeek/讯飞密钥,application 配置也包含其他服务凭据。本文不复制值;迁移到环境变量/配置中心并替换暴露过的凭据。代理和云调用补认证、请求范围限制、限流与调用审计;生产日志避免输出 Authorization、身份证、完整健康表单/聊天。

7.4 语音两条路线要分别处理

路线 当前入口 关键协议
DashScope 多模态对话 /ws/voice?userId=...,另有 /ws/voice/sockjs 二进制上下行 PCM 16kHz;前端以 Int16 音频编码;文本控制 interrupt / stop;服务端文本 JSON type 为 text/transcript,content 为文本
讯飞代理 /iflytek/ws-url、/tts、/asr、/test HMAC 签名;返回 String 封装;ASR/TTS 期望 16kHz MP3;与 DashScope WS 不是同一协议

WS 配置放开 origin *,SecurityConfig 允许匿名;userId 从 query、session 属性或 session ID 取得,移动端还可能随机生成 user_...,不是可靠账号身份。AiVoiceService 用 ConcurrentHashMap 按 userId 保存本机会话,多连接/多实例需重设会话键和路由;断开/异常清会话。

WebSocket 容器:文本缓冲 8192、二进制缓冲 102400、空闲 60 秒。目标握手应绑定实际登录身份,配置 wss 生产 URL、合法 origin、录音权限、断线与音频资源回收。移动端当前硬编码 ws://localhost:8080 和 ws://your-domain.com。

AiVoiceService 还实现 CommandLineRunner,启动休眠 5 秒并测试云模型/百炼配置,会主动发外部请求。迁移时去掉自动启动测试或放在明确禁用的开发开关下,正常启动不应依赖外部 AI 调用。

两个旧配置类 DeepseekProxyConfig 与 IflytekVoiceConfig 都有 @EnableWebMvc 和同名 hiddenHttpMethodFilter bean,旧配置允许 bean overriding。迁移集成客户端而非复制这些 WebMVC/跨域配置,使用目标框架统一配置。

8. 已确认缺口与需核验项

问题 静态证据 后续处理
用户类型同步接口缺失 A API /system/userType/sync;后端只有 /system/profile CRUD;feature flag=false 身份由服务端注册/登录维护,取消客户端任意切换身份
海拔便捷查询缺失 A API /system/elevation/getByAddress、/getByProvince;ElevationController 只有通用 CRUD 新增专用查询或适配列表;不要把 {id} 路由匹配误当作实现
跌倒按用户查询缺失 A API /system/fallrisk/listByUserId/{userId},Controller 无此映射 使用有权限范围的分页查询或专用 App API
用药按老人查询缺失 A API /system/medication/listByElderlyId,Controller 无此映射 统一 ID 与本人/家属权限
慢病 API 参数/方法不一致 getChronicInfo(idCard) 发 /{idCard},后端实际按 Long 主键;前端 export 用 GET,后端 POST 重命名参数并核对实际调用点
泛化问卷元数据缺失 Mapper 引用 t_section、t_intervention_strategy、t_scale_result;56 表 SQL 均没有 先迁移固定采集表;通用引擎需确认是否补做
孤立 result Mapper R/result/TScaleResultMapper.xml 不在配置 mapper/**/*Mapper.xml 范围;未找到配套 result Java 类 暂不视为可运行模块
关系列表缺展示 JOIN SysDependentElderlyMapper 只返回关系字段,部分页面再查账号/兼容多个老人名字段 App 关联列表直接返回获授权老人的安全展示 VO,消除 N+1
页面链接不存在 家属页跳 alarm/medication/nutrition/allRecords/healthAlerts 等,未发现对应页面源文件 检查路由清单;隐藏入口或明确新增开发
提醒/志愿者/设备数据不闭环 空提醒管理页、内存用药列表、模拟扫码、健康指标示例等 定义最小范围;真实推送/调度/设备接入属于新增工作
评分/标签原子性和一致性 前端计分直接保存、Controller 两次调用、删除不重算、模糊文本匹配 服务层统一校验/计算/事务;按最新记录重算
身份/资源授权不足 UI 类型本地选;通用管理 CRUD 复用;视频默认列表可混入 targeted,详情/签名无完整可见性校验 设计 App Controller 和资源权限校验
账号回退取值错误 profile 响应用户在 data,量表页面回退读 response.userId 改用户 VO/API 适配,验证 store 无 ID 的场景
SQL 完整性与配置真实性未验证 dump 含历史记录;没有连接当前数据库或运行服务 迁移前取正式结构/数据快照,验证关联与孤儿数据

9. 芋道落地方案:目标项目到位后执行

9.1 第一轮只读检查

读取目标根和子目录 AGENTS.md;确认是 yudao-boot 还是 yudao-cloud、精简版还是完整版;确认 Spring Boot/JDK(是否 javax→jakarta)、MyBatis-Plus 版本、CommonResult/PageResult、异常和校验规范、system/member/infra/ai 模块及依赖结构;确认管理前端 Vue2/Vue3/Vben/其他工程;确认移动端工程和多租户开关。

找目标中最接近的现成 CRUD、App Controller、文件上传、用户 API、数据权限和租户实现,各用一个作为模板。以下命名是参考惯例,必须以本地实际源码为准。

9.2 模块组织建议

单体中优先新增 yudao-module-health(若项目采用 api/biz 拆分,则跟随拆分),包路径示例 cn.iocoder.yudao.module.health,业务表前缀 health_。业务按 profile、assessment、intervention、exercise、relation、media、integration 划分;后台和 App Controller 分开,共享 Service 与资源授权逻辑。

不要把所有旧 com.ruoyi.system 类直接塞进芋道 system 模块。身份用 system/member 的 API,文件走 infra 的能力;AI 若已启用且适用,则复用 AI 接口,否则通过业务集成服务封装 SDK。

旧约定 芋道迁移方向(以目标版本为准)
Domain 直接作为入参与出参 DO + Create/Update/PageReq/Resp VO;明确校验和字段白名单
若依 BaseEntity 目标 BaseDO / TenantBaseDO;审计字段与逻辑删除显式转换
MyBatis Mapper/XML BaseMapperX / LambdaQueryWrapperX 等,复杂标签匹配保留受控 XML/自定义查询
BaseController.startPage / TableDataInfo PageParam / PageResult,分页显式传入
AjaxResult CommonResult;旧成功 code=200,目标常见 code=0,要检查并修改两个前端解析器
@ss.hasPermi 目标 PermissionService 表达式(常见 @ss.hasPermission);健康权限如 health:assessment:query
SecurityUtils 目标 SecurityFrameworkUtils/当前登录用户 API;分清管理用户/会员
若依 Log + ExcelUtil 目标操作日志注解和 Excel 工具;下载响应不包装 JSON
JWT/Redis、若依 SecurityConfig 复用目标认证与会话,不搬旧 token/过滤器
旧 CRUD REST 风格 跟随目标 create/update/delete/get/page/export-excel 风格;App API 统一适配
javax + Springfox 若 Boot3,迁移 jakarta 与目标 OpenAPI 注解;遵循目标依赖版本

建议后台前缀 /admin-api/health/...,移动前缀 /app-api/health/...。路径是建议,注册/登录应走目标 auth 契约。可以短期做明确的旧接口适配层,但先列合同和停用计划,避免响应形状、分页参数和权限悄悄混用。

9.3 表迁移建议

原业务表名到新表名可先按以下规则:sys_elderly_* → health_elderly_*,sys_mental_examination → health_mental_examination,elderly_nutrition_assessment → health_nutrition_assessment,sys_dependent_elderly → health_dependent_elderly,sys_health_reminder → health_reminder,elderly_info → health_elderly_profile,volunteer_info → health_volunteer_profile,其他业务表统一 health_ 前缀。具体名称由目标规范确定并生成映射表。

先使用独立迁移数据库/结构脚本;保留业务历史主键或创建主键映射;账号 ID、关系两端 ID、评估/运动/提醒/标签/推荐 user_id 必须一起替换;视频引用、分类代码和 tag_code 保持对应。若重命名字段,附带完整列映射与异常记录,不隐式丢列。

多租户:旧系统没有 tenant_id。若目标开启,明确旧用户和数据属于哪个租户,并决定行政区划、海拔、知识库是否共享;不要一律写 0 或取消过滤。业务唯一键需要考虑 tenant_id,尤其用户档案、关系对、分类代码、标签代码和推荐去重。

导入业务字典/菜单时按 type/value 或权限码匹配目标记录,重新分配字典/菜单/角色 ID。账号密码旧为 BCrypt,是否可直接保留取决于目标编码器;不要对已有 hash 再次加密。旧 token、Redis 缓存和 Quartz 运行状态不迁移。

知识库迁移要先消除双源:把移动端静态内容和数据库知识库逐条比对,选一个统一版本,保存适用人群、优先级、版本及来源,然后由 App 查询后端。附录 E 保留当前实际使用的静态内容;行政区划/海拔全量数据仍从旧 SQL 或正式数据库获取。

10. 实施顺序与验收

阶段 工作 可验收结果
0 检查目标框架,记录身份/租户/前端/范围决策,生成新旧表/API 映射 迁移清单与目标结构可审阅
1 健康模块、用户扩展、业务身份、字典、老人/志愿者档案 三类 App 身份可信,后台权限、本人/家属隔离可验证
2 10 类固定采集/量表;后端评分、历史记录、服务层事务 同输入评分可比,跨设备查询,错误/越权请求被拒绝
3 分析/画像、筛查、统一运动/饮食知识库、运动记录 不依赖旧本地缓存;记录和统计、画像与建议可复现
4 家属授权关联、关联老人安全 VO、提醒最小真实链路 授权建立/撤销有效,无任意查用户;提醒持久化和触发范围明确
5 视频素材/分类/标签/上传/发布、推荐与签名校验 表单变更驱动推荐;公开/定向可见性、过期签名、并发去重正确
6 文本 AI、语音;平台录音、断线、限流 配置关闭时可启动;真实外部调用成功/失败可区分
7 历史数据试迁移与正式切换准备;按需扩展原型模块 核对数量、关联、评分、回滚方式,无缺失字段

实现后的必要检查(本轮尚未执行):

  • 后端按目标项目约定编译/测试,前端执行目标类型检查与生产构建;uni-app 用确定的平台构建,当前 package.json 没有可用测试脚本。
  • 评分边界覆盖 BMI 18.5/22/24/28、GDS 4/5/9/10、ADL 39/40/59/60/89/90、跌倒初筛 5 与风险 11/31、营养初筛 11/12 和完整 17/23.5/24、缺题、非合法分值、认知满分 30。
  • 权限覆盖本人、不同老人、未授权家属、已授权家属、撤销关联、志愿者、后台有限权限与管理员,以及不同租户。
  • 数据迁移核对每表数量/抽样字段、所有 user_id 映射、关系对、孤儿引用、重复资料、逻辑删除、日期/时区、JSON 多选、旧审计字段、BCrypt 登录。
  • 推荐覆盖同来源重复提交、修改旧记录、删除最新记录、标签过期、无类型、多标签任一匹配、发布/下架、目标人群、并发请求唯一键、签名权限与过期刷新。
  • App 覆盖换账号缓存、退出清理、保存后立即查询、失败提示、分页与错误码、头像 multipart 字段、OCR 和真实设备/浏览器录音。

11. 待目标项目确认的决策与当前状态

待定:芋道具体版本/分支、Boot/JDK、管理前端、移动端是否保留 Vue2、使用 member 还是现有业务账号模型、租户归属、真实数据是否迁移、家属授权方式、是否补齐志愿者/设备/提醒推送原型、哪条语音路线保留、评分异常修正方式与医学规则复核。

当前完成:已读取架构和关键业务源码、配置(凭据未复制)、SQL DDL、前后端 API 与页面入口,梳理 ID 关系、评分/筛查/处方/饮食/视频标签规则与实现缺口。尚未实施任何芋道代码或数据迁移;后续不要据本文写“系统已迁移完成”。

附录为当前磁盘源码自动整理的技术快照,和正文建议要区分使用。

附录 A. 旧后端端点快照

来源:Controller 注解静态提取。权限列“登录”指无方法权限注解、按 SecurityConfig 默认需认证;标明匿名的按现有放行规则判断。此表只证明路由声明存在,不证明数据库或云服务调用成功。

AdminDivisionController

源码:J/division/controller/AdminDivisionController.java。

HTTP 路径 方法 旧权限/认证
GET /division/division/list list @ss.hasPermi('division:division:list')
POST /division/division/export export @ss.hasPermi('division:division:export')
GET /division/division/{id} getInfo @ss.hasPermi('division:division:query')
POST /division/division add @ss.hasPermi('division:division:add')
PUT /division/division edit @ss.hasPermi('division:division:edit')
DELETE /division/division/{ids} remove @ss.hasPermi('division:division:remove')

TSectionController

源码:J/section/controller/TSectionController.java。

HTTP 路径 方法 旧权限/认证
GET /section/section/list list @ss.hasPermi('section:section:list')
POST /section/section/export export @ss.hasPermi('section:section:export')
GET /section/section/{id} getInfo @ss.hasPermi('section:section:query')
POST /section/section add @ss.hasPermi('section:section:add')
PUT /section/section edit @ss.hasPermi('section:section:edit')
DELETE /section/section/{ids} remove @ss.hasPermi('section:section:remove')

InterventionStrategyController

源码:J/strategy/controller/InterventionStrategyController.java。

HTTP 路径 方法 旧权限/认证
GET /strategy/strategy/list list @ss.hasPermi('strategy:strategy:list')
POST /strategy/strategy/export export @ss.hasPermi('strategy:strategy:export')
GET /strategy/strategy/{id} getInfo @ss.hasPermi('strategy:strategy:query')
POST /strategy/strategy add @ss.hasPermi('strategy:strategy:add')
PUT /strategy/strategy edit @ss.hasPermi('strategy:strategy:edit')
DELETE /strategy/strategy/{ids} remove @ss.hasPermi('strategy:strategy:remove')

DietaryAdviceController

源码:J/system/controller/DietaryAdviceController.java。

HTTP 路径 方法 旧权限/认证
GET /system/advice/list list @ss.hasPermi('system:advice:list')
POST /system/advice/export export @ss.hasPermi('system:advice:export')
GET /system/advice/{id} getInfo @ss.hasPermi('system:advice:query')
POST /system/advice add @ss.hasPermi('system:advice:add')
PUT /system/advice edit @ss.hasPermi('system:advice:edit')
DELETE /system/advice/{ids} remove @ss.hasPermi('system:advice:remove')

ElderlyNutritionAssessmentController

源码:J/system/controller/ElderlyNutritionAssessmentController.java。

HTTP 路径 方法 旧权限/认证
GET /system/elderlyNutrition/list list @ss.hasPermi('system:elderlyNutrition:list')
POST /system/elderlyNutrition/export export @ss.hasPermi('system:elderlyNutrition:export')
GET /system/elderlyNutrition/{id} getInfo @ss.hasPermi('system:elderlyNutrition:query')
POST /system/elderlyNutrition add @ss.hasPermi('system:elderlyNutrition:add')
PUT /system/elderlyNutrition edit @ss.hasPermi('system:elderlyNutrition:edit')
DELETE /system/elderlyNutrition/{ids} remove @ss.hasPermi('system:elderlyNutrition:remove')

ElevationController

源码:J/system/controller/ElevationController.java。

HTTP 路径 方法 旧权限/认证
GET /system/elevation/list list @ss.hasPermi('system:elevation:list')
POST /system/elevation/export export @ss.hasPermi('system:elevation:export')
GET /system/elevation/{id} getInfo @ss.hasPermi('system:elevation:query')
POST /system/elevation add @ss.hasPermi('system:elevation:add')
PUT /system/elevation edit @ss.hasPermi('system:elevation:edit')
DELETE /system/elevation/{ids} remove @ss.hasPermi('system:elevation:remove')

ExercisePrescriptionController

源码:J/system/controller/ExercisePrescriptionController.java。

HTTP 路径 方法 旧权限/认证
GET /system/prescription/list list @ss.hasPermi('system:prescription:list')
POST /system/prescription/export export @ss.hasPermi('system:prescription:export')
GET /system/prescription/{id} getInfo @ss.hasPermi('system:prescription:query')
POST /system/prescription add @ss.hasPermi('system:prescription:add')
PUT /system/prescription edit @ss.hasPermi('system:prescription:edit')
DELETE /system/prescription/{ids} remove @ss.hasPermi('system:prescription:remove')

ExerciseRecordController

源码:J/system/controller/ExerciseRecordController.java。

HTTP 路径 方法 旧权限/认证
GET /system/records/list list @ss.hasPermi('system:records:list')
POST /system/records/export export @ss.hasPermi('system:records:export')
GET /system/records/{id} getInfo @ss.hasPermi('system:records:query')
POST /system/records add @ss.hasPermi('system:records:add')
PUT /system/records edit @ss.hasPermi('system:records:edit')
DELETE /system/records/{ids} remove @ss.hasPermi('system:records:remove')

SysDependentElderlyController

源码:J/system/controller/SysDependentElderlyController.java。

HTTP 路径 方法 旧权限/认证
GET /system/dependent/list list @ss.hasPermi('system:dependent:list')
POST /system/dependent/export export @ss.hasPermi('system:dependent:export')
GET /system/dependent/{id} getInfo @ss.hasPermi('system:dependent:query')
POST /system/dependent add @ss.hasPermi('system:dependent:add')
PUT /system/dependent edit @ss.hasPermi('system:dependent:edit')
DELETE /system/dependent/{ids} remove @ss.hasPermi('system:dependent:remove')

SysElderlyChronicController

源码:J/system/controller/SysElderlyChronicController.java。

HTTP 路径 方法 旧权限/认证
GET /system/chronic/list list @ss.hasPermi('system:chronic:list')
POST /system/chronic/export export @ss.hasPermi('system:chronic:export')
GET /system/chronic/{id} getInfo @ss.hasPermi('system:chronic:query')
POST /system/chronic add @ss.hasPermi('system:chronic:add')
PUT /system/chronic edit @ss.hasPermi('system:chronic:edit')
DELETE /system/chronic/{ids} remove @ss.hasPermi('system:chronic:remove')

SysElderlyDepressionGds15Controller

源码:J/system/controller/SysElderlyDepressionGds15Controller.java。

HTTP 路径 方法 旧权限/认证
GET /system/elderlyDepressionGds15/list list @ss.hasPermi('system:elderlyDepressionGds15:list')
POST /system/elderlyDepressionGds15/export export @ss.hasPermi('system:elderlyDepressionGds15:export')
GET /system/elderlyDepressionGds15/{id} getInfo @ss.hasPermi('system:elderlyDepressionGds15:query')
POST /system/elderlyDepressionGds15 add @ss.hasPermi('system:elderlyDepressionGds15:add')
PUT /system/elderlyDepressionGds15 edit @ss.hasPermi('system:elderlyDepressionGds15:edit')
DELETE /system/elderlyDepressionGds15/{ids} remove @ss.hasPermi('system:elderlyDepressionGds15:remove')

SysElderlyFallriskController

源码:J/system/controller/SysElderlyFallriskController.java。

HTTP 路径 方法 旧权限/认证
GET /system/fallrisk/list list @ss.hasPermi('system:fallrisk:list')
POST /system/fallrisk/export export @ss.hasPermi('system:fallrisk:export')
GET /system/fallrisk/{id} getInfo @ss.hasPermi('system:fallrisk:query')
POST /system/fallrisk add @ss.hasPermi('system:fallrisk:add')
PUT /system/fallrisk edit @ss.hasPermi('system:fallrisk:edit')
DELETE /system/fallrisk/{ids} remove @ss.hasPermi('system:fallrisk:remove')

SysElderlyFamilyInfoController

源码:J/system/controller/SysElderlyFamilyInfoController.java。

HTTP 路径 方法 旧权限/认证
GET /system/info/list list @ss.hasPermi('system:info:list')
POST /system/info/export export @ss.hasPermi('system:info:export')
GET /system/info/{id} getInfo @ss.hasPermi('system:info:query')
POST /system/info add @ss.hasPermi('system:info:add')
PUT /system/info edit @ss.hasPermi('system:info:edit')
DELETE /system/info/{ids} remove @ss.hasPermi('system:info:remove')

SysElderlyInfoController

源码:J/system/controller/SysElderlyInfoController.java。

HTTP 路径 方法 旧权限/认证
GET /system/elderlyinfo/list list @ss.hasPermi('system:elderlyinfo:list')
POST /system/elderlyinfo/export export @ss.hasPermi('system:elderlyinfo:export')
GET /system/elderlyinfo/{id} getInfo @ss.hasPermi('system:elderlyinfo:query')
POST /system/elderlyinfo add @ss.hasPermi('system:elderlyinfo:add')
PUT /system/elderlyinfo edit @ss.hasPermi('system:elderlyinfo:edit')
DELETE /system/elderlyinfo/{ids} remove @ss.hasPermi('system:elderlyinfo:remove')

SysElderlyLifestyleController

源码:J/system/controller/SysElderlyLifestyleController.java。

HTTP 路径 方法 旧权限/认证
GET /system/lifestyle/list list @ss.hasPermi('system:lifestyle:list')
POST /system/lifestyle/export export @ss.hasPermi('system:lifestyle:export')
GET /system/lifestyle/{id} getInfo @ss.hasPermi('system:lifestyle:query')
POST /system/lifestyle add @ss.hasPermi('system:lifestyle:add')
PUT /system/lifestyle edit @ss.hasPermi('system:lifestyle:edit')
DELETE /system/lifestyle/{ids} remove @ss.hasPermi('system:lifestyle:remove')

SysElderlyLivingAbilityController

源码:J/system/controller/SysElderlyLivingAbilityController.java。

HTTP 路径 方法 旧权限/认证
GET /system/elderlyLivingAbility/list list @ss.hasPermi('system:elderlyLivingAbility:list')
POST /system/elderlyLivingAbility/export export @ss.hasPermi('system:elderlyLivingAbility:export')
GET /system/elderlyLivingAbility/{id} getInfo @ss.hasPermi('system:elderlyLivingAbility:query')
POST /system/elderlyLivingAbility add @ss.hasPermi('system:elderlyLivingAbility:add')
PUT /system/elderlyLivingAbility edit @ss.hasPermi('system:elderlyLivingAbility:edit')
DELETE /system/elderlyLivingAbility/{ids} remove @ss.hasPermi('system:elderlyLivingAbility:remove')

SysElderlyMedicationController

源码:J/system/controller/SysElderlyMedicationController.java。

HTTP 路径 方法 旧权限/认证
GET /system/medication/list list @ss.hasPermi('system:medication:list')
POST /system/medication/export export @ss.hasPermi('system:medication:export')
GET /system/medication/{id} getInfo @ss.hasPermi('system:medication:query')
POST /system/medication add @ss.hasPermi('system:medication:add')
PUT /system/medication edit @ss.hasPermi('system:medication:edit')
DELETE /system/medication/{ids} remove @ss.hasPermi('system:medication:remove')

SysHealthReminderController

源码:J/system/controller/SysHealthReminderController.java。

HTTP 路径 方法 旧权限/认证
GET /system/reminder/list list @ss.hasPermi('system:reminder:list')
POST /system/reminder/export export @ss.hasPermi('system:reminder:export')
GET /system/reminder/{id} getInfo @ss.hasPermi('system:reminder:query')
POST /system/reminder add @ss.hasPermi('system:reminder:add')
PUT /system/reminder edit @ss.hasPermi('system:reminder:edit')
DELETE /system/reminder/{ids} remove @ss.hasPermi('system:reminder:remove')

SysMentalExaminationController

源码:J/system/controller/SysMentalExaminationController.java。

HTTP 路径 方法 旧权限/认证
GET /system/examination/list list @ss.hasPermi('system:examination:list')
POST /system/examination/export export @ss.hasPermi('system:examination:export')
GET /system/examination/{id} getInfo @ss.hasPermi('system:examination:query')
POST /system/examination add @ss.hasPermi('system:examination:add')
PUT /system/examination edit @ss.hasPermi('system:examination:edit')
DELETE /system/examination/{ids} remove @ss.hasPermi('system:examination:remove')

SysUserTypeProfileController

源码:J/system/controller/SysUserTypeProfileController.java。

HTTP 路径 方法 旧权限/认证
GET /system/profile/list list @ss.hasPermi('system:profile:list')
POST /system/profile/export export @ss.hasPermi('system:profile:export')
GET /system/profile/{profileId} getInfo @ss.hasPermi('system:profile:query')
POST /system/profile add @ss.hasPermi('system:profile:add')
PUT /system/profile edit @ss.hasPermi('system:profile:edit')
DELETE /system/profile/{profileIds} remove @ss.hasPermi('system:profile:remove')

VideoAssetController

源码:J/video/controller/VideoAssetController.java。

HTTP 路径 方法 旧权限/认证
GET /video/admin/list adminList @ss.hasPermi('video:asset:list')
GET /video/admin/{id} adminDetail @ss.hasPermi('video:asset:query')
POST /video/admin add @ss.hasPermi('video:asset:add')
PUT /video/admin edit @ss.hasPermi('video:asset:edit')
DELETE /video/admin/{ids} remove @ss.hasPermi('video:asset:remove')
POST /video/admin/upload/video uploadVideo @ss.hasPermi('video:asset:add')
POST /video/admin/upload/cover uploadCover @ss.hasPermi('video:asset:add')
POST /video/admin/{id}/publish publish @ss.hasPermi('video:asset:edit')
POST /video/admin/{id}/offline offline @ss.hasPermi('video:asset:edit')
GET /video/categories categories 登录
GET /video/list list 登录
GET /video/{id} detail 登录
GET /video/{id}/play-url playUrl 登录
GET /video/recommend/me recommendMine 登录

VideoCategoryController

源码:J/video/controller/VideoCategoryController.java。

HTTP 路径 方法 旧权限/认证
GET /video/category/list list @ss.hasPermi('video:category:list')
GET /video/category/{id} getInfo @ss.hasPermi('video:category:query')
POST /video/category add @ss.hasPermi('video:category:add')
PUT /video/category edit @ss.hasPermi('video:category:edit')
DELETE /video/category/{ids} remove @ss.hasPermi('video:category:remove')

VideoRecommendRecordController

源码:J/video/controller/VideoRecommendRecordController.java。

HTTP 路径 方法 旧权限/认证
GET /video/recommend-record/list list @ss.hasPermi('video:record:list')

VideoTagController

源码:J/video/controller/VideoTagController.java。

HTTP 路径 方法 旧权限/认证
GET /video/tag/list list @ss.hasPermi('video:tag:list')
GET /video/tag/enabled enabled 登录
GET /video/tag/{id} getInfo @ss.hasPermi('video:tag:query')
POST /video/tag add @ss.hasPermi('video:tag:add')
PUT /video/tag edit @ss.hasPermi('video:tag:edit')
DELETE /video/tag/{ids} remove @ss.hasPermi('video:tag:remove')

AliyunOcrController

源码:J/web/controller/aliyun/AliyunOcrController.java。

HTTP 路径 方法 旧权限/认证
POST /aliyun/ocr/idCard recognizeIdCard 匿名

CaptchaController

源码:J/web/controller/common/CaptchaController.java。

HTTP 路径 方法 旧权限/认证
GET /captchaImage getCode 匿名

CommonController

源码:J/web/controller/common/CommonController.java。

HTTP 路径 方法 旧权限/认证
GET /common/download fileDownload 登录
POST /common/upload uploadFile 登录
POST /common/uploads uploadFiles 登录
GET /common/download/resource resourceDownload 登录

ElderlyInfoController

源码:J/web/controller/system/ElderlyInfoController.java。

HTTP 路径 方法 旧权限/认证
GET /system/elderly/list list @ss.hasPermi('elderly:list')
POST /system/elderly/export export @ss.hasPermi('elderly:export')
GET /system/elderly/{elderlyId} getInfo @ss.hasPermi('elderly:query')
POST /system/elderly add @ss.hasPermi('elderly:add')
PUT /system/elderly edit @ss.hasPermi('elderly:edit')
DELETE /system/elderly/{elderlyIds} remove @ss.hasPermi('elderly:remove')
POST /system/elderly/importData importData @ss.hasPermi('elderly:import')
POST /system/elderly/importTemplate importTemplate 登录

SysLoginController

源码:J/web/controller/system/SysLoginController.java。

HTTP 路径 方法 旧权限/认证
POST /login login 匿名
GET /login/captcha-config captchaConfig 匿名
GET /getInfo getInfo 登录
GET /getRouters getRouters 登录

SysProfileController

源码:J/web/controller/system/SysProfileController.java。

HTTP 路径 方法 旧权限/认证
GET /system/user/profile profile 登录
PUT /system/user/profile updateProfile 登录
PUT /system/user/profile/updatePwd updatePwd 登录
POST /system/user/profile/avatar avatar 登录

SysRegisterController

源码:J/web/controller/system/SysRegisterController.java。

HTTP 路径 方法 旧权限/认证
POST /register register 匿名

SysUserController

源码:J/web/controller/system/SysUserController.java。

HTTP 路径 方法 旧权限/认证
GET /system/user/list list @ss.hasPermi('system:user:list')
POST /system/user/export export @ss.hasPermi('system:user:export')
POST /system/user/importData importData @ss.hasPermi('system:user:import')
POST /system/user/importTemplate importTemplate 登录
GET /system/user getInfo @ss.hasPermi('system:user:query')
GET /system/user/{userId} getInfo @ss.hasPermi('system:user:query')
POST /system/user add @ss.hasPermi('system:user:add')
PUT /system/user edit @ss.hasPermi('system:user:edit')
DELETE /system/user/{userIds} remove @ss.hasPermi('system:user:remove')
PUT /system/user/resetPwd resetPwd @ss.hasPermi('system:user:resetPwd')
PUT /system/user/changeStatus changeStatus @ss.hasPermi('system:user:edit')
GET /system/user/authRole/{userId} authRole @ss.hasPermi('system:user:query')
PUT /system/user/authRole insertAuthRole @ss.hasPermi('system:user:edit')
GET /system/user/deptTree deptTree @ss.hasPermi('system:user:list')

VolunteerInfoController

源码:J/web/controller/system/VolunteerInfoController.java。

HTTP 路径 方法 旧权限/认证
GET /system/volunteer/list list @ss.hasPermi('volunteer:list')
POST /system/volunteer/export export @ss.hasPermi('volunteer:export')
GET /system/volunteer/{volunteerId} getInfo @ss.hasPermi('volunteer:query')
POST /system/volunteer add @ss.hasPermi('volunteer:add')
PUT /system/volunteer edit @ss.hasPermi('volunteer:edit')
DELETE /system/volunteer/{volunteerIds} remove @ss.hasPermi('volunteer:remove')
POST /system/volunteer/importTemplate importTemplate 登录
POST /system/volunteer/importData importData @ss.hasPermi('volunteer:import')

DeepseekController

源码:J/web/controller/tool/DeepseekController.java。

HTTP 路径 方法 旧权限/认证
POST /deepseek/** proxyDeepseek 匿名
POST /deepseek/test testConnection 匿名

IflytekSparkController

源码:J/web/controller/tool/IflytekSparkController.java。

HTTP 路径 方法 旧权限/认证
GET /iflytek/ws-url getWsUrl 匿名
POST /iflytek/tts tts 匿名
POST /iflytek/asr asr 匿名
GET /iflytek/test test 匿名

附录 B. 旧业务 DDL 快照

只提取 CREATE TABLE,未复制 DROP/INSERT/用户数据。保留旧字段、默认值、索引和注释;删除表选项中的历史 AUTO_INCREMENT 起点。这是旧结构证据,不能作为芋道最终建表脚本直接执行。另保存 sys_user 供定制字段与主体映射参考。

业务表 26 张,账号参考表 1 张;旧 dump 其余 30 张是框架基础/调度/生成器表。

admin_division

CREATE TABLE `admin_division` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `division_code` char(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '行政区划代码(身份证前6位)',
  `province_code` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '省级代码',
  `city_code` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '地级市代码',
  `district_code` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '区县级代码',
  `province_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '省份名称',
  `city_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '地级市名称',
  `district_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '区县名称',
  `full_name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '完整名称',
  `admin_level` tinyint NOT NULL COMMENT '行政级别:1-省级,2-地级,3-县级',
  `is_direct_city` tinyint(1) DEFAULT '0' COMMENT '是否直辖市辖区',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uk_division_code` (`division_code`) USING BTREE,
  KEY `idx_province` (`province_code`) USING BTREE,
  KEY `idx_city` (`province_code`,`city_code`) USING BTREE,
  KEY `idx_full_name` (`full_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='全国行政区划表(含身份证编码)';

dietary_advice

CREATE TABLE `dietary_advice` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `target_type` varchar(50) NOT NULL COMMENT '适用人群类型代码',
  `target_name` varchar(50) NOT NULL COMMENT '适用人群名称',
  `category_name` varchar(50) NOT NULL COMMENT '饮食类别(原则/推荐食物/禁忌食物/营养素建议)',
  `content` text NOT NULL COMMENT '饮食建议内容',
  `priority` int DEFAULT '0' COMMENT '优先级(数字越小越重要)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_target_type` (`target_type`),
  KEY `idx_category` (`category_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='高原地区饮食建议知识库';

elderly_info

CREATE TABLE `elderly_info` (
  `elderly_id` bigint NOT NULL AUTO_INCREMENT COMMENT '老人ID',
  `user_id` bigint NOT NULL COMMENT '关联用户ID',
  `real_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '真实姓名',
  `gender` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '性别(0男 1女)',
  `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '手机号码',
  `id_card` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '身份证号',
  `birth_date` date DEFAULT NULL COMMENT '出生日期',
  `address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '住址',
  `emergency_contact` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '紧急联系人',
  `emergency_phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '紧急联系人电话',
  `health_status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '健康状况',
  `medical_history` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '病史',
  `medication_info` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '用药信息',
  `family_info` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '家庭情况',
  `special_needs` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '特殊需求',
  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态(0正常 1停用)',
  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`elderly_id`) USING BTREE,
  UNIQUE KEY `uk_user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='老人信息表';

elderly_nutrition_assessment

CREATE TABLE `elderly_nutrition_assessment` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '评估ID',
  `user_id` bigint DEFAULT NULL COMMENT '用户ID',
  `weight_change` decimal(5,2) DEFAULT NULL COMMENT '体重变化得分',
  `bmi` decimal(5,2) DEFAULT NULL COMMENT 'BMI得分',
  `activity_ability` decimal(5,2) DEFAULT NULL COMMENT '活动能力得分',
  `acute_illness` decimal(5,2) DEFAULT NULL COMMENT '急性疾病得分',
  `cognitive_status` decimal(5,2) DEFAULT NULL COMMENT '认知状态得分',
  `calf_circumference1` decimal(5,2) DEFAULT NULL COMMENT '小腿围初筛得分',
  `screening_score` decimal(6,2) DEFAULT NULL COMMENT '初筛总分',
  `arm_circumference` decimal(5,2) DEFAULT NULL COMMENT '上臂围得分',
  `calf_circumference2` decimal(5,2) DEFAULT NULL COMMENT '小腿围详细得分',
  `lifestyle` decimal(5,2) DEFAULT NULL COMMENT '生活方式得分',
  `medication` decimal(5,2) DEFAULT NULL COMMENT '用药情况得分',
  `skin_lesions` decimal(5,2) DEFAULT NULL COMMENT '皮肤病变得分',
  `meal_frequency` decimal(5,2) DEFAULT NULL COMMENT '每日正餐次数得分',
  `protein_intake` decimal(5,2) DEFAULT NULL COMMENT '蛋白质摄入得分',
  `fruit_veg_intake` decimal(5,2) DEFAULT NULL COMMENT '果蔬摄入得分',
  `fluid_intake` decimal(5,2) DEFAULT NULL COMMENT '液体摄入得分',
  `eating_ability` decimal(5,2) DEFAULT NULL COMMENT '自主进食能力得分',
  `health_self_assessment` decimal(5,2) DEFAULT NULL COMMENT '自评健康得分',
  `nutrition_self_assessment` decimal(5,2) DEFAULT NULL COMMENT '自评营养得分',
  `full_assessment_score` decimal(6,2) DEFAULT NULL COMMENT '完整评估总分',
  `total_score` decimal(6,2) DEFAULT NULL COMMENT '总分',
  `nutrition_level` varchar(50) DEFAULT NULL COMMENT '营养等级',
  `is_full_assessment` tinyint DEFAULT '0' COMMENT '是否进行完整评估(0:否,1:是)',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_user_elderly_time` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='老年人营养不良评估表';

elevation

CREATE TABLE `elevation` (
  `id` int NOT NULL AUTO_INCREMENT,
  `province` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '省份',
  `city` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '市/自治州',
  `city_elevation` int DEFAULT NULL COMMENT '市海拔高度',
  `district` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '区县',
  `district_elevation` int DEFAULT NULL COMMENT '区县海拔高度',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_province` (`province`) USING BTREE,
  KEY `idx_city` (`city`) USING BTREE,
  KEY `idx_district` (`district`) USING BTREE,
  KEY `idx_elevation` (`district_elevation`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='全国四省海拔高度数据表';

exercise_prescription

CREATE TABLE `exercise_prescription` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `prescription_type` varchar(50) NOT NULL COMMENT '处方类型(老年人/高血压/冠心病等)',
  `prescription_type_code` varchar(50) NOT NULL COMMENT '处方类型代码(general/hypertension等)',
  `category_name` varchar(50) NOT NULL COMMENT '运动类别(有氧运动/力量训练/柔韧性训练/平衡训练)',
  `frequency` varchar(200) DEFAULT NULL COMMENT '运动频率',
  `intensity` varchar(200) DEFAULT NULL COMMENT '运动强度',
  `duration` varchar(200) DEFAULT NULL COMMENT '运动时间',
  `exercise_method` text COMMENT '运动方式',
  `warnings` text COMMENT '注意事项',
  `priority` int DEFAULT '0' COMMENT '优先级(数字越小越优先)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_prescription_type` (`prescription_type_code`),
  KEY `idx_category` (`category_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='高原地区运动处方知识库';

exercise_record

CREATE TABLE `exercise_record` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `record_date` date NOT NULL COMMENT '记录日期',
  `exercise_type` varchar(50) NOT NULL COMMENT '锻炼类型',
  `duration` int NOT NULL COMMENT '锻炼时长(分钟)',
  `intensity` varchar(20) NOT NULL COMMENT '强度(低强度/中等强度/高强度)',
  `feeling` varchar(20) NOT NULL COMMENT '感受(轻松/适中/疲劳/非常疲劳)',
  `remarks` varchar(500) DEFAULT NULL COMMENT '备注',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_record_date` (`record_date`),
  KEY `idx_user_date` (`user_id`,`record_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='锻炼记录表';

sys_dependent_elderly

CREATE TABLE `sys_dependent_elderly` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `dependent_id` bigint NOT NULL COMMENT '家属用户ID',
  `elderly_id` bigint NOT NULL COMMENT '老人用户ID',
  `relationship` varchar(50) DEFAULT NULL COMMENT '亲属关系',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `status` tinyint DEFAULT '1' COMMENT '状态(0:禁用,1:启用)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_dependent_elderly` (`dependent_id`,`elderly_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='家属-老人关联关系表';

sys_elderly_chronic

CREATE TABLE `sys_elderly_chronic` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `hypertension` varchar(10) DEFAULT NULL COMMENT '是否有高血压(是/不清楚)',
  `hypertension_years` int DEFAULT NULL COMMENT '高血压确诊年数',
  `hypertension_complication` varchar(10) DEFAULT NULL COMMENT '高血压有无并发症(有/无)',
  `hypertension_complication_details` json DEFAULT NULL COMMENT '高血压并发症详情',
  `hypertension_complication_other` varchar(200) DEFAULT NULL COMMENT '高血压其他并发症说明',
  `fasting_blood_sugar` varchar(20) DEFAULT NULL COMMENT '空腹血糖是否异常(是/否/不清楚)',
  `diabetes_years1` int DEFAULT NULL COMMENT '糖尿病确诊年数(空腹血糖)',
  `diabetes_complication1` varchar(10) DEFAULT NULL COMMENT '糖尿病有无并发症(空腹血糖)(有/无)',
  `diabetes_complication_details1` json DEFAULT NULL COMMENT '糖尿病并发症详情(空腹血糖)',
  `diabetes_complication_other1` varchar(200) DEFAULT NULL COMMENT '糖尿病其他并发症说明(空腹血糖)',
  `glycated_hemoglobin` varchar(20) DEFAULT NULL COMMENT '糖化血红蛋白是否异常(是/否/不清楚)',
  `diabetes_years2` int DEFAULT NULL COMMENT '糖尿病确诊年数(糖化血红蛋白)',
  `diabetes_complication2` varchar(10) DEFAULT NULL COMMENT '糖尿病有无并发症(糖化血红蛋白)(有/无)',
  `diabetes_complication_details2` json DEFAULT NULL COMMENT '糖尿病并发症详情(糖化血红蛋白)',
  `diabetes_complication_other2` varchar(200) DEFAULT NULL COMMENT '糖尿病其他并发症说明(糖化血红蛋白)',
  `hyperlipidemia` varchar(10) DEFAULT NULL COMMENT '是否有高血脂(是/不清楚)',
  `hyperlipidemia_years` int DEFAULT NULL COMMENT '高血脂确诊年数',
  `hyperlipidemia_complication` varchar(10) DEFAULT NULL COMMENT '高血脂有无并发症(有/无)',
  `hyperlipidemia_complication_details` json DEFAULT NULL COMMENT '高血脂并发症详情',
  `hyperlipidemia_complication_other` varchar(200) DEFAULT NULL COMMENT '高血脂其他并发症说明',
  `plateau_disease` varchar(10) DEFAULT NULL COMMENT '是否有高原常见病(有/无)',
  `plateau_disease_details` json DEFAULT NULL COMMENT '高原常见病详情',
  `plateau_disease_other` varchar(200) DEFAULT NULL COMMENT '其他高原常见病说明',
  `treatments` json DEFAULT NULL COMMENT '治疗方式',
  `has_chronic_disease` varchar(10) DEFAULT NULL COMMENT '是否有慢性疾病如三高(有/无)',
  `disease_control_measures` json DEFAULT NULL COMMENT '疾病控制措施',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_hypertension` (`hypertension`),
  KEY `idx_hyperlipidemia` (`hyperlipidemia`),
  KEY `idx_plateau_disease` (`plateau_disease`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_user_id` (`user_id`) COMMENT '用户ID索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='老人慢性疾病信息表';

sys_elderly_depression_gds15

CREATE TABLE `sys_elderly_depression_gds15` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `question_1` int NOT NULL COMMENT '问题1得分(对生活满意:0=是,1=否)',
  `question_2` int NOT NULL COMMENT '问题2得分(放弃活动和兴趣:0=否,1=是)',
  `question_3` int NOT NULL COMMENT '问题3得分(感觉生活空虚:0=否,1=是)',
  `question_4` int NOT NULL COMMENT '问题4得分(经常感到无聊:0=否,1=是)',
  `question_5` int NOT NULL COMMENT '问题5得分(对未来充满希望:0=是,1=否)',
  `question_6` int NOT NULL COMMENT '问题6得分(被烦恼困扰:0=否,1=是)',
  `question_7` int NOT NULL COMMENT '问题7得分(感到快乐:0=是,1=否)',
  `question_8` int NOT NULL COMMENT '问题8得分(害怕不好的事情发生:0=否,1=是)',
  `question_9` int NOT NULL COMMENT '问题9得分(感到幸福:0=是,1=否)',
  `question_10` int NOT NULL COMMENT '问题10得分(感到无助:0=否,1=是)',
  `question_11` int NOT NULL COMMENT '问题11得分(容易坐立不安:0=否,1=是)',
  `question_12` int NOT NULL COMMENT '问题12得分(宁愿待在家里不愿外出:0=否,1=是)',
  `question_13` int NOT NULL COMMENT '问题13得分(对未来担忧:0=否,1=是)',
  `question_14` int NOT NULL COMMENT '问题14得分(记忆力明显变差:0=否,1=是)',
  `question_15` int NOT NULL COMMENT '问题15得分(活着很有意义:0=是,1=否)',
  `total_score` int NOT NULL COMMENT '总分(0-15分)',
  `depression_level` varchar(50) NOT NULL COMMENT '抑郁程度(无抑郁症状/轻度抑郁/中重度抑郁)',
  `clinical_significance` varchar(255) NOT NULL COMMENT '临床意义',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`) COMMENT '用户ID索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='老年人抑郁症GDS-15量表记录表';

sys_elderly_fallrisk

CREATE TABLE `sys_elderly_fallrisk` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` bigint DEFAULT NULL COMMENT '用户ID',
  `fall_history` tinyint(1) DEFAULT '0' COMMENT '跌倒史(0:否,10:是)',
  `balance_ability` tinyint DEFAULT '0' COMMENT '平衡能力(0:≥15秒,5:5-14秒,10:<5秒)',
  `gait_observation` tinyint DEFAULT '0' COMMENT '步态观察(0:无,5:轻度,10:显著)',
  `chronic_diseases` tinyint DEFAULT '0' COMMENT '慢性疾病数量得分(0,5,10,15)',
  `sedative_drugs` tinyint DEFAULT '0' COMMENT '镇静剂药物数量得分(0,3,6,9)',
  `diuretic_drugs` tinyint DEFAULT '0' COMMENT '利尿剂药物数量得分(0,2,4,6)',
  `cognitive_function` tinyint DEFAULT '0' COMMENT '认知功能(0:正常,3:轻度障碍,6:中重度)',
  `daily_activity` tinyint DEFAULT '0' COMMENT '日常活动能力(0:100分,3:61-99分,6:≤60分)',
  `lower_limb_strength` decimal(4,1) DEFAULT '0.0' COMMENT '下肢肌力得分(0,1.5,3,4.5)',
  `vision_disorder` decimal(4,1) DEFAULT '0.0' COMMENT '视力障碍(0:否,4.5:是)',
  `floor_slippery` tinyint DEFAULT '0' COMMENT '地面湿滑(0:无,3:有)',
  `clutter` tinyint DEFAULT '0' COMMENT '杂物堆积(0:无,3:有)',
  `poor_lighting` tinyint DEFAULT '0' COMMENT '照明不足(0:无,3:有)',
  `no_ramp` tinyint DEFAULT '0' COMMENT '无坡道/扶手(0:否,3:是)',
  `damaged_sidewalk` tinyint DEFAULT '0' COMMENT '人行道破损(0:否,3:是)',
  `screening_score` decimal(5,1) DEFAULT '0.0' COMMENT '初筛总分',
  `full_assessment_score` decimal(5,1) DEFAULT '0.0' COMMENT '综合评估总分',
  `total_score` decimal(5,1) DEFAULT '0.0' COMMENT '评估总分',
  `risk_level` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '风险等级(低风险/中风险/高风险)',
  `is_full_assessment` tinyint(1) DEFAULT '0' COMMENT '是否完成综合评估(0:否,1:是)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人',
  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '备注',
  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '0' COMMENT '删除标志(0:正常,1:删除)',
  PRIMARY KEY (`id`),
  KEY `idx_risk_level` (`risk_level`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_user_id` (`user_id`) COMMENT '用户ID索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='老年人跌倒风险评估表';

sys_elderly_family_info

CREATE TABLE `sys_elderly_family_info` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `father_alive` varchar(5) DEFAULT NULL COMMENT '父亲是否健在:是/否',
  `father_age` int DEFAULT NULL COMMENT '父亲年龄(健在时)',
  `father_death_age` int DEFAULT NULL COMMENT '父亲去世年龄',
  `father_death_reason` json DEFAULT NULL COMMENT '父亲死亡原因(JSON数组格式)',
  `father_death_reason_other` varchar(200) DEFAULT NULL COMMENT '父亲死亡其他原因说明',
  `mother_alive` varchar(5) DEFAULT NULL COMMENT '母亲是否健在:是/否',
  `mother_age` int DEFAULT NULL COMMENT '母亲年龄(健在时)',
  `mother_death_age` int DEFAULT NULL COMMENT '母亲去世年龄',
  `mother_death_reason` json DEFAULT NULL COMMENT '母亲死亡原因(JSON数组格式)',
  `mother_death_reason_other` varchar(200) DEFAULT NULL COMMENT '母亲死亡其他原因说明',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `deleted` tinyint(1) DEFAULT '0' COMMENT '逻辑删除标志:0-正常,1-已删除',
  PRIMARY KEY (`id`),
  KEY `idx_father_alive` (`father_alive`),
  KEY `idx_mother_alive` (`mother_alive`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_update_time` (`update_time`),
  KEY `idx_user_id` (`user_id`) COMMENT '用户ID索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='老年人家庭信息调查表';

sys_elderly_info

CREATE TABLE `sys_elderly_info` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `age` int NOT NULL COMMENT '年龄',
  `height` decimal(5,1) DEFAULT NULL COMMENT '身高(cm)',
  `weight` decimal(5,1) DEFAULT NULL COMMENT '体重(kg)',
  `bmi` decimal(4,1) DEFAULT NULL COMMENT 'BMI指数',
  `bmi_level` varchar(50) DEFAULT NULL COMMENT 'BMI等级',
  `education_background` varchar(50) NOT NULL COMMENT '学历',
  `residence` varchar(100) NOT NULL COMMENT '居住地',
  `residence_province` varchar(50) DEFAULT NULL COMMENT '居住省份',
  `residence_city` varchar(50) DEFAULT NULL COMMENT '居住城市',
  `residence_district` varchar(50) DEFAULT NULL COMMENT '居住区县',
  `permanent_residence` varchar(100) NOT NULL COMMENT '常住地',
  `permanent_province` varchar(50) DEFAULT NULL COMMENT '常住省份',
  `permanent_city` varchar(50) DEFAULT NULL COMMENT '常住城市',
  `permanent_district` varchar(50) DEFAULT NULL COMMENT '常住区县',
  `residence_type` varchar(50) NOT NULL COMMENT '现住地类型',
  `long_residence_type` varchar(50) NOT NULL COMMENT '长期居住地类型',
  `long_residence_other` varchar(100) DEFAULT NULL COMMENT '长期居住地其他说明',
  `occupation` varchar(50) NOT NULL COMMENT '退休前职业',
  `occupation_other` varchar(100) DEFAULT NULL COMMENT '其他职业说明',
  `income_range` varchar(50) NOT NULL COMMENT '去年总收入区间',
  `religious` varchar(30) NOT NULL COMMENT '宗教信仰',
  `religious_other` varchar(100) DEFAULT NULL COMMENT '其他宗教信仰说明',
  `hukou_type` varchar(30) NOT NULL COMMENT '户口类型',
  `marital_status` varchar(30) NOT NULL COMMENT '婚姻状态',
  `insurance` varchar(50) NOT NULL COMMENT '参保社会养老保险种类',
  `insurance_other` varchar(100) DEFAULT NULL COMMENT '其他养老保险类型说明',
  `insurance_type` varchar(50) NOT NULL COMMENT '参保社会医疗保险种类',
  `medical_insurance_other` varchar(100) DEFAULT NULL COMMENT '其他医疗保险类型说明',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`) COMMENT '用户ID索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='老年人基础信息采集表';

sys_elderly_lifestyle

CREATE TABLE `sys_elderly_lifestyle` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `smoking_status` varchar(20) DEFAULT NULL COMMENT '吸烟状态:从不吸烟/既往吸烟/被动吸烟(二手烟)/当前吸烟',
  `smoking_start_age` int DEFAULT NULL COMMENT '开始吸烟年龄',
  `smoking_cig_per_day` int DEFAULT NULL COMMENT '每日吸烟量(根)',
  `smoking_years` int DEFAULT NULL COMMENT '吸烟年限(年)',
  `smoking_quit_attempt` varchar(5) DEFAULT NULL COMMENT '戒烟尝试:有/无',
  `passive_smoke_years` int DEFAULT NULL COMMENT '被动吸烟暴露(年)',
  `drink_frequency` varchar(20) DEFAULT NULL COMMENT '饮酒频率:从不饮酒/偶尔饮酒/每天饮酒',
  `drink_amount_per_time` decimal(5,2) DEFAULT NULL COMMENT '每次饮酒量(两)',
  `drink_years` int DEFAULT NULL COMMENT '饮酒史(年)',
  `sleep_duration` varchar(20) DEFAULT NULL COMMENT '睡眠时长:8小时及以上/6-8小时/4-6小时/不到4小时',
  `sleep_satisfied` varchar(10) DEFAULT NULL COMMENT '睡眠满意度:满意/不满意',
  `sleep_affect_factors` json DEFAULT NULL COMMENT '影响睡眠因素(JSON数组)',
  `sleep_affect_factors_other` varchar(200) DEFAULT NULL COMMENT '睡眠影响因素其他说明',
  `activity_types` json DEFAULT NULL COMMENT '身体活动类型(JSON数组)',
  `activity_types_other` varchar(200) DEFAULT NULL COMMENT '身体活动类型其他说明',
  `weekly_activity` varchar(50) DEFAULT NULL COMMENT '每周身体活动:每天≥30分钟,每周≥5次身体活动/每天<30分钟/每周<5次身体活动',
  `sedentary_hours` varchar(20) DEFAULT NULL COMMENT '久坐时间:<4小时/4-8小时/>8小时',
  `sedentary_activities` json DEFAULT NULL COMMENT '久坐活动(JSON数组)',
  `sedentary_activities_other` varchar(200) DEFAULT NULL COMMENT '久坐活动其他说明',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `deleted` tinyint(1) DEFAULT '0' COMMENT '逻辑删除标志:0-正常,1-已删除',
  PRIMARY KEY (`id`),
  KEY `idx_smoking_status` (`smoking_status`),
  KEY `idx_drink_frequency` (`drink_frequency`),
  KEY `idx_sleep_duration` (`sleep_duration`),
  KEY `idx_sedentary_hours` (`sedentary_hours`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_update_time` (`update_time`),
  KEY `idx_user_id` (`user_id`) COMMENT '用户ID索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='老年人生活方式调查表';

sys_elderly_living_ability

CREATE TABLE `sys_elderly_living_ability` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `eating` int DEFAULT NULL COMMENT '进食得分',
  `bathing` int DEFAULT NULL COMMENT '洗澡得分',
  `personal_hygiene` int DEFAULT NULL COMMENT '个人卫生得分',
  `dressing` int DEFAULT NULL COMMENT '穿衣得分',
  `bowel_control` int DEFAULT NULL COMMENT '大便控制得分',
  `bladder_control` int DEFAULT NULL COMMENT '小便控制得分',
  `toileting` int DEFAULT NULL COMMENT '如厕得分',
  `transfer` int DEFAULT NULL COMMENT '床椅转移得分',
  `walking` int DEFAULT NULL COMMENT '平地行走得分',
  `stairs` int DEFAULT NULL COMMENT '上下楼梯得分',
  `total_score` int DEFAULT NULL COMMENT '总分',
  `ability_level` varchar(50) DEFAULT NULL COMMENT '生活能力等级',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`) COMMENT '用户ID索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='老年人自主生活能力评估表';

sys_elderly_medication

CREATE TABLE `sys_elderly_medication` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `long_term_medications` varchar(500) DEFAULT NULL COMMENT '长期服用的药物/保健品(JSON格式)',
  `other_medication` varchar(500) DEFAULT NULL COMMENT '其他药物说明',
  `anti_htn_type` varchar(50) DEFAULT NULL COMMENT '降血压药类型',
  `analgesic_type` varchar(50) DEFAULT NULL COMMENT '止痛药类型',
  `central_analgesics` varchar(500) DEFAULT NULL COMMENT '中枢止痛药(JSON格式)',
  `central_analgesic_other` varchar(500) DEFAULT NULL COMMENT '其他中枢止痛药说明',
  `nsaids` varchar(500) DEFAULT NULL COMMENT '解热镇痛抗炎药(JSON格式)',
  `nsaid_other` varchar(500) DEFAULT NULL COMMENT '其他解热镇痛抗炎药说明',
  `detailed_medications` text COMMENT '详细药物信息(JSON格式)',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`) COMMENT '用户ID索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='老年人用药信息表';

sys_health_reminder

CREATE TABLE `sys_health_reminder` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '提醒ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '提醒标题',
  `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '提醒类型(medicine:服药 exercise:运动 diet:饮食 rest:休息 other:其他)',
  `remind_time` time NOT NULL COMMENT '提醒时间',
  `is_repeat` tinyint DEFAULT '1' COMMENT '是否每天重复(0:否 1:是)',
  `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'pending' COMMENT '状态(pending:待执行 completed:已完成)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_remind_time` (`remind_time`),
  KEY `idx_user_status` (`user_id`,`status`),
  KEY `idx_user_type` (`user_id`,`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='健康提醒表';

sys_mental_examination

CREATE TABLE `sys_mental_examination` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `year_score` int DEFAULT NULL COMMENT '年份得分',
  `season_score` int DEFAULT NULL COMMENT '季节得分',
  `month_score` int DEFAULT NULL COMMENT '月份得分',
  `day_score` int DEFAULT NULL COMMENT '日期得分',
  `week_score` int DEFAULT NULL COMMENT '星期得分',
  `region_score` int DEFAULT NULL COMMENT '地区得分',
  `province_score` int DEFAULT NULL COMMENT '省份得分',
  `city_score` int DEFAULT NULL COMMENT '城市得分',
  `street_score` int DEFAULT NULL COMMENT '街道/社区得分',
  `floor_hospital_score` int DEFAULT NULL COMMENT '楼层/医院得分',
  `immediate_memory_score` int DEFAULT NULL COMMENT '即刻记忆得分',
  `delayed_memory_score` int DEFAULT NULL COMMENT '延时记忆得分',
  `subtract_seven_score` int DEFAULT NULL COMMENT '连续减7得分',
  `name_pencil_score` int DEFAULT NULL COMMENT '铅笔命名得分',
  `name_watch_score` int DEFAULT NULL COMMENT '手表命名得分',
  `repeat_sentence_score` int DEFAULT NULL COMMENT '复述句子得分',
  `reading_comprehension_score` int DEFAULT NULL COMMENT '阅读理解得分',
  `writing_ability_score` int DEFAULT NULL COMMENT '书写能力得分',
  `graph_imitation_score` int DEFAULT NULL COMMENT '图形模仿得分',
  `draw_clock_score` int DEFAULT NULL COMMENT '画钟试验得分',
  `total_score` int DEFAULT NULL COMMENT '总分',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`) COMMENT '用户ID索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='简易智力状态检查记录表';

sys_user_type_profile

CREATE TABLE `sys_user_type_profile` (
  `profile_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` bigint DEFAULT NULL COMMENT '系统用户ID',
  `user_name` varchar(30) NOT NULL COMMENT '系统用户名',
  `phone_number` varchar(20) DEFAULT NULL COMMENT '手机号(可选)',
  `user_type` varchar(20) NOT NULL COMMENT '用户类型:elderly/volunteer/dependent',
  `sync_source` varchar(30) DEFAULT 'app' COMMENT '来源标识',
  `remark` varchar(200) DEFAULT NULL,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`profile_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='移动端用户类型映射表';

user_intervention_tag

CREATE TABLE `user_intervention_tag` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `tag_code` varchar(64) NOT NULL COMMENT '标签编码',
  `tag_value` varchar(200) DEFAULT NULL COMMENT '标签值',
  `source_form` varchar(64) DEFAULT NULL COMMENT '来源表单',
  `expire_time` datetime DEFAULT NULL COMMENT '失效时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_intervention_user` (`user_id`),
  KEY `idx_user_intervention_tag` (`tag_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户干预标签表';

video_asset

CREATE TABLE `video_asset` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `title` varchar(200) NOT NULL COMMENT '标题',
  `description` varchar(1000) DEFAULT NULL COMMENT '简介',
  `category_code` varchar(64) NOT NULL COMMENT '分类编码',
  `object_key` varchar(255) DEFAULT NULL COMMENT 'OSS视频对象key',
  `cover_object_key` varchar(255) DEFAULT NULL COMMENT 'OSS封面对象key',
  `source_url` varchar(500) DEFAULT NULL COMMENT '视频源地址',
  `cover_url` varchar(500) DEFAULT NULL COMMENT '封面地址',
  `duration_seconds` int DEFAULT NULL COMMENT '时长(秒)',
  `file_size` bigint DEFAULT NULL COMMENT '文件大小',
  `content_type` varchar(100) DEFAULT NULL COMMENT '文件类型',
  `status` varchar(20) DEFAULT 'draft' COMMENT '状态(draft/published/offline)',
  `visibility_type` varchar(20) DEFAULT 'public' COMMENT '可见范围(public/targeted)',
  `audience_types` varchar(200) DEFAULT NULL COMMENT '适用用户类型,逗号分隔',
  `sort_order` int DEFAULT '0' COMMENT '排序',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_video_asset_category` (`category_code`),
  KEY `idx_video_asset_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='视频资源表';

video_asset_tag

CREATE TABLE `video_asset_tag` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `video_id` bigint NOT NULL COMMENT '视频ID',
  `tag_code` varchar(64) NOT NULL COMMENT '标签编码',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_video_asset_tag` (`video_id`,`tag_code`),
  KEY `idx_video_asset_tag_code` (`tag_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='视频标签关联表';

video_category

CREATE TABLE `video_category` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `category_code` varchar(64) NOT NULL COMMENT '分类编码',
  `category_name` varchar(128) NOT NULL COMMENT '分类名称',
  `parent_id` bigint DEFAULT '0' COMMENT '父级ID',
  `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
  `sort_order` int DEFAULT '0' COMMENT '排序',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_video_category_code` (`category_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='视频分类表';

video_recommend_record

CREATE TABLE `video_recommend_record` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `video_id` bigint NOT NULL COMMENT '视频ID',
  `rule_code` varchar(64) DEFAULT NULL COMMENT '规则编码',
  `recommend_reason` varchar(500) DEFAULT NULL COMMENT '推荐原因',
  `recommend_status` varchar(20) DEFAULT 'active' COMMENT '推荐状态',
  `is_read` char(1) DEFAULT '0' COMMENT '是否已读(0否 1是)',
  `read_time` datetime DEFAULT NULL COMMENT '阅读时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_video_recommend` (`user_id`,`video_id`),
  KEY `idx_video_recommend_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='视频推荐记录表';

video_tag

CREATE TABLE `video_tag` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `tag_code` varchar(64) NOT NULL COMMENT '标签编码',
  `tag_name` varchar(128) NOT NULL COMMENT '标签名称',
  `tag_type` varchar(64) DEFAULT 'intervention' COMMENT '标签类型',
  `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_video_tag_code` (`tag_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='视频标签表';

volunteer_info

CREATE TABLE `volunteer_info` (
  `volunteer_id` bigint NOT NULL AUTO_INCREMENT COMMENT '志愿者ID',
  `user_id` bigint NOT NULL COMMENT '关联用户ID',
  `real_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '真实姓名',
  `gender` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '性别(0男 1女)',
  `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '手机号码',
  `id_card` varchar(18) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '身份证号',
  `birth_date` date DEFAULT NULL COMMENT '出生日期',
  `address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '住址',
  `occupation` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '职业',
  `education` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '学历',
  `skills` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '技能特长',
  `service_areas` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '服务区域',
  `available_time` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '可服务时间',
  `service_experience` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '服务经验',
  `motivation` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '服务动机',
  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态(0正常 1停用)',
  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`volunteer_id`) USING BTREE,
  UNIQUE KEY `uk_user_id` (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='志愿者信息表';

sys_user

CREATE TABLE `sys_user` (
  `user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `dept_id` bigint DEFAULT NULL COMMENT '部门ID',
  `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户账号',
  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户邮箱',
  `phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机号码',
  `avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '头像地址',
  `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '密码',
  `real_name` varchar(30) DEFAULT '' COMMENT '真实姓名',
  `id_card_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '身份证号',
  `id_card_birth` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '身份证出生日期',
  `sex` char(1) DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
  `id_card_nation` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '民族',
  `id_card_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '身份证住址',
  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '账号状态(0正常 1停用)',
  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
  `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '最后登录IP',
  `login_date` datetime DEFAULT NULL COMMENT '最后登录时间',
  `pwd_update_date` datetime DEFAULT NULL COMMENT '密码最后更新时间',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户信息表';

附录 C. 字典与视频初始化语义

字典 label/value 直接从旧 SQL 提取,不带旧 ID 和审计字段。value 含中文时不要自动换成数字。目标字典接口的数据形状和类型必须另行适配。

字典类型 名称 旧 value → label
sys_user_sex 用户性别 0 → 男;1 → 女;2 → 未知
sys_show_hide 菜单状态 0 → 显示;1 → 隐藏
sys_normal_disable 系统开关 0 → 正常;1 → 停用
sys_job_status 任务状态 0 → 正常;1 → 暂停
sys_job_group 任务分组 DEFAULT → 默认;SYSTEM → 系统
sys_yes_no 系统是否 Y → 是;N → 否
sys_notice_type 通知类型 1 → 通知;2 → 公告
sys_notice_status 通知状态 0 → 正常;1 → 关闭
sys_oper_type 操作类型 1 → 新增;2 → 修改;3 → 删除;4 → 授权;5 → 导出;6 → 导入;7 → 强退;8 → 生成代码;9 → 清空数据;0 → 其他
sys_common_status 系统状态 0 → 成功;1 → 失败
q_type 题目类型 single → 单选;multi → 多选;fill → 填空;subjective → 主观评价
difficulty_level 难易程度 easy → 简单;medium → 中等;hard → 困难
role 角色 volunteer → 志愿者;other → 其他非被调查者
is_cohabiting 是否与被调查人同住 Y → 是;N → 否
gender 性别 M → 男;F → 女;O → 其他
education_level 学历 小学 → 小学;初中 → 初中;高中/中专 → 高中/中专;大专 → 大专;本科 → 本科;硕士 → 硕士;博士 → 博士
marital_status 婚姻状态 未婚 → 未婚;已婚 → 已婚;离异 → 离异;丧偶 → 丧偶
social_security 社保类型 城镇职工 → 城镇职工;城乡居民 → 城乡居民;新农合 → 新农合;商业保险 → 商业保险;无 → 无
annual_income 收入 0没有收入 → 0没有收入;少于2千元 → 少于2千元;2千与5千之间 → 2千与5千之间;5千与1万之间 → 5千与1万之间;1万与2万之间 → 1万与2万之间;2万与3万之间 → 2万与3万之间;3万以上 → 3万以上
hukou_type 户口类型 农业 → 农业;非农业 → 非农业;居民 → 居民
parent_status 是否健在 健在 → 健在;已故 → 已故
obesity_screening 筛查肥胖 18.5-21.9 → 18.5-21.9;22-23.9 → 22-23.9;24-27.9 → 24-27.9;≥28 → ≥28
smoking_status 吸烟状态 从不吸烟 → 从不吸烟;既往吸烟 → 既往吸烟;被动吸烟 → 被动吸烟;当前吸烟 → 当前吸烟
quit_smoking_attempt 是否有戒烟尝试 有 → 有;无 → 无
drinking_frequency 饮酒频率 从不饮酒 → 从不饮酒;偶尔饮酒 → 偶尔饮酒;每天饮酒 → 每天饮酒
sleep_duration 睡眠时长 8小时及以上 → 8小时及以上;6-8小时 → 6-8小时;4-6小时 → 4-6小时;不到4小时 → 不到4小时
sleep_satisfaction 对睡眠质量是否满意 满意 → 满意;不满意 → 不满意
sleep_issues 影响睡眠的主要因素 高原缺氧 → 高原缺氧;环境噪音 → 环境噪音;夜间排尿频繁 → 夜间排尿频繁;身体疼痛 → 身体疼痛;焦虑/抑郁 → 焦虑/抑郁;很难入睡 → 很难入睡;容易惊醒 → 容易惊醒;睡眠表浅 → 睡眠表浅;生物节律紊乱 → 生物节律紊乱;其他 → 其他
exercise_types 常进行的身体活动类型 散步/快走(低强度) → 散步/快走(低强度);家务(中强度) → 家务(中强度);广场舞/健身操(中强度) → 广场舞/健身操(中强度);柔韧性拉伸(如拉筋、瑜伽)(中强度) → 柔韧性拉伸(如拉筋、瑜伽)(中强度);骑自行车(中强度) → 骑自行车(中强度);太极拳/八段锦/气功(中强度) → 太极拳/八段锦/气功(中强度);骑马(高强度) → 骑马(高强度);器械训练(高强度) → 器械训练(高强度);游泳(高强度) → 游泳(高强度);其他 → 其他
exercise_frequency 每周身体活动情况 每天≥30分钟,每周≥5次身体活动 → 每天≥30分钟,每周≥5次身体活动;每天<30分钟 → 每天<30分钟;每周<5次身体活动 → 每周<5次身体活动;久坐 → 久坐
sedentary_duration 每天久坐或卧躺累计时间 <4小时 → <4小时;4-8小时 → 4-8小时;>8小时 → >8小时
sedentary_activities 久坐时常做的事情 看电视/听广播 → 看电视/听广播;玩手机(看小说/刷视频/打游戏) → 玩手机(看小说/刷视频/打游戏);静躺/坐聊天 → 静躺/坐聊天;做手工 → 做手工;打麻将/打牌 → 打麻将/打牌;其他 → 其他
has_hypertension 是否有高血压 是 → 是;否/不清楚 → 否/不清楚
hypertension_complication 高血压有无并发症 有 → 有;无 → 无;不清楚 → 不清楚
hypertension_complication_types 高血压并发症类型 心血管并发症 → 心血管并发症;脑血管并发症 → 脑血管并发症;肾血管并发症 → 肾血管并发症;眼部并发症 → 眼部并发症;其他 → 其他
has_diabetes 是否有糖尿病 是 → 是;否/不清楚 → 否/不清楚
diabetes_complication 糖尿病有无并发症 有 → 有;无 → 无
diabetes_complication_types 糖尿病并发症类型 糖尿病足并发症 → 糖尿病足并发症;酮症酸中毒并发症 → 酮症酸中毒并发症;低血糖并发症 → 低血糖并发症;眼部并发症 → 眼部并发症;心脑血管并发症 → 心脑血管并发症;肾血管并发症 → 肾血管并发症;糖尿病神经系统病变 → 糖尿病神经系统病变;其他 → 其他
hba1c_diabetes 糖化血红蛋白≥6.5%是否确诊糖尿病 是 → 是;否/不清楚 → 否/不清楚
hba1c_complication 糖化血红蛋白糖尿病有无并发症 有 → 有;无 → 无
hba1c_complication_types 糖化血红蛋白糖尿病并发症类型 糖尿病足并发症 → 糖尿病足并发症;酮症酸中毒并发症 → 酮症酸中毒并发症;低血糖并发症 → 低血糖并发症;眼部并发症 → 眼部并发症;心脑血管并发症 → 心脑血管并发症;肾血管并发症 → 肾血管并发症;糖尿病神经系统病变 → 糖尿病神经系统病变;其他 → 其他
has_hyperlipidemia 是否有高血脂 是 → 是;不清楚 → 不清楚
hyperlipidemia_complication 高血脂有无并发症 有 → 有;无 → 无
hyperlipidemia_complication_types 高血脂并发症类型 心血管并发症 → 心血管并发症;脑血管并发症 → 脑血管并发症;脂肪肝 → 脂肪肝;血管性痴呆 → 血管性痴呆;其他 → 其他
has_highland_diseases 是否有高原常见病 无 → 无;有 → 有
highland_diseases 高原常见病(可多选) 冠心病 → 冠心病;红细胞增多症 → 红细胞增多症;肺动脉高压 → 肺动脉高压;贫血 → 贫血;右心衰 → 右心衰;中风(缺血性中风、出血性中风) → 中风(缺血性中风、出血性中风);包虫病 → 包虫病;骨质疏松 → 骨质疏松;颈肩腰背疼痛 → 颈肩腰背疼痛;大骨节病 → 大骨节病;视力问题(白内障、青光眼) → 视力问题(白内障、青光眼);跌倒史 → 跌倒史;睡眠障碍 → 睡眠障碍;癌症 → 癌症;低血压 → 低血压
highland_treatment_status 高原病是否接受正规治疗 药物 → 药物;手术 → 手术;未治疗 → 未治疗
long_term_medications 长期服用的药物或保健品 降血压药 → 降血压药;中药 → 中药;藏药 → 藏药;降血糖药 → 降血糖药;降血脂药 → 降血脂药;抗心绞痛药 → 抗心绞痛药;止痛药 → 止痛药;镇静催眠药 → 镇静催眠药;抗精神病药 → 抗精神病药;抗抑郁药 → 抗抑郁药;抗帕金森药 → 抗帕金森药;抗阿兹海默症药 → 抗阿兹海默症药;解热镇痛抗炎药 → 解热镇痛抗炎药;抗痛风药 → 抗痛风药;抗肿瘤药 → 抗肿瘤药;维生素或微量元素补充剂等营养补充产品 → 维生素或微量元素补充剂等营养补充产品;鱼油、卵磷脂等功能保健食品 → 鱼油、卵磷脂等功能保健食品;褪黑素等助眠剂 → 褪黑素等助眠剂;中药或藏药等药食同源保健品 → 中药或藏药等药食同源保健品;其他 → 其他
analgesic_type 服用的止痛药类型 西药类 → 西药类;中药 → 中药;藏药类 → 藏药类;中枢止痛药 → 中枢止痛药
central_analgesics 服用的中枢止痛药 吗啡 → 吗啡;杜冷丁 → 杜冷丁;哌替啶 → 哌替啶;纳洛酮 → 纳洛酮;美沙酮 → 美沙酮;喷他佐辛 → 喷他佐辛;其他 → 其他
antipyretic_analgesics 具体服用的解热镇痛抗炎药 阿司匹林 → 阿司匹林;布洛芬(又称美林、芬必得) → 布洛芬(又称美林、芬必得);双氯芬酸 → 双氯芬酸;贝诺脂 → 贝诺脂;吲哚美辛 → 吲哚美辛;扑热息痛(对乙酰氨基酚) → 扑热息痛(对乙酰氨基酚);美洛昔康 → 美洛昔康;普奈生 → 普奈生;糖皮质激素类 → 糖皮质激素类;其他 → 其他
chronic_control_measures 慢性疾病控制措施 规律服药 → 规律服药;限制饮食(低盐低糖低脂饮食) → 限制饮食(低盐低糖低脂饮食);定期复查 → 定期复查;改善不良生活习惯(如少吃多动) → 改善不良生活习惯(如少吃多动);无措施 → 无措施

视频 SQL 当前初始化分类:

code 名称 状态
balance 平衡训练 0
stretch 拉伸训练 0
cardio 有氧训练 0

视频 SQL 当前初始化标签(比 Service 可生成的标签少,需要补齐缺项):

code 名称 类型 状态
fall_risk_high 高跌倒风险 intervention 0
low_intensity_needed 需低强度训练 intervention 0
hypertension 高血压干预 intervention 0

附录 D. 移动端页面及量表题项备查

D.1 注册页面入口

直接提取 A/pages.json 中注册的路径和标题;源码文件存在不代表所有跳转都有效。

注册路径 标题 文件存在
pages/login 登录 是
pages/register 注册 是
pages/volunteers/index 志愿者首页 是
pages/volunteers/work/index 服务管理 是
pages/volunteers/work/task/index 服务工单 是
pages/volunteers/work/clockin/index 扫码打卡 是
pages/volunteers/work/rating/index 星级评价 是
pages/volunteers/work/report/index 服务报告 是
pages/volunteers/study/index 知识学习 是
pages/volunteers/study/video/index 培训视频 是
pages/volunteers/study/exam/index 技能考核 是
pages/volunteers/community/index 社区互动 是
pages/volunteers/community/forum/index 志愿者论坛 是
pages/volunteers/community/ranking/index 排行榜 是
pages/volunteers/mine/index 个人中心 是
pages/volunteers/mine/setting/index 应用设置 是
pages/volunteers/mine/pwd/index 修改密码 是
pages/volunteers/mine/info/index 个人信息 是
pages/volunteers/mine/help/index 常见问题 是
pages/elderly/index 高原银龄e健航 是
pages/elderly/work/index 服务台 是
pages/elderly/work/survey_fill/index 问卷填写 是
pages/elderly/work/survey_fill/basic_info 个人信息采集表 是
pages/elderly/work/survey_fill/chronic_info 个人信息采集 是
pages/elderly/work/survey_fill/lifestyle 个人信息采集 是
pages/elderly/work/survey_fill/medication_info 个人信息采集 是
pages/elderly/work/survey_fill/family_info 个人信息采集 是
pages/elderly/work/survey_fill/intelligence 简易智力状态检查表 是
pages/elderly/work/survey_fill/GDS15 抑郁症GDS-15量表 是
pages/elderly/work/survey_fill/fallrisk 跌倒风险筛查表 是
pages/elderly/work/survey_fill/nutrition 营养不良评估表 是
pages/elderly/work/survey_fill/living_ability 老年人自主生活能力评估表 是
pages/elderly/work/survey_analysis/index 问卷分析 是
pages/elderly/work/survey_analysis/detail 问卷分析 是
pages/elderly/work/health_intervention/index 健康干预 是
pages/elderly/work/health_intervention/user_profile 用户画像 是
pages/elderly/work/health_intervention/exercise_prescription 运动处方 是
pages/elderly/work/health_intervention/screening_questionnaire 健康筛查问卷 是
pages/elderly/work/health_intervention/video 运动干预视频教学 是
pages/elderly/work/health_intervention/health_monitor 健康运动记录 是
pages/elderly/work/health_intervention/dietary_advice 饮食建议 是
pages/elderly/work/health_intervention/medication_reminder 用药提醒 是
pages/elderly/work/psychological_support/index 心理社交支持 是
pages/elderly/work/family_monitor/index 家庭监护门户 是
pages/elderly/work/volunteer_empowerment/index 志愿者赋能 是
pages/elderly/mine/index 我的 是
pages/elderly/mine/avatar/index 修改头像 是
pages/elderly/mine/info/index 个人信息 是
pages/elderly/mine/info/edit 编辑资料 是
pages/elderly/mine/data/index 个人资料 是
pages/elderly/mine/pwd/index 修改密码 是
pages/elderly/mine/setting/index 应用设置 是
pages/elderly/mine/help/index 常见问题 是
pages/elderly/mine/about/index 关于我们 是
pages/elderly/common/webview/index 浏览网页 是
pages/elderly/common/textview/index 浏览文本 是
pages/dependents/index 家属首页 是
pages/dependents/work/index 服务台 是
pages/dependents/mine/index 我的 是
pages/dependents/mine/info/index 我的 是
pages/dependents/mine/avatar/index 修改头像 是
pages/dependents/addRelation 添加关系 是
pages/dependents/elderlyDetail 老人详情 是
pages/dependents/questionnaire 问卷列表 是
pages/dependents/questionnaireDetail 问卷详情 是

D.2 GDS15 题目和反向计分

来源:A/pages/elderly/work/survey_fill/GDS15.vue 的 questions。

字段 题目 0 分 1 分
question1 对生活满意 是(0分) 否(1分)
question2 放弃活动和兴趣 否(0分) 是(1分)
question3 感觉生活空虚 否(0分) 是(1分)
question4 经常感到无聊 否(0分) 是(1分)
question5 对未来充满希望 是(0分) 否(1分)
question6 被烦恼困扰 否(0分) 是(1分)
question7 感到快乐 是(0分) 否(1分)
question8 害怕不好的事情发生 否(0分) 是(1分)
question9 感到幸福 是(0分) 否(1分)
question10 感到无助 否(0分) 是(1分)
question11 容易坐立不安 否(0分) 是(1分)
question12 宁愿待在家里不愿外出 否(0分) 是(1分)
question13 对未来担忧 否(0分) 是(1分)
question14 记忆力明显变差 否(0分) 是(1分)
question15 活着很有意义 是(0分) 否(1分)

D.3 living_ability.vue 的单项分值

页面以数字输入计分,限制整数和各项最大值,但没有仅允许说明中的离散分值;新服务端须定义是否严格校验到 0/5/10/15。最大值累计 100。

字段 页面允许范围 题项说明与标准分值
eating 0~10 整数 1. 进食(独立完成(无辅助工具或帮助)(分值范围10分),需部分帮助(如切食物、摆盘)(分值范围5分),全依赖他人(分值范围0分))
bathing 0~5 整数 2. 洗澡(独立完成(包括进出浴缸、擦洗身体)(分值范围5分),需他人帮助(分值范围0分))
personalHygiene 0~5 整数 3. 个人卫生(独立完成洗脸、刷牙、梳头等(分值范围5分),需他人帮助(分值范围0分))
dressing 0~10 整数 4. 穿衣(独立完成(包括系扣子、拉拉链)(分值范围10分),需部分帮助(穿鞋袜)(分值范围5分),完全依赖他人(分值范围0分))
bowelControl 0~10 整数 5. 大便控制(完全自主控制,无失禁(分值范围10分),偶有失禁(每周<1次)(分值范围5分),完全失禁或需他人处理(分值范围0分))
bladderControl 0~10 整数 6. 小便控制(完全自主控制,无失禁(分值范围10分),偶有失禁(每周<1次)(分值范围5分),完全失禁或需他人处理(分值范围0分))
toileting 0~10 整数 7. 如厕(独立完成(包括擦拭、穿脱衣裤、使用便盆)(分值范围10分),需部分帮助(如扶稳身体)(分值范围5分),完全依赖他人(分值范围0分))
transfer 0~15 整数 8. 床椅转移(独立完成(包括使用轮椅或助行器)(分值范围15分),需部分帮助(如搀扶或口头指导)(分值范围10分),需两人帮助或使用机械辅助(分值范围5分),完全无法移动(分值范围0分))
walking 0~15 整数 9. 平地行走(≥45米)(独立完成(可使用助行器)(分值范围15分),需部分帮助(如搀扶)(分值范围10分),仅能轮椅移动(分值范围5分),完全依赖他人(分值范围0分))
stairs 0~10 整数 10. 上下楼梯(独立完成(可使用扶手或辅助工具)(分值范围10分),需部分帮助(如搀扶或口头指导),无法完成(分值范围0分))

D.3 fallrisk.vue 的单项分值

来源:页面 radio-group 的实际选项。以下只是题项值快照,展示/跳题条件以正文和源码为准。

字段 value → 选项文字
fallHistory 0 → 否 (0分);10 → 是 (10分)
balanceAbility 0 → ≥15秒 (0分);5 → 5-14秒 (5分);10 → <5秒或无法完成 (10分)
gaitObservation 0 → 无 (0分);5 → 轻度 (5分);10 → 显著 (10分)
chronicDiseases 0 → 0种 (0分);5 → 1种 (5分);10 → 2种 (10分);15 → ≥3种 (15分)
sedativeDrugs 0 → 0种 (0分);3 → 1种 (3分);6 → 2种 (6分);9 → ≥3种 (9分)
diureticDrugs 0 → 0种 (0分);2 → 1种 (2分);4 → 2种 (4分);6 → ≥3种 (6分)
cognitiveFunction 0 → 正常 (0分);3 → 轻度障碍 (3分);6 → 中重度 (6分)
dailyActivity 0 → 100分 (0分);3 → 61-99分 (3分);6 → ≤60分 (6分)
lowerLimbStrength 0 → ≥12次(男)/≥10次(女)(0分);1.5 → 减少2次 (1.5分);3 → 减少4次 (3分);4.5 → 减少6次 (4.5分)
visionDisorder 0 → 否 (0分);4.5 → 是 (4.5分)
floorSlippery 0 → 地面湿滑:无 (0分);3 → 地面湿滑:有 (3分)
clutter 0 → 杂物堆积:无 (0分);3 → 杂物堆积:有 (3分)
poorLighting 0 → 照明不足:无 (0分);3 → 照明不足:有 (3分)
noRamp 0 → 否 (0分);3 → 是 (3分)
damagedSidewalk 0 → 否 (0分);3 → 是 (3分)

D.3 nutrition.vue 的单项分值

来源:页面 radio-group 的实际选项。以下只是题项值快照,展示/跳题条件以正文和源码为准。

字段 value → 选项文字
weightChange 0 → >3kg (0分);1 → 不知道 (1分);2 → 1-3kg (2分);3 → 无体重下降 (3分)
bmi 0 → <18.5 (0分);1 → 18.5-21.9 (1分);2 → 22-27.9 (2分);3 → ≥28 (3分)
activityAbility 0 → 卧床/轮椅 (0分);1 → 需辅助工具 (1分);2 → 可自主外出 (2分)
acuteIllness 0 → 是 (0分);2 → 否 (2分)
cognitiveStatus 0 → 严重痴呆 (0分);1 → 轻度痴呆 (1分);2 → 无 (2分)
calfCircumference1 0 → <31 (0分);2 → ≥31 (2分)
armCircumference 0 → <21cm (0分);0.5 → 21-21.9cm (0.5分);1 → ≥22cm (1分)
calfCircumference2 0 → <31cm (0分);1 → ≥31cm (1分)
lifestyle 0 → 否(与家人同住) (0分);1 → 是(独居) (1分)
medication 0 → ≥3种 (0分);1 → 1-3种 (1分);2 → 不用药 (2分)
skinLesions 0 → 是 (0分);1 → 否 (1分)
mealFrequency 0 → 1餐 (0分);1 → 2餐 (1分);2 → 3餐 (2分)
proteinIntake 0 → 0-1种 (0分);1 → ≥2种 (1分)
fruitVegIntake 0 → 否 (0分);1 → 是 (1分)
fluidIntake 0 → <3杯 (0分);0.5 → 3-5杯 (0.5分);1 → >5杯 (1分)
eatingAbility 0 → 无法自主进食 (0分);1 → 需部分协助 (1分);2 → 自主进食 (2分)
healthSelfAssessment 0 → 不如同龄人 (0分);0.5 → 不确定 (0.5分);1 → 一样或更好 (1分)
nutritionSelfAssessment 0 → 营养不良 (0分);1 → 不确定 (1分);2 → 无问题 (2分)

D.4 认知检查字段编号与输入最大值

来源:intelligence.vue 的 validateInput 与提交映射。未指定 max 参数的题项使用默认 1;各项累计最大 30 分,与页面上限一致。输入限制是前端行为,后端需重新验证。

编号 输入最大值 提交字段
1 1 yearScore
2 1 seasonScore
3 1 monthScore
4 1 dayScore
5 1 weekScore
6 1 regionScore
7 1 provinceScore
8 1 cityScore
9 1 streetScore
10 1 floorHospitalScore
11 3 immediateMemoryScore
12 3 delayedMemoryScore
13 5 subtractSevenScore
14 1 namePencilScore
15 1 nameWatchScore
16 1 repeatSentenceScore
17 1 readingComprehensionScore
18 1 writingAbilityScore
19 1 graphImitationScore
20 3 drawClockScore

D.5 管理端定制页面文件

源码路径(U 下) 状态
src/views/division/division/index.vue 有源码
src/views/guidance/guidance/index.vue 有源码
src/views/system/advice/index.vue 有源码
src/views/system/chronic/index.vue 有源码
src/views/system/dependent/index.vue 有源码
src/views/system/elderlyDepressionGds15/index.vue 有源码
src/views/system/elderlyLivingAbility/index.vue 有源码
src/views/system/elderlyNutrition/index.vue 有源码
src/views/system/elderlyinfo/index.vue 有源码
src/views/system/elevation/index.vue 有源码
src/views/system/examination/index.vue 有源码
src/views/system/fallrisk/index.vue 有源码
src/views/system/info/index.vue 有源码
src/views/system/lifestyle/index.vue 有源码
src/views/system/medication/index.vue 有源码
src/views/system/mentalExamination/index.vue 有源码
src/views/system/prescription/index.vue 有源码
src/views/system/profile/index.vue 有源码
src/views/system/records/index.vue 有源码
src/views/system/reminder/index.vue 空文件
src/views/video/asset/index.vue 有源码
src/views/video/category/index.vue 有源码
src/views/video/record/index.vue 有源码
src/views/video/tag/index.vue 有源码

附录 E. 当前移动端运动/饮食知识库源码快照

两份 JS 是当前移动端实际用的静态内容与选取逻辑,完整保留在下面,不包含账号或密钥。它们是旧实现证据,不表示文中医学表述已校验;迁移可据此生成业务初始化数据与规则,随后与数据库版本比对。正文指出的 COPD 未赋值、多选 JSON 兼容等问题仍然存在。

A/utils/exercisePrescription.js

/**
 * 高原地区老年人运动处方知识库
 * 根据用户的健康状况(高血压、冠心病、癌症、BMI等)生成个性化运动处方
 */

// 运动处方类型枚举
export const PrescriptionType = {
  GENERAL: 'general',           // 一般老年人
  HYPERTENSION: 'hypertension', // 高血压
  CORONARY: 'coronary',         // 冠心病
  DIABETES: 'diabetes',         // 糖尿病
  COPD: 'copd',                 // 慢性阻塞性肺疾病
  OSTEOPOROSIS: 'osteoporosis', // 骨质疏松
  OBESITY: 'obesity',           // 肥胖
  CANCER: 'cancer',             // 癌症
  BALANCE: 'balance'            // 平衡能力训练
}

// 运动处方知识库
export const exercisePrescriptions = {
  // 1. 高原地区一般老年人运动处方
  [PrescriptionType.GENERAL]: {
    title: '高原地区老年人运动处方',
    description: '适合高原地区一般老年人的基础运动方案',
    categories: [
      {
        name: '有氧运动',
        items: [
          { label: '频率', value: '中等强度每周5天,较大强度每周3天,或结合运动每周3-5天' },
          { label: '强度', value: '中小强度(最大运动心率的30%-70%),RPE 12-14(稍累)' },
          { label: '时间', value: '每次20-30分钟,中等强度每天≥30-60分钟' },
          { label: '方式', value: '步行、太极拳、水上项目等' }
        ]
      },
      {
        name: '力量训练',
        items: [
          { label: '频率', value: '每周≥2天' },
          { label: '强度', value: '低强度(40%-50%重复次数)或中等强度(60%-70%)' },
          { label: '时间', value: '每天≥30-60分钟' },
          { label: '方式', value: '渐进式负重、爬楼梯、大肌群训练' }
        ]
      },
      {
        name: '柔韧性训练',
        items: [
          { label: '频率', value: '每周≥2天' },
          { label: '强度', value: '拉伸至拉紧或轻微不适' },
          { label: '时间', value: '每次保持30-60秒' },
          { label: '方式', value: '静力性拉伸各大肌群' }
        ]
      }
    ],
    warnings: [
      '运动前请咨询医生',
      '注意高原反应,循序渐进',
      '出现不适立即停止运动'
    ]
  },

  // 2. 高原地区高血压患者运动处方
  [PrescriptionType.HYPERTENSION]: {
    title: '高原地区高血压患者运动处方',
    description: '针对高血压患者的安全运动方案',
    categories: [
      {
        name: '有氧运动',
        items: [
          { label: '频率', value: '每周≥5-7天' },
          { label: '强度', value: '中小强度(最大心率30%-70%)' },
          { label: '时间', value: '每次30-60分钟' },
          { label: '方式', value: '快走、慢跑、爬楼梯、骑自行车' }
        ]
      },
      {
        name: '力量练习',
        items: [
          { label: '频率', value: '每周2-3天' },
          { label: '强度', value: '中等强度(60%-70%重复次数)' },
          { label: '时间', value: '每次≥30-60分钟' },
          { label: '方式', value: '哑铃推举、坐姿、站姿划船、蹲起、箭步蹲' }
        ]
      }
    ],
    warnings: [
      '避免憋气和过度用力',
      '监测血压变化',
      '避免清晨剧烈运动',
      '服药后1-2小时再运动'
    ]
  },

  // 3. 高原地区冠心病患者运动处方
  [PrescriptionType.CORONARY]: {
    title: '高原地区冠心病患者运动处方',
    description: '针对冠心病患者的康复运动方案',
    categories: [
      {
        name: '有氧运动',
        items: [
          { label: '频率', value: '每周3-5天' },
          { label: '强度', value: '小负荷,心率100-110次每分钟' },
          { label: '时间', value: '每次30-60分钟' },
          { label: '方式', value: '步行(快慢走)、慢跑、骑车、爬山、舞蹈' }
        ]
      },
      {
        name: '力量练习',
        items: [
          { label: '频率', value: '每周3次' },
          { label: '强度', value: '小负荷(40%-50%)' },
          { label: '时间', value: '每次≥30-60分钟' },
          { label: '方式', value: '哑铃推举、墙壁俯卧撑' }
        ]
      }
    ],
    warnings: [
      '必须在医生指导下进行',
      '随身携带硝酸甘油',
      '避免寒冷天气户外运动',
      '出现胸痛立即停止'
    ]
  },

  // 4. 高原地区糖尿病患者运动处方
  [PrescriptionType.DIABETES]: {
    title: '高原地区糖尿病患者运动处方',
    description: '针对糖尿病患者的血糖控制运动方案',
    categories: [
      {
        name: '有氧运动',
        items: [
          { label: '频率', value: '每周3-5天' },
          { label: '强度', value: '中等强度(50%-80%)' },
          { label: '时间', value: '每周累计≥150分钟' },
          { label: '方式', value: '散步、太极拳等有节奏、持续性运动' }
        ]
      },
      {
        name: '力量训练',
        items: [
          { label: '频率', value: '每周2-3次' },
          { label: '强度', value: '小负荷(最大力量40%-50%)' },
          { label: '时间', value: '每次15-20分钟' },
          { label: '方式', value: '全身大肌群抗阻训练(如哑铃、哑铃划船)' }
        ]
      }
    ],
    warnings: [
      '监测血糖,避免低血糖',
      '随身携带糖果',
      '检查足部,穿合适鞋袜',
      '避免空腹运动'
    ]
  },

  // 5. 高原地区慢性阻塞性肺疾病患者运动处方
  [PrescriptionType.COPD]: {
    title: '高原地区慢性阻塞性肺疾病患者运动处方',
    description: '针对COPD患者的呼吸功能改善方案',
    categories: [
      {
        name: '有氧运动',
        items: [
          { label: '频率', value: '每周2-5天' },
          { label: '强度', value: '30%-40%低强度与60%-80%中等强度结合' },
          { label: '时间', value: '每次20-30分钟' },
          { label: '方式', value: '跑步、骑自行车、登楼、登山、游泳' }
        ]
      },
      {
        name: '力量训练',
        items: [
          { label: '频率', value: '每周≥2天' },
          { label: '强度', value: '50%-80%最大力量' },
          { label: '时间', value: '每次≥15-30分钟' },
          { label: '方式', value: '抗阻训练,结合上下肢及呼吸肌训练' }
        ]
      }
    ],
    warnings: [
      '注意呼吸节奏',
      '避免空气污染严重时运动',
      '携带支气管扩张剂',
      '循序渐进,量力而行'
    ]
  },

  // 6. 高原地区骨质疏松症患者运动处方
  [PrescriptionType.OSTEOPOROSIS]: {
    title: '高原地区骨质疏松症患者运动处方',
    description: '针对骨质疏松患者的骨密度改善方案',
    categories: [
      {
        name: '有氧运动',
        items: [
          { label: '频率', value: '每周3-5天' },
          { label: '强度', value: '最大心率65%-85%,心率110-140次每分' },
          { label: '时间', value: '每次15-30分钟' },
          { label: '方式', value: '步行、慢跑、太极拳等' }
        ]
      },
      {
        name: '力量训练',
        items: [
          { label: '频率', value: '每周≥2天' },
          { label: '强度', value: '低强度(40%-50%重复次数)' },
          { label: '时间', value: '每次≥15-30分钟' },
          { label: '方式', value: '自重、哑铃、弹力绳等抗阻训练' }
        ]
      },
      {
        name: '柔韧性训练',
        items: [
          { label: '频率', value: '每周≥5天' },
          { label: '强度', value: '拉伸至拉紧或轻微不适' },
          { label: '时间', value: '每个动作保持30-60秒' },
          { label: '方式', value: '全身性伸展运动' }
        ]
      }
    ],
    warnings: [
      '避免高冲击运动',
      '注意防跌倒',
      '补充钙和维生素D',
      '避免脊柱前屈动作'
    ]
  },

  // 7. 高原地区肥胖者运动处方
  [PrescriptionType.OBESITY]: {
    title: '高原地区肥胖者运动处方',
    description: '针对肥胖患者的减重运动方案',
    categories: [
      {
        name: '有氧运动',
        items: [
          { label: '频率', value: '每周3-5天' },
          { label: '强度', value: '最大心率65%-85%或50%-80%最大摄氧量,心率110-140次每分钟' },
          { label: '时间', value: '每次30-60分钟' },
          { label: '方式', value: '步行、慢跑、太极拳等' }
        ]
      },
      {
        name: '力量训练',
        items: [
          { label: '频率', value: '每周≥2天' },
          { label: '强度', value: '低强度(40%-50%重复次数)' },
          { label: '时间', value: '每次≥15-30分钟' },
          { label: '方式', value: '哑铃、仰卧起坐、自重、弹力绳等' }
        ]
      },
      {
        name: '柔韧性训练',
        items: [
          { label: '频率', value: '每周≥5天' },
          { label: '强度', value: '拉伸至拉紧或轻微不适' },
          { label: '时间', value: '每个动作保持30-60秒,每次≥15-30分钟' },
          { label: '方式', value: '提高柔韧性的运动项目' }
        ]
      }
    ],
    warnings: [
      '循序渐进,避免关节损伤',
      '注意心率监测',
      '配合饮食控制',
      '选择低冲击运动'
    ]
  },

  // 8. 高原地区癌症患者运动处方
  [PrescriptionType.CANCER]: {
    title: '高原地区癌症患者运动处方',
    description: '针对癌症患者的康复运动方案',
    categories: [
      {
        name: '有氧运动',
        items: [
          { label: '频率', value: '每周3-5天' },
          { label: '强度', value: '中等强度(最大心率65%-85%),心率110-140次每分钟' },
          { label: '时间', value: '每次15-30分钟' },
          { label: '方式', value: '步行、慢跑、太极拳等' }
        ]
      },
      {
        name: '力量训练',
        items: [
          { label: '频率', value: '每周≥2天' },
          { label: '强度', value: '低强度(40%-50%重复次数)' },
          { label: '时间', value: '每次≥15-30分钟' },
          { label: '方式', value: '自重、哑铃、弹力绳等' }
        ]
      },
      {
        name: '柔韧性训练',
        items: [
          { label: '频率', value: '每周≥5天' },
          { label: '强度', value: '拉伸至拉紧或轻微不适' },
          { label: '时间', value: '每次拉伸保持30-60秒' },
          { label: '方式', value: '动态和静态柔韧性项目' }
        ]
      },
      {
        name: '平衡能力训练',
        items: [
          { label: '频率', value: '每周≥5天' },
          { label: '强度', value: '拉伸至拉紧或轻微不适' },
          { label: '时间', value: '每次保持30-60秒' },
          { label: '方式', value: '动态和静态柔韧性项目(与柔韧性训练合并执行)' }
        ]
      }
    ],
    warnings: [
      '根据治疗阶段调整强度',
      '注意白细胞计数',
      '避免感染风险',
      '在医生指导下进行'
    ]
  },

  // 9. 高原地区平衡能力训练运动处方
  [PrescriptionType.BALANCE]: {
    title: '高原地区平衡能力训练运动处方',
    description: '针对平衡能力下降的专项训练方案',
    categories: [
      {
        name: '平衡训练',
        items: [
          { label: '频率', value: '每天一次' },
          { label: '强度', value: '初期以简单、组合动作2-3个' },
          { label: '时间', value: '每次15-20分钟' },
          { label: '方式', value: '坐姿平衡练习、单脚站立双手侧平举、BOSU球平衡练习、流动式平衡练习、跆拳道、太极拳、球类运动(篮球、足球、羽毛球、乒乓球等)' }
        ]
      }
    ],
    warnings: [
      '确保运动环境安全',
      '有人陪伴进行',
      '使用辅助器具',
      '循序渐进增加难度'
    ]
  }
}

/**
 * 根据用户健康数据生成运动处方
 * @param {Object} healthData - 用户健康数据
 * @param {boolean} healthData.hasHypertension - 是否有高血压
 * @param {boolean} healthData.hasCoronary - 是否有冠心病
 * @param {boolean} healthData.hasDiabetes - 是否有糖尿病
 * @param {boolean} healthData.hasCOPD - 是否有慢性阻塞性肺疾病
 * @param {boolean} healthData.hasOsteoporosis - 是否有骨质疏松
 * @param {boolean} healthData.hasCancer - 是否有癌症
 * @param {boolean} healthData.hasBalanceIssue - 是否有平衡问题
 * @param {number} healthData.bmi - BMI指数
 * @returns {Array} - 推荐的运动处方列表
 */
export function generateExercisePrescription(healthData) {
  const prescriptions = []
  
  // 优先级排序的疾病列表
  const conditions = []
  
  // 癌症优先级最高
  if (healthData.hasCancer) {
    conditions.push(PrescriptionType.CANCER)
  }
  
  // 冠心病
  if (healthData.hasCoronary) {
    conditions.push(PrescriptionType.CORONARY)
  }
  
  // 高血压
  if (healthData.hasHypertension) {
    conditions.push(PrescriptionType.HYPERTENSION)
  }
  
  // 糖尿病
  if (healthData.hasDiabetes) {
    conditions.push(PrescriptionType.DIABETES)
  }
  
  // COPD
  if (healthData.hasCOPD) {
    conditions.push(PrescriptionType.COPD)
  }
  
  // 骨质疏松
  if (healthData.hasOsteoporosis) {
    conditions.push(PrescriptionType.OSTEOPOROSIS)
  }
  
  // 肥胖(BMI >= 28)
  if (healthData.bmi && healthData.bmi >= 28) {
    conditions.push(PrescriptionType.OBESITY)
  }
  
  // 平衡问题
  if (healthData.hasBalanceIssue) {
    conditions.push(PrescriptionType.BALANCE)
  }
  
  // 如果没有特定疾病,使用一般老年人处方
  if (conditions.length === 0) {
    conditions.push(PrescriptionType.GENERAL)
  }
  
  // 获取对应的运动处方
  conditions.forEach(type => {
    if (exercisePrescriptions[type]) {
      prescriptions.push({
        type,
        ...exercisePrescriptions[type]
      })
    }
  })
  
  return prescriptions
}

/**
 * 根据慢性病信息表单数据解析健康状况
 * @param {Object} chronicInfo - 慢性病信息表单数据
 * @param {Object} basicInfo - 基础信息(包含BMI)
 * @returns {Object} - 解析后的健康数据
 */
export function parseHealthData(chronicInfo, basicInfo) {
  const healthData = {
    hasHypertension: false,
    hasCoronary: false,
    hasDiabetes: false,
    hasCOPD: false,
    hasOsteoporosis: false,
    hasCancer: false,
    hasBalanceIssue: false,
    bmi: null
  }
  
  if (chronicInfo) {
    // 高血压
    healthData.hasHypertension = chronicInfo.hypertension === '是'
    
    // 糖尿病(空腹血糖或糖化血红蛋白)
    healthData.hasDiabetes = chronicInfo.fastingBloodSugar === '是' || 
                              chronicInfo.glycatedHemoglobin === '是'
    
    // 高血脂
    healthData.hasHyperlipidemia = chronicInfo.hyperlipidemia === '是'
    
    // 高原常见病
    if (chronicInfo.plateauDisease === '有' && chronicInfo.plateauDiseaseDetails) {
      const diseases = Array.isArray(chronicInfo.plateauDiseaseDetails) 
        ? chronicInfo.plateauDiseaseDetails 
        : JSON.parse(chronicInfo.plateauDiseaseDetails || '[]')
      
      healthData.hasCoronary = diseases.includes('冠心病')
      healthData.hasCancer = diseases.includes('癌症')
      healthData.hasOsteoporosis = diseases.includes('骨质疏松')
      healthData.hasBalanceIssue = diseases.includes('跌倒史')
    }
  }
  
  // 从基础信息获取BMI
  if (basicInfo && basicInfo.bmi) {
    healthData.bmi = parseFloat(basicInfo.bmi)
  }
  
  return healthData
}

/**
 * 获取运动处方建议的优先级说明
 * @param {Array} prescriptions - 运动处方列表
 * @returns {string} - 优先级说明文本
 */
export function getPrescriptionPriorityDescription(prescriptions) {
  if (!prescriptions || prescriptions.length === 0) {
    return ''
  }
  
  if (prescriptions.length === 1) {
    return '根据您的健康状况,为您推荐以下运动处方:'
  }
  
  return `根据您的健康状况,检测到您有${prescriptions.length}项需要关注的健康问题,为您推荐以下运动处方(按优先级排序):`
}

export default {
  PrescriptionType,
  exercisePrescriptions,
  generateExercisePrescription,
  parseHealthData,
  getPrescriptionPriorityDescription
}

A/utils/dietaryKnowledgeBase.js


// 饮食建议知识库
export const dietaryAdvice = {
  // 人群类型映射
  targetTypes: {
    general: '高原地区老年人',
    hypertension: '高血压患者',
    coronary: '冠心病患者',
    diabetes: '糖尿病患者',
    copd: 'COPD患者',
    osteoporosis: '骨质疏松患者',
    obesity: '肥胖者',
    cancer: '癌症患者'
  },

  // 饮食建议数据
  advice: {
    general: {
      title: '高原地区老年人饮食建议',
      principles: [
        '均衡营养,少食多餐,食物多样化,易消化吸收',
        '增加优质蛋白摄入(鱼、蛋、奶、豆制品)',
        '多喝水,预防高原脱水,每日饮水1500-2000ml'
      ],
      recommendedFoods: [
        '全谷物:燕麦、小米、糙米',
        '深色蔬菜:菠菜、西兰花、胡萝卜',
        '低糖水果:苹果、梨、蓝莓',
        '优质蛋白:鱼肉、鸡胸肉、豆腐、鸡蛋'
      ],
      nutrients: [
        '补充维生素D和钙,预防骨质疏松',
        '适量补充B族维生素,改善能量代谢',
        '补充抗氧化剂(维生素C、E),减轻高原氧化应激'
      ]
    },
    
    hypertension: {
      title: '高原地区高血压患者饮食建议',
      principles: [
        '低盐饮食,每日食盐摄入量<5g',
        '采用DASH饮食模式(富含蔬菜、水果、低脂乳制品)',
        '控制总热量,维持健康体重'
      ],
      recommendedFoods: [
        '高钾食物:香蕉、土豆、菠菜、豆类',
        '高钙食物:低脂牛奶、酸奶、豆腐',
        '高镁食物:坚果、全谷物、绿叶蔬菜',
        '富含膳食纤维:燕麦、糙米、豆类'
      ],
      forbiddenFoods: [
        '高盐食物:咸菜、腊肉、加工肉制品、酱油',
        '高脂肪食物:肥肉、油炸食品',
        '刺激性饮品:浓茶、咖啡、酒精'
      ]
    },
    
    coronary: {
      title: '高原地区冠心病患者饮食建议',
      principles: [
        '低脂、低胆固醇饮食',
        '控制饱和脂肪酸摄入,增加不饱和脂肪酸',
        '少食多餐,避免暴饮暴食'
      ],
      recommendedFoods: [
        '富含Omega-3食物:深海鱼(三文鱼、沙丁鱼)、亚麻籽',
        '坚果类:核桃、杏仁(适量)',
        '橄榄油、菜籽油等植物油',
        '紫色/红色蔬果:紫薯、番茄、红葡萄'
      ],
      forbiddenFoods: [
        '高胆固醇食物:动物内脏、蟹黄、鱿鱼',
        '高饱和脂肪:肥肉、黄油、奶油',
        '反式脂肪酸:炸鸡、薯条、糕点'
      ]
    },
    
    diabetes: {
      title: '高原地区糖尿病患者饮食建议',
      principles: [
        '控制碳水化合物总量,选择低升糖指数食物',
        '定时定量进餐,少食多餐',
        '增加膳食纤维摄入,延缓血糖上升'
      ],
      recommendedFoods: [
        '低GI主食:燕麦、荞麦、糙米、全麦面包',
        '非淀粉类蔬菜:绿叶蔬菜、黄瓜、西红柿',
        '优质蛋白:鱼、鸡胸肉、豆腐、鸡蛋',
        '低糖水果:柚子、草莓、樱桃'
      ],
      forbiddenFoods: [
        '高糖食物:糖果、蛋糕、含糖饮料',
        '精制主食:白米饭、白面包、面条',
        '高GI水果:西瓜、荔枝、龙眼'
      ]
    },
    
    copd: {
      title: '高原地区慢性阻塞性肺疾病患者饮食建议',
      principles: [
        '高蛋白、高热量饮食,维持呼吸肌功能',
        '少食多餐,避免饱腹影响呼吸',
        '充足水分,稀释痰液'
      ],
      recommendedFoods: [
        '优质蛋白:鸡蛋、鱼肉、瘦肉、豆制品',
        '健康脂肪:橄榄油、牛油果、坚果',
        '复合碳水:全谷物、薯类'
      ],
      nutrients: [
        '补充维生素D,增强免疫力',
        '补充抗氧化剂(维生素C、E、硒)',
        '补充Omega-3脂肪酸,抗炎'
      ]
    },
    
    osteoporosis: {
      title: '高原地区骨质疏松症患者饮食建议',
      principles: [
        '高钙、高维生素D饮食',
        '适量优质蛋白,促进骨基质合成',
        '限制咖啡因和碳酸饮料摄入'
      ],
      recommendedFoods: [
        '高钙食物:牛奶、酸奶、奶酪、豆腐、芝麻酱',
        '富含维生素D:蛋黄、动物肝脏、深海鱼',
        '富含维生素K:西兰花、菠菜、纳豆',
        '富含镁:坚果、全谷物、绿叶蔬菜'
      ],
      forbiddenFoods: [
        '高盐食物:增加钙流失',
        '过量咖啡因:咖啡、浓茶',
        '碳酸饮料:影响钙吸收'
      ]
    },
    
    obesity: {
      title: '高原地区肥胖者饮食建议',
      principles: [
        '控制总热量摄入,制造合理热量缺口',
        '高蛋白、低脂肪、低碳水饮食结构',
        '规律进餐,避免夜宵和零食'
      ],
      recommendedFoods: [
        '高蛋白食物:鸡胸肉、鱼、虾、鸡蛋、豆制品',
        '高纤维蔬菜:西兰花、芹菜、黄瓜',
        '低GI水果:苹果、柚子、蓝莓'
      ],
      forbiddenFoods: [
        '高糖食物:甜点、奶茶、碳酸饮料',
        '高脂食物:油炸食品、肥肉',
        '精制碳水:白面包、饼干、薯片'
      ]
    },
    
    cancer: {
      title: '高原地区癌症患者饮食建议',
      principles: [
        '高蛋白、高热量饮食,维持体重和体力',
        '多样化饮食,保证营养全面',
        '少量多餐,适应消化道反应'
      ],
      recommendedFoods: [
        '优质蛋白:鱼肉、鸡蛋、豆制品、乳清蛋白',
        '抗癌食物:十字花科蔬菜(西兰花、卷心菜)',
        '富含抗氧化剂:蓝莓、番茄、绿茶',
        '全谷物:燕麦、糙米、藜麦'
      ],
      nutrients: [
        '补充Omega-3脂肪酸,抗炎',
        '补充益生菌,改善肠道健康',
        '补充维生素D,增强免疫力'
      ]
    }
  },

  // 高原通用建议
  plateauGeneral: {
    principles: [
      '多饮水,预防高原脱水,每日饮水2000-2500ml',
      '增加碳水化合物摄入,提供充足能量',
      '避免饮酒,减轻高原反应'
    ],
    nutrients: [
      '补充铁剂,预防高原贫血',
      '补充维生素C,促进铁吸收,增强抗氧化能力'
    ]
  }
}

/**
 * 根据疾病类型获取饮食建议
 * @param {Array} conditions - 疾病类型代码列表
 * @returns {Object} - 饮食建议
 */
export function getDietaryAdvice(conditions) {
  const result = {
    title: '您的个性化饮食建议',
    adviceList: [],
    plateauTips: dietaryAdvice.plateauGeneral
  }
  
  // 按优先级获取饮食建议
  const priorityOrder = ['cancer', 'coronary', 'hypertension', 'diabetes', 'copd', 'osteoporosis', 'obesity', 'general']
  
  const sortedConditions = conditions.sort((a, b) => {
    return priorityOrder.indexOf(a) - priorityOrder.indexOf(b)
  })
  
  sortedConditions.forEach(condition => {
    if (dietaryAdvice.advice[condition]) {
      result.adviceList.push(dietaryAdvice.advice[condition])
    }
  })
  
  return result
}

/**
 * 根据健康数据解析适用的饮食建议类型
 * @param {Object} healthData - 健康数据
 * @returns {Array} - 适用的人群类型
 */
export function parseDietaryTargets(healthData) {
  const targets = []
  
  if (healthData.hasCancer) targets.push('cancer')
  if (healthData.hasCoronary) targets.push('coronary')
  if (healthData.hasHypertension) targets.push('hypertension')
  if (healthData.hasDiabetes) targets.push('diabetes')
  if (healthData.hasCOPD) targets.push('copd')
  if (healthData.hasOsteoporosis) targets.push('osteoporosis')
  if (healthData.bmi && healthData.bmi >= 28) targets.push('obesity')
  
  if (targets.length === 0) {
    targets.push('general')
  }
  
  return targets
}

export default {
  dietaryAdvice,
  getDietaryAdvice,
  parseDietaryTargets
}

附录 F. 新旧响应适配备查

这些是结构示例,不含真实账号或记录;迁移时所有调用者需跟随目标协议。

{
  "login": {
    "code": 200,
    "msg": "操作成功",
    "token": "<legacy-token>"
  },
  "getInfo": {
    "code": 200,
    "msg": "操作成功",
    "user": {
      "userId": "<legacy-login-user-id>",
      "userName": "<username>"
    },
    "roles": [
      "elderly"
    ],
    "permissions": [
      "system:fallrisk:add"
    ]
  },
  "profile": {
    "code": 200,
    "msg": "操作成功",
    "data": {
      "userId": "<legacy-login-user-id>"
    },
    "roleGroup": "<roles>",
    "postGroup": "<posts>"
  },
  "page": {
    "code": 200,
    "msg": "查询成功",
    "rows": [
      {
        "id": "<record-id>",
        "userId": "<legacy-login-user-id>"
      }
    ],
    "total": 1
  },
  "detail": {
    "code": 200,
    "msg": "操作成功",
    "data": {
      "id": "<record-id>"
    }
  },
  "write": {
    "code": 200,
    "msg": "操作成功"
  },
  "playUrl": {
    "code": 200,
    "msg": "操作成功",
    "videoId": "<video-id>",
    "playUrl": "<signed-url>"
  },
  "deepseek": {
    "code": 200,
    "msg": "<JSON string of DeepSeek response>"
  }
}

旧列表通常 query 为 pageNum/pageSize,目标常见 pageNo/pageSize;新 CommonResult 成功码常为 0,PageResult 通常为 data.list/data.total。两者只是目标惯例,需先读新工程。写操作旧 toAjax 返回成功与否,不一定返回新增 ID;若新页面后续需要 ID,应明确 Create API 的返回类型。

提醒旧类型为 medicine/exercise/diet/rest/other,isRepeat 0/1 表示是否每天重复;没有送达、确认服用、补发等完整调度状态。视频 upload multipart 字段 file,categoryCode 可选;头像字段 avatarfile;旧通用文件上传的 URL/文件名属性应按目标文件 VO 重写。