尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

ECharts智慧医疗可视化大屏:设计与实战全解析

ECharts智慧医疗可视化大屏:设计与实战全解析 简介本资源是一套基于ECharts开发的智慧医疗数据可视化大屏源码面向前端开发者、医疗信息化从业者及数据可视化学习者旨在解决医疗场景中多源异构数据难以直观呈现、关键运营指标缺乏实时动态监控的问题。项目采用纯Web技术栈集成ECharts核心图表能力支持区域疾病分布热力图、科室接诊量柱状图、病床使用率时序折线图、手术成功率环形图等十余类专业医疗指标视图并具备地图下钻、指标悬浮提示、时间维度切换等交互功能。压缩包为ZIP格式大小5.9MB包含HTML结构页、CSS样式文件、JavaScript逻辑模块含ECharts配置与模拟数据接口、以及响应式布局适配代码整体结构清晰、注释完整便于二次开发与部署。目前已有593人学习下载可直接运行调试快速掌握医疗大屏从数据建模、图表配置到性能优化的全流程实践方案。 做个智慧医疗可视化大屏用ECharts到底要准备些什么这篇文章我打算把这个项目的源码思路和工程细节一次讲透。医院运营监控、急诊调度、床位资源、疾病分布、医护人员排班这些数据如果只是堆在后台表格里管理效率非常低。而把整套数据搬到一块实时刷新的大屏上让院长、科室主任、值班医生一眼看到关键指标这就是“基于ECharts智慧医疗数据可视化大屏”最核心的诉求。它的技术底座就是ECharts这个开源可视化库配合前端工程化的适配方案、实时数据更新机制和一套成熟的布局设计就能落地。这篇文章适合谁看想用ECharts做政务大屏、园区监控大屏、指挥中心大屏的前端开发者以及正在做医疗信息化项目但暂时没有商业BI预算的团队。你不需要有很深的可视化功底但至少要写过基本的HTML/CSS/JavaScript最好知道ECharts的option配置项是什么。我会从整体设计、核心图表实现、大屏适配、数据实时更新和典型问题排查这几个维度拆解把我实际做这套源码时踩过的坑和沉淀下来的方案都交代清楚。1. 项目整体设计与技术选型1.1 为什么这套大屏选择ECharts而不是其他可视化框架做数据可视化大屏市面上可选的技术方案其实不少。商业化的有阿里DataV、帆软FineReport开源的有Apache ECharts、AntV G2/G6、D3.js、Highcharts等。我在医疗场景里最终选择ECharts核心原因有三个。第一个原因是ECharts对“大屏”场景的适应度极高。大屏通常运行在一个独立的显示器或者拼接屏上硬件配置不一定高数据更新频率却可能很快。ECharts基于Canvas渲染在渲染大量数据点、频繁重绘时性能表现稳定。它的折线图、柱状图、饼图、地图、仪表盘、关系图这些图表类型基本覆盖了医疗大屏的绝大多数需求不需要自己从底层去画图形。第二个原因是生态成熟资料好找。ECharts在国内的社区积累非常深厚从官方文档到各类博客、源码示例几乎你能想到的图表组合都有现成案例。这对一个实际项目来说非常重要因为很多时候你不需要从零造轮子而是把现成的图表配置改一改就能接入业务数据开发效率会高很多。第三个原因是可定制能力强。医疗大屏不像普通报表不需要千篇一律的模板。ECharts的series、xAxis、yAxis、tooltip、dataZoom等模块都支持细粒度配置通过option里的事件回调还能做图表联动、轮播高亮、下钻跳转等等。也就是说把一个基础饼图做成“疾病构成环形图”把折线图加上“门诊趋势警戒线”都完全在掌控范围内。对比之下D3.js虽然灵活度最高但学习成本和实现成本也高不适合在一个需要快速交付的项目里作为主力框架商业平台虽然开箱即用却存在授权费用和定制限制。所以这套源码采用纯ECharts 前端工程化方案是最稳妥的组合。1.2 医疗场景对大屏的视觉与布局要求医疗可视化大屏和普通的业务报表大屏不完全一样它对视觉主色调、信息层级、数据刷新方式都有一些行业特性。我在这套源码里采用的是经典的“深色科技风”主背景用深蓝到黑渐变比如#0a1c3a到#061121主图表配色以青色#22d3ee、蓝色#3b82f6、绿色#34d399、橙色#f59e0b为主。为什么要用深色因为大屏通常长时间挂在墙上深色背景能降低显示器的亮刺感同时突出数据图形的发光感让关键指标更醒目。布局方面我按照“总览-分类-焦点”的逻辑来安排。顶部是整体标题和核心汇总指标今日门诊量、急诊量、住院人数、床位使用率中间主视觉区放最核心的动态内容比如区域医疗资源地图左右两侧放具体维度的分析图表例如科室工作量排名、疾病构成饼图、门诊流量趋势、设备状态仪表盘等。这套布局的思路是让观看者第一眼先看到总指标再由总到分逐层查看细节符合管理者的阅读习惯。为了适配任意尺寸的屏幕所有模块采用百分比定位加flex布局。大屏默认设计稿是1920x1080再通过缩放机制适配到其他分辨率。这部分我后面会专门展开因为适配做不好图表会变形、tooltip会错位。1.3 前后端数据流与技术栈这套源码的前端技术栈是原生HTML CSS JavaScript ECharts 5。如果你对Vue或React更熟悉改成对应框架也毫无问题ECharts本身与框架解耦核心逻辑是一样的。数据流上我设计了三种模式静态mock数据、REST API轮询、WebSocket推送。开发调试阶段用mock数据图表不会因为接口没通而空白对接真实业务时通过HTTP接口定时拉取比如每5秒请求一次最新的急救车位置对实时性要求更高的场景比如ICU床位状态则使用WebSocket推送让后端主动把数据推送到前端。这里有一个关键的工程决策数据解析和图表数据格式化必须放在一个单独的工具模块里比如dataProcessor.js。因为后端接口返回的数据格式几乎不可能直接符合ECharts option的要求如果把字段映射散落在各个图表实例代码里项目一大就非常混乱。统一封装成getAdmissionTrend() - { categories, values }这类纯函数在组件里直接调用可维护性会大大提升。2. 医疗大屏核心图表实现细节2.1 医院运营指标折线图、柱状图与仪表盘医疗大屏最常见的图表就是折线图、柱状图和仪表盘。不要觉得这些图表很基础就放松警惕实际配置中很多细节会直接影响大屏的观感。以门诊量趋势折线图为例我配置了双Y轴左侧是各科室分时门诊人数右侧是当日累计门急诊总量。关键配置点包括option { tooltip: { trigger: axis, backgroundColor: rgba(10, 30, 60, 0.9), borderWidth: 0, textStyle: { color: #e2e8f0 } }, grid: { top: 40, right: 60, bottom: 30, left: 70 }, xAxis: { type: category, data: [00:00, 02:00, 04:00, 08:00, 12:00, 16:00, 20:00], axisLabel: { color: #94a3b8 }, axisLine: { lineStyle: { color: #334155 } } }, yAxis: [ { type: value, name: 各科门诊量, axisLabel: { color: #94a3b8 } }, { type: value, name: 累计门急诊量, axisLabel: { color: #fbbf24 } } ], series: [ { name: 内科门诊, type: line, smooth: true, symbol: circle, symbolSize: 8, data: [120, 80, 30, 45, 260, 310, 180], lineStyle: { width: 3, color: #3b82f6 }, itemStyle: { color: #3b82f6 }, areaStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ { offset: 0, color: rgba(59, 130, 246, 0.25) }, { offset: 1, color: rgba(59, 130, 246, 0) } ]) } } ] };这里有几个值得注意的点。第一smooth: true让折线变为平滑曲线医疗场景下的趋势图看起来更专业第二areaStyle用线性渐变填充让数据面积有层次感而不是一个死板的颜色块第三tooltip背景色必须与大屏深色主题一致否则弹出一块白底会非常突兀。科室工作量排名柱状图是另一个高频使用场景。为了让排名变化更直观我在源码里用了ECharts的sort: descending排序并且通过label显示具体数值。这里我要特别提醒一点柱状图的数据标签字体大小在大屏上建议设置成14px以上否则拼接屏或远距离观看时根本看不清。设备状态监控则适合用仪表盘。每个仪表盘代表一个科室或一类设备如呼吸机、心电监护仪、CT设备通过axisLine的渐变色来区分配置区间的健康程度。例如0~70绿色70~90橙色90~100红色。需要注意仪表盘的detail数值格式化保留一位小数并且单位如“%”要显式设置避免出现数值后面什么都不跟的尴尬。2.2 医疗资源地图ECharts地图与GeoJSON接入在智慧医疗大屏里地图的用途非常明确展示区域医疗资源的分布、急救车的实时位置、疫情或传染病在不同区域的分布热度。我在这套源码里用了ECharts的地图系列底层数据来源于GeoJSON。接入地图有两个步骤。第一步是准备好GeoJSON数据文件可以是全国地图、省级地图或者市级地图。ECharts 5官方不再内置地图数据需要手动下载或通过第三方获取GeoJSON。第二步是注册地图import * as echarts from echarts/core; import { MapChart } from echarts/charts; import chinaJson from /assets/map/china.json; echarts.registerMap(china, chinaJson); const mapOption { series: [{ type: map, map: china, roam: true, label: { show: true, color: #cbd5e1, fontSize: 10 }, itemStyle: { areaColor: #0f2c59, borderColor: #1e90ff }, emphasis: { itemStyle: { areaColor: #f59e0b }, label: { color: #ffffff } } }] };地图在医疗大屏中往往不会单独存在而是和散点图组合使用。比如在地图上叠加scatter系列用散点表示各急救分站的位置用散点大小表示车辆数量用散点颜色表示是否出勤。ECharts支持同一坐标系下多个series叠加只要把scatter的coordinateSystem设置为geo即可。这里有一个很常见的坑地图数据加载后如果区域名称和业务数据名称不一致数据就映射不上。比如后端传的是“张家口市”GeoJSON里却是“张家口”这时候就得在数据预处理阶段做别名映射。我的做法是在dataProcessor.js里维护一个regionAlias映射表统一处理后再交给ECharts。地图性能也需要留意。全国几千个区县级别的GeoJSON文件体积大、渲染节点多如果大屏只需要省内分布就尽量使用市级GeoJSON减少绘制开销。直接加载全国地图再通过zoom放大到某个省效果远不如直接用对应的省市地图文件。2.3 组件技巧DataZoom、markLine、emphasis与tooltip的调优大屏上图表数量多如果每个图表都单独配置一遍tooltip、axisLabel、颜色代码会非常臃肿。我这套源码里做了一个全局主题配置通过echarts.init的第三个参数或setOption里的textStyle统一设置基础样式。但有些组件细节还是得逐个图表单独调。DataZoom在医疗大屏里的使用场景主要是时间轴类图表。比如急诊收治量24小时趋势数据点多达144个每10分钟一个点如果全部挤在一个图里x轴标签会重叠得看不清。解决方案是加dataZoomdataZoom: [ { type: inside, start: 0, end: 40 }, { type: slider, height: 12, bottom: 5, borderColor: transparent, backgroundColor: rgba(30, 60, 120, 0.4), fillerColor: rgba(30, 144, 255, 0.2), handleStyle: { color: #1e90ff }, showDetail: true } ]为什么要配两个dataZoom一个inside让用户可以用鼠标滚轮缩放另一个slider作为视觉上的滚动条两者配合操作体验最好。同时要注意大屏通常不是给普通用户交互用的所以滚动条不宜太显眼可以适当调低透明度和高度。markLine在医疗数据分析里经常用来标记阈值。比如门诊量超过某个警戒值在折线图上画一条红色警戒线管理者一眼就能看到异常。配置方式是在series里加上markLine: { silent: true, symbol: none, lineStyle: { color: #ef4444, type: dashed, width: 2 }, label: { formatter: 警戒值: 300, color: #ef4444, position: insideEndTop }, data: [{ yAxis: 300 }] }这里要提醒的是symbol: none如果不设置markLine两端会出现默认箭头在大屏上看起来很怪。emphasis是ECharts里控制鼠标悬浮高亮状态的配置项。柱状图、饼图、地图都支持。我做疾病构成饼图时会定义emphasis: { scaleSize: 5 }让被选中的扇区放大一些同时配合阴影效果让高亮更突出。tooltip调优是另一个重点。大屏上图表旁边经常有其他组件默认的tooltip弹层可能出现白底黑字、位置遮挡数据的问题。我的统一方案是tooltip: { backgroundColor: rgba(8, 25, 55, 0.85), borderColor: #1e90ff, borderWidth: 1, textStyle: { color: #e2e8f0, fontSize: 14 }, extraCssText: box-shadow: 0 4px 20px rgba(0,0,0,0.4); border-radius: 6px; }extraCssText这个属性很多初学者不知道它能补充自定义CSS样式比如圆角和阴影让弹层和大屏风格更统一。3. 大屏适配与工程化处理3.1 从1920x1080设计稿到任意分辨率缩放方案对比做可视化大屏第一道门槛往往不是图表本身而是适配。大屏的输出设备可能是普通显示器、电视、拼接屏分辨率和比例都不一样。如果只按1920x1080写死在1366x768的屏幕上就会溢出。我测试过几种适配方案简单说一下优缺点。第一种是rem vw/vh方案。把设计稿宽度按100rem换算动态设置根节点font-size。优点是布局灵活配合flex能适应不同比例缺点是ECharts内部大量使用px尺寸计算rem一变图表容器的宽度计算很容易出现偏差导致折线图空半边或者柱状图挤压。第二种是媒体查询方案。对不同分辨率写多套CSS工程量大且大屏业务模块多很容易漏改。第三种是transform: scale整体缩放方案。用JS计算当前窗口与设计稿的宽高比然后把整个大屏容器按比例缩放function fitScreen() { const designWidth 1920; const designHeight 1080; const scaleX window.innerWidth / designWidth; const scaleY window.innerHeight / designHeight; const scale Math.min(scaleX, scaleY); const root document.getElementById(screen); root.style.transform translate(-50%, -50%) scale(${scale}); root.style.left 50%; root.style.top 50%; } window.addEventListener(resize, fitScreen);这个方案最大的好处是页面始终按照1920x1080设计稿来排版所有尺寸都是固定值ECharts内部计算不会乱。缺点有两个一是缩放后如果缩放比例小于1四周会有空隙可能显示背景色这个可以通过给body设置深色背景解决二是ECharts的tooltip是渲染在canvas上的缩放后鼠标定位可能出现偏移解决办法是给tooltip的position回调函数里加上缩放系数修正。实测下来这个方案的稳定性和开发效率最高。3.2 ECharts实例的resize监听与性能优化大屏处于缩放模式时图表容器本身尺寸不变因为缩放的是整个screen容器。但如果你的大屏有左右分栏折叠、Tab切换等需求图表容器尺寸变化后必须调用chart.resize()。这个动作很多人会忘记结果就是图表从一个宽容器切到窄容器后图形还是原来的尺寸非常难看。我的做法是在ECharts封装类里统一注册resize监听export function initChart(dom, option) { const chart echarts.init(dom); chart.setOption(option); const resizeObserver new ResizeObserver(() chart.resize()); resizeObserver.observe(dom); chart._resizeObserver resizeObserver; return chart; }用ResizeObserver比直接监听window.resize更精准它只观察图表容器的大小变化不关心整个页面。对于需要销毁的图表要记得断开_resizeObserver否则可能造成监听器泄漏。性能方面大屏上的图表数量少则六七个多则十几个。每个ECharts实例都会独立维护Canvas渲染上下文对内存和CPU占用不可忽视。我的优化策略有四个按需引入ECharts模块不要全量引入import * as echarts from echarts。对不需要交互的图表设置animation: false或animationDurationUpdate: 0。使用media查询在移动端或低性能设备上关闭部分辅助图形。定时器销毁大屏的实时刷新通常用setInterval或WebSocket驱动一旦图表被销毁定时器必须同步清理否则会不断调用setOption造成内存泄漏。3.3 ECharts按需引入与打包体积控制ECharts 5支持按需引入这对大屏项目很有价值。一个完整ECharts包压缩后大约1MB左右而按需引入后仅加载用到的图表和组件最终打包体积可能只有300KB不到。项目里的引入方式如下import * as echarts from echarts/core; import { LineChart, BarChart, PieChart, MapChart, ScatterChart, GaugeChart } from echarts/charts; import { TitleComponent, TooltipComponent, GridComponent, LegendComponent, DataZoomComponent, GeoComponent, VisualMapComponent } from echarts/components; import { CanvasRenderer } from echarts/renderers; echarts.use([ LineChart, BarChart, PieChart, MapChart, ScatterChart, GaugeChart, TitleComponent, TooltipComponent, GridComponent, LegendComponent, DataZoomComponent, GeoComponent, VisualMapComponent, CanvasRenderer ]);这段代码放在一个echarts.js公共模块里其他页面统一从这里面导入echarts。要注意echarts/core里没有graphic等工具如果用到echarts.graphic.LinearGradient需要单独从echarts/core里导入graphic或者直接使用new echarts.graphic.LinearGradient在完整包里。在实际开发中我建议基于当前项目用到的图表清单维护这个模块新增图表类型时再补use注册。4. 实时数据接入与源码实战4.1 用Mock数据保持开发效率医疗大屏的真实数据接口通常由后端团队提供前端等接口是非常低效的。我在源码里先实现了Mock数据层每个图表的getXxxData()方法都返回符合业务语义的模拟数据并模拟了随机波动。这样即使后端接口没开发完大屏的视觉效果和交互逻辑也能完整跑通。Mock数据不是简单的静态数组而是会动态变化的。比如模拟实时门诊量我在函数里执行Math.round(120 Math.random() * 40)这种随机逻辑让图表每次刷新都有变化能直观验证实时刷新效果。后面对接真实接口时只需要替换dataProcessor里对应的请求方法不用改动任何图表渲染代码。4.2 对接真实数据接口REST与WebSocket两种方式真实医疗场景中门诊量、住院人数这类数据不需要实时到毫秒级用REST接口轮询就够了。我封装了一个fetchData工具async function fetchAdmissionData() { const res await fetch(/api/hospital/admission/trend); const json await res.json(); const processed processAdmissionTrend(json.data); admissionChart.setOption({ series: [{ data: processed.seriesData }] }, true); } setInterval(fetchAdmissionData, 5000);这里的第二个参数true表示notMerge即完全替换数据。对于折线图、柱状图这类需要整体刷新的图表用true能避免旧数据残留。但对急救车位置、ICU设备状态这类高实时数据轮询的延迟和无效请求太多WebSocket是更合理的选择。示例const ws new WebSocket(wss://your-host/ws/medical-monitor); ws.onmessage function (event) { const data JSON.parse(event.data); if (data.type ambulance) { updateAmbulanceMap(data.payload); } else if (data.type bed_usage) { bedChart.setOption({ series: [{ data: data.payload.bedUsage }] }); } };WebSocket接入的关键是做好数据协议约定。我建议前端和后端约定一个{ type, payload }标准信封格式这样一台服务器可以推送多种业务数据类型前端按type分发处理。另外直接对WebSocket拿到的原始数据做图表映射会非常脆弱要先经过dataProcessor处理把字段名、单位、时间格式统一。4.3 定时器管理、图表销毁与内存泄漏防范大屏是一个“常驻页面”不像后台管理系统那样频繁跳转所以内存泄漏问题尤其需要重视。我遇到过的情况是页面运行几天后变得卡顿打开任务管理器发现内存占用一直上涨最后定位到是定时器没有清理导致图表被重复setOption。我的解决方案是建立一个统一的实例管理模块chartManager.js负责注册图表实例、存储定时器ID、统一销毁const chartRegistry new Map(); const timerRegistry new Map(); export function registerChart(id, chart) { chartRegistry.set(id, chart); return chart; } export function registerTimer(id, timer) { timerRegistry.set(id, timer); return timer; } export function destroyAll() { chartRegistry.forEach(chart { if (chart._resizeObserver) chart._resizeObserver.disconnect(); chart.dispose(); }); chartRegistry.clear(); timerRegistry.forEach(timer clearInterval(timer)); timerRegistry.clear(); }页面关闭或路由切换时调用destroyAll()把ECharts实例和定时器全部清理干净。这里有个经验不要依赖浏览器自动回收内存显式调用chart.dispose()才是可靠的。在数据更新方面也要注意不要无脑setOption。如果数据只是某个数值变化尽量精确定位到series的data比如chart.setOption({ series: [{ data: newData }] })而不是每次都传整棵option树。尤其在图表多、数据点多的页面上这样的差异更新能明显降低渲染压力。5. 常见问题与排查技巧实录5.1 高频问题速查表这里列一下我在实际开发中遇到的典型问题以及对应的排查和处理办法。现象可能原因处理方法图表不显示控制台报“Component series.line not exists”按需引入时漏注册了图表或组件检查echarts.use确保LineChart、GridComponent等都注册了地图一片空白地图GeoJSON未注册或series.map名称和注册名不一致确认调用echarts.registerMap(china, json)且map: china地图上的数据无法映射到区域业务数据名称与GeoJSON属性名不一致做区域名别名映射表统一转译大屏整体缩放后tooltip位置错乱transform缩放导致鼠标坐标偏移在tooltip的position回调中用当前缩放倍数修正坐标页面切走再切回图表不跟随容器尺寸变化缺少resize()调用用ResizeObserver监听容器变化并调用chart.resize()大屏运行时间长了越来越卡定时器未清理或图表实例泄漏用chartManager统一管理页面销毁时dispose并清理定时器折线图数据点太多展示卡顿渲染节点过多开启sampling: lttb配合dataZoom控制可视范围饼图文字标签重叠数据项太多或标签配置不当调整minAngle、label.overflow、avoidLabelOverlap: true横向柱状图的label被截断容器宽度不足或label.width未设置设置grid.left或label.width并对长名称做省略5.2 若干亲身踩坑记录第一个坑是地图数据加载。刚开始做急救车分布地图时我发现地图能显示但散点位置全部偏到了海里面。查了半天才发现项目用的GeoJSON坐标是[longitude, latitude]格式而业务数据里存的却是[latitude, longitude]两者正好反了。ECharts地图和scatter的坐标顺序必须严格按[经度, 纬度]来建议在前端数据接入层就统一校验一次避免问题暴露到展示层。第二个坑是ECharts的饼图label重叠。疾病构成饼图如果分类很多比如十几个病种默认的label布局会互相遮挡。我最后给它配置了minAngle: 5让扇区有最小角度同时开启avoidLabelOverlap: true并对超过一定长度的分类名做formatter截断配合tooltip显示全称问题才真正解决。第三个坑和markLine有关。我一开始在门诊趋势图上画警戒线时markLine的label一直在线的上方但单位显示得很奇怪。后来发现label.formatter要写成模板字符串形式并且position: insideEndTop在不同坐标系下的表现不一样最好在源码里实际渲染出来微调位置而不是凭经验猜。第四个坑是ECharts实例初始化时机。大屏页面为了显示加载状态容器的初始高度可能为0此时调用echarts.init会警告并产生不正确的图表尺寸。我的做法是在页面完全渲染后再初始化图表或者用v-show代替v-if保持容器尺寸稳定这个细节在Vue项目中尤其重要。5.3 不做冗余交互聚焦“看得清”做医疗大屏要克制交互冲动。大屏的主要使用场景是“远距离、长时间、被动观看”而不是像后台系统那样让用户点来点去。所以我在源码里默认关闭了roam地图缩放拖拽、dataZoom的鼠标滚轮缩放除了排查数据时打开以减少误操作。数据轮播高亮可以通过dispatchAction实现比如每3秒高亮下一个疾病饼图的扇区让观看者不用动手就能关注到重点数据。如果你需要做轮播高亮参考这个思路let currentIndex 0; setInterval(() { currentIndex (currentIndex 1) % pieData.length; pieChart.dispatchAction({ type: downplay, seriesIndex: 0 }); pieChart.dispatchAction({ type: highlight, seriesIndex: 0, dataIndex: currentIndex }); pieChart.dispatchAction({ type: showTip, seriesIndex: 0, dataIndex: currentIndex }); }, 3000);showTip会把tooltip也轮播出来看起来像自动讲解。这里注意dispatchAction里的seriesIndex是当前图表实例内部的索引不是全局图表编号多个图表实例必须分别调用各自实例的dispatchAction。我在这套“基于ECharts智慧医疗数据可视化大屏源码”上花了大量精力打磨的就是这些“默认配置”和“极端情况”。可视化页面从截图效果看大家都能做真正拉开差距的是长时间运行是否稳定、数据更新是否流畅、跨设备展示是否不变形。最后再说一个小经验开发这类大屏时一定要把页面运行起来放一晚上第二天早上再去刷新看内存占用很多问题不是写代码时暴露的而是运行数小时后才浮出来的。这个测试动作比临时调试更有效。本文还有配套的精品资源点击获取
返回列表