feat: 二级页面色彩刷新 + 用药/通知/设备重构 + 后端健康档案/通知管线增强 + 大量测试

## 后端
- 健康档案: 新增手术状态字段 + EF 迁移; HealthArchiveService 新增查询方法
- 健康记录: HealthRecordService 新增批量/统计方法; 契约扩展
- 用药: 新增 MedicationScheduleStatus 枚举; MedicationService 排班逻辑调整
- 通知: EfUserNotificationPipeline 重构; 新增 EfReminderCatchUpService; 通知管线支持更多场景
- 用户: UserService 账号删除逻辑; 新增 local_account_file_cleanup; EfUserRepository 扩展
- AI: medication_agent_handler 微调; prompt_manager 优化; AiConversationService 上下文处理
- Endpoint: doctor/medication/exercise/health/notification/user 等多接口调整
- BackgroundService: health_record_reminder_service 重构, 提醒补漏逻辑
- 测试: 新增 account_deletion/doctor_endpoint/medication_schedule/medication_update/prompt_manager 测试

## 前端
- UI 系统: app_theme 大幅重构; app_colors/app_design_tokens/app_module_visuals 调整; 二级页面色彩刷新
- 主页: home_page 背景渐变 + 消息列表提取 _HomeMessages + 通知检查逻辑; chat_messages_view 全面重构
- 用药: medication_list/edit/checkin 三页重构, 新增 medication_ui_logic 抽取
- 通知: notification_prefs_page 重构, 新增 notification_prefs_logic; notification_center 优化
- 设备: device_management 重构, 新增 device_sync_ui_logic; device_scan 优化
- 趋势图: trend_page 大幅重构
- 登录: login_page 重构
- 个人资料: 新增 profile_edit_page; profile_page 优化
- 运动: 新增 exercise/ 目录 + care_plan_ui_logic
- 其他: remaining_pages/report_pages/health_drawer/admin/doctor 等多页面调整
- 组件: common_widgets/app_empty_state/app_error_state/app_future_view/app_toast/ai_content 优化
- Provider: chat_provider/consultation_provider/data_providers/auth_provider 调整
- AndroidManifest: 移除多余权限
- 测试: 新增 ai_content/care_plan/home_message/login_flow/medication_checkin/medication_ui/notification_prefs/profile_device/secondary_page/swipe_delete 等大量测试

## 文档
- 新增 ui-design-system.md 设计系统文档
- 新增 secondary-page-color-refresh 计划 + specs 目录
This commit is contained in:
MingNian
2026-07-15 23:22:52 +08:00
parent e654c1e0cc
commit fade61ac21
138 changed files with 12636 additions and 5013 deletions

View File

