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

2682 lines
156 KiB
Markdown
Raw Normal View History

# 高原银龄 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 → &lt;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": "<legacy-token>"
},
"getInfo": {
"code": 200,
"msg": "操作成功",
"user": {
"userId": "<legacy-login-user-id>",
"userName": "<username>"
},
"roles": [
"elderly"
],
"permissions": [
"system:fallrisk:add"
]
},
"profile": {
"code": 200,
"msg": "操作成功",
"data": {
"userId": "<legacy-login-user-id>"
},
"roleGroup": "<roles>",
"postGroup": "<posts>"
},
"page": {
"code": 200,
"msg": "查询成功",
"rows": [
{
"id": "<record-id>",
"userId": "<legacy-login-user-id>"
}
],
"total": 1
},
"detail": {
"code": 200,
"msg": "操作成功",
"data": {
"id": "<record-id>"
}
},
"write": {
"code": 200,
"msg": "操作成功"
},
"playUrl": {
"code": 200,
"msg": "操作成功",
"videoId": "<video-id>",
"playUrl": "<signed-url>"
},
"deepseek": {
"code": 200,
"msg": "<JSON string of DeepSeek response>"
}
}
```
旧列表通常 query 为 pageNum/pageSize,目标常见 pageNo/pageSize;新 CommonResult 成功码常为 0,PageResult 通常为 data.list/data.total。两者只是目标惯例,需先读新工程。写操作旧 toAjax 返回成功与否,不一定返回新增 ID;若新页面后续需要 ID,应明确 Create API 的返回类型。
提醒旧类型为 medicine/exercise/diet/rest/other,isRepeat 0/1 表示是否每天重复;没有送达、确认服用、补发等完整调度状态。视频 upload multipart 字段 file,categoryCode 可选;头像字段 avatarfile;旧通用文件上传的 URL/文件名属性应按目标文件 VO 重写。