政府部门的"数据发布"栏目往往只有静态表格,领导想看趋势、想看市州对比,还得自己导 Excel 画。本文以我们刚上线的《贵州省人力资源与社会保障管理系统》为例,拆解如何用一个 HTML 文件 + ECharts,零后端、零构建,做出对标省厅数据发布口径的政务数据驾驶舱。
政务数据有两个特点:口径必须权威(不能瞎编指标)、展示必须稳(汇报现场不能崩)。我们选单文件方案,理由是:
我们完全照搬省人社厅"数据发布"年度栏目结构,覆盖 7 大维度,再加就业、人才、欠薪、政务 4 个派生模块,共 11 个一级模块:
| 对标栏目 | 系统模块 | 核心指标(单位) |
|---|---|---|
| 城镇就业和失业人数 | 城镇就业监测 | 城镇新增就业(万人)、登记失业率(%)、再就业(万人) |
| 基本养老保险 | 基本养老保险 | 职工/居民参保(万人)、基金收支(亿元)、待遇(元/月) |
| 失业保险 | 失业保险 | 参保(万人)、基金收入/支出/结余(亿元) |
| 工伤认定 / 劳动能力鉴定 | 工伤保险 | 认定件数、鉴定 1-10 级分布 |
| 劳动争议案件 | 劳动争议仲裁 | 受理/结案(件)、结案率(%) |
政务汇报最忌"一图走天下"。我们按数据性质选图:
name + value;政务汇报里,领导最常问"这个柱子是多少?"。所以我们的铁律是:每张图都要把数值标出来。我们用一个统一的 setChart(id, opt) 封装,在 setOption 前自动注入 label:
function applyLabels(opt){
const ser = Array.isArray(opt.series)?opt.series:[opt.series];
const yCat = opt.yAxis && (Array.isArray(opt.yAxis)
? opt.yAxis.some(a=>a&&a.type==='category')
: opt.yAxis.type==='category');
ser.forEach(s=>{
if(s.type==='line') s.label={show:true,position:'top',formatter:o=>fmtNum(o.value)};
else if(s.type==='bar') s.label={show:true,position:yCat?'right':'top',formatter:o=>fmtNum(o.value)};
else if(s.type==='pie') s.label={show:true,formatter:o=>`${o.name} ${fmtNum(o.value)}`};
});
return opt;
}
这样折线顶部、柱状顶部/右端、环图外侧都自动带数字,新增图表不用每次手写 label。
系统首页是运营驾驶舱:6 个 KPI 卡 + 就业趋势 + 三险对比 + 市州就业排名 + 预警时间线。登录用双页面:左侧品牌宣传(渐变光晕 + 标题 + 4 个亮点标签),右侧玻璃拟态登录卡(登录/注册 Tab 切换),演示账号 admin/123456,登录后图表再初始化并强制 resize,避免隐藏容器 0 尺寸导致图表不显示。
单文件方案用 jsdelivr CDN 引 ECharts 很爽,但部署到云服务器后,jsdelivr 在国内偶发不稳定会导致图表全空。我们后续会把 echarts.min.js 下载到同目录、改成本地引用。这是所有"纯静态单文件 + CDN"系统的通病,记住这坑能省半天排查。
小结:政务数据大屏不必上重型 BI。单文件 HTML + ECharts,把省厅口径的指标、合理的图表选型、强制数值标注三件事做对,就能交付一个领导爱看、现场不崩、归档省心的系统。
觉得有用?分享给做政务信息化的朋友