@@ -0,0 +1,47 @@
# Secondary Page Color Refresh Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Execute this plan inline in the current session. Do not create a branch or worktree.
**Goal:** Produce a restrained first-pass visual refresh for secondary pages while leaving the home page and all business behavior unchanged.
**Architecture:** Centralize a light neutral secondary-page canvas with a white AppBar in `GradientScaffold`, keep the existing home implementation untouched, and introduce one reusable outlined create FAB for the pages that currently expose add/upload actions. Fix swipe-delete rows at the shared widget layer so medication and exercise rows always paint an opaque white content surface over the red delete action.
**Tech Stack:** Flutter, Material 3, flutter_test.
## Global Constraints
- Work on the existing `main` branch and preserve all unrelated dirty-worktree changes.
- Do not change backend APIs, providers, routing, or page business logic.
- Keep the current home page visual design unchanged.
- Secondary pages use a `#F7F8FA` canvas with white content surfaces; module colors remain content accents only.
- Reuse the existing `AppRadius` and `AppColors.actionOutlineGradient` tokens.
---
### Task 1: Lock the shared secondary-page visual behavior
**Files:**
- Modify: `health_app/test/swipe_delete_tile_test.dart`
- Create: `health_app/test/secondary_page_visuals_test.dart`
- Modify: `health_app/lib/core/app_theme.dart`
- Modify: `health_app/lib/widgets/common_widgets.dart`
- [ ] Add failing widget tests for an opaque swipe-row surface, a white `GradientScaffold`, and the shared outlined create FAB.
- [ ] Run the targeted tests and confirm they fail for the missing visual behavior.
- [ ] Make `GradientScaffold` and the global AppBar surface white without changing the home page.
- [ ] Add the reusable white, purple-gradient-outline create FAB.
- [ ] Paint swipe-row content white so red appears only in the revealed action area.
- [ ] Run the targeted tests and confirm they pass.
### Task 2: Adopt the common create action on active user pages
**Files:**
- Modify: `health_app/lib/pages/chart/trend_page.dart`
- Modify: `health_app/lib/pages/medication/medication_list_page.dart`
- Modify: `health_app/lib/pages/exercise/exercise_plan_page.dart`
- Modify: `health_app/lib/pages/report/report_pages.dart`
- [ ] Replace page-specific solid-color FAB styling with the shared create FAB.
- [ ] Preserve every existing callback, tooltip, route, and upload sheet.
- [ ] Format only the touched Dart files.
- [ ] Run the focused widget tests, the full Flutter test suite, and `flutter analyze`.

View File

@@ -0,0 +1,47 @@
# 通知设置改造设计
## 目标
让通知设置展示真实的服务端状态,保存失败时明确提示并恢复原值;将五个健康指标开关收纳到底部选择弹窗中,同时修复通知总开关未真正参与后端投递判断的问题。
## 页面结构
主页面保持四个区域:通知总开关、通知类型、健康录入提醒、免打扰时段。
健康录入提醒区域只展示:
- “每日健康录入提醒”总开关。
- “提醒指标”入口,副标题展示当前已选指标摘要。
点击“提醒指标”后打开底部弹窗。弹窗使用复选框选择血压、心率、血糖、血氧和体重,至少保留一项,点击“保存”后一次性提交全部指标设置。
## 状态与保存
前端使用明确的通知偏好状态对象,不再直接使用无类型的 Map。状态区分首次加载、单项保存、指标批量保存和错误信息。
- 首次加载成功后才展示设置内容。
- 首次加载失败展示错误页和重试按钮,不使用默认值冒充服务端数据。
- 普通开关修改时只锁定当前操作,后端成功后采用响应中的完整偏好更新页面。
- 保存失败恢复原值并显示错误提示。
- 指标弹窗先维护本地草稿,点击保存时一次提交五个字段,避免连续请求和部分成功。
- 免打扰时间采用相同的真实保存与失败恢复规则。
## 后端行为
保留现有 `/api/notification-prefs` GET 和 PUT 接口。PUT 继续支持部分字段更新并返回保存后的完整偏好。
通知发送管线必须优先检查 `PushEnabled`。总开关关闭时,不生成或投递任何用户通知;健康录入、用药、随访、医生回复和异常提醒继续读取各自开关,免打扰规则继续生效。
## 错误处理
- 网络或服务错误显示后端可读信息,无法解析时使用统一提示。
- 保存过程中禁止同一设置重复提交。
- 指标未选择任何一项时,弹窗内提示至少选择一项,不发送请求。
- 后端返回失败时不显示成功状态。
## 测试
- Flutter 单元测试覆盖偏好解析、指标摘要、至少选择一项和失败回滚。
- Flutter 组件测试覆盖加载失败、指标弹窗批量选择和保存中禁用。
- 后端测试覆盖 `PushEnabled=false` 时所有通知类型均不投递,以及各分类开关和免打扰继续生效。
- 运行 `flutter analyze`、Flutter 全量测试和相关 .NET 测试。

79
docs/ui-design-system.md Normal file
View File

@@ -0,0 +1,79 @@
# 健康 App 前端 UI 设计系统
这份规范用于后续逐页精修。首页是品牌化例外,保持当前紫色背景和已有结构;以下规则主要约束普通二级页面。
## 1. 页面层级
- 标题栏:纯白背景,深色标题和返回图标。
- 页面画布:`#F7F8FA`,只负责建立内容边界,不作为卡片颜色。
- 主要内容组:纯白背景,区域间保留 1216 px 的画布间距。
- 列表行:同一内容组内连续排列,用文字区域浅分隔线区分,不为每一行单独套卡片。
- 重点对象报告、设备、AI 分析和关键概览可以使用独立白色卡片。
## 2. 颜色角色
- 品牌紫:通用选中、焦点、品牌按钮描边和少量重点操作。
- 模块色:只用于统一样式的图标、极浅图标底、图表曲线、小标签和状态识别。
- 中性色:页面画布、分隔线、正文层级和不可用状态。
- 语义色:绿色表示成功/正常,黄色表示提醒/等待,红色表示错误/危险,蓝色表示信息/进行中。
- 禁止模块色用于整页背景、大面积头部、大卡片底色和普通新增按钮。
## 3. 间距
- 页面左右边距16 px。
- 页面顶部内容间距12 px。
- 内容组间距1216 px。
- 列表图标与文字12 px。
- 列表行垂直内边距:根据内容使用 12 或 16 px不通过缩小字体制造紧凑感。
## 4. 圆角与阴影
- 所有圆角使用 `AppRadius`,不得在页面里随意新增数值。
- 连续内容组默认使用 16 px 圆角。
- 输入框和小型操作使用 1014 px 圆角。
- 普通内容组默认无阴影、无描边。
- 浮动操作可以使用一层轻微中性阴影;同一组件不同时使用明显边框和重阴影。
## 5. 字体层级
- 页面标题1920 px粗体颜色 `textPrimary`
- 区域标题18 px粗体。
- 列表主标题1617 px中粗体。
- 正文和补充说明1315 px保证对比度不使用过浅小字。
- 数值、单位、份量和热量在同一行时保持基线、字号和字重协调。
- 选中状态不能改变文字大小、字重或位置。
## 6. 图标
- 全 App 优先使用同一套 Material 线性 `outlined/rounded` 图标,不混用大面积实心图标。
- 普通列表图标底座统一为 40×40 px、10 px 圆角,图标统一为 22 px。
- 不同模块可以改变图标和极浅底色,但尺寸、线条感觉、底座形状和对齐必须一致。
- 无底座的小型操作图标统一为 2024 px并保证至少 44 px 点击区域。
## 7. 按钮
- 通用新增:白底、紫色渐变细描边、深紫色线性加号;所有模块共用同一组件。
- 页面主要操作:优先使用白底紫色品牌描边;是否使用实心按钮由逐页任务重要性决定。
- 次要操作:白底或极浅灰底、深色文字。
- 危险操作:白底红字;只有确认删除阶段显示红色危险面。
- 新增、上传、绑定和记录属于通用操作,不跟随模块颜色。
## 8. 列表与滑动操作
- 列表行连续排列,分隔线从文字区域开始,不穿过左侧图标。
- 整行可点击,附属按钮不能缩小主点击区域。
- 删除背景默认完全隐藏,向左打开删除操作后才出现。
- 删除失败时保留真实列表数据,不提前移除前端项目。
## 9. 弹窗、表单和状态
- 弹窗、底部面板统一白色,不跟随模块色。
- 输入框焦点继续使用品牌紫,错误提示使用语义红。
- 空状态说明原因并提供一个明确下一步;加载、空、失败和未开放必须能被用户区分。
- 暂未启用的问诊和随访显示明确准备状态,不伪装成可用功能。
## 10. 逐页精修原则
- 每次只精修一个真实页面或一组完全同构页面。
- 先看真机截图,再确定该页的信息层级、内容组、操作和模块色用量。
- 不因建立设计系统而批量重排所有页面;公共组件只提供一致基础,页面布局仍按实际任务设计。