diff --git a/README.md b/README.md index 3c29f1c..76a2def 100644 --- a/README.md +++ b/README.md @@ -44,3 +44,8 @@ Cloud 文档验证码:https://cloud.iocoder.cn/?code=p70 > 白天正常上班写代码,晚上有时间就同步文档(无遮羞布)。 > > 在这里跟原作者道个歉,年轻人真的比容易,还望刀下留情,韭菜割的差不多就得了。 + +## 项目文档 + +- [文档目录](docs/README.md) +- [老年健康系统迁移上下文](docs/芋道框架迁移上下文.md) diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..23fa19f --- /dev/null +++ b/docs/README.md @@ -0,0 +1,5 @@ +# 项目文档 + +- [芋道框架迁移上下文](芋道框架迁移上下文.md):旧老年健康系统的技术栈、业务模块、数据结构、接口、评分与推荐规则,以及迁移到芋道的建议和已知缺口。 + +该文档是 2026-10-05 对旧系统的分析快照。有关目标框架和实施方案的历史假设,应结合当前项目代码及后续确认的需求核实;文档中的任务示例不代表已经开始或完成迁移。 diff --git a/docs/芋道框架迁移上下文.md b/docs/芋道框架迁移上下文.md new file mode 100644 index 0000000..78d2f45 --- /dev/null +++ b/docs/芋道框架迁移上下文.md @@ -0,0 +1,2681 @@ +# 高原银龄 e 健航:迁移到芋道框架的工作上下文 + +> 分析日期:2026-10-05(Asia/Shanghai)。用途:供后续 Codex 在更换项目参考文件夹、甚至没有旧项目源码上下文时继续实施迁移。本文记录的是当前磁盘代码,不是 README 宣称的能力。已实现、存在缺口、迁移建议分别说明。 +> +> 本轮只做静态分析并生成本文,没有修改业务代码,没有启动服务、连接数据库、调用云服务或验证部署。目标芋道项目尚未提供,因此目标模块名、框架版本和接口路径均是待在新项目核实的建议。 + +## 0. 新聊天如何继续 + +把本文复制到新的芋道项目根目录,向后续 Codex 发出以下任务即可: + +```text +读取《芋道框架迁移上下文.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 没有外键约束,真实历史数据仍应抽样验证。 + +```mermaid +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```sql +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 + +```javascript +/** + * 高原地区老年人运动处方知识库 + * 根据用户的健康状况(高血压、冠心病、癌症、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 + +```javascript + +// 饮食建议知识库 +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. 新旧响应适配备查 + +这些是结构示例,不含真实账号或记录;迁移时所有调用者需跟随目标协议。 + +```json +{ + "login": { + "code": 200, + "msg": "操作成功", + "token": "" + }, + "getInfo": { + "code": 200, + "msg": "操作成功", + "user": { + "userId": "", + "userName": "" + }, + "roles": [ + "elderly" + ], + "permissions": [ + "system:fallrisk:add" + ] + }, + "profile": { + "code": 200, + "msg": "操作成功", + "data": { + "userId": "" + }, + "roleGroup": "", + "postGroup": "" + }, + "page": { + "code": 200, + "msg": "查询成功", + "rows": [ + { + "id": "", + "userId": "" + } + ], + "total": 1 + }, + "detail": { + "code": 200, + "msg": "操作成功", + "data": { + "id": "" + } + }, + "write": { + "code": 200, + "msg": "操作成功" + }, + "playUrl": { + "code": 200, + "msg": "操作成功", + "videoId": "", + "playUrl": "" + }, + "deepseek": { + "code": 200, + "msg": "" + } +} +``` + +旧列表通常 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 重写。