diff --git a/employee-app/weight-management/diet-advice-v2.html b/employee-app/weight-management/diet-advice-v2.html index 8e8c81b..abff4d1 100644 --- a/employee-app/weight-management/diet-advice-v2.html +++ b/employee-app/weight-management/diet-advice-v2.html @@ -17,7 +17,6 @@ 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; color: #1a1a1a; } .nav-title { flex: 1; text-align: center; font-size: 17px; font-weight: 600; color: #1a1a1a; } .nav-placeholder { width: 28px; height: 28px; } - .nav-action { font-size: 13px; color: #36cfc9; font-weight: 600; cursor: pointer; white-space: nowrap; flex-shrink: 0; } /* ===== 周日历(页面顶部) ===== */ .calendar-card { background: #fff; border-radius: 16px; margin: 10px 12px 0; padding: 12px 12px 8px; box-shadow: 0 4px 14px rgba(0,0,0,0.04); position: relative; } @@ -343,7 +342,7 @@ body { background: #f0f2f5; display: flex; justify-content: center; align-items:
- + diff --git a/employee-app/weight-management/doc/PRD.md b/employee-app/weight-management/doc/PRD.md index d036244..6df6c49 100644 --- a/employee-app/weight-management/doc/PRD.md +++ b/employee-app/weight-management/doc/PRD.md @@ -10,7 +10,7 @@ 体重管理(员工端) ├── 体重管理主页(入口) │ ├── 目标管理 → 目标详情 -│ ├── 历史计划 +│ ├── 历史目标 │ ├── 活动详情 │ ├── 基本信息 │ ├── 签订承诺 / 我的承诺 @@ -45,6 +45,8 @@ stateDiagram-v2 每日打卡 --> 饮食记录: 查看饮食 每日打卡 --> 运动记录: 查看运动 每日打卡 --> 体重记录: 查看体重 + 体重管理主页 --> 目标详情: 查看目标卡片 + 体重管理主页 --> 健康科普: 查看科普食谱/推荐视频 体重管理主页 --> 吃动平衡: 查看吃动平衡 体重管理主页 --> 排行榜: 查看排名 体重管理主页 --> 体重报告: 查看报告 @@ -61,7 +63,7 @@ stateDiagram-v2 | 1 | 体重管理主页 | weight-main-v2.html | 页面 | | 2 | 目标管理 | goal-management-v2.html | 页面 | | 3 | 目标详情 | goal-detail-v2.html | 页面 | -| 4 | 历史计划 | goal-history-v2.html | 页面 | +| 4 | 历史目标 | goal-history-v2.html | 页面 | | 5 | 活动详情 | activity-detail.html | 页面 | | 6 | 基本信息 | basic-info.html | 页面 | | 7 | 签订承诺 | promise-signing.html | 页面 | @@ -117,18 +119,18 @@ stateDiagram-v2 **功能说明:** 体重管理模块的核心中枢页面,聚合展示体重管理目标、每日吃/动/体重打卡概览、吃动平衡、排行榜、体重报告与推荐视频。 页面存在六种状态:6 种演示状态:已设置-参加活动·已签署、已设置-参加活动·审核中、已设置-参加活动·已通过待签署、已设置-参加活动·已驳回、已设置-个人目标、未设置目标。 -| UI 区域 | 已签署 | 审核中 | 已通过待签署 | 已驳回 | 个人目标 | 未设置 | -|---------|:--:|:--:|:--:|:--:|:--:|:--:| -| 目标卡片-标尺(人物+波浪球) | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | -| 目标状态横幅 | ❌ | 🟡 审核中 | 🟢 去签署 | 🔴 重新提交 | ❌ | ❌ | -| 目标空状态 | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | -| 排名徽章(第N名) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | -| 排行榜-我的排名行 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | -| 体重报告-目标相关行 | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| UI 区域 | 已签署 | 审核中 | 已通过待签署 | 已驳回 | 个人目标 | 未设置/未参加 | +|---------|:--:|:--:|:--:|:--:|:--:|:-------:| +| 目标卡片-标尺(人物+波浪球) | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| 目标状态横幅 | ❌ | 🟡 审核中 | 🟢 去签署 | 🔴 重新提交 | ❌ | ❌ | +| 目标空状态 | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | +| 排名徽章(第N名) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| 排行榜-我的排名行 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| 体重报告-目标相关行 | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | **主要UI元素:** -- **导航栏:** 标题"体重管理",右侧"历史计划"链接(跳转到历史计划页) +- **导航栏:** 标题"体重管理",右侧"历史目标"链接(跳转到历史目标页) - **体重管理目标卡片:** - 标题"体重管理目标"+ 右侧"当前第N天/共N天"(点击跳转到目标详情/目标管理页) - 活动名称 + 排名徽章(🏆 第N名) @@ -142,26 +144,29 @@ stateDiagram-v2 - **记录体重弹窗(底部弹层):** 记录体重(必填,滑动尺子调整)+ 记录体脂率(开关)+ 记录腰围(开关)+ "保存"按钮,构成同体重记录页的记录体重弹窗(见第 18 节)  +- **记录成功弹窗(保存后弹出):** 居中弹窗——今日日期 + "记录成功" + 今日体重(kg,青绿高亮)+ 体脂率/腰围摘要行(对应开关开启时显示)+ "确定"按钮(仅关闭弹窗,留在当前页) + +  - **排行榜卡片:** "我的排名"行(排名/积分)+ 前三名金银铜牌列表,点击跳转到排行榜页 - **体重报告卡片:** 初始体重 → 当前体重 → 目标体重,统计行(已减体重/距目标/目标进度)+ 进度条 - **推荐视频卡片:** 2列网格展示健康科普视频(缩略图 + 播放次数 + 作者 + 标题 + 机构) **交互说明:** -- 点击"历史计划"跳转到历史计划页(goal-history-v2.html) -- 点击目标卡片天数链接跳转到目标详情页(goal-detail-v2.html),未设置目标时跳转到目标管理页(goal-management-v2.html) +- 点击"历史目标"跳转到历史目标页(goal-history-v2.html) +- 点击目标卡片跳转到目标详情页(goal-detail-v2.html),未设置目标时跳转到目标管理页(goal-management-v2.html) - 点击状态横幅"去签署"跳转到签订承诺页(promise-signing.html);"重新提交"跳转到目标管理页(goal-management-v2.html,携带活动回填参数) - 点击吃/动/体重卡片:已记录时跳转到对应记录页(饮食记录 eat-detail-v2.html / 运动记录 exercise-detail-v2.html / 体重记录 weight-detail-v2.html),未记录时直接跳转到自记打卡页(饮食录入 eat-checkin-v2.html / 运动录入 exercise-checkin-v2.html,体重为打开记录体重弹窗) - 点击吃卡片"+"跳转到饮食录入页(eat-checkin-v2.html);动卡片"+"跳转到运动录入页(exercise-checkin-v2.html);体重卡片"+"打开记录体重弹窗 +- 记录体重弹窗点击"保存"后关闭弹窗并弹出记录成功弹窗(展示本次记录的体重等数据),主页体重卡片同步更新为最新记录 - 点击"今日饮食建议",先判断是否设置饮食偏好,如未设置,跳转到diet-questionnaire.html,设置了则跳转到今日饮食建议页(diet-advice-v2.html);"智能运动计划"跳转到智能运动计划页(exercise-advice-v2.html);"蓝牙称"跳转到蓝牙称页(bluetooth-scale-v2.html) - 点击吃动平衡卡片跳转到吃动平衡页(eat-exercise-detail-v2.html);点击周日历中的日期切换当日吃动统计(不触发跳转) - 点击排行榜卡片跳转到排行榜页(weight-ranking.html);体重报告卡片跳转到体重报告页(weight-report.html) - 点击返回按钮跳转到应用主页(home/index.html) **业务规则:** -- 非"已签署"状态下,排行榜隐藏"我的排名"行、体重报告隐藏目标相关行、标尺隐藏并展示状态横幅 -- 个人目标模式下隐藏排名徽章与"我的排名"行,体重报告完整展示 -- 如员工有参加过活动(签署过承诺书),则后续被纳入参与人员范围的活动自动参加,自动变成已签署状态 - +- 未参加活动时,判断当前单位是否存在活动,已存在,显示排行榜;未存在活动,显示排行榜示意图,无法点击 +- 如员工有参加过活动(签署过承诺书),则后续被纳入参与人员范围的活动自动参加,自动变成已签署状态(已参加) +- --- ### 2. 目标管理(goal-management-v2.html) @@ -188,9 +193,13 @@ stateDiagram-v2 - **活动选择弹窗:** 活动列表(活动名称、起止时间、组织机构)+ 确定按钮  -- **确认提交弹窗:** 活动信息 / 初始数据 / 目标数据三段式确认,取消 / 确认提交(个人目标模式下活动信息段为空占位"--") +- **确认提交弹窗:** 按目标类型展示信息段 + 初始数据 / 目标数据三段式确认,取消 / 确认提交 + - 活动目标模式:信息段标题为"活动信息",含活动名称 / 起止日期 / 组织机构 -  +  + - 个人目标模式:信息段标题为"个人目标信息",含目标名称 / 起止日期(回填所填名称与开始~结束日期),不展示组织机构 + +  **交互说明:** - 点击"活动目标/个人目标"切换类型 @@ -198,13 +207,12 @@ stateDiagram-v2 - 点击"查看全部"跳转到基本信息页(basic-info.html) - 点击底部"提交"校验(活动模式需先选活动,个人模式需填写名称与合法日期),通过后打开确认弹窗 - 点击"确认提交"跳转到目标详情页(goal-detail-v2.html) -- 页面支持通过 URL 参数回填(个人目标:name/startDate/endDate;活动目标:actId/actName/actPeriod/actOrg) **业务规则:** - 活动天数由活动起止日期自动计算,不可修改 - 个人目标天数由开始/结束日期自动计算 -- 目标数据各项分别给出推荐范围与换算说明:体重按身高与健康 BMI 标准(18.5~23.9)换算;体脂率按性别健康标准;腰围按身高比例与性别中心性肥胖线取较严值(原型中为静态示例文案) -- 结束日期必须晚于开始日期 +- 目标数据各项分别给出推荐范围与换算说明(推荐范围按原系统公式走,换算说明可暂时等待AI处理) +- 开始日期只能今日及以后,结束日期必须晚于开始日期 --- @@ -212,24 +220,28 @@ stateDiagram-v2  +  + +  + **功能说明:** 展示单个活动目标或个人目标的完整信息,含审核状态、目标数据、变化趋势、排行榜与体重报告。 -**页面状态:** 导航栏标题旁下拉菜单切换"活动目标 / 个人目标";活动目标模式下通过顶部状态标签切换 5 种状态演示:审核中、已通过待签署、已驳回、已签署、已结束。 +**页面状态:** 导航栏标题"目标详情",标题旁下拉菜单切换"活动目标 / 个人目标";活动目标模式下通过顶部状态标签切换 5 种状态演示:审核中、已通过待签署、已驳回、已签署、已结束。 -| 状态 | 状态横幅 | 目标信息列 | 变化趋势 | 排行榜/报告 | -|------|------|------|:--:|:--:| -| 审核中 | 🟡 目标审核中,请耐心等待(提交时间) | 初始 → 目标 | ❌ | ❌ | -| 已通过待签署 | 🟢 审核已通过,请签署目标承诺书(审核人)+ 签署按钮 | 初始 → 目标 | ❌ | ❌ | -| 已驳回 | 🔴 目标已被驳回(驳回原因 + 重新提交按钮) | 初始 → 目标(体重标红) | ❌ | ❌ | -| 已签署 | 🎉 承诺书已签署,活动进行中(签署时间)+ 承诺书按钮 | 初始 → 当前 → 目标 | ❌ | ❌ | -| 已结束 | 🏁 活动已结束,恭喜完成目标 + 承诺书按钮 | 初始 → 最终 → 目标 | ✅ | ✅ | +| 状态 | 状态横幅 | 目标信息列 | 变化趋势 | 排行榜/报告/摄入消耗 | +|------|------|------|:--:|:-----------:| +| 审核中 | 🟡 目标审核中,请耐心等待(提交时间) | 初始 → 目标 | ❌ | ❌ | +| 已通过待签署 | 🟢 审核已通过,请签署目标承诺书(审核人)+ 签署按钮 | 初始 → 目标 | ❌ | ❌ | +| 已驳回 | 🔴 目标已被驳回(驳回原因 + 重新提交按钮) | 初始 → 目标 | ❌ | ❌ | +| 已签署 | 🎉 承诺书已签署,活动进行中(签署时间)+ 承诺书按钮;目标信息卡片标题右侧"修改目标"按钮 | 初始 → 当前 → 目标 | ❌ | ❌ | +| 已结束 | 🏁 活动已结束 + 承诺书按钮 | 初始 → 最终 → 目标 | ✅ | ✅ | **主要UI元素:** -- **导航栏:** 标题"活动目标详情/个人目标详情" + 标题旁下拉菜单(活动目标/个人目标) +- **导航栏:** 标题"目标详情" + 标题旁下拉菜单(活动目标/个人目标) - **状态横幅:** 按状态显示不同颜色与文案,含提交/审核/签署时间、审核人、驳回原因及操作按钮 - **活动信息卡片:** 活动名称 + "活动详情"链接 + 起止时间 · 组织机构 -- **目标信息卡片:** 三列数据(初始 / 当前·最终 / 目标),含体重、体脂率、腰围 +- **目标信息卡片:** 三列数据(初始 / 当前·最终 / 目标),含体重、体脂率、腰围;已签署状态下卡片标题右侧显示"修改目标"按钮,提交修改后按钮隐藏、卡片底部显示黄色审核提示条("修改目标已提交,正在审核中" + 修改后的目标体重/体脂/腰围数据) - **变化趋势卡片:** 体重变化 / 体脂变化 / 腰围变化三 Tab,各含统计行(平均/最大/最小/变化)+ 折线图(初始参考线、目标参考线、实际趋势) - **排行榜卡片:** 我的排名 + 前三名(跳转排行榜页) - **体重报告卡片:** 截止日期/天数 + 初始→当前→目标体重 + 已减/距目标/目标进度 + 进度条 @@ -241,33 +253,38 @@ stateDiagram-v2 - 点击状态标签切换活动目标状态演示 - 点击"活动详情"跳转到活动详情页(activity-detail.html) - 点击"签署"跳转到签订承诺页(promise-signing.html),"承诺书"跳转到我的承诺页(my-promise.html) -- 点击"重新提交/修改目标"跳转到目标管理页(goal-management-v2.html,携带回填参数) +- 点击"重新提交"跳转到目标管理页(goal-management-v2.html,携带回填参数) +- 已签署状态下点击"修改目标"弹出修改目标弹窗:提示"当前已参加活动,仅限修改一次目标数据",下方为目标体重、目标体脂、目标腰围三个输入项并回填当前目标值;点击"提交"关闭弹窗、隐藏"修改目标"按钮,并在目标信息卡片下方显示"修改目标已提交,正在审核中"提示及修改后的目标数据;点击"取消"直接关闭弹窗 +- 个人目标模式下点击底部"修改目标"跳转到目标管理页(goal-management-v2.html,携带回填参数) - 点击排行榜卡片跳转到排行榜页(weight-ranking.html),体重报告卡片跳转到体重报告页(weight-report.html) **业务规则:** - 活动目标状态流转:审核中 → 已通过待签署 → 已签署 → 已结束;审核驳回后可重新提交 -- 已驳回状态下目标信息中的体重值红色高亮提示 +- 目标值超过推荐范围则红色警示 - 个人目标模式无审核流程,提交后即为"进行中",可修改目标 +- 活动目标已签署状态下修改目标仅限一次,提交后进入审核中状态,审核通过前目标数据不变 --- -### 4. 历史计划(goal-history-v2.html) +### 4. 历史目标(goal-history-v2.html)  -**功能说明:** 展示员工参与过的全部活动计划与个人计划历史列表。 +**功能说明:** 展示员工参与过的全部活动目标与个人目标历史列表。 **主要UI元素:** -- Tab 栏:活动计划 / 个人计划 -- 计划卡片:计划名称、状态标签(进行中/已结束/已完成)、起止日期、机构(活动计划)、数据行(初始体重 → 目标体重 → 当前/最终体重)、底部(签署时间 / 剩余天数 / 减重结果)+ "详情"链接 +- Tab 栏:活动目标 / 个人目标 +- 目标卡片:目标名称、状态标签(进行中/已结束/已完成)、起止日期、机构(活动目标)、数据行(初始体重 → 目标体重 → 当前/最终体重)、底部(参加时间 / 剩余天数 / 减重结果)+ "详情"链接 +- 底部"新建目标"按钮:固定于手机壳底部,带渐变背景过渡 **交互说明:** -- 点击 Tab 切换活动计划/个人计划列表 -- 点击计划卡片或"详情"跳转到目标详情页(goal-detail-v2.html,携带类型与状态参数) +- 点击 Tab 切换活动目标/个人目标列表 +- 点击目标卡片或"详情"跳转到目标详情页(goal-detail-v2.html,携带类型与状态参数) +- 点击底部"新建目标"跳转到目标管理页(goal-management-v2.html) **业务规则:** -- 已结束计划展示最终体重与减重结果 -- 个人计划已达标时展示"达成目标 ✅" +- 进行中的活动目标底部展示参加时间,已结束目标展示最终体重与减重结果 +- 个人目标已达标时展示"达成目标 ✅" --- @@ -373,26 +390,32 @@ stateDiagram-v2 **功能说明:** 员工记录每日饮食摄入,按早餐/午餐/晚餐/加餐分类,支持搜索餐品、手动录入克数和拍照识别。 **主要UI元素:** -- 导航栏标题:当前日期 +- 导航栏:标题为当前日期,右上角"拍照识别"按钮(取景框图标 + 文字,跳转拍照识别页) - 餐次选择 + 搜索行:餐次下拉(点击展开下拉浮层选择:早餐/午餐/晚餐/加餐,当前餐次高亮)+ 餐品搜索框  -- 双列布局:左侧餐品分类(常用/主食/肉蛋奶/蔬菜/水果/饮品/零食)、右侧菜品列表(emoji + 名称 + 千卡/参考份量 + "+"按钮) -- 底部固定栏:购物袋图标(显示已选数量徽章)、"完成打卡"按钮、拍照识别图标按钮(取景框图标,无文字) +- 双列布局:左侧餐品分类("已记录"置顶,下接常用/主食/肉蛋奶/蔬菜/水果/饮品/零食)、右侧菜品列表(emoji + 名称 + 千卡/参考份量 + "+"按钮) +- "已记录"分类列表:汇总展示各餐次已记录餐品(emoji + 名称 + 餐次标签 + 智记/自记标签 + 千卡/克数,自记条目可删除),支持搜索过滤 + +  +- 底部固定栏:购物袋图标(显示当前餐次已选数量徽章)+ 已选统计两行("已选 X 样" / "摄入 XXX 千卡",跟随当前餐次刷新)+ "提交记录"按钮(固定宽度,靠右) - 克数录入弹窗:菜品信息 + 克数(+/- 步进)+ 预估热量 + 确认添加  -- 已选餐品弹窗:四个餐次 Tab(含数量角标)+ 已选列表(智记/自记标签 + 克数 + 热量 + 移除按钮)+ 完成打卡 +- 已选餐品弹窗(仅当前餐次):标题"XX · 已选餐品"(XX 为当前餐次名)+ 汇总行(共 X 样,XXX 千卡)+ 已选列表(智记/自记标签 + 克数 + 热量 + 移除按钮)+ 提交记录  +- 提交成功弹窗:今日日期 + "记录成功" + "XX摄入 XXX 千卡"(XX 为当前餐次名,数值为该餐次汇总)+ "确定"按钮 + +  **交互说明:** -- 点击餐次下拉展开选项浮层,选择后切换餐次并收起浮层 -- 点击分类切换菜品列表,支持搜索过滤 +- 点击餐次下拉展开选项浮层,选择后切换餐次(底部栏统计与购物袋徽章同步刷新)并收起浮层 +- 点击分类切换菜品列表,支持搜索过滤;点击"已记录"分类查看各餐次已记录餐品,可删除自记条目 - 点击菜品"+"打开克数录入弹窗 -- 点击购物袋打开已选餐品汇总面板,可切换餐次、移除菜品(智记不可移除) -- 点击"完成打卡"提交当日饮食记录 -- 点击拍照识别图标按钮跳转到拍照识别页(scan-checkin.html) +- 点击购物袋打开当前餐次的已选餐品面板,可移除菜品(智记不可移除),当前餐次删空后自动关闭面板 +- 点击"提交记录"提交记录并弹出提交成功弹窗,点击"确定"返回上一页 +- 点击右上角"拍照识别"跳转到拍照识别页(scan-checkin.html) - 点击返回按钮返回上一页 **业务规则:** @@ -464,20 +487,26 @@ stateDiagram-v2 **主要UI元素:** - 导航栏标题:"添加YYYY/MM/DD运动" - 搜索行:运动搜索框 -- 双列布局:左侧运动分类(常用/有氧运动/力量训练/球类运动/日常活动/柔韧平衡)、右侧运动列表(emoji + 名称 + 千卡/30分钟 + "+"按钮) -- 底部固定栏:购物袋图标(显示已选数量徽章)、"完成记录"按钮 +- 双列布局:左侧运动分类("已记录"置顶,下接常用/有氧运动/力量训练/球类运动/日常活动/柔韧平衡)、右侧运动列表(emoji + 名称 + 千卡/30分钟 + "+"按钮) +- "已记录"分类列表:展示已记录运动(emoji + 名称 + 来源标签(穿戴/器械/微信/自记)+ 千卡/时长,自记条目可删除),支持搜索过滤 + +  +- 底部固定栏:购物袋图标(显示已选数量徽章)+ 已选统计两行("已选 X 项" / "消耗 XXX 千卡")+ "提交记录"按钮(固定宽度,靠右) - 时长录入弹窗:运动信息 + 时长(+/- 步进)+ 预估消耗 + 确认添加  -- 已选运动弹窗:已选列表(穿戴/器械/微信/自记标签 + 时长 + 消耗 + 移除按钮)+ 完成记录 +- 已选运动弹窗:标题"已选运动" + 汇总行(共 X 项,XXX 分钟 XXX 千卡)+ 已选列表(穿戴/器械/微信/自记标签 + 时长 + 消耗 + 移除按钮)+ 提交记录  +- 提交成功弹窗:今日日期 + "记录成功" + "今日运动消耗 XXX 千卡"(全部已选运动汇总)+ "确定"按钮 + +  **交互说明:** -- 点击分类切换运动列表,支持搜索过滤 +- 点击分类切换运动列表,支持搜索过滤;点击"已记录"分类查看已记录运动,可删除自记条目 - 点击运动"+"打开时长录入弹窗 - 点击购物袋打开已选运动汇总面板,可移除自记运动 -- 点击"完成记录"提交当日运动记录 +- 点击"提交记录"提交当日运动记录并弹出提交成功弹窗,点击"确定"返回上一页 - 点击返回按钮返回上一页 **业务规则:** @@ -497,7 +526,7 @@ stateDiagram-v2 - 总消耗标尺:半圆进度弧,左端基础消耗、右端活动消耗、中心总消耗(实际/推荐),右上"智能运动计划"按钮 - 运动统计三列:今日步数 / 运动次数 / 运动时长 - 数据来源卡片:四张来源小卡(穿戴·步数 / 器械·千卡 / 微信·步数(右上角"同步"按钮)/ 自记·步数),未记录时显示“尚未记录”,点击自记卡片跳转运动录入页(exercise-checkin-v2.html) -- 变化趋势卡片:时间范围(周/月/季/年/活动期间)+ 三 Tab(步数趋势/消耗趋势/时长趋势)+ 折线图(数据点悬浮提示) +- 变化趋势卡片:时间范围(周/月/季/年/活动期间)+ 三 Tab(步数变化/消耗变化/时长变化)+ 折线图(数据点悬浮提示) - 运动明细列表:按日期分组,每条含运动名、消耗、运动详情、来源徽章 **交互说明:** @@ -521,7 +550,7 @@ stateDiagram-v2 **功能说明:** 为员工提供个性化膳食指导方案,含"食谱建议"与"营养分析"两个 Tab。 **主要UI元素:** -- 导航栏:标题"今日饮食建议",右侧"修改偏好"按钮(跳转到膳食偏好设置页) +- 导航栏:标题"今日饮食建议" - 周历(含月历弹窗):日期用圆环标记有无饮食数据 - Tab 栏:食谱建议 / 营养分析 @@ -549,7 +578,6 @@ stateDiagram-v2 - 点击注意事项标题折叠/展开 - 点击菜品打开餐品详情弹窗,查看推荐理由;点击弹窗内"不喜欢"关闭详情弹窗并打开"不再推荐"弹窗 - 在"不再推荐"弹窗中选填不喜欢的原因(可多选、可跳过),点击"确定"提交并弹出"已记录"提示;点击"取消"或遮罩关闭 -- 点击"修改偏好"跳转到膳食偏好设置页(diet-questionnaire.html) - 点击返回按钮返回来源页 **业务规则:** diff --git a/employee-app/weight-management/doc/screenshots/diet-advice.jpg b/employee-app/weight-management/doc/screenshots/diet-advice.jpg index db77fa4..c9a24b2 100644 Binary files a/employee-app/weight-management/doc/screenshots/diet-advice.jpg and b/employee-app/weight-management/doc/screenshots/diet-advice.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/eat-checkin-bag.jpg b/employee-app/weight-management/doc/screenshots/eat-checkin-bag.jpg index 6b28276..d0e427b 100644 Binary files a/employee-app/weight-management/doc/screenshots/eat-checkin-bag.jpg and b/employee-app/weight-management/doc/screenshots/eat-checkin-bag.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/eat-checkin-recorded.jpg b/employee-app/weight-management/doc/screenshots/eat-checkin-recorded.jpg new file mode 100644 index 0000000..3786cdc Binary files /dev/null and b/employee-app/weight-management/doc/screenshots/eat-checkin-recorded.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/eat-checkin-success.jpg b/employee-app/weight-management/doc/screenshots/eat-checkin-success.jpg new file mode 100644 index 0000000..e6cab48 Binary files /dev/null and b/employee-app/weight-management/doc/screenshots/eat-checkin-success.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/eat-checkin.jpg b/employee-app/weight-management/doc/screenshots/eat-checkin.jpg index 28e989b..5468812 100644 Binary files a/employee-app/weight-management/doc/screenshots/eat-checkin.jpg and b/employee-app/weight-management/doc/screenshots/eat-checkin.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/exercise-checkin-bag.jpg b/employee-app/weight-management/doc/screenshots/exercise-checkin-bag.jpg index b03eae2..f3c9db7 100644 Binary files a/employee-app/weight-management/doc/screenshots/exercise-checkin-bag.jpg and b/employee-app/weight-management/doc/screenshots/exercise-checkin-bag.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/exercise-checkin-recorded.jpg b/employee-app/weight-management/doc/screenshots/exercise-checkin-recorded.jpg new file mode 100644 index 0000000..28fd41b Binary files /dev/null and b/employee-app/weight-management/doc/screenshots/exercise-checkin-recorded.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/exercise-checkin-success.jpg b/employee-app/weight-management/doc/screenshots/exercise-checkin-success.jpg new file mode 100644 index 0000000..a939c64 Binary files /dev/null and b/employee-app/weight-management/doc/screenshots/exercise-checkin-success.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/exercise-checkin.jpg b/employee-app/weight-management/doc/screenshots/exercise-checkin.jpg index bf6f97c..43bda42 100644 Binary files a/employee-app/weight-management/doc/screenshots/exercise-checkin.jpg and b/employee-app/weight-management/doc/screenshots/exercise-checkin.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/exercise-detail.jpg b/employee-app/weight-management/doc/screenshots/exercise-detail.jpg index 32cf8cd..8ab2010 100644 Binary files a/employee-app/weight-management/doc/screenshots/exercise-detail.jpg and b/employee-app/weight-management/doc/screenshots/exercise-detail.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/goal-detail-edit.jpg b/employee-app/weight-management/doc/screenshots/goal-detail-edit.jpg new file mode 100644 index 0000000..9d72e5e Binary files /dev/null and b/employee-app/weight-management/doc/screenshots/goal-detail-edit.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/goal-detail-ended.jpg b/employee-app/weight-management/doc/screenshots/goal-detail-ended.jpg index d63d2cf..25323c2 100644 Binary files a/employee-app/weight-management/doc/screenshots/goal-detail-ended.jpg and b/employee-app/weight-management/doc/screenshots/goal-detail-ended.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/goal-detail-rejected.jpg b/employee-app/weight-management/doc/screenshots/goal-detail-rejected.jpg index 0d98aab..eb25410 100644 Binary files a/employee-app/weight-management/doc/screenshots/goal-detail-rejected.jpg and b/employee-app/weight-management/doc/screenshots/goal-detail-rejected.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/goal-detail-review.jpg b/employee-app/weight-management/doc/screenshots/goal-detail-review.jpg index 4d0ec8e..158aef3 100644 Binary files a/employee-app/weight-management/doc/screenshots/goal-detail-review.jpg and b/employee-app/weight-management/doc/screenshots/goal-detail-review.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/goal-detail-signed.jpg b/employee-app/weight-management/doc/screenshots/goal-detail-signed.jpg index f241984..0a1c343 100644 Binary files a/employee-app/weight-management/doc/screenshots/goal-detail-signed.jpg and b/employee-app/weight-management/doc/screenshots/goal-detail-signed.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/goal-history-personal.jpg b/employee-app/weight-management/doc/screenshots/goal-history-personal.jpg index 3b2692d..dd0def4 100644 Binary files a/employee-app/weight-management/doc/screenshots/goal-history-personal.jpg and b/employee-app/weight-management/doc/screenshots/goal-history-personal.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/goal-history.jpg b/employee-app/weight-management/doc/screenshots/goal-history.jpg index 0e345eb..30d2dfb 100644 Binary files a/employee-app/weight-management/doc/screenshots/goal-history.jpg and b/employee-app/weight-management/doc/screenshots/goal-history.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/goal-management-confirm-personal.jpg b/employee-app/weight-management/doc/screenshots/goal-management-confirm-personal.jpg new file mode 100644 index 0000000..1c39374 Binary files /dev/null and b/employee-app/weight-management/doc/screenshots/goal-management-confirm-personal.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/weight-main-record-success.jpg b/employee-app/weight-management/doc/screenshots/weight-main-record-success.jpg new file mode 100644 index 0000000..7245fe7 Binary files /dev/null and b/employee-app/weight-management/doc/screenshots/weight-main-record-success.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/weight-main.jpg b/employee-app/weight-management/doc/screenshots/weight-main.jpg index 4bed5c8..6cfd05d 100644 Binary files a/employee-app/weight-management/doc/screenshots/weight-main.jpg and b/employee-app/weight-management/doc/screenshots/weight-main.jpg differ diff --git a/employee-app/weight-management/doc/screenshots/weight-report.jpg b/employee-app/weight-management/doc/screenshots/weight-report.jpg index caaccd1..55ff642 100644 Binary files a/employee-app/weight-management/doc/screenshots/weight-report.jpg and b/employee-app/weight-management/doc/screenshots/weight-report.jpg differ diff --git a/employee-app/weight-management/eat-checkin-v2.html b/employee-app/weight-management/eat-checkin-v2.html index f22d055..8b5984a 100644 --- a/employee-app/weight-management/eat-checkin-v2.html +++ b/employee-app/weight-management/eat-checkin-v2.html @@ -17,6 +17,9 @@ 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; color: #1a1a1a; } .nav-title { flex: 1; text-align: center; font-size: 17px; font-weight: 600; color: #1a1a1a; } .nav-placeholder { width: 28px; height: 28px; } +.nav-camera { display: flex; align-items: center; gap: 4px; height: 28px; padding: 0 10px; border-radius: 14px; background: #e8fbfa; color: #36cfc9; font-size: 12px; font-weight: 700; cursor: pointer; flex-shrink: 0; } +.nav-camera svg { width: 14px; height: 14px; } +.nav-camera:active { opacity: 0.8; } /* ===== 餐次选择 + 搜索行 ===== */ .filter-row { background: #fff; padding: 10px 12px; display: flex; align-items: center; gap: 8px; border-bottom: 1px solid #f0f0f0; } @@ -52,7 +55,6 @@ body { background: #f0f2f5; display: flex; justify-content: center; align-items: /* ===== 分类列表 ===== */ .category-list { background: #fff; border-radius: 12px; overflow: hidden; height: 100%; display: flex; flex-direction: column; } -.category-list__title { font-size: 12px; font-weight: 700; color: #999; padding: 10px 10px 6px; letter-spacing: 1px; flex-shrink: 0; } .category-list__items { flex: 1; overflow-y: auto; } .category-list__items::-webkit-scrollbar { display: none; } .category-item { padding: 12px 10px; font-size: 13px; color: #666; text-align: center; cursor: pointer; border-left: 3px solid transparent; transition: all .2s; } @@ -79,6 +81,7 @@ body { background: #f0f2f5; display: flex; justify-content: center; align-items: .dish-item__btn:active { background: #f5f5f5; } .dish-item__btn--minus { color: #ff4d4f; border-color: #ffccc7; } .dish-item__btn--plus { color: #3ec46a; border-color: #b7ebc4; background: #f6fff6; } +.dish-item__btn--remove { color: #ff4d4f; border-color: #ffccc7; background: #fff1f0; } /* ===== 底部固定栏 ===== */ .bottom-bar { height: 68px; background: #fff; border-top: 1px solid #f0f0f0; display: flex; align-items: center; padding: 0 16px; flex-shrink: 0; gap: 12px; } @@ -86,12 +89,14 @@ body { background: #f0f2f5; display: flex; justify-content: center; align-items: .bottom-bar__bag svg { width: 22px; height: 22px; color: #1890ff; } .bottom-bar__bag-badge { position: absolute; top: -4px; right: -4px; min-width: 18px; height: 18px; border-radius: 9px; background: #ff4d4f; color: #fff; font-size: 10px; font-weight: 700; display: none; align-items: center; justify-content: center; padding: 0 4px; line-height: 1; } .bottom-bar__bag-badge.show { display: flex; } -.bottom-bar__submit { flex: 1; height: 40px; border-radius: 20px; border: none; background: linear-gradient(160deg, #6ee16e, #3ec46a); color: #fff; font-size: 15px; font-weight: 700; cursor: pointer; box-shadow: 0 2px 8px rgba(62,196,106,0.3); transition: opacity .2s, transform .15s; } +.bottom-bar__stats { flex: 1; min-width: 0; display: flex; flex-direction: column; justify-content: center; gap: 2px; } +.bottom-bar__stats-item { font-size: 12px; color: #666; line-height: 1.3; white-space: nowrap; } +.bottom-bar__stats-item em { font-style: normal; font-weight: 800; font-size: 14px; } +.bottom-bar__stats-item--count em { color: #36cfc9; } +.bottom-bar__stats-item--kcal em { color: #fa8c16; } +.bottom-bar__submit { width: 116px; flex-shrink: 0; height: 40px; border-radius: 20px; border: none; background: linear-gradient(160deg, #6ee16e, #3ec46a); color: #fff; font-size: 15px; font-weight: 700; cursor: pointer; box-shadow: 0 2px 8px rgba(62,196,106,0.3); transition: opacity .2s, transform .15s; margin-left: auto; } .bottom-bar__submit:active { transform: scale(0.97); } .bottom-bar__submit:disabled { opacity: 0.4; cursor: not-allowed; box-shadow: none; } -.bottom-bar__scan { width: 40px; height: 40px; border-radius: 10px; background: #f7f8fa; display: flex; align-items: center; justify-content: center; cursor: pointer; flex-shrink: 0; } -.bottom-bar__scan svg { width: 22px; height: 22px; color: #666; } -.bottom-bar__scan:active { background: #e8e8e8; } /* ===== 克数录入弹窗 ===== */ .gram-mask { display: none; position: absolute; inset: 0; background: rgba(0,0,0,0.45); z-index: 50; } @@ -127,14 +132,7 @@ body { background: #f0f2f5; display: flex; justify-content: center; align-items: .bag-panel__head { padding: 16px 16px 8px; flex-shrink: 0; } .bag-panel__handle { width: 36px; height: 4px; background: #ddd; border-radius: 2px; margin: 0 auto 12px; } .bag-panel__title { font-size: 15px; font-weight: 700; color: #1a1a1a; text-align: center; margin-bottom: 8px; } -.bag-panel__body { flex: 1; overflow: hidden; display: flex; gap: 8px; padding: 0 16px; } -/* 左侧:餐次标签 */ -.bag-panel__meals { width: 68px; flex-shrink: 0; display: flex; flex-direction: column; gap: 4px; padding-bottom: 4px; } -.bag-meal-tab { padding: 10px 6px; font-size: 13px; color: #666; text-align: center; cursor: pointer; border-radius: 8px; transition: all .2s; position: relative; font-weight: 500; } -.bag-meal-tab.active { color: #36cfc9; font-weight: 700; background: #e8fbfa; } -.bag-meal-tab__count { display: none; position: absolute; top: 2px; right: 2px; min-width: 16px; height: 16px; border-radius: 8px; background: #ff4d4f; color: #fff; font-size: 10px; font-weight: 700; align-items: center; justify-content: center; padding: 0 4px; line-height: 1; } -.bag-meal-tab__count.show { display: flex; } -/* 右侧:已选列表 */ +.bag-panel__body { flex: 1; overflow: hidden; display: flex; padding: 0 16px; } .bag-panel__list-wrap { flex: 1; min-width: 0; display: flex; flex-direction: column; overflow: hidden; } .bag-panel__summary { font-size: 13px; color: #666; padding-bottom: 8px; flex-shrink: 0; } .bag-panel__summary em { font-style: normal; font-weight: 800; color: #fa8c16; } @@ -152,12 +150,27 @@ body { background: #f0f2f5; display: flex; justify-content: center; align-items: .bag-item__src { font-size: 9px; font-weight: 600; padding: 1px 6px; border-radius: 6px; white-space: nowrap; line-height: 1.5; } .bag-item__src--auto { color: #1890ff; background: #e6f7ff; } .bag-item__src--manual { color: #fa8c16; background: #fff7e6; } +.bag-item__src--meal { color: #36cfc9; background: #e8fbfa; } .bag-item__remove { width: 24px; height: 24px; border-radius: 50%; border: none; background: #fff1f0; color: #ff4d4f; cursor: pointer; display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: 12px; line-height: 1; } .bag-item__remove:active { background: #ffccc7; } .bag-panel__footer { padding: 12px 16px 24px; flex-shrink: 0; } .bag-panel__submit { width: 100%; height: 46px; border: none; border-radius: 23px; background: linear-gradient(160deg, #6ee16e, #3ec46a); color: #fff; font-size: 16px; font-weight: 700; cursor: pointer; } .bag-panel__submit:active { opacity: 0.85; } +/* ===== 提交成功弹窗 ===== */ +.success-mask { position: absolute; inset: 0; background: rgba(0,0,0,0.45); z-index: 60; opacity: 0; visibility: hidden; transition: opacity .25s ease, visibility .25s ease; } +.success-mask.show { opacity: 1; visibility: visible; } +.success-dialog { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0.9); width: 296px; background: #fff; border-radius: 16px; padding: 28px 20px 20px; z-index: 61; text-align: center; transition: transform .25s ease; } +.success-mask.show .success-dialog { transform: translate(-50%, -50%) scale(1); } +.success-dialog__icon { width: 56px; height: 56px; border-radius: 50%; background: linear-gradient(160deg, #6ee16e, #3ec46a); display: flex; align-items: center; justify-content: center; margin: 0 auto; box-shadow: 0 4px 12px rgba(62,196,106,0.35); } +.success-dialog__icon svg { width: 28px; height: 28px; color: #fff; } +.success-dialog__date { font-size: 13px; color: #999; margin-top: 12px; } +.success-dialog__title { font-size: 18px; font-weight: 700; color: #1a1a1a; margin-top: 4px; } +.success-dialog__kcal { font-size: 13px; color: #666; margin-top: 12px; padding: 10px; background: #fff7e6; border-radius: 10px; } +.success-dialog__kcal em { font-style: normal; font-weight: 800; color: #fa8c16; font-size: 18px; } +.success-dialog__btn { width: 100%; height: 44px; border: none; border-radius: 22px; background: linear-gradient(160deg, #6ee16e, #3ec46a); color: #fff; font-size: 16px; font-weight: 700; cursor: pointer; margin-top: 16px; box-shadow: 0 2px 8px rgba(62,196,106,0.3); } +.success-dialog__btn:active { opacity: 0.85; } + /* Toast */ .toast { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0.9); background: rgba(0,0,0,0.78); color: #fff; font-size: 14px; padding: 10px 22px; border-radius: 20px; z-index: 100; pointer-events: none; opacity: 0; transition: all .25s ease; white-space: nowrap; } .toast.show { opacity: 1; transform: translate(-50%, -50%) scale(1); } @@ -182,7 +195,10 @@ body { background: #f0f2f5; display: flex; justify-content: center; align-items: - + @@ -216,7 +232,6 @@ body { background: #f0f2f5; display: flex; justify-content: center; align-items: