From 37327a4da462bae0623f80e8c67893577b718489 Mon Sep 17 00:00:00 2001 From: iven Date: Sat, 16 May 2026 01:33:24 +0800 Subject: [PATCH] =?UTF-8?q?refactor(mp):=20=E8=BF=81=E7=A7=BB=E5=8C=BB?= =?UTF-8?q?=E6=8A=A4+=E5=81=A5=E5=BA=B7=E9=A1=B5=E9=9D=A2=20=E2=80=94=20?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=20PageShell=20+=20ContentCard=20=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E7=BB=84=E4=BB=B6=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 行动收件箱、医护工作台、健康趋势、患者告警、体征录入、 日常监测、设备同步共 7 个页面迁移: - 最外层容器 → PageShell - 卡片元素 → ContentCard - SCSS 删除 min-height/background/box-shadow 通用样式 --- .../pkg-doctor-core/action-inbox/index.scss | 14 +++------- .../pkg-doctor-core/action-inbox/index.tsx | 13 ++++++---- .../src/pages/pkg-doctor-core/index.scss | 6 ++--- .../src/pages/pkg-doctor-core/index.tsx | 7 ++--- .../src/pages/pkg-health/alerts/index.scss | 11 ++------ .../src/pages/pkg-health/alerts/index.tsx | 18 +++++++------ .../pkg-health/daily-monitoring/index.scss | 14 ++-------- .../pkg-health/daily-monitoring/index.tsx | 22 +++++++++------- .../pages/pkg-health/device-sync/index.scss | 14 ++-------- .../pages/pkg-health/device-sync/index.tsx | 14 +++++----- .../src/pages/pkg-health/input/index.scss | 15 ++--------- .../src/pages/pkg-health/input/index.tsx | 22 +++++++++------- .../src/pages/pkg-health/trend/index.scss | 14 +++------- .../src/pages/pkg-health/trend/index.tsx | 26 ++++++++++--------- 14 files changed, 86 insertions(+), 124 deletions(-) diff --git a/apps/miniprogram/src/pages/pkg-doctor-core/action-inbox/index.scss b/apps/miniprogram/src/pages/pkg-doctor-core/action-inbox/index.scss index bd82bbd..04abf4e 100644 --- a/apps/miniprogram/src/pages/pkg-doctor-core/action-inbox/index.scss +++ b/apps/miniprogram/src/pages/pkg-doctor-core/action-inbox/index.scss @@ -1,10 +1,8 @@ -@import '../../../styles/variables.scss'; -@import '../../../styles/mixins.scss'; +@import '../../styles/variables.scss'; +@import '../../styles/mixins.scss'; -.action-inbox-page { - min-height: 100vh; - background: $bg; -} +// PageShell 已接管:min-height, background +// ContentCard 已接管:inbox-card 背景/圆角/阴影/触摸反馈 .inbox-list { height: calc(100vh - 50px); @@ -12,11 +10,7 @@ } .inbox-card { - background: $card; - border-radius: $r-sm; - padding: 14px 16px; margin-bottom: 10px; - box-shadow: $shadow-sm; .inbox-card-header { display: flex; diff --git a/apps/miniprogram/src/pages/pkg-doctor-core/action-inbox/index.tsx b/apps/miniprogram/src/pages/pkg-doctor-core/action-inbox/index.tsx index d52927b..049f165 100644 --- a/apps/miniprogram/src/pages/pkg-doctor-core/action-inbox/index.tsx +++ b/apps/miniprogram/src/pages/pkg-doctor-core/action-inbox/index.tsx @@ -13,6 +13,8 @@ import Loading from '@/components/Loading'; import ErrorState from '@/components/ErrorState'; import EmptyState from '@/components/EmptyState'; import SegmentTabs from '@/components/SegmentTabs'; +import PageShell from '@/components/ui/PageShell'; +import ContentCard from '@/components/ui/ContentCard'; import { useElderClass } from '../../../hooks/useElderClass'; import './index.scss'; @@ -119,7 +121,7 @@ export default function ActionInboxPage() { }; return ( - + {error ? ( @@ -129,10 +131,11 @@ export default function ActionInboxPage() { ) : ( {items.map((item) => ( - handleItemClick(item)} + activeFeedback="opacity" + onPress={() => handleItemClick(item)} > - + ))} {loading && } {!loading && items.length >= total && total > 0 && ( @@ -208,6 +211,6 @@ export default function ActionInboxPage() { )} )} - + ); } diff --git a/apps/miniprogram/src/pages/pkg-doctor-core/index.scss b/apps/miniprogram/src/pages/pkg-doctor-core/index.scss index de5ace2..3a15391 100644 --- a/apps/miniprogram/src/pages/pkg-doctor-core/index.scss +++ b/apps/miniprogram/src/pages/pkg-doctor-core/index.scss @@ -1,11 +1,9 @@ @import '../../styles/variables.scss'; @import '../../styles/mixins.scss'; +// PageShell 已接管:min-height, background, padding + .doctor-home { - min-height: 100vh; - background: $bg; - padding: 32px; - padding-bottom: calc(160px + env(safe-area-inset-bottom)); &__header { margin-bottom: 40px; diff --git a/apps/miniprogram/src/pages/pkg-doctor-core/index.tsx b/apps/miniprogram/src/pages/pkg-doctor-core/index.tsx index d20d6ff..0ace41b 100644 --- a/apps/miniprogram/src/pages/pkg-doctor-core/index.tsx +++ b/apps/miniprogram/src/pages/pkg-doctor-core/index.tsx @@ -1,11 +1,12 @@ import { useState, useMemo, useCallback } from 'react'; -import { View, Text, Input, ScrollView } from '@tarojs/components'; +import { View, Text, Input } from '@tarojs/components'; import Taro from '@tarojs/taro'; import { useAuthStore } from '@/stores/auth'; import { useElderClass } from '../../hooks/useElderClass'; import { usePageData } from '@/hooks/usePageData'; import { getDashboard, type DoctorDashboard } from '@/services/doctor/dashboard'; import Loading from '@/components/Loading'; +import PageShell from '@/components/ui/PageShell'; import './index.scss'; interface CardConfig { @@ -107,7 +108,7 @@ export default function DoctorHome() { if (loading) return ; return ( - + 医护工作台 @@ -192,6 +193,6 @@ export default function DoctorHome() { 退出登录 - + ); } diff --git a/apps/miniprogram/src/pages/pkg-health/alerts/index.scss b/apps/miniprogram/src/pages/pkg-health/alerts/index.scss index 2c25cbe..0945578 100644 --- a/apps/miniprogram/src/pages/pkg-health/alerts/index.scss +++ b/apps/miniprogram/src/pages/pkg-health/alerts/index.scss @@ -1,11 +1,8 @@ @import '../../../styles/variables.scss'; @import '../../../styles/mixins.scss'; -.alerts-page { - min-height: 100vh; - background: $bg; - padding-bottom: env(safe-area-inset-bottom); -} +// PageShell 已接管:min-height, background, safe-bottom +// ContentCard 已接管:alert-card 背景/圆角/阴影 .alerts-tabs { display: flex; @@ -39,11 +36,7 @@ } .alert-card { - background: $card; - border-radius: $r; - padding: 24px; margin-bottom: 16px; - box-shadow: $shadow-sm; } .alert-header { diff --git a/apps/miniprogram/src/pages/pkg-health/alerts/index.tsx b/apps/miniprogram/src/pages/pkg-health/alerts/index.tsx index fc91648..5a06dcd 100644 --- a/apps/miniprogram/src/pages/pkg-health/alerts/index.tsx +++ b/apps/miniprogram/src/pages/pkg-health/alerts/index.tsx @@ -8,6 +8,8 @@ import Loading from '@/components/Loading'; import ErrorState from '@/components/ErrorState'; import EmptyState from '@/components/EmptyState'; import SegmentTabs from '@/components/SegmentTabs'; +import PageShell from '@/components/ui/PageShell'; +import ContentCard from '@/components/ui/ContentCard'; import { useElderClass } from '../../../hooks/useElderClass'; import './index.scss'; @@ -79,23 +81,23 @@ export default function PatientAlerts() { if (!currentPatient) { return ( - + Taro.navigateTo({ url: '/pages/pkg-profile/family-add/index' })} /> - + ); } if (error) { return ( - + fetchAlerts(1, status, true)} /> - + ); } return ( - + {alerts.length === 0 && !loading ? ( @@ -105,7 +107,7 @@ export default function PatientAlerts() { {alerts.map((item) => { const sev = SEVERITY_MAP[item.severity] || SEVERITY_MAP.warning; return ( - + {sev.label} @@ -115,7 +117,7 @@ export default function PatientAlerts() { {item.title} - + ); })} {loading && } @@ -124,6 +126,6 @@ export default function PatientAlerts() { )} )} - + ); } diff --git a/apps/miniprogram/src/pages/pkg-health/daily-monitoring/index.scss b/apps/miniprogram/src/pages/pkg-health/daily-monitoring/index.scss index e982f54..4f2a458 100644 --- a/apps/miniprogram/src/pages/pkg-health/daily-monitoring/index.scss +++ b/apps/miniprogram/src/pages/pkg-health/daily-monitoring/index.scss @@ -1,11 +1,8 @@ @import '../../../styles/variables.scss'; @import '../../../styles/mixins.scss'; -.dm-page { - min-height: 100vh; - background: $bg; - padding: 0 0 60px; -} +// PageShell 已接管:min-height, background +// ContentCard 已接管:dm-card/dm-group 背景/圆角/阴影 /* ── hero ── */ .dm-hero { @@ -44,10 +41,6 @@ /* ── card (standalone, used for date picker) ── */ .dm-card { - background: $card; - border-radius: $r; - box-shadow: $shadow-md; - padding: 28px; margin: 0 24px 20px; } @@ -98,9 +91,6 @@ /* ── collapsible group ── */ .dm-group { - background: $card; - border-radius: $r; - box-shadow: $shadow-md; margin: 0 24px 20px; overflow: hidden; } diff --git a/apps/miniprogram/src/pages/pkg-health/daily-monitoring/index.tsx b/apps/miniprogram/src/pages/pkg-health/daily-monitoring/index.tsx index 869716a..17c74de 100644 --- a/apps/miniprogram/src/pages/pkg-health/daily-monitoring/index.tsx +++ b/apps/miniprogram/src/pages/pkg-health/daily-monitoring/index.tsx @@ -10,6 +10,8 @@ import { clearRequestCache } from '@/services/request'; import { trackEvent } from '@/services/analytics'; import { useSafeTimeout } from '@/hooks/useSafeTimeout'; import { useElderClass } from '@/hooks/useElderClass'; +import PageShell from '@/components/ui/PageShell'; +import ContentCard from '@/components/ui/ContentCard'; import { BP_RANGE, WEIGHT_RANGE, SUGAR_RANGE, VOLUME_RANGE, checkAbnormal, formatDate, FIELD_LABELS, @@ -218,7 +220,7 @@ export default function DailyMonitoring() { const bloodSugarAbnormal = checkAbnormal(bloodSugar, 'bloodSugar'); return ( - + {/* 页面标题 */} @@ -229,7 +231,7 @@ export default function DailyMonitoring() { {/* 日期选择 (standalone card) */} - + 记录日期 {isToday && ( @@ -247,10 +249,10 @@ export default function DailyMonitoring() { V - + {/* ── Group 1: 晨间体征 (default open) ── */} - + toggleSection('morning')}> 晨间体征 @@ -295,10 +297,10 @@ export default function DailyMonitoring() { mmHg - + {/* ── Group 2: 晚间体征 (default open) ── */} - + toggleSection('evening')}> 晚间体征 @@ -343,10 +345,10 @@ export default function DailyMonitoring() { mmHg - + {/* ── Group 3: 其他指标 (default collapsed) ── */} - + toggleSection('other')}> 其他指标 @@ -428,7 +430,7 @@ export default function DailyMonitoring() { /> - + {/* 提交 */} 清空表单 - + ); } diff --git a/apps/miniprogram/src/pages/pkg-health/device-sync/index.scss b/apps/miniprogram/src/pages/pkg-health/device-sync/index.scss index 35f8251..db05bda 100644 --- a/apps/miniprogram/src/pages/pkg-health/device-sync/index.scss +++ b/apps/miniprogram/src/pages/pkg-health/device-sync/index.scss @@ -1,11 +1,8 @@ @import '../../../styles/variables.scss'; @import '../../../styles/mixins.scss'; -.device-sync-page { - min-height: 100vh; - background: $bg; - padding-bottom: env(safe-area-inset-bottom); -} +// PageShell 已接管:min-height, background, safe-bottom +// ContentCard 已接管:sync-status-card/sync-result-card 背景/圆角/阴影 .sync-header { background: $pri; @@ -130,11 +127,7 @@ .sync-status-card { display: flex; align-items: center; - background: $card; - border-radius: $r-sm; - padding: 24px; margin-bottom: 16px; - box-shadow: $shadow-sm; } .sync-status-dot { @@ -225,9 +218,6 @@ display: flex; flex-direction: column; align-items: center; - background: $card; - border-radius: $r; - padding: 48px 24px; margin-bottom: 24px; box-shadow: $shadow-sm; } diff --git a/apps/miniprogram/src/pages/pkg-health/device-sync/index.tsx b/apps/miniprogram/src/pages/pkg-health/device-sync/index.tsx index 9f72bae..e5664ce 100644 --- a/apps/miniprogram/src/pages/pkg-health/device-sync/index.tsx +++ b/apps/miniprogram/src/pages/pkg-health/device-sync/index.tsx @@ -12,6 +12,8 @@ import { uploadReadings } from '@/services/device-sync'; import { useAuthStore } from '@/stores/auth'; import type { BLEDevice, NormalizedReading } from '@/services/ble/types'; import { useElderClass } from '@/hooks/useElderClass'; +import PageShell from '@/components/ui/PageShell'; +import ContentCard from '@/components/ui/ContentCard'; import './index.scss'; /** liveReadings 最大保留条数,防止内存无限增长 */ @@ -232,10 +234,10 @@ export default function DeviceSync() { const renderConnected = () => ( - + 已连接: {selectedDevice?.name} - + {liveReadings.length > 0 && ( @@ -276,11 +278,11 @@ export default function DeviceSync() { const renderDone = () => ( - + V 同步完成 成功上传 {syncCount} 条数据 - + { handleDisconnect(); if (returnTo === 'input') { @@ -293,7 +295,7 @@ export default function DeviceSync() { ); return ( - + 设备同步 @@ -317,6 +319,6 @@ export default function DeviceSync() { {(pageState === 'idle' || pageState === 'error') && renderIdle()} {pageState === 'connected' && renderConnected()} {pageState === 'done' && renderDone()} - + ); } diff --git a/apps/miniprogram/src/pages/pkg-health/input/index.scss b/apps/miniprogram/src/pages/pkg-health/input/index.scss index 90869b2..a83cfef 100644 --- a/apps/miniprogram/src/pages/pkg-health/input/index.scss +++ b/apps/miniprogram/src/pages/pkg-health/input/index.scss @@ -1,11 +1,8 @@ @import '../../../styles/variables.scss'; @import '../../../styles/mixins.scss'; -.input-page { - min-height: 100vh; - background: $bg; - padding: 0 0 60px; -} +// PageShell 已接管:min-height, background +// ContentCard 已接管:input-card 背景/圆角/阴影 /* ── hero ── */ .input-hero { @@ -47,10 +44,6 @@ display: flex; align-items: center; justify-content: space-between; - background: $card; - border-radius: $r; - box-shadow: $shadow-sm; - padding: 24px 28px; margin: 0 24px 20px; border: 1px dashed $pri; @@ -72,10 +65,6 @@ /* ── card ── */ .input-card { - background: $card; - border-radius: $r; - box-shadow: $shadow-md; - padding: 28px; margin: 0 24px 20px; } diff --git a/apps/miniprogram/src/pages/pkg-health/input/index.tsx b/apps/miniprogram/src/pages/pkg-health/input/index.tsx index 57121c7..8345783 100644 --- a/apps/miniprogram/src/pages/pkg-health/input/index.tsx +++ b/apps/miniprogram/src/pages/pkg-health/input/index.tsx @@ -12,6 +12,8 @@ import { useSafeTimeout } from '@/hooks/useSafeTimeout'; import { trackEvent } from '@/services/analytics'; import { useElderClass } from '../../../hooks/useElderClass'; import Loading from '../../../components/Loading'; +import PageShell from '@/components/ui/PageShell'; +import ContentCard from '@/components/ui/ContentCard'; import './index.scss'; const INDICATORS = [ @@ -176,7 +178,7 @@ export default function HealthInput() { const indicatorInitial = INDICATORS[indicatorIdx].label.charAt(0); return ( - + {loadingThresholds && } {!loadingThresholds && ( @@ -197,7 +199,7 @@ export default function HealthInput() { {/* 指标类型选择 */} - + {indicatorInitial} @@ -215,11 +217,11 @@ export default function HealthInput() { V - + {/* 数值输入 */} {BP_INDICATORS.includes(INDICATORS[indicatorIdx].value) ? ( - + 血压数值 @@ -249,9 +251,9 @@ export default function HealthInput() { mmHg - + ) : ( - + 检测数值 {INDICATORS[indicatorIdx].label.match(/\((.+)\)/)?.[1] || ''} - + )} {/* 备注 */} - + 备注 setNote(e.detail.value)} /> - + {/* 提交 */} )} - + ); } diff --git a/apps/miniprogram/src/pages/pkg-health/trend/index.scss b/apps/miniprogram/src/pages/pkg-health/trend/index.scss index 7a06a18..036f33a 100644 --- a/apps/miniprogram/src/pages/pkg-health/trend/index.scss +++ b/apps/miniprogram/src/pages/pkg-health/trend/index.scss @@ -1,9 +1,10 @@ @import '../../../styles/variables.scss'; @import '../../../styles/mixins.scss'; -.trend-page { - min-height: 100vh; - background: $bg; +// PageShell 已接管:min-height, background +// ContentCard 已接管:trend-chart-card 背景/圆角/阴影 + +.trend-page-shell { padding-bottom: 60px; } @@ -48,10 +49,6 @@ /* ── chart card ── */ .trend-chart-card { margin: 0 24px 20px; - background: $card; - border-radius: $r; - box-shadow: $shadow-md; - padding: 24px; min-height: 300px; overflow: hidden; } @@ -59,9 +56,6 @@ /* ── reference card ── */ .trend-ref-card { margin: 0 24px 20px; - background: $acc-l; - border-radius: $r; - padding: 20px 24px; display: flex; align-items: center; gap: 16px; diff --git a/apps/miniprogram/src/pages/pkg-health/trend/index.tsx b/apps/miniprogram/src/pages/pkg-health/trend/index.tsx index dca1ef6..116f35b 100644 --- a/apps/miniprogram/src/pages/pkg-health/trend/index.tsx +++ b/apps/miniprogram/src/pages/pkg-health/trend/index.tsx @@ -8,6 +8,8 @@ import Loading from '@/components/Loading'; import ErrorState from '@/components/ErrorState'; import EmptyState from '@/components/EmptyState'; import SegmentTabs from '@/components/SegmentTabs'; +import PageShell from '@/components/ui/PageShell'; +import ContentCard from '@/components/ui/ContentCard'; import { useElderClass } from '../../../hooks/useElderClass'; import './index.scss'; @@ -67,7 +69,7 @@ export default function Trend() { }; return ( - + {/* 页面标题 */} @@ -81,36 +83,36 @@ export default function Trend() { {/* ECharts 折线图 */} {loading ? ( - + - + ) : error ? ( - + - + ) : points.length === 0 ? ( - + - + ) : ( - + - + )} {/* 参考区间 */} {!loading && points.length > 0 && meta.refMin !== undefined && meta.refMax !== undefined && ( - + 参考区间 {meta.refMin} ~ {meta.refMax} {meta.unit} - + )} {/* 数据列表 */} @@ -135,6 +137,6 @@ export default function Trend() { })} )} - + ); }