fix: 更新体重管理页面,清理旧文件,新增文档和启动脚本

This commit is contained in:
liuyunqin
2026-07-08 18:57:37 +08:00
parent 559eee84d1
commit 281e756a78
54 changed files with 1986 additions and 820 deletions
+563
View File
@@ -0,0 +1,563 @@
# 管理员端(健康应急APP)产品需求文档
## 模块概述
管理员端为健康应急APP的管理与配置角色提供移动端工作平台,负责监控体重管理活动的执行进度、追踪员工体检完成情况、查看应急工单处理状态以及穿戴设备异常告警记录。管理员通过数据看板掌握各业务线运行状况,并对体重管理目标进行审核把关。
### 页面导航结构
```
管理员端
├── 工作台(底部Tab
│ ├── 体重管理详情 → 每日打卡
│ │ ├── 饮食记录详情 → 员工饮食详情
│ │ ├── 运动记录详情 → 员工运动详情
│ │ └── 体重记录 → 员工体重详情
│ ├── 体重管理详情 → 减重排名
│ ├── 体重管理详情 → 目标审核
│ │ └── 目标审核页
│ ├── 体检进度追踪
│ ├── 应急求助工单 → 应急工单详情
│ └── 穿戴设备预警记录
├── 知识库(底部Tab
│ ├── 知识文章(分类Tab)→ 知识详情
│ └── 规章制度(PDF列表)
├── AI助手(底部Tab
├── 消息(底部Tab
│ ├── 消息列表
│ ├── 通讯录
│ └── 即时通讯
└── 我的(底部Tab
├── 修改个人信息
├── 修改密码
└── 退出登录(确认弹窗)
```
### 目标审核状态流转图
```mermaid
stateDiagram-v2
[*] --> 待审核 : 员工提交减重目标
待审核 --> 已通过 : 管理员审核通过
待审核 --> 已驳回 : 管理员审核驳回
已通过 --> 待签收 : 员工签收确认
```
### 应急工单状态流转图
```mermaid
stateDiagram-v2
[*] --> 进行中 : 操作人员派单
进行中 --> 已完成 : 驻场人员完成处理
```
## 页面清单
| 序号 | 文件名 | 页面名称 | 所属模块 |
|------|--------|----------|----------|
| 1 | workbench/index.html | 工作台首页 | 工作台 |
| 2 | workbench/weight-detail.html | 体重管理详情 | 工作台·体重管理 |
| 3 | workbench/eat-detail.html | 饮食记录详情 | 工作台·体重管理 |
| 4 | workbench/diet-employee-detail.html | 员工饮食详情 | 工作台·体重管理 |
| 5 | workbench/exercise-detail.html | 运动记录详情 | 工作台·体重管理 |
| 6 | workbench/exercise-employee-detail.html | 员工运动详情 | 工作台·体重管理 |
| 7 | workbench/weight-record.html | 体重记录 | 工作台·体重管理 |
| 8 | workbench/weight-employee-detail.html | 员工体重详情 | 工作台·体重管理 |
| 9 | workbench/goal-review.html | 目标审核 | 工作台·体重管理 |
| 10 | workbench/checkup-progress.html | 体检进度追踪 | 工作台·体检管理 |
| 11 | workbench/emergency-orders.html | 应急求助工单 | 工作台·应急管理 |
| 12 | workbench/emergency-order-detail.html | 应急工单详情 | 工作台·应急管理 |
| 13 | workbench/wearable-alerts.html | 穿戴设备预警记录 | 工作台·预警管理 |
| 14 | knowledge/index.html | 知识库首页 | 知识库 |
| 15 | knowledge/detail.html | 知识详情 | 知识库 |
| 16 | ../ai-assistant/index.html | AI 助手 | AI 助手 |
| 17 | ../message/index.html | 消息列表 | 消息 |
| 18 | ../message/contacts.html | 通讯录 | 消息 |
| 19 | ../message/im-chat.html | 即时通讯 | 消息 |
| 20 | profile/index.html | 个人中心主页 | 我的 |
| 21 | profile/edit-profile.html | 修改个人信息 | 我的 |
| 22 | profile/change-pwd.html | 修改密码 | 我的 |
## 逐页说明
---
## 一、工作台模块
### 1. 工作台首页
![页面截图](screenshots/index.jpg)
**功能说明:** 管理员工作台入口,顶部展示用户信息(头像、姓名、角色、部门),下方以功能卡片形式呈现四大管理入口:体重管理详情、体检进度追踪、应急求助工单、穿戴设备预警记录。
**业务规则:**
- 用户信息区:头像、姓名(王建国)、角色(健康管理员)、所属部门(安全环保部·健康管理科)
- 功能卡片共 4 个,两行两列排列:
1. 体重管理详情(蓝色图标)
2. 体检进度追踪(绿色图标)
3. 应急求助工单(橙色图标,角标数字"3"表示进行中工单数)
4. 穿戴设备预警记录(红色图标)
- 底部 5 个 Tab:工作台(当前激活,角标"3")、知识库、AI 助手、消息(角标"2")、我的
**交互说明:**
- 点击"体重管理详情"卡片:跳转到体重管理详情页
- 点击"体检进度追踪"卡片:跳转到体检进度追踪页
- 点击"应急求助工单"卡片:跳转到应急求助工单页
- 点击"穿戴设备预警记录"卡片:跳转到穿戴设备预警记录页
- 点击头像:跳转到个人中心主页
- 底部导航栏切换:跳转到对应 Tab 页面
---
## 二、体重管理业务线
### 2. 体重管理详情
![页面截图](screenshots/weight-detail.jpg)
**功能说明:** 体重管理活动总览页面,支持切换不同活动期次,展示活动整体统计数据,并通过三个主 Tab(每日打卡、减重排名、目标审核)分类查看管理数据。
**业务规则:**
- 顶部活动选择器:下拉切换不同活动期次(如"2026年Q2体重管理活动"),切换后刷新活动统计数据
- 活动统计区:已进行天数 / 总天数、预期参与人数、实际参与人数
- 三个主 Tab
- 每日打卡(默认):按日查看饮食、运动、体重的打卡统计数据
- 减重排名:4 个子 Tab(减重总量排名 / 减重率排名 / 综合评分排名 / 行动评分排名),各显示前 20 名
- 目标审核:4 个子 Tab(待审核 / 已通过 / 待签收 / 已驳回),显示员工减重目标申请
- 每日打卡面板:日期导航(左右箭头 + 日历选择器)、三张统计卡片(饮食已打卡XX人/未打卡XX人、运动已打卡XX人/未打卡XX人、体重已打卡XX人/未打卡XX人)
- 减重排名:前三名展示金/银/铜牌勋章 + 员工脱敏姓名 + 部门 + 数值
- 目标审核卡片:展示员工姓名、初始/目标数据对比、操作按钮
**交互说明:**
- 点击活动下拉框:展开活动列表,选择后切换数据
- 点击每日打卡 Tab:切换到打卡统计面板
- 点击减重排名 Tab:切换到排名面板
- 点击目标审核 Tab:切换到审核面板
- 点击饮食"查看详情":跳转到饮食记录详情页
- 点击运动"查看详情":跳转到运动记录详情页
- 点击体重"查看详情":跳转到体重记录页
- 日期导航左右箭头:切换前一天/后一天
- 点击日历图标:弹出日历选择面板
- 点击排名子 Tab:切换不同排名维度
- 点击审核子 Tab(待审核/已通过/待签收/已驳回):切换审核状态面板
- 点击目标审核卡片的"审核"按钮:跳转到目标审核页
- 点击返回:返回工作台首页
---
### 3. 饮食记录详情
![页面截图](screenshots/eat-detail.jpg)
**功能说明:** 按日查看员工的饮食打卡情况,分"已记录"和"未记录"两个 Tab 展示员工列表。
**业务规则:**
- 日期导航:支持左右箭头切换日期、日历面板选择日期
- 两个 Tab:已记录(角标数字显示已打卡人数)、未记录(角标数字显示未打卡人数)
- 员工卡片信息:头像(取姓名首字)、姓名、性别、年龄、部门、身高
- 已记录员工卡片右侧有"记录详情 >"链接
**交互说明:**
- 点击已记录员工的"记录详情":跳转到员工饮食详情页
- 点击日历图标:弹出日历选择面板
- 日期左右箭头:切换日期
- 点击 Tab 切换:已记录 / 未记录列表
- 点击返回:返回体重管理详情页
---
### 4. 员工饮食详情
![页面截图](screenshots/diet-employee-detail.jpg)
**功能说明:** 查看单个员工的当日饮食详细记录,包括各餐次的摄入热量、食物明细及记录来源。同时展示该员工的初始/目标/当前身体数据对比。
**业务规则:**
- 员工信息:姓名(张晓红)、性别、年龄、部门、身高
- 数据对比表(三列):初始数据 / 目标数据 / 当前数据,包含体重、BMI、体脂率、腰围
- 变化指标:体重变化、BMI 变化、体脂率变化、腰围变化(绿色数值表示下降)
- 当日饮食记录:按餐次展示(早餐、午餐、加餐、晚餐),每条记录显示热量(kcal)、时间、记录来源标签
- 记录来源标签颜色:蓝色(智能记录)、紫色(手动记录)
**交互说明:**
- 点击返回:返回饮食记录详情页
---
### 5. 运动记录详情
![页面截图](screenshots/exercise-detail.jpg)
**功能说明:** 按日查看员工的运动打卡情况,分"已记录"和"未记录"两个 Tab 展示员工列表。
**业务规则:**
- 日期导航:支持左右箭头切换日期、日历面板选择日期
- 两个 Tab:已记录(角标数字)、未记录(角标数字)
- 员工卡片信息:头像、姓名、性别、年龄、部门
- 已记录员工卡片右侧有"记录详情 >"链接
**交互说明:**
- 点击已记录员工的"记录详情":跳转到员工运动详情页
- 点击日历图标:弹出日历选择面板
- 日期左右箭头:切换日期
- 点击 Tab 切换:已记录 / 未记录列表
- 点击返回:返回体重管理详情页
---
### 6. 员工运动详情
![页面截图](screenshots/exercise-employee-detail.jpg)
**功能说明:** 查看单个员工的当日运动详细记录,包括运动类型、时长、消耗热量及记录来源。同时展示员工的初始/目标/当前身体数据对比。
**业务规则:**
- 员工信息:姓名(陈伟)、性别、年龄
- 数据对比表:初始数据 / 目标数据 / 当前数据(体重、BMI、体脂率、腰围)
- 变化指标:绿色显示下降数值
- 当日运动记录:跑步(45min/320kcal/穿戴设备)、骑行(30min/180kcal/手动记录)、游泳(60min/480kcal/器材记录)、步行(8,520步/150kcal/微信运动)
- 记录来源标签颜色:蓝色(穿戴设备/器材)、紫色(手动/微信运动)
**交互说明:**
- 点击返回:返回运动记录详情页
---
### 7. 体重记录
![页面截图](screenshots/weight-record.jpg)
**功能说明:** 按日查看员工的体重打卡情况,分"已记录"和"未记录"两个 Tab 展示员工列表。
**业务规则:**
- 日期导航:支持左右箭头切换日期、日历面板选择日期
- 两个 Tab:已记录(角标数字)、未记录(角标数字)
- 员工卡片信息:头像、姓名、性别、年龄、部门
- 已记录员工卡片右侧有"记录详情 >"链接
**交互说明:**
- 点击已记录员工的"记录详情":跳转到员工体重详情页
- 点击日历图标:弹出日历选择面板
- 日期左右箭头:切换日期
- 点击 Tab 切换:已记录 / 未记录列表
- 点击返回:返回体重管理详情页
---
### 8. 员工体重详情
![页面截图](screenshots/weight-employee-detail.jpg)
**功能说明:** 查看单个员工的体重历史记录,每条记录包含体重、体脂率、腰围及记录来源,同时展示该员工的初始/目标/当前身体数据对比。
**业务规则:**
- 员工信息:姓名(张晓红)、性别、年龄、部门
- 数据对比表:初始数据 / 目标数据 / 当前数据(体重、BMI、体脂率、腰围)
- 变化指标:绿色显示下降数值
- 体重记录列表:按时间倒序,每条显示时间、体重、体脂率、腰围、来源标签
- 记录来源标签颜色:蓝色(蓝牙秤/身高体重秤)、紫色(体脂仪/手动/穿戴设备)
**交互说明:**
- 点击返回:返回体重记录页
---
### 9. 目标审核
![页面截图](screenshots/goal-review.jpg)
**功能说明:** 管理员审核员工提交的体重管理减重目标申请,可选择通过或驳回,驳回时需填写驳回原因。已审核的目标以只读方式展示审核结果。
**业务规则:**
- 通过 URL 参数 `status` 区分页面模式:pending(待审核)/ approved(已通过)/ signed(待签收)/ rejected(已驳回)
- 待审核模式:
- 展示员工基本信息卡片(姓名、性别、年龄、身高)
- 数据对比卡片:初始数据(体重/BMI/体脂率/腰围)、目标数据(绿色)、推荐数据范围(蓝色参考)
- 活动时间范围卡片:开始日期 → 结束日期
- 底部操作区:单选按钮(通过 / 驳回)、驳回时展开驳回原因文本框、提交审核按钮
- 已通过/待签收/已驳回模式:
- 以只读方式展示审核结果,包含状态标签、审核人、审核时间
- 已驳回额外展示驳回原因
- 无操作按钮
**交互说明:**
- 点击"通过"单选按钮:隐藏驳回原因文本框
- 点击"驳回"单选按钮:展开驳回原因文本框(placeholder: "请输入驳回原因..."
- 点击"提交审核":弹出确认弹窗
- 确认弹窗:标题根据操作变化(通过审核 / 驳回申请),显示简要确认信息,取消按钮关闭弹窗,确认按钮执行操作
- 确认后弹出成功弹窗:"审核完成",点击"返回列表"跳转回体重管理详情页
- 点击返回:返回体重管理详情页
**审核操作表单:**
| 字段名 | 类型 | 必填 | 校验规则 |
|--------|------|------|----------|
| 审核结果 | 单选按钮 | 是 | 必选"通过"或"驳回" |
| 驳回原因 | 多行文本 | 驳回时必填 | 驳回时不可为空 |
---
## 三、体检管理业务线
### 10. 体检进度追踪
![页面截图](screenshots/checkup-progress.jpg)
**功能说明:** 按体检计划期次查看员工的体检预约和完成进度,通过四个分段 Tab(已预约、已检查、未预约、未检查)统计并展示各状态的员工列表。
**业务规则:**
- 顶部体检计划选择器:下拉切换不同体检计划(如"2026年度体检""2025年度体检""2025职业病体检"),切换后刷新各状态统计数据
- 统计区:预期人数、已预约人数、已检查人数、未预约人数、未检查人数
- 四个分段 Tab:已预约(角标数字)、已检查(角标数字)、未预约(角标数字)、未检查(角标数字)
- 员工卡片信息:头像(姓名首字)、姓名 + 工号、所属单位 + 部门、联系电话
- 数据通过 JS 模拟数据动态渲染
**交互说明:**
- 点击体检计划下拉框:展开计划列表,选择后切换数据
- 点击分段 Tab:切换不同状态的员工列表
- 点击返回:返回工作台首页
---
## 四、应急管理业务线
### 11. 应急求助工单
![页面截图](screenshots/emergency-orders.jpg)
**功能说明:** 查看所有应急求助工单的处理情况,分"进行中"和"已完成"两个 Tab 展示,支持按月度和求助方式筛选。管理员以只读监控视角查看工单流转。
**业务规则:**
- 两个主 Tab:进行中(角标数字"3")、已完成(角标数字"12"
- 筛选栏:月份下拉(全部 / 2026-06 / 2026-05 / 2026-04)、求助方式下拉(全部 / 应急视频 / 应急电话 / 拨120)
- 工单卡片信息:求助方式标签(颜色区分:视频粉色、电话橙色、120红色)、时间、求助员工信息(头像、姓名、工号、性别、年龄、单位、部门、电话)、工单详情行(应急中心、操作人员、专业人员)
- 数据通过 JS 模拟,筛选条件联动更新两个 Tab 的列表
**交互说明:**
- 点击进行中/已完成 Tab:切换工单列表
- 点击月份下拉:按月份筛选工单
- 点击求助方式下拉:按求助方式筛选工单
- 点击工单卡片:跳转到应急工单详情页
- 点击返回:返回工作台首页
---
### 12. 应急工单详情
![页面截图](screenshots/emergency-order-detail.jpg)
**功能说明:** 查看单条应急工单的完整信息,以可折叠卡片形式展示基本信息、救助信息、派单信息、救护车支持信息四个维度的详情。管理员视角为纯只读页面。
**业务规则:**
- 四个可折叠卡片(默认展开):
1. 基本信息:工单编号、应急中心、求助员工姓名/工号、单位、部门、求助方式、求助时间、位置信息(含地图图标)、操作人员、专业人员、工单状态(已完成绿色标签)、完成时间
2. 救助信息:救助意见(文本)、救助结果(文本)、相关照片(3 张占位图)、补充小结(多条带圆点标记的列表)
3. 派单信息:派单时间、驻场人员、派单状态(已完成)、结束时间、派单说明、驻场说明
4. 救护车支持:车牌号、机构、驾驶员、驾驶员电话、护送人员、护送人员电话、目的地、备注
- 纯只读展示,无编辑或操作按钮
**交互说明:**
- 点击卡片标题行:折叠/展开卡片内容
- 点击返回:返回应急求助工单列表页
---
## 五、预警管理业务线
### 13. 穿戴设备预警记录
![页面截图](screenshots/wearable-alerts.jpg)
**功能说明:** 查看所有员工穿戴设备的异常告警记录,支持按月份和告警类型筛选。
**业务规则:**
- 筛选栏:月份下拉(全部 / 2026-06 / 2026-05 / 2026-04)、告警类型下拉(全部 / SOS 求助 / 体温异常 / 心率异常 / 血氧异常 / 压力异常 / 跌倒检测)
- 告警卡片信息:告警类型标签(颜色区分类型)、时间戳、异常数值(含单位)、员工信息(头像、姓名、工号、性别、年龄、单位、部门)、位置信息(含定位图标)
- 告警类型共 6 种:SOS 求助(红色)、体温异常(橙色)、心率异常(红色)、血氧异常(紫色)、压力异常(蓝色)、跌倒检测(红色)
- 数据通过 JS 模拟,筛选条件联动更新列表
**交互说明:**
- 点击月份下拉:按月份筛选告警记录
- 点击告警类型下拉:按类型筛选告警记录
- 点击返回:返回工作台首页
---
## 六、知识库模块
### 14. 知识库首页
![页面截图](screenshots/knowledge-index.jpg)
**功能说明:** 专业知识参考库,分"知识文章"和"规章制度"两个大类,知识文章下再按二级分类 Tab 组织。
**业务规则:**
- 两大主 Tab:知识文章(默认)/ 规章制度
- 知识文章二级分类 Tab(4 个):体检知识(4 篇)、药品知识(2 篇)、疾病知识(2 篇)、健康知识(2 篇)
- 知识文章列表:每篇文章展示图标、标题、简介描述、右箭头
- 规章制度列表:5 条 PDF 文档条目(员工健康管理办法、职业病防治规则、体检异常处理流程、健康咨询服务规范、应急救援操作标准)
- 文章数据通过 JS 对象动态渲染
**交互说明:**
- 点击知识文章/规章制度主 Tab:切换大类
- 点击二级分类 Tab:切换知识分类
- 点击文章条目:跳转到知识详情页(通过 `?key=<文章标识>` 传递参数)
- 点击规章制度条目:打开对应 PDF(原型中为占位链接)
---
### 15. 知识详情
![页面截图](screenshots/knowledge-detail.jpg)
**功能说明:** 展示单篇知识文章的详细内容,包括文章基本信息、摘要和要点列表。
**业务规则:**
- 通过 URL 参数 `key` 确定展示哪篇文章,共有 10 篇文章数据
- 文章内容:图标、标题、分类、发布日期、摘要段、要点列表(彩色标题 + 灰色圆角说明卡片)
- 体检知识(4 篇):血常规解读、心电图判读、肝功能解读、血糖解读
- 药品知识(2 篇):降压药物、他汀类药物
- 疾病知识(2 篇):高血压、偏头痛
- 健康知识(2 篇):营养指导、运动与心血管健康
**交互说明:**
- 点击返回:返回知识库首页
---
## 七、AI 助手
### 16. AI 助手
![页面截图](screenshots/../ai-assistant/screenshots/index.jpg)
**功能说明:** 智能健康问答助手,支持文字输入提问,提供快捷问题入口。全角色共享页面。
**业务规则:**
- 欢迎语和三个快捷问题入口(偏头痛鉴别诊断、高血压用药建议、血脂异常处理方案)
- AI 对话模拟:用户发送消息后,AI 延迟回复占位文字
- 通过 `sessionStorage.appRole` 识别当前角色为 admin,设置正确的 Tab 导航路径
**交互说明:**
- 输入文字后点击发送或按回车:发送消息,显示用户消息气泡(紫色右对齐)
- 点击快捷问题标签:自动填入输入框并发送
- 底部 Tab 切换:跳转到对应角色页面
---
## 八、消息模块
### 17. 消息列表
![页面截图](screenshots/../message/screenshots/index.jpg)
**功能说明:** 即时通讯消息汇总列表,展示最近对话的联系人及消息预览。全角色共享页面。
**业务规则:**
- 6 条消息会话:咨询小助手(未读"2")、李主任(专业人员)、张护士长(专业人员)、陈运营(操作人员)、刘驻场(驻场人员)、系统管理员
- 每条展示:头像、姓名、角色标签(颜色区分)、时间、消息预览
- 通过 `sessionStorage.appRole` 识别当前角色,设置正确的底部 Tab 导航路径
**交互说明:**
- 点击消息条目:跳转到即时通讯页
- 点击右上角"通讯录":跳转到通讯录页
- 底部 Tab 切换:跳转到对应角色页面
---
### 18. 通讯录
![页面截图](screenshots/../message/screenshots/contacts.jpg)
**功能说明:** 组织内联系人列表,按角色分组展示,支持搜索过滤。全角色共享页面。
**业务规则:**
- 6 个联系人分组:小助手、咨询专家、健康管理员、操作人员、专业人员、驻场人员
- 每组可折叠/展开,展示成员姓名、角色标签、所属机构
- 搜索框支持按姓名实时过滤,空分组自动隐藏
**交互说明:**
- 点击分组标题:折叠/展开该分组
- 在搜索框输入文字:实时过滤联系人
- 点击联系人:跳转到即时通讯页
- 点击返回:返回消息列表页
---
### 19. 即时通讯
![页面截图](screenshots/../message/screenshots/im-chat.jpg)
**功能说明:** 单聊页面,支持文字和语音输入,可发送图片。全角色共享页面。
**业务规则:**
- 导航栏标题显示当前对话对象名称
- 预置示例对话(与"咨询小助手"的聊天记录)
- 支持文字输入、语音输入(按住说话)、多媒体附件(拍照/图库)
- 发送的消息为蓝色右对齐气泡,接收的消息为白色左对齐气泡
**交互说明:**
- 在输入框输入文字后点击发送:消息以蓝色气泡展示在右侧
- 点击语音切换按钮:切换为按住说话模式
- 点击"+"按钮:展开多媒体面板(拍照/图库选项,原型中为占位)
- 点击返回:返回消息列表页
---
## 九、个人中心模块
### 20. 个人中心主页
![页面截图](screenshots/profile-index.jpg)
**功能说明:** 管理员个人信息展示和功能菜单导航。
**业务规则:**
- 用户信息区:头像、姓名(王建国)、角色(健康管理员)、所属部门(安全环保部·健康管理科)
- 菜单项:修改个人信息、修改密码、关于我们
- 退出登录按钮(红色文字)
**交互说明:**
- 点击"修改个人信息":跳转到修改个人信息页
- 点击"修改密码":跳转到修改密码页
- 点击"退出登录":弹出二次确认弹窗("确认退出当前账号?"),取消关闭弹窗,确认退出登录
- 底部 Tab 切换:跳转到对应页面
---
### 21. 修改个人信息
![页面截图](screenshots/profile-edit-profile.jpg)
**功能说明:** 编辑管理员头像和姓名。
**交互说明:**
- 点击头像:弹出底部操作面板(拍照 / 从相册选择 / 取消)
- 点击"保存":验证姓名非空,显示"保存成功"提示(1.5 秒自动消失)
- 点击返回:返回个人中心主页
**表单字段表:**
| 字段名 | 类型 | 必填 | 校验规则 |
|--------|------|------|----------|
| 头像 | 图片选择 | 否 | 支持拍照或从相册选择 |
| 姓名 | 单行文本 | 是 | 不能为空 |
---
### 22. 修改密码
![页面截图](screenshots/profile-change-pwd.jpg)
**功能说明:** 修改管理员登录密码。
**交互说明:**
- 点击"保存修改":弹出修改成功确认弹窗("密码修改成功,下次登录请使用新密码"),点击确定后跳转回个人中心
**表单字段表:**
| 字段名 | 类型 | 必填 | 校验规则 |
|--------|------|------|----------|
| 当前密码 | 密码输入 | 是 | 不能为空 |
| 新密码 | 密码输入 | 是 | 不能为空 |
| 确认新密码 | 密码输入 | 是 | 必须与新密码一致 |
+165
View File
@@ -0,0 +1,165 @@
/**
* 管理员端(健康应急APP)页面截图脚本
* 使用 Puppeteer 批量截取 HTML 原型页面,输出 JPEG(质量 85%)到 doc/screenshots/
*
* 用法: node doc/screenshot.js
*/
const puppeteer = require('puppeteer');
const path = require('path');
const fs = require('fs');
const MODULE_DIR = __dirname.replace(/\\doc$/, ''); // admin/
const SCREENSHOTS_DIR = path.join(__dirname, 'screenshots');
// 所有需要截图的页面(相对于模块目录)
const PAGES = [
// 工作台
'workbench/index.html',
'workbench/weight-detail.html',
'workbench/eat-detail.html',
'workbench/diet-employee-detail.html',
'workbench/exercise-detail.html',
'workbench/exercise-employee-detail.html',
'workbench/weight-record.html',
'workbench/weight-employee-detail.html',
'workbench/goal-review.html',
'workbench/checkup-progress.html',
'workbench/emergency-orders.html',
'workbench/emergency-order-detail.html',
'workbench/wearable-alerts.html',
// 知识库
'knowledge/index.html',
'knowledge/detail.html',
// 个人中心
'profile/index.html',
'profile/edit-profile.html',
'profile/change-pwd.html',
];
async function screenshotPage(browser, htmlFile) {
const page = await browser.newPage();
const filePath = path.join(MODULE_DIR, htmlFile);
const fileUrl = `file:///${filePath.replace(/\\/g, '/')}`;
const viewportWidth = 390;
const viewportHeight = 844;
await page.setViewport({ width: viewportWidth, height: viewportHeight, deviceScaleFactor: 2 });
try {
await page.goto(fileUrl, { waitUntil: 'networkidle0', timeout: 15000 });
// 等待页面渲染完成
await new Promise(r => setTimeout(r, 500));
// 注入 CSS:移除 phone-shell 限制,展开全部内容
await page.evaluate(() => {
const style = document.createElement('style');
style.id = 'screenshot-unwrap';
style.textContent = `
/* 移除手机壳固定高度和装饰 */
.phone-shell {
height: auto !important;
min-height: auto !important;
max-height: none !important;
border-radius: 0 !important;
box-shadow: none !important;
overflow: visible !important;
}
/* 滚动区域全部展开 */
.scroll-content,
[class*="scroll"] {
overflow: visible !important;
max-height: none !important;
height: auto !important;
}
/* 页面外层背景改为白色 */
body {
background: #fff !important;
padding: 0 !important;
margin: 0 !important;
}
/* 隐藏下拉菜单、遮罩等弹窗遮挡元素 */
.dropdown-menu, .dropdown-mask, .calendar-mask,
.plan-dropdown, .plan-mask {
display: none !important;
}
/* 底部安全区缩到最小 */
.bottom-safe {
height: 8px !important;
}
`;
document.head.appendChild(style);
});
// 等待样式生效
await new Promise(r => setTimeout(r, 300));
// 获取实际内容高度
const bodyHandle = await page.$('.phone-shell');
const contentHeight = await page.evaluate((el) => {
if (el) return el.scrollHeight;
return document.body.scrollHeight;
}, bodyHandle);
const finalHeight = Math.max(contentHeight || viewportHeight, 400);
await page.setViewport({ width: viewportWidth, height: Math.min(finalHeight + 40, 12000), deviceScaleFactor: 2 });
// 使用简洁文件名,与 PRD 引用一致
// workbench/index.html → index.jpg, knowledge/index.html → knowledge-index.jpg
let outName = htmlFile.replace('.html', '.jpg');
if (outName.startsWith('workbench/')) {
outName = outName.replace('workbench/', '');
} else if (outName.startsWith('knowledge/')) {
outName = outName.replace('knowledge/', 'knowledge-');
} else if (outName.startsWith('profile/')) {
outName = outName.replace('profile/', 'profile-');
}
const outPath = path.join(SCREENSHOTS_DIR, outName);
await page.screenshot({
path: outPath,
type: 'jpeg',
quality: 85,
fullPage: true,
});
console.log(`${htmlFile}${outName} (${viewportWidth}×${finalHeight})`);
} catch (err) {
console.error(`${htmlFile}: ${err.message}`);
} finally {
await page.close();
}
}
(async () => {
console.log('管理员端(健康应急APP)- 页面截图');
console.log(`模块目录: ${MODULE_DIR}`);
console.log(`输出目录: ${SCREENSHOTS_DIR}`);
console.log(`${PAGES.length} 个页面\n`);
// 确保输出目录存在
if (!fs.existsSync(SCREENSHOTS_DIR)) {
fs.mkdirSync(SCREENSHOTS_DIR, { recursive: true });
}
const browser = await puppeteer.launch({
headless: true,
executablePath: 'C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe',
args: ['--no-sandbox', '--disable-setuid-sandbox'],
});
try {
for (let i = 0; i < PAGES.length; i++) {
const pageName = PAGES[i];
console.log(`[${i + 1}/${PAGES.length}] ${pageName}`);
await screenshotPage(browser, pageName);
}
console.log(`\n✅ 全部完成!共 ${PAGES.length} 张截图,保存在 ${SCREENSHOTS_DIR}`);
} catch (err) {
console.error('执行出错:', err);
process.exit(1);
} finally {
await browser.close();
}
})();
Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB