diff --git a/--full-page b/--full-page new file mode 100644 index 0000000..73c43a1 Binary files /dev/null and b/--full-page differ diff --git a/employee-app/health-monitor/doc/PRD.md b/employee-app/health-monitor/doc/PRD.md index e67be98..bb9845f 100644 --- a/employee-app/health-monitor/doc/PRD.md +++ b/employee-app/health-monitor/doc/PRD.md @@ -33,7 +33,7 @@ │ ├── 水质监测(达标/未达标 · 6项指标) │ └── 花粉监测(5级评价 · 8种花粉+总数) ├── 设备详情(依 Tab 切换指标下拉、阈值线与等级文案) - └── 报警数据(依 Tab 切换可选报警类型与阈值范围) + └── 报警数据(依 Tab 切换展示不同类型报警,支持按年月筛选) ``` ## 页面清单 @@ -225,17 +225,17 @@ **功能说明:** 穿戴设备监测数据的主页,展示设备连接状态和各项健康指标的最新数据卡片网格。 **主要UI元素:** -- 设备连接状态栏(设备图标、设备名称如"华为 WATCH GT5 Pro"、设备序列号、连接状态) +- 设备连接状态栏(手表图标、设备名称如"华为 WATCH GT5 Pro"、设备序列号如"SF55996622586") - 监测卡片网格(2列布局,共9张卡片): - - 步数卡片(当前步数、距离换算、同步时间) - - 睡眠卡片(睡眠时长、平均睡眠参考、同步时间) - - 心率卡片(当前心率、范围值、同步时间) - - 体温卡片(当前体温、范围值、同步时间) - - 血氧卡片(当前血氧、范围值、同步时间) - - 压力卡片(当前压力值、范围值、同步时间) - - 血压卡片(收缩压/舒张压、状态标签、同步时间。手表不支持时,隐藏该模块) - - 心电图卡片(心率值、分类结果标签、同步时间。手表不支持时,隐藏该模块) - - 锻炼卡片(锻炼次数/时长/消耗统计、同步时间) + - 步数卡片(当前步数 8,562、距离换算"相当于步行5.2公里"、同步时间) + - 睡眠卡片(睡眠时长 7h 32min、平均睡眠参考"平均睡眠8小时57分"、同步时间) + - 心率卡片(当前心率 72 bpm、范围值 89~120、同步时间) + - 体温卡片(当前体温 36.5℃、范围值 36.2~37.1℃、同步时间) + - 血氧卡片(当前血氧 98%、范围值 95~99%、同步时间) + - 压力卡片(当前压力值 42、范围值 18~82、同步时间) + - 血压卡片(收缩压/舒张压 120/78 mmHg、状态标签"正常"、同步时间) + - 心电图卡片(心率 75 次/分钟、分类结果标签"窦性心律"、同步时间) + - 锻炼卡片(消耗 680 千卡、锻炼时长 52 分钟、同步时间) **交互说明:** - 点击各卡片进入对应详情页面 @@ -269,18 +269,17 @@ **功能说明:** 展示心率预警记录列表,支持按年份和月份筛选。 **主要UI元素:** -- 预警记录列表标题(含总条数) -- 筛选按钮 -- 预警记录卡片(时间、等级、数值、持续时长、触发原因、右侧阈值范围显示) -- 时间筛选弹窗(年份/月份下拉) +- 预警记录列表标题(含总条数,如"预警记录(共 3 条)") +- 筛选按钮(显示当前筛选年月,如"2026-4") +- 预警记录卡片: + - 预警时间(如"2026-04-28 16:32") + - 预警数值(如"142 bpm") +- 时间筛选弹窗(年份/月份下拉选择,取消/确定按钮) -**业务规则:** -- 预警等级:严重(红色)、警告(橙色) -- 每条预警卡片右侧显示正常阈值范围参考 **交互说明:** - 点击筛选按钮打开时间筛选弹窗 -- 选择年份和月份后点击"确定"应用筛选 +- 选择年份和月份后点击"确定"应用筛选,卡片列表按所选年月过滤 --- @@ -288,7 +287,7 @@ **血氧详情(wearable/blood-oxygen.html):** 展示血氧监测数据,图表采用柱状图形式,支持日/周/月/年多时间维度查看,底部时间轴滑块可交互选择具体时间点。 -**血氧预警历史(wearable/blood-oxygen-alerts.html):** 页面结构与心率预警历史一致,展示血氧预警记录列表,每条卡片右侧显示正常阈值范围。 +**血氧预警历史(wearable/blood-oxygen-alerts.html):** 展示血氧预警记录列表,支持按年月筛选。页面结构与心率预警历史一致,区别在于确定按钮为绿色主题。示例数据:1条记录(2026年3月),93%(严重)。   @@ -302,13 +301,13 @@ **血压详情(wearable/blood-pressure.html):** 展示收缩压/舒张压双线图表,统计卡片分别显示收缩压和舒张压的最高/最低值。 -**血压预警历史(wearable/blood-pressure-alerts.html):** 预警记录卡片同时显示收缩压和舒张压数值,右侧显示正常阈值范围。 +**血压预警历史(wearable/blood-pressure-alerts.html):** 预警记录以"收缩压/舒张压"格式显示(如"158/98 mmHg"),支持按年月筛选。示例数据:4条记录(2026年5月) --- ### 14-15. 体温详情与预警历史 -**体温详情(wearable/temperature.html)** 和 **体温预警历史(wearable/temperature-alerts.html)** 的页面结构与心率一致,预警历史页面每条卡片右侧显示正常阈值范围。 +**体温详情(wearable/temperature.html)** 和 **体温预警历史(wearable/temperature-alerts.html)** 的页面结构与心率一致。   @@ -317,7 +316,7 @@ ### 16-17. 压力详情与预警历史 -**压力详情(wearable/stress.html)** 和 **压力预警历史(wearable/stress-alerts.html)** 的页面结构与心率一致,额外显示压力等级评估徽章,预警历史页面每条卡片右侧显示正常阈值范围。 +**压力详情(wearable/stress.html)** 和 **压力预警历史(wearable/stress-alerts.html)** 的页面结构与心率一致。压力详情额外显示压力等级评估徽章。   @@ -452,9 +451,6 @@ **典型设备:** 空气质量监测站、PM10检测仪、臭氧检测仪、气象参数监测仪、VOC检测仪(共6台示例) -**等级描述(示例):** -- 优:空气质量令人满意,基本无污染 -- 严重污染:健康人群运动耐受力降低,有明显强烈症状,提前出现某些疾病 ##### 23.1.1 设备底部弹窗 @@ -609,47 +605,47 @@  -**功能说明:** 展示环境监测设备的报警记录,支持按日期范围和报警类型筛选。页面根据 URL 参数 `tab` 决定可选报警类型与展示的报警列表。 +**功能说明:** 展示环境监测设备的报警记录,支持按时间筛选。页面根据 URL 参数 `tab`(outdoor/indoor/water/pollen)决定展示的报警类型与数据列表。 **通用 UI 元素:** -- 筛选区:日期范围(起始/结束日期选择器)、类型下拉、重置按钮、查询按钮 - 统计条:报警总条数(红色突出) -- 报警卡片列表:左侧红色边条,顶部"{指标} 超标报警" + 时间,中部报警值(红底)→ 阈值范围(灰底),底部设备名称/位置 +- 筛选按钮(显示当前年月,如"2026-5") +- 报警卡片列表:左侧红色边条,顶部"{指标} 超标报警" + 时间,中部"报警值(数值+单位)› 阈值范围(min~max+单位)" +- 数据通过 JavaScript 动态渲染 **通用交互说明:** -- 设置日期范围和类型后点击"查询"筛选 -- 点击"重置"恢复默认日期与类型筛选条件 +- 点击筛选按钮打开时间筛选弹窗,选择年月后确定 - 列表为空时显示"暂无报警数据"占位 **业务规则:** - 报警值高于阈值上限或低于阈值下限时进入报警列表 -- 报警卡片同时呈现实际值与允许阈值范围(min~max),便于直观判断超标幅度 +- 报警卡片同时呈现实际值与允许阈值范围(min~max),直观判断超标幅度 #### 25.1 室外空气  -**可选报警类型:** PM2.5、PM10、温度、湿度、风速、太阳辐射、照度 +**示例数据(8条,2026年5月):** PM2.5(156 μg/m³,阈值 0~75)、PM10(218 μg/m³,阈值 0~150)、风速(13.5 m/s,阈值 0~10)、太阳辐射(1180 W/m²,阈值 0~1000)、温度(42.3℃,阈值 -10~40)、PM2.5(195 μg/m³)、PM10(285 μg/m³)、照度(98500 lm/m²,阈值 0~95000) #### 25.2 室内空气  -**可选报警类型:** PM2.5、PM10、CO₂、甲醛、温度、湿度 +**示例数据(6条,2026年5月):** CO₂(1250 ppm,阈值 400~1000)、甲醛(0.15 mg/m³,阈值 0~0.10)、PM2.5(135 μg/m³,阈值 0~75)、CO₂(980 ppm,敏感场所阈值 400~800)、湿度(85%,阈值 30~80)、甲醛(0.12 mg/m³) #### 25.3 水质监测  -**可选报警类型:** PH、电导率、盐度、TDS、电阻率、温度 +**示例数据(6条,2026年5月):** 电导率(1250 μS/cm,阈值 50~1000)、PH(8.5,阈值 6.5~8.0)、TDS(840 mg/L,阈值 0~500)、盐度(920 mg/L,阈值 0~500)、电导率(1680 μS/cm)、PH(9.2) #### 25.4 花粉监测  -**可选报警类型:** 花粉总数 +**示例数据(3条,2026年5月):** 花粉总数(1098、924、860 粒/千mm²,阈值 0~800) > 备注:花粉监测仅对"花粉总数"设置统一报警阈值,各属/科单一指标暂不单独报警。 diff --git a/employee-app/health-monitor/doc/screenshots/environment/alarm-data-indoor.jpg b/employee-app/health-monitor/doc/screenshots/environment/alarm-data-indoor.jpg index eb23eb9..9aae140 100644 Binary files a/employee-app/health-monitor/doc/screenshots/environment/alarm-data-indoor.jpg and b/employee-app/health-monitor/doc/screenshots/environment/alarm-data-indoor.jpg differ diff --git a/employee-app/health-monitor/doc/screenshots/environment/alarm-data-outdoor.jpg b/employee-app/health-monitor/doc/screenshots/environment/alarm-data-outdoor.jpg index b189e28..a6f724c 100644 Binary files a/employee-app/health-monitor/doc/screenshots/environment/alarm-data-outdoor.jpg and b/employee-app/health-monitor/doc/screenshots/environment/alarm-data-outdoor.jpg differ diff --git a/employee-app/health-monitor/doc/screenshots/environment/alarm-data-pollen.jpg b/employee-app/health-monitor/doc/screenshots/environment/alarm-data-pollen.jpg index 255e073..a44d4db 100644 Binary files a/employee-app/health-monitor/doc/screenshots/environment/alarm-data-pollen.jpg and b/employee-app/health-monitor/doc/screenshots/environment/alarm-data-pollen.jpg differ diff --git a/employee-app/health-monitor/doc/screenshots/environment/alarm-data-water.jpg b/employee-app/health-monitor/doc/screenshots/environment/alarm-data-water.jpg index 7223bf6..695fe90 100644 Binary files a/employee-app/health-monitor/doc/screenshots/environment/alarm-data-water.jpg and b/employee-app/health-monitor/doc/screenshots/environment/alarm-data-water.jpg differ diff --git a/employee-app/health-monitor/doc/screenshots/environment/alarm-data.jpg b/employee-app/health-monitor/doc/screenshots/environment/alarm-data.jpg index b189e28..a6f724c 100644 Binary files a/employee-app/health-monitor/doc/screenshots/environment/alarm-data.jpg and b/employee-app/health-monitor/doc/screenshots/environment/alarm-data.jpg differ diff --git a/employee-app/health-monitor/doc/screenshots/wearable/blood-oxygen-alerts.jpg b/employee-app/health-monitor/doc/screenshots/wearable/blood-oxygen-alerts.jpg index efa6cfe..57f8877 100644 Binary files a/employee-app/health-monitor/doc/screenshots/wearable/blood-oxygen-alerts.jpg and b/employee-app/health-monitor/doc/screenshots/wearable/blood-oxygen-alerts.jpg differ diff --git a/employee-app/health-monitor/doc/screenshots/wearable/blood-pressure-alerts.jpg b/employee-app/health-monitor/doc/screenshots/wearable/blood-pressure-alerts.jpg index 14d7f94..4f58433 100644 Binary files a/employee-app/health-monitor/doc/screenshots/wearable/blood-pressure-alerts.jpg and b/employee-app/health-monitor/doc/screenshots/wearable/blood-pressure-alerts.jpg differ diff --git a/employee-app/health-monitor/doc/screenshots/wearable/heart-rate-alerts.jpg b/employee-app/health-monitor/doc/screenshots/wearable/heart-rate-alerts.jpg index 5462c02..1891b6b 100644 Binary files a/employee-app/health-monitor/doc/screenshots/wearable/heart-rate-alerts.jpg and b/employee-app/health-monitor/doc/screenshots/wearable/heart-rate-alerts.jpg differ diff --git a/employee-app/health-monitor/doc/screenshots/wearable/index.jpg b/employee-app/health-monitor/doc/screenshots/wearable/index.jpg index eadea7b..2d4bd01 100644 Binary files a/employee-app/health-monitor/doc/screenshots/wearable/index.jpg and b/employee-app/health-monitor/doc/screenshots/wearable/index.jpg differ diff --git a/employee-app/health-monitor/doc/screenshots/wearable/stress-alerts.jpg b/employee-app/health-monitor/doc/screenshots/wearable/stress-alerts.jpg index b4af856..fd1dd96 100644 Binary files a/employee-app/health-monitor/doc/screenshots/wearable/stress-alerts.jpg and b/employee-app/health-monitor/doc/screenshots/wearable/stress-alerts.jpg differ diff --git a/employee-app/health-monitor/doc/screenshots/wearable/temperature-alerts.jpg b/employee-app/health-monitor/doc/screenshots/wearable/temperature-alerts.jpg index 333aea2..2596259 100644 Binary files a/employee-app/health-monitor/doc/screenshots/wearable/temperature-alerts.jpg and b/employee-app/health-monitor/doc/screenshots/wearable/temperature-alerts.jpg differ diff --git a/employee-app/health-monitor/environment/alarm-data.html b/employee-app/health-monitor/environment/alarm-data.html index 6b1fcf6..43ea922 100644 --- a/employee-app/health-monitor/environment/alarm-data.html +++ b/employee-app/health-monitor/environment/alarm-data.html @@ -15,17 +15,159 @@ body { background: #f0f2f5; display: flex; justify-content: center; align-items: .nav-back { width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; cursor: pointer; } .nav-title { flex: 1; text-align: center; font-size: 17px; font-weight: 600; color: #1a1a1a; margin-right: 28px; } -/* 筛选区 */ -.filter-bar { background: #fff; padding: 12px 16px; border-bottom: 1px solid #f0f0f0; flex-shrink: 0; display: flex; flex-direction: column; gap: 8px; } -.filter-row { display: flex; align-items: center; gap: 8px; } -.filter-label { font-size: 12px; color: #999; flex-shrink: 0; } -.filter-date-input { height: 32px; border: 1px solid #e8e8e8; border-radius: 8px; padding: 0 8px; font-size: 12px; color: #333; outline: none; background: #fff; flex: 1; min-width: 0; } -.filter-date-input:focus { border-color: #1aad8d; } -.filter-sep { font-size: 12px; color: #bbb; flex-shrink: 0; } -.filter-select { height: 32px; border: 1px solid #e8e8e8; border-radius: 8px; padding: 0 24px 0 10px; font-size: 12px; color: #333; background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5'%3E%3Cpath d='M0 0l4 5 4-5z' fill='%23999'/%3E%3C/svg%3E") no-repeat right 8px center; appearance: none; outline: none; cursor: pointer; flex: 1; } -.filter-btn { height: 32px; padding: 0 16px; border-radius: 8px; border: none; font-size: 12px; font-weight: 600; cursor: pointer; flex-shrink: 0; } -.filter-btn--primary { background: #1aad8d; color: #fff; } -.filter-btn--reset { background: #f5f5f5; color: #666; } +/* 筛选按钮 */ +.filter-btn { + display: flex; + align-items: center; + gap: 4px; + padding: 4px 2px; + border: none; + background: transparent; + font-size: 13px; + color: #333; + font-weight: 600; + cursor: pointer; +} +.filter-btn__arrow { + font-size: 9px; + color: #999; +} + +/* 时间筛选弹窗 */ +.time-filter-modal { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: none; + z-index: 1000; +} +.time-filter-modal.active { + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-end; +} + +.time-filter-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.4); +} + +.time-filter-panel { + position: relative; + width: 100%; + max-width: 390px; + background: #fff; + border-radius: 16px 16px 0 0; + box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1); + animation: slideUp 0.3s ease-out; +} + +@keyframes slideUp { + from { transform: translateY(100%); } + to { transform: translateY(0); } +} + +.time-filter-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px; + border-bottom: 1px solid #f0f0f0; + font-size: 16px; + font-weight: 600; + color: #1a1a1a; +} + +.time-filter-close { + width: 28px; + height: 28px; + display: flex; + align-items: center; + justify-content: center; + border: none; + background: none; + font-size: 20px; + color: #999; + cursor: pointer; +} + +.time-filter-content { + padding: 16px; + display: flex; + flex-direction: column; + gap: 16px; +} + +.filter-section { + display: flex; + flex-direction: column; + gap: 8px; +} + +.filter-label { + font-size: 13px; + font-weight: 600; + color: #333; +} + +.filter-select { + padding: 10px 12px; + border: 1px solid #ddd; + border-radius: 8px; + font-size: 14px; + color: #333; + background: #fff; + cursor: pointer; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%23666' d='M1 1l5 5 5-5'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 10px center; + padding-right: 32px; +} + +.time-filter-footer { + display: flex; + gap: 12px; + padding: 16px; + border-top: 1px solid #f0f0f0; +} + +.filter-btn-cancel, +.filter-btn-confirm { + flex: 1; + padding: 12px; + border: none; + border-radius: 8px; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; +} + +.filter-btn-cancel { + background: #f5f5f5; + color: #666; +} + +.filter-btn-cancel:active { + background: #e8e8e8; +} + +.filter-btn-confirm { + background: #ff7a8a; + color: #fff; +} + +.filter-btn-confirm:active { + background: #ff5a7a; +} /* 统计条 */ .stat-bar { padding: 10px 16px; display: flex; align-items: center; justify-content: space-between; } @@ -70,42 +212,67 @@ body { background: #f0f2f5; display: flex; justify-content: center; align-items:
- - - - + + + +