Skip to content

WellChina 前端全面整改执行计划

创建日期: 2026-03-27 基准文档: .impeccable.md + docs/design-critique.md 状态: 待执行


执行依赖图

Phase 1 — 基础设施(必须先完成,后续所有改动依赖此阶段)
  ├── 1. /typeset    字体系统重建
  └── 2. /colorize   色彩体系 + Dark Mode 基础设施

Phase 2 — 视觉重塑(基于新字体和色彩)
  ├── 3. /bolder     Hero 区域重设计
  ├── 4. /arrange    布局多样化
  └── 5. /animate    动画系统丰富化

Phase 3 — 体验打磨
  ├── 6. /normalize  组件一致性(含 Admin 迁移)
  ├── 7. /delight    微反馈补全
  ├── 8. /distill    信息密度优化
  └── 9. /onboard    空状态与边缘体验

Phase 4 — 收尾
  └── 10. /polish    最终打磨 + 回归验证

Phase 1 内部 typeset 和 colorize 可并行。Phase 2 三项可并行。Phase 3 四项可并行。Phase 4 必须最后执行。


1. /typeset — 字体系统重建

目标

替换 Inter,建立有品牌识别度的字体组合。标题有个性,正文高可读。

涉及文件

文件改动
src/app/layout.tsx替换 Google Fonts 导入(Inter → 新字体)
src/app/globals.css更新 --font-sans / --font-* 变量;重新校准 .text-display / .text-heading / .text-body / .text-captionfont-familyletter-spacingline-heightfont-weight
package.json如使用非 Google Fonts 字体需添加依赖

设计决策点

  • 标题字体候选(需确认):
    • DM Serif Display — 衬线,温暖优雅,有品质感
    • Fraunces — 可变衬线,柔和有机,温暖感强
    • Source Serif 4 — 衬线,专业可靠,适合信息密集场景
    • Playfair Display — 衬线,高端但可能过于杂志感
  • 正文字体候选(需确认):
    • DM Sans — 几何人文,干净但比 Inter 有更多个性
    • Plus Jakarta Sans — 现代人文,温暖圆润
    • Source Sans 3 — 专业中性,比 Inter 更有人文气质
    • Outfit — 几何但柔和,现代感强
  • 推荐组合:标题衬线 + 正文无衬线,形成对比层次。例如 Fraunces + Plus Jakarta Sans(温暖路线)或 DM Serif Display + DM Sans(统一家族路线)

校准要点

  • Display 级别:标题字体,加大 letter-spacing 负值(衬线字体通常需要更紧的间距)
  • Heading 级别:标题字体,适度紧凑
  • Body 级别:正文字体,保持 16px / 1.6 line-height 的舒适阅读
  • Caption 级别:正文字体,可适当增加 letter-spacing
  • Navbar / Button / Badge 等组件内文字:正文字体,semibold

验收标准

  • [ ] 全站无 Inter 残留
  • [ ] 标题和正文字体有明确的视觉区分
  • [ ] 各级排版在 320px ~ 1440px 屏幕上均舒适可读
  • [ ] 字体加载策略合理(font-display: swapoptional),不造成布局抖动

2. /colorize — 色彩体系重建 + Dark Mode

目标

将冰冷的纯蓝体系调整为偏暖的专业色彩;实现完整的 Dark Mode 支持。

涉及文件

文件改动
src/app/globals.css重新定义 :root 全部色彩变量;新增 [data-theme="dark"].dark 下的深色变量;新增 @media (prefers-color-scheme: dark)
src/app/layout.tsx<html> 标签添加 theme class/attribute;引入 theme 初始化脚本(避免 flash)
src/components/layout/Navbar.tsx添加主题切换按钮(Sun/Moon 图标)
新文件: src/lib/theme.tssrc/components/ui/ThemeToggle.tsx主题切换逻辑 + localStorage 持久化
所有使用硬编码颜色的文件替换为 CSS 变量引用

色彩设计决策点

浅色主题

变量当前值调整方向
--color-primary#1e3a5f 纯蓝偏向蓝绿 teal(如 #1a4a4a#2d4a5c#1e4d5c),保留专业感但更温暖
--color-primary-light#2d5a8e随主色联动调整
--color-primary-dark#152b47随主色联动调整
--color-accent#0ea5e9 cyan替换为暖色系(琥珀 #d97706、珊瑚 #e8734a、暖金 #b8860b),或暖色 teal
--color-accent-light#38bdf8随 accent 联动
--background#ffffff 纯白微暖 off-white(#faf8f5#f9f7f4
--foreground#171717 纯黑微调为暖黑(#1a1a18#201e1b
--color-neutral-*Slate 系 (偏蓝灰)切换到 Stone/Warm Gray 系(偏暖灰),从 slate 迁移到 stone

