零基础拿捏交互式数据大屏!筛选器全局联动+蓝图数据流全流程爆肝详解
还在做只会摆图表的静态大屏?现在职场主流的交互式动态数据大屏早就卷起来了!一个下拉筛选器控制全页面图表、数据自动刷新、多维度数据统一分发,不用复杂代码,靠可视化蓝图就能搞定。今天这篇超干货教程,从数据准备、组件配置、蓝图节点搭建到最终联动测试,一步不落手把手教学,新手也能直接复刻浏览器用户画像分析大屏,看完轻松解锁低代码大屏高阶玩法✨
一、先搞懂:本次项目目标 & 核心知识点
(一)项目落地目标
基于已完成布局的用户画像大屏,搭建全局筛选联动体系:选择不同浏览器,页面内地图、饼图、柱状图、指标卡片、排行榜等所有组件实时切换对应数据,完整呈现不同浏览器用户的性别、年龄、学历、职业、收入、地域等全维度画像。
本次仅实现全国范围数据展示,省份点击下钻分析留作进阶玩法,专注吃透筛选联动 + 数据流分发两大核心能力。
(二)必学核心概念(小白也能秒懂)
整个大屏交互靠蓝图编辑器驱动,它就像大屏的 “神经中枢”,用拖拽节点 + 连线的方式编排数据流转和交互逻辑,告别硬编码,灵活度拉满。
触发器:触发数据更新的动作,比如打开页面、点击下拉筛选器,是数据流的 “启动键”;
变量:数据传递的 “中转站”,把筛选器选中的内容存为全局变量,全页面节点都能调用;
SQL 查询节点:对接数据库,根据全局变量精准查询对应数据;
并行数据处理节点:本次重中之重!相当于 “数据分拣员”,一份原始数据拆分、格式化后,分发给不同图表,避免重复查询,效率翻倍;
联动逻辑:筛选器变更→更新全局变量→触发 SQL 重查→数据分拣→所有图表刷新,形成闭环。
(三)数据源说明
本次使用 MySQL 数据库中的user_profile_stats用户画像统计表,为了精准计算平均年龄,我们会提前补充精确年龄字段,完整表结构如下:
字段名 | 数据类型 | 字段说明 |
browser_name | VARCHAR(50) | 浏览器名称(筛选核心依据) |
gender | VARCHAR(10) | 性别 |
age | INT | 精确年龄(用于计算平均年龄) |
age_group | VARCHAR(10) | 年龄段 |
edu | VARCHAR(50) | 学历 |
job | VARCHAR(50) | 职业 |
income | VARCHAR(50) | 收入区间 |
city_type | VARCHAR(10) | 居住地类型 |
province | VARCHAR(50) | 省份 |
user_count | INT | 对应维度下的用户数量 |
二、前置准备:数据库表改造(关键第一步)
原有数据表只有年龄段,估算平均年龄会有误差,我们先重建数据表 + 同步数据流,确保数据精度,这一步出错后续指标全部失真!
步骤 1:执行 SQL 重建数据表
登录数据库管理工具,执行以下完整 SQL 语句,删除旧表并新建带age精确年龄字段的统计表:
DROP TABLE IF EXISTS `user_profile_stats`; CREATE TABLE `user_profile_stats` ( `browser_name` VARCHAR(50) NOT NULL COMMENT '浏览器名称', `gender` VARCHAR(10) COMMENT '性别', `age` INT NOT NULL COMMENT '年龄', -- 新增字段 `age_group` VARCHAR(10) COMMENT '年龄段', `edu` VARCHAR(50) COMMENT '学历', `job` VARCHAR(50) COMMENT '职业', `income` VARCHAR(50) COMMENT '收入', `city_type` VARCHAR(10) COMMENT '居住地类型', `province` VARCHAR(50) COMMENT '省份', `user_count` INT NOT NULL COMMENT '用户数' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户画像统计表';步骤 2:修改数据转换流
打开前期制作的「用户画像表加工」数据流,做两处微调,保证新字段正常参与聚合计算:
修改排序组件:在原有排序规则基础上,新增
age字段升序排序;修改分组组件:分组字段追加
age,确保聚合数据包含精确年龄;点击执行转换流,等待数据同步完成,数据表正式可用。
避坑提醒:一定要执行转换流!否则新字段无数据,后续平均年龄指标会计算为空。
三、基础操作:组件导出至蓝图编辑器
所有想要实现交互、接收动态数据的组件,必须先从画布导出到蓝图编辑器,才能被节点调用。
步骤 1:打开已有大屏
进入已完成静态布局的「用户画像」大屏画布,确认页面内所有组件完整:
交互组件:浏览器下拉筛选器
维度图表:性别饼图、年龄段柱状图、学历条形图、职业柱状图、收入柱状图、居住地饼图、省份地图、省份排行榜(轮播列表)
指标卡片:总用户数、平均年龄、本科及以上占比、中高收入占比
步骤 2:批量导出组件到蓝图
选中画布 / 左侧图层栏中的组件,右键→ 选择【导出到蓝图编辑器】;
按照上面的组件清单,依次将所有组件全部导出;
点击页面顶部【蓝图编辑器】图标,切换到蓝图编辑界面,左侧「导入节点列表」能看到所有导出的组件,代表导出成功。
小技巧:组件导出顺序不影响后续配置,只要全部导出即可;如果组件缺失,后续无法连线绑定数据。
四、核心配置(上篇):筛选器 + 参数接收节点(联动源头)
筛选器是用户操作入口,并行数据处理节点负责接收筛选值、存储全局变量,是整个联动链路的 “起点中转站”,这一步决定所有图表能否同步响应。
步骤 1:添加「浏览器参数接收」并行节点
在蓝图编辑器逻辑节点库中,拖拽并行数据处理节点到画布,重命名为「浏览器参数接收」;
双击该节点,进入脚本配置页面,添加两个执行方法(代码直接复制即用):
方法 1:页面加载时执行(初始化基础地址)
大屏打开自动运行,预留外部 API 地址,本次无需额外修改,保留即可:
const BASE_URL = 'https://lab.guilian.cn'; window.GLOBAL_BASE_URL = BASE_URL; return data;方法 2:筛选器切换时执行(存储全局变量,核心代码)
接收下拉框选中的浏览器名称,存入全局变量,供后续所有 SQL 节点调用:
const SELECTED_BROWSER = data.value; window.GLOBAL_SELECTED_BROWSER = SELECTED_BROWSER; return { value: SELECTED_BROWSER };配置完成后保存节点设置。
步骤 2:配置浏览器下拉筛选器
回到画布编辑器,选中「浏览器筛选器(下拉多选)」组件,进入右侧配置面板:
数据配置:选择「静态数据」,按
title(页面展示文字)+value(数据库真实字段)格式,录入 6 款浏览器信息,示例:默认值设置:输入框默认选中设置为IE 浏览器(大屏打开默认展示该浏览器数据);
点击【刷新数据】→ 保存筛选器配置。
步骤 3:基础连线(启动数据流)
按照规则连接触发器与参数接收节点,两条连线缺一不可:
页面加载节点(页面初始化完成)→ 连线至「浏览器参数接收」输入口(大屏打开初始化参数);
浏览器筛选器(下拉框内容被选中)→ 连线至「浏览器参数接收」输入口(用户切换筛选器触发更新)。
此时基础链路搭建完成:打开页面 / 切换筛选器,都会自动把浏览器名称存入全局变量。
五、核心配置(中篇):双 SQL 查询节点(数据查询核心)
我们分两类查询:全维度数据查询(给饼图、柱状图、地图等 7 类图表使用)、核心指标查询(给 4 个指标卡片使用),两个 SQL 节点均读取上一步的全局浏览器变量,实现动态查询。
步骤 1:维度数据 SQL 请求节点(多维度合并查询)
该节点用UNION ALL一次性查询性别、年龄、学历、职业、收入、居住地、省份 7 大维度数据,统一输出dimension_type(维度类型)、name(维度名称)、value(用户数)标准格式,一份数据供给 7 个图表。
拖拽SQL 请求节点,重命名为「维度数据 SQL 请求」;
数据源选择「团队私有数据库」,SQL 类型选择「查询」;
粘贴下方完整处理代码(自动读取全局浏览器变量,过滤数据):
// 从全局变量获取选中的浏览器值 const selectedBrowser = window.GLOBAL_SELECTED_BROWSER; let sql = ` -- 性别分布 select 'gender' as dimension_type, gender as name, sum(user_count) as value from labs.user_profile_stats where browser_name = '${selectedBrowser}' group by gender union all -- 年龄段分布 select 'age' as dimension_type, age_group as name, sum(user_count) as value from labs.user_profile_stats where browser_name = '${selectedBrowser}' group by age_group union all -- 学历分布 select 'edu' as dimension_type, edu as name, sum(user_count) as value from labs.user_profile_stats where browser_name = '${selectedBrowser}' group by edu union all -- 职业分布 select 'job' as dimension_type, job as name, sum(user_count) as value from labs.user_profile_stats where browser_name = '${selectedBrowser}' group by job union all -- 收入分布 select 'income' as dimension_type, income as name, sum(user_count) as value from labs.user_profile_stats where browser_name = '${selectedBrowser}' group by income union all -- 居住地类型分布 select 'city_type' as dimension_type, city_type as name, sum(user_count) as value from labs.user_profile_stats where browser_name = '${selectedBrowser}' group by city_type union all -- 省份分布 select 'province' as dimension_type, province as name, sum(user_count) as value from labs.user_profile_stats where browser_name = '${selectedBrowser}' group by province `; return sql;连线:将「浏览器参数接收」输出口 → 连线至该 SQL 节点【执行 SQL】接口。
步骤 2:核心指标 SQL 请求节点(四大指标查询)
单独查询 4 个核心 KPI:总用户数、平均年龄、本科及以上学历占比、中高收入占比,采用分行查询格式,适配指标卡片读取规则。
再拖拽一个SQL 请求节点,重命名为「核心指标 SQL 请求」;
数据源同样选择「团队私有数据库」,粘贴以下代码:
// 从全局变量获取选中的浏览器值 const selectedBrowser = window.GLOBAL_SELECTED_BROWSER; let sql = ` -- 核心指标1:总用户数 select 'total_users' as name, sum(user_count) as value from labs.user_profile_stats where browser_name = '${selectedBrowser}' union all -- 核心指标2:平均年龄(加权平均) select 'avg_age' as name, round(sum(age * user_count) / sum(user_count), 1) as value from labs.user_profile_stats where browser_name = '${selectedBrowser}' union all -- 核心指标3:本科及以上占比 select 'high_edu_ratio' as name, round( sum(case when edu in ('本科', '硕士及以上') then user_count else 0 end) * 100.0 / sum(user_count), 1 ) as value from labs.user_profile_stats where browser_name = '${selectedBrowser}' union all -- 核心指标4:中高收入占比 select 'high_income_ratio' as name, round( sum(case when income in ('5001~8000元', '8001~12000元', '12000元以上') then user_count else 0 end) * 100.0 / sum(user_count), 1 ) as value from labs.user_profile_stats where browser_name = '${selectedBrowser}' `; return sql;连线:「浏览器参数接收」输出口 → 连线至该节点【执行 SQL】接口。
知识点补充:加权平均年龄
sum(age * user_count) / sum(user_count)是行业标准算法,比单纯取年龄段中值更精准;case when用于条件统计占比,是数据分析常用语法。
六、核心配置(下篇):数据分发节点(数据分拣,灵魂环节)
两份 SQL 查询返回的是整合后的原始数据,不同图表需要的数据格式、筛选规则各不相同,这时候就轮到并行数据处理分发节点登场,按维度拆分、排序、格式化数据,一对一发给对应组件。
步骤 1:维度数据分发节点(对接 7 类维度图表)
拖拽并行数据处理节点,重命名为「维度数据分发」;
连线:「维度数据 SQL 请求」【执行成功】接口 → 连线至该节点输入口;
双击节点,新增 7 个分支方法,分别对应 7 个图表(代码分分支复制,每个分支独立生效):
分支 1:性别分布(饼图)
过滤出性别维度数据,适配饼图name-value格式:
var filtered = data.filter(item => item.dimension_type === 'gender'); return filtered.map(item => ({ name: item.name, value: item.value }));分支 2:年龄段分布(柱状图)
过滤 + 固定顺序排序,避免年龄段乱序:
var filtered = data.filter(item => item.dimension_type === 'age'); var order = ['<<18', '18-25', '26-35', '36-45', '>45']; filtered.sort((a, b) => order.indexOf(a.name) - order.indexOf(b.name)); return filtered.map(item => ({ x: item.name, y: item.value, s: '用户数' }));分支 3:学历分布(条形图)
按学历从低到高排序:
var filtered = data.filter(item => item.dimension_type === 'edu'); var order = ['小学及以下', '初中', '高中/中专/技校', '大专', '大学本科', '硕士及以上']; filtered.sort((a, b) => order.indexOf(a.name) - order.indexOf(b.name)); return filtered.map(item => ({ x: item.name, y: item.value, s: '学历' }));分支 4:职业分布(柱状图)
基础过滤,无需强制排序:
var filtered = data.filter(item => item.dimension_type === 'job'); return filtered.map(item => ({ x: item.name, y: item.value, s: '职业' }));分支 5:收入分布(柱状图)
智能提取数字,按收入金额升序排列:
var filtered = data.filter(item => item.dimension_type === 'income'); // 按收入金额升序排序(提取数字进行比较) filtered.sort((a, b) => { var getMinIncome = (incomeStr) => { if (incomeStr === '无收入') return -1; if (incomeStr === '500元及以下') return 0; var match = incomeStr.match(/(\d+)/); return match ? parseInt(match[1]) : 999999; }; return getMinIncome(a.name) - getMinIncome(b.name); }); return filtered.map(item => ({ x: item.name, y: item.value, s: '收入' }));分支 6:居住地类型(饼图)
兼容unknown未知字段,统一转为中文展示:
var filtered = data.filter(item => item.dimension_type === 'city_type'); return filtered.map(item => ({ name: item.name === 'unknown' ? '未知' : item.name, value: item.value }));分支 7:省份排行榜(轮播列表 TOP5)
按用户数降序,只取前 5 名,适配列表字段:
// 过滤出省份数据 var filtered = data.filter(item => item.dimension_type === 'province'); // 按用户数降序排序 filtered.sort((a, b) => b.value - a.value); // 取前5条 var top5 = filtered.slice(0, 5); // 映射为轮播列表需要的字段格式 return top5.map(item => ({ province: item.name, user_count: item.value }));分支连线:将 7 个分支接口,分别连线至对应图表组件的【导入数据接口】。
步骤 2:核心指标分发节点(对接 4 个指标卡片)
SQL 返回 4 行指标数据,每个指标卡片只需要单独一个数值,通过分支过滤拆分数据。
拖拽并行数据处理节点,重命名为「核心指标分发」;
连线:「核心指标 SQL 请求」【执行成功】接口 → 连线至该节点输入口;
新增 4 个分支,分别对应 4 个指标卡片,代码模板如下(仅修改
name匹配值即可):
分支 1:总用户数卡片
var item = data.find(item => item.name === 'total_users'); return [{ value: item ? item.value : 0 }];分支 2:平均年龄卡片
var item = data.find(item => item.name === 'avg_age'); return [{ value: item ? item.value : 0 }];分支 3:本科及以上占比卡片
var item = data.find(item => item.name === 'high_edu_ratio'); return [{ value: item ? item.value : 0 }];分支 4:中高收入占比卡片
var item = data.find(item => item.name === 'high_income_ratio'); return [{ value: item ? item.value : 0 }];分支连线:4 个分支分别对接 4 个指标卡片【导入数据接口】。
七、最终收尾:全链路连线 + 保存预览 + 排错指南
步骤 1:完整链路自查(对照清单,杜绝漏线)
按以下完整逻辑核对所有连线,这是联动成功的最后一关:
页面加载 → 浏览器参数接收(输入)
浏览器筛选器 → 浏览器参数接收(输入)
浏览器参数接收(输出)→ 维度数据 SQL 请求(执行 SQL)
浏览器参数接收(输出)→ 核心指标 SQL 请求(执行 SQL)
维度数据 SQL 请求(执行成功)→ 维度数据分发(输入)
核心指标 SQL 请求(执行成功)→ 核心指标分发(输入)
维度数据分发 7 个分支 → 7 个维度图表
核心指标分发 4 个分支 → 4 个指标卡片
步骤 2:保存 & 预览测试
蓝图编辑器右上角点击保存,锁定所有节点和连线配置;
返回大屏画布,点击【预览】,进入测试页面;
功能测试(两大核心场景):
场景 1:页面初始化,默认展示「IE 浏览器」的全量数据,所有图表、指标正常渲染;
场景 2:切换下拉筛选器中的其他浏览器,全页面组件同步刷新,数据随选择变更。
步骤 3:高频踩坑 & 排错指南(新手必看)
所有图表无数据
排查:全局变量未生效 → 检查筛选器与参数接收节点的连线,核对 JS 代码中全局变量名是否统一;
部分图表乱序 / 字段错乱
排查:分发节点排序规则错误 → 核对年龄段、学历、收入的排序数组,确保和数据库字段一致;
指标卡片显示为 0
排查:SQL 查询语法错误 / 字段名不匹配 → 检查
total_users、avg_age等名称与分发节点是否一一对应;
省份排行榜数据为空
排查:未截取 TOP5 / 字段名错误 → 核对轮播列表映射字段为
province和user_count。
步骤 4:进阶小技巧
如果需要调试数据,可在任意分支代码中添加console.log("返回的数据",data),预览页面打开开发者控制台,就能查看节点流转的原始数据,快速定位问题。
八、项目总结 & 能力延伸
至此,一套完整的筛选器全局联动交互式数据大屏就制作完成了!我们全程依靠蓝图编辑器 + 并行数据处理节点,实现了「一次筛选→全局响应」的标准企业级大屏交互方案,核心优势总结:
高效复用:单条 SQL 查询多维度数据,通过并行节点分发,减少数据库请求压力;
低代码门槛:拖拽节点 + 简易 JS 脚本,零基础也能实现复杂交互,不用开发后端接口;
扩展性强:后续可拓展省份点击下钻、时间筛选、多条件组合筛选等玩法。
学会这套逻辑,不管是用户画像大屏、业务监控看板、营销数据战报,都能套用相同框架搭建交互功能,轻松搞定职场数据可视化需求!
需要我帮你整理代码片段汇总,把文中所有脚本按节点分类方便你直接复制使用吗?
