使用AI从零打造炫酷医疗数据可视化大屏,源码免费拿!
在智慧医疗时代,数据可视化大屏已成为医院指挥中心、急诊监控室的核心工具。今天分享一套完整的医疗数据可视化大屏解决方案,带你深入了解从架构设计到动效实现的全流程。
🎯 项目概览
这是一个面向医疗场景的数据可视化大屏,涵盖患者就诊统计、科室床位管理、医生接诊分析、设备使用监控、全国患者流向等核心业务模块。
![]()
技术栈:
- React 19.2.3 + TypeScript 5.9.3
- Vite 7.2.4 极速构建
- Tailwind CSS 4.1.17 原子化样式
- ECharts 中国地图可视化
- Recharts React 原生图表库
- date-fns 日期处理
- lucide-react 图标库
📊 功能模块详解
🔷 头部区域(Header)
typescript
const [time, setTime] = useState(new Date());
useEffect(() => {
const timer = setInterval(() => setTime(new Date()), 1000);
return () => clearInterval(timer);
}, []);
-
实时时钟:秒级刷新,
date-fns格式化,支持中文星期显示 -
渐变标题:
bg-clip-text+drop-shadow实现发光效果 -
滚动公告:CSS
marquee动画,无限循环
🔷 左侧面板(LeftPanel)
1. 疾病关键词搜索
typescript
const activeKeywordIndex = useHighlightCarousel(diseaseKeywords.length, 2500);
- 6 个关键词按钮,自动轮播高亮
- 高亮时放大 + 橙色边框 + 发光阴影
2. 患者年龄分布(柱状图)
typescript
const animatedAgeData = useChartDataRefresh(ageData, 4000, 0.12);
- Recharts
BarChart,4 个年龄段分组对比 - 数据每 4 秒自动波动,模拟实时更新
3. 每周人流量分布(面积图)
typescript
<linearGradient id="colorFlow" x1="0" y1="0" x2="0" y2="1">
<stop offset="5%" stopColor="#4fc3f7" stopOpacity={0.3}/>
<stop offset="95%" stopColor="#4fc3f7" stopOpacity={0}/>
</linearGradient>
- Recharts
AreaChart,渐变填充 - 双曲线对比展示两种类型数据
4. 就诊人数统计(翻牌器)
typescript
function useCountUp(targetValue: number, duration = 2000) {
// easeOutQuart 缓动函数
const easeProgress = 1 - Math.pow(1 - progress, 4);
// ...
}
- 自定义
FlipClock组件 - 数字从 0 递增到目标值,缓动动画更自然
- 上月/本月分组展示婴幼儿、青少年、中壮年、老年人数据
🔷 中间面板(CenterPanel)
1. 全国患者流向图
typescript
useEffect(() => {
fetch('https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json')
.then(response => response.json())
.then(geoJson => {
echarts.registerMap('china', geoJson);
setMapLoaded(true);
});
}, []);
核心配置:
typescript
series: [
// 飞线动画
{ type: 'lines', effect: { show: true, trailLength: 0.7, color: '#ffb74d' } },
// 涟漪散点
{ type: 'effectScatter', rippleEffect: { brushType: 'stroke' } }
]
- 动态加载阿里云 GeoJSON 地图数据
- 飞线展示北京、上海、广州、深圳、成都、西安患者流向
- 涟漪散点标注城市,支持缩放拖拽
2. 学历占比(SVG 圆环)
typescript
<circle
cx="60" cy="60" r="54"
stroke="#4fc3f7"
strokeDasharray="339"
strokeDashoffset={339 - (339 * educationStats.bachelor / 100)}
/>
- 纯 SVG 实现进度圆环
-
strokeDashoffset控制进度
3. 设备使用情况统计
typescript
const activeEquipmentIndex = useHighlightCarousel(equipmentStats.length, 1500);
- 7 个设备卡片,轮播高亮
- 显示设备数量、涨跌百分比、趋势迷你折线图
- 提示语:"设备一、设备四应考虑进货"
🔷 右侧面板(RightPanel)
1. 患者就诊登记(表格轮播)
typescript
const { visibleItems: visibleRecords } = useListCarousel(patientRecords, 4, 2500);
- 10 条记录,每次显示 4 条
- 每 2.5 秒自动滚动,循环展示
- 状态高亮:已治愈(绿色)/ 治疗中(橙色)
2. 科室床位使用情况(面积图)
- Recharts
AreaChart,5 个科室对比 - 双色渐变填充
3. 医生接诊情况分析(组合图)
typescript
<ComposedChart data={animatedDoctorData}>
<Bar dataKey="接诊数" barSize={4} fill="#29b6f6" />
<Line dataKey="目标" stroke="#ff9800" strokeDasharray="5 5" />
</ComposedChart>
- 柱状图展示实际接诊数
- 虚线折线展示目标值
- 直观对比 5 位医生的 KPI 完成情况
4. 每日医疗使用情况
typescript
const statCards = [
{ icon: Activity, label: '急诊人数', value: dailyStats.emergency },
{ icon: Users, label: '门诊人数', value: dailyStats.outpatient },
{ icon: PlusCircle, label: '住院人数', value: dailyStats.inpatient },
{ icon: ArrowUpRight, label: '出院人数', value: dailyStats.discharged },
];
- 预约总人数翻牌器
- 4 个统计卡片,轮播高亮
-
lucide-react图标 + 数字递增动画
🎨 UI 设计亮点
1. 科技感卡片组件
typescript
<div className="relative bg-[#06142a]/60 border border-[#135c9d]/60
backdrop-blur-sm shadow-[inset_0_0_30px_rgba(19,92,157,0.2)]">
{/* 四角装饰 */}
<div className="absolute -top-px -left-px w-3 h-3
border-t-2 border-l-2 border-[#4fc3f7]" />
{/* 顶部发光线 */}
<div className="absolute top-0 left-10 right-10 h-px
bg-gradient-to-r from-transparent via-[#4fc3f7]/50 to-transparent" />
</div>
2. autofit.js 大屏适配
typescript
autofit.init({
el: 'body',
dw: 1920, // 设计稿宽度
dh: 1080, // 设计稿高度
resize: true
});
- 一行代码适配任意分辨率
- 自动监听窗口变化
3. 配色方案
| 元素 | 颜色值 | 用途 |
|---|---|---|
| 主背景 | #020b18 |
深蓝科技感 |
| 边框 | #135c9d |
卡片边框 |
| 高亮 | #4fc3f7 |
装饰、图表 |
| 强调 | #ffb74d |
高亮、警告 |
| 文字 | #e0f7fa |
主文字 |
🔧 自定义 Hooks 封装
| Hook | 功能 | 参数 |
|---|---|---|
useApiData<T> |
泛型数据获取 | fetcher, initialValue |
useCountUp |
数字递增动画 | targetValue, duration |
useListCarousel |
列表轮播 | items, visibleCount, interval |
useHighlightCarousel |
高亮轮播 | itemCount, interval |
useChartDataRefresh |
图表数据波动 | initialData, interval, range |
📁 项目结构
src/
├── api/
│ ├── index.ts # API 层(模拟延迟、响应包装)
│ └── mock/data.ts # Mock 数据
├── components/
│ ├── Card.tsx # 科技感卡片
│ ├── Header.tsx # 头部(时钟 + 公告)
│ ├── LeftPanel.tsx # 左侧(关键词 + 图表 + 翻牌器)
│ ├── CenterPanel.tsx # 中间(地图 + 设备)
│ └── RightPanel.tsx # 右侧(表格 + 图表 + 统计)
├── hooks/
│ ├── useData.ts # 数据获取 Hooks
│ └── useCarousel.ts # 动画效果 Hooks
└── utils/cn.ts # 样式工具
🏥 适用场景
- 医院运营指挥中心
- 急诊科实时监控大屏
- 卫健委数据展示平台
- 智慧医疗解决方案演示
🌟 总结
这套方案的核心价值:
- 业务完整:覆盖医疗场景核心指标
- 动效丰富:翻牌器、轮播、飞线、涟漪
- 架构清晰:Hooks 封装,组件化设计
- 适配灵活:autofit.js 一键适配
- 开箱即用:Mock 数据层,快速切换生产环境
欢迎 Star ⭐,一起探索智慧医疗可视化的无限可能!
我放在公众号(柳杉前端) 回复 医疗数据可视化大屏 获取源码
#前端开发 #数据可视化 #React #智慧城市 #大屏设计