深色主题

  • 背景:不用纯黑 #000,用暖深色(#1a1a18#1c1917
  • 表面色:card/section 背景用 #262520 或类似暖灰
  • 文字:不用纯白 #fff,用微暖的 #f5f3ef
  • 主色和强调色:保持与浅色版一致的色相,但调整亮度以确保对比度
  • 边框:从 neutral-200 变为暖深灰
  • 阴影:深色模式下改用微光或边框代替阴影

主题切换机制

1. 首次访问 → 读取 localStorage('theme')
2. 如无存储 → 读取 prefers-color-scheme
3. 用户手动切换 → 写入 localStorage + 更新 html attribute
4. 使用 <script> 在 <head> 中同步执行(避免闪烁)

需要排查的硬编码颜色

  • Hero 区域:to-[#1e6fa8](硬编码蓝色)
  • HeroSearch:hover:bg-gray-50text-gray-400 等原生 Tailwind 灰色
  • 各页面中散落的 bg-whitetext-whiteborder-white 需评估是否需要改为变量
  • Admin 全部页面(Phase 3 /normalize 处理)

验收标准

  • [ ] 浅色主题视觉温度明显提升(不再"冰冷")
  • [ ] 深色主题独立调色完成,温暖感延续
  • [ ] 主题跟随系统偏好自动切换
  • [ ] Navbar 有手动切换按钮
  • [ ] 主题偏好持久化到 localStorage
  • [ ] 切换无闪烁(FOUC-free)
  • [ ] 所有语义色在两个主题下对比度均达到 4.5:1 (AA)

3. /bolder — Hero 区域重设计

目标

告别渐变 blob 模板感,建立有品牌特色的首页第一印象。

涉及文件

文件改动
src/app/page.tsx重写 Hero section 结构和样式
src/app/globals.css如需新增 Hero 专属样式/动画
public/如使用品牌图形资产需添加

设计决策点

  • 背景方案(选一):
    • A. 高品质摄影(中国城市天际线/医院内景)+ 色彩叠加
    • B. 品牌色块 + 几何图形语言(非 blob)
    • C. 微妙纹理/图案(如中国传统纹样的现代化抽象)+ 纯色
    • D. 分栏布局:左文字右插画/图形,打破居中对称
  • Trust items 重设计
    • 当前:CheckCircle + 纯文字水平列表 → 太常见
    • 方案:数字卡片("100+ hospitals"、"13 cities")、logo 墙式合作伙伴展示、或融入 hero 布局而非独立区块
  • 搜索框
    • 保留功能但视觉重新设计
    • 考虑与新色彩系统的融合
    • 深色模式下的表现

验收标准

  • [ ] Hero 不再使用蓝色渐变 + blur blob
  • [ ] 视觉上无法被识别为 "AI 模板"
  • [ ] 在 3 秒内传达 WellChina 的核心价值
  • [ ] 移动端和桌面端均有良好表现
  • [ ] 深色模式适配

4. /arrange — 布局多样化

目标

打破"标题→网格→分页"的单调节奏,不同内容用不同布局策略。

涉及文件

文件改动方向
src/app/page.tsx首页各 section 差异化布局
src/app/hospitals/page.tsx医院列表布局优化
src/app/procedures/page.tsx手术列表布局优化
src/app/cities/page.tsx城市列表布局优化
src/app/pricing/page.tsx价格表格移动端适配
src/app/guides/page.tsx指南列表布局
src/components/ui/Card.tsx可能需要卡片变体(horizontal/featured/compact)

具体方案

首页 section 差异化

Section当前建议
Popular Procedures4列均匀网格首行 2 个大卡(featured)+ 下方 4-6 个小卡,或横向滚动 carousel
Price Highlights4列小卡保持但加入迷你柱状图或数据可视化元素
Featured Cities3列均匀网格Masonry 布局或大小卡混排(第一个城市大图,其余小图)
Quick Tools3列卡片考虑全宽横条(horizontal card)+ 图标更大更突出
Trust Bar4列图标列表横向滚动 marquee 或更紧凑的单行展示

列表页差异化

  • 医院卡片:加入更多视觉信息(英文服务等级用色彩条而非文字、JCI 用徽章而非文字标签)
  • 手术卡片:价格信息更突出(大字号、对比条)
  • 城市卡片:图片占比更大,信息覆盖在图片上(overlay)

验收标准

  • [ ] 首页至少 3 种不同的 section 布局
  • [ ] 医院/手术/城市卡片有视觉区分
  • [ ] 移动端各列表页不再是简单的单列堆叠
  • [ ] 信息层次通过布局(而非仅靠字号)传达

5. /animate — 动画系统丰富化

目标

不只 fade-up,引入有目的的多样化动画,建立动画语言体系。

涉及文件

文件改动
src/components/ui/AnimatedSection.tsx扩展动画变体;考虑新增动画组件
src/app/page.tsx各 section 使用不同动画类型
src/app/globals.cssCSS 动画 keyframes(如需)
各页面文件根据内容选择合适的动画

动画语言定义

场景动画类型目的
Section 进入fade-up(保留但不是唯一)引导滚动阅读
卡片列表stagger(保留)+ scale-in节奏感
数字/统计count-up强调数据
图片reveal (clip-path) 或 parallax品质感
页面切换crossfade流畅感
Hover 交互subtle scale + shadow可交互暗示
状态变化spring physics活力感

约束

  • 所有动画必须 prefers-reduced-motion 友好
  • 动画时长不超过 500ms(除 parallax 等持续性动画)
  • 不做纯装饰动画(每个动画都要有信息传达目的)

验收标准

  • [ ] 全站至少使用 3 种不同的入场动画类型
  • [ ] 支持 prefers-reduced-motion: reduce
  • [ ] 动画不造成布局抖动(CLS)
  • [ ] Hero 区域有独特的动画节奏,区别于内容区

6. /normalize — 组件一致性(含 Admin)

目标

Admin 页面迁移到 CSS 变量体系,全站设计语言统一。

涉及文件

文件改动
src/app/admin/login/page.tsxgray-* → CSS 变量
src/app/admin/(dashboard)/page.tsx统一使用 Card/Badge/Button 组件
src/app/admin/(dashboard)/hospitals/page.tsx表格样式迁移
src/app/admin/(dashboard)/hospitals/[id]/page.tsx表单样式迁移
src/app/admin/(dashboard)/procedures/page.tsx表格样式迁移
src/app/admin/(dashboard)/procedures/[id]/page.tsx表单样式迁移
src/app/admin/(dashboard)/insurance/page.tsx表格样式迁移
src/app/admin/(dashboard)/insurance/[id]/page.tsx表单样式迁移
src/app/admin/(dashboard)/contacts/page.tsx表格样式迁移

具体替换清单

当前(Admin)替换为
bg-gray-50bg-[var(--color-neutral-50)]
bg-gray-900bg-[var(--color-primary)]
text-gray-700text-[var(--color-neutral-600)]
text-gray-500text-[var(--color-neutral-400)]
border-gray-200border-[var(--color-neutral-200)]
hover:bg-gray-50hover:bg-[var(--color-neutral-50)]
bg-white (在 Admin 上下文)bg-[var(--color-background)] 或保持但确认 dark mode 覆盖
内联 Badge 样式复用 Badge 组件
内联 Button 样式复用 Button 组件

验收标准

  • [ ] Admin 页面零 Tailwind 原生灰色类(全部使用 CSS 变量)
  • [ ] Admin 使用与前台相同的 Button/Badge/Card 组件
  • [ ] Admin Dark Mode 正常工作
  • [ ] Admin 表单输入框样式与前台一致

7. /delight — 微反馈补全

目标

补全交互反馈的空白,让用户明确知道"操作已生效"。

涉及文件

文件改动
src/components/ui/HeroSearch.tsx搜索 loading spinner
src/app/contact/page.tsx表单提交 loading + 成功/失败动画
src/components/compare/CompareButton.tsx添加/移除时的微动画
src/components/compare/CompareBar.tsx物品变化时的过渡动画
src/components/ui/FilterBar.tsx已激活筛选器视觉标记
新文件: src/components/ui/Skeleton.tsx骨架屏组件
新文件: src/components/ui/Toast.tsx(可选)轻量 toast 通知
各列表页添加 loading / skeleton 状态

具体方案

交互当前反馈补充反馈
搜索输入Input 右侧显示 spinner;无结果时即时提示
表单提交按钮文字变化按钮 spinner + disabled;成功后显示 checkmark 动画
对比添加CompareBar 出现按钮 scale-bounce 微动画 + Bar 新增项 slide-in
对比移除项目消失Slide-out 动画 + 如果清空则 bar fade-out
筛选选择Select 值变化已激活筛选器添加 accent 色 pill 标记
页面加载空白等待骨架屏(card shape + pulse animation)

验收标准

  • [ ] 所有异步操作有 loading 指示
  • [ ] 表单提交有明确的成功/失败状态
  • [ ] 对比工具添加/移除有动画过渡
  • [ ] 列表页有骨架屏或 loading 占位

8. /distill — 信息密度优化

目标

关键页面的信息组织优化,善用渐进式披露。

涉及文件

文件改动
src/app/hospitals/[slug]/page.tsx信息分段(tabs 或 accordion)
src/app/pricing/page.tsx移动端卡片式布局替代表格
src/app/cities/page.tsx信息主次分层
src/app/procedures/[category]/[slug]/page.tsx手术详情信息分组

具体方案

医院详情页

当前:所有信息垂直堆叠(基本信息 → 专科 → Fudan → 手术价格 → 保险 → 联系方式) 建议:

  • 顶部保留基本信息 hero(名称、类型、英文服务、JCI、城市)
  • 下方使用 Tab 导航:概览 | 手术与价格 | 保险 | 联系方式
  • 或使用粘性侧边导航(桌面端)跳转到各 section

Pricing 页面

当前:宽表格 + overflow-x-auto(移动端需横向滚动) 建议:

  • 桌面端保持表格
  • 移动端(< md)切换为卡片列表,每个手术一张卡片,内含价格对比

城市列表

当前:所有 stats 平铺 建议:

  • 主信息:城市名 + 医院数(始终显示)
  • 次信息:expat 人口 + 可达性(hover 或展开显示)

验收标准

  • [ ] 医院详情页有信息分段机制
  • [ ] Pricing 在 375px 屏幕上无需横向滚动
  • [ ] 各列表页主次信息有视觉权重区分

9. /onboard — 空状态与边缘体验

目标

将空状态从"死胡同"转变为"引导入口"。

涉及文件

文件改动
src/app/compare/page.tsx对比空状态重设计
src/app/search/page.tsx搜索无结果重设计
新文件: src/app/not-found.tsx自定义 404 页面
src/app/page.tsxFallback 数据提取为独立常量

具体方案

场景当前改进
对比空状态Scale 图标 + 说明文字示意图/动画展示对比功能 + "Browse Hospitals" CTA 按钮
搜索无结果"No results found" + 帮助链接友好插画 + "Try searching for..." 热门推荐 + 联系入口
404Next.js 默认品牌化 404 页面 + 导航建议 + 搜索框
DB 无数据 fallback硬编码在 page.tsx提取到 src/lib/fallback-data.ts

验收标准

  • [ ] 对比空状态有视觉引导和明确 CTA
  • [ ] 搜索无结果有热门推荐
  • [ ] 自定义 404 页面上线
  • [ ] Fallback 数据从页面文件中提取

10. /polish — 最终打磨

目标

全站回归验证,修复前 9 步引入的不一致和遗留细节。

检查清单

  • [ ] 间距审查 — 所有 section padding、card padding、gap 在新布局下保持一致
  • [ ] 色彩审查 — 全站无硬编码颜色残留(包括 text-whitebg-white 等)
  • [ ] 字体审查 — 无 Inter 残留,新字体在所有组件中正确应用
  • [ ] Dark Mode 全量测试 — 每个页面、每个组件在深色模式下正常显示
  • [ ] 响应式审查 — 375px / 768px / 1024px / 1440px 四个断点全量测试
  • [ ] 动画审查prefers-reduced-motion 下无动画残留
  • [ ] 无障碍审查 — 对比度检查(至少 AA)、焦点指示器、ARIA 标签
  • [ ] Favicon — 替换 Next.js 默认 favicon 为品牌 icon
  • [ ] OG Image — 添加社交分享预览图
  • [ ] 硬编码字符串 — 确认所有面向用户的文案走 i18n 系统
  • [ ] Footer Guide slugs — 从数据库动态获取或至少抽为常量
  • [ ] HeroSearch 键盘导航 — 上下箭头选择 + Enter 确认
  • [ ] Admin 删除确认 — 所有 DELETE 操作添加确认对话框
  • [ ] z-index 冲突 — CompareBar 和 Navbar 的层级关系确认
  • [ ] console 报错清零 — 开发和生产模式下无 warning/error
  • [ ] Lighthouse 跑分 — Performance > 90, Accessibility > 90, SEO > 95

工作量预估概览

Phase任务复杂度依赖
1/typeset
1/colorize
2/bolderPhase 1
2/arrangePhase 1
2/animatePhase 1
3/normalizePhase 1 (colorize)
3/delight无强依赖
3/distillPhase 2 (arrange)
3/onboardPhase 1
4/polish全部

备注

  • 每完成一个 Phase 建议跑一次 /critique 看分数变化
  • Phase 1 是地基,如果字体和色彩选得好,后续改动会自然流畅
  • Hero 重设计(/bolder)可能是视觉感知变化最大的单项改动
  • Admin 的 /normalize 工作量不大但非常琐碎,适合批量搜索替换

WellChina 内部文档 · 基于 VitePress