大杂烩:创建自己的个人数据工作台
在我的职业生涯中,不得不说,数据的组织,Alteryx是真好用、数据仓库整体解决方案SQL Server是真顺手、出炫彩的报告用Power BI是真舒服。无奈这些产品都自成体系捆绑,而且卖的还真的很贵,更难受的是你即使平时只是用其5%的功能,那么你也得为那95%付费。而更关键的是,随着外资撤离的越来越多,这些洋工具想在国内找到饭碗越来越难。
不过,还好现在Vibe Coding已经很强了,以前想自己模仿个类似工具简直天方夜谭,现在只要你有想法,基本都能帮你实现。
于是我把这些工具,我平时用的最多的功能,临摹了一遍,形成一个项目,一个跑在浏览器里的个人数据工作台。它保留了 Alteryx 的画布式工作流、SSIS 的编排与调度、Power BI 的拖拽报表。这个平台暂时不面向企业,只做个人工作台使用。
这篇文章不讲安装步骤,而是讲它实现了什么,以及这些功能背后的设计取舍。
写在前面
我的Vibe Coding用的是Trae CN + DeepSeek Flash V4.1,主要来自火山引擎的Coding Plan,目前还在打折中。不要问我为什么不Claude,问就只有一个字------穷。
一、整体形态:四层结构
整个系统是一个 pnpm monorepo,自上而下分四层:
HUSTServer/
├── apps/
│ ├── server/ # Fastify 5 + better-sqlite3(API、调度、运行 / Job 编排、静态托管)
│ └── web/ # React 19 + Vite + Tailwind v4 控制台(含仪表板编辑器)
│ └── DATA/ # 资源库默认根目录
├── packages/
│ ├── engine/ # HUSTERYX 执行引擎移植(DuckDB + mssql)
│ └── workflow-designer/ # HUSTERYX 前端画布复用包(适配器注入平台能力)
└── docs/ # 设计文档与截图
- 前端层 :React 19 控制台,路由与按钮都按「能力」门禁;画布编辑由独立包提供,该包逐字节复用 HUSTERYX 的设计器并裁剪掉运行态,通过
DesignerAdapter注入「保存发布 / 文件上传 / 结构探测」等平台能力,包内不依赖路由和平台 API。 - 服务层:Fastify 5,提供 REST API 与 SSE 实时日志,承担会话认证、能力授权、Cron 调度、工作流运行编排、Job 步骤编排、连接密码加密、数据模型管理,生产模式下同时静态托管前端产物并做 SPA 回退。
- 执行引擎:HUSTERYX 后端引擎的移植,DuckDB 负责节点间的列式计算,mssql 负责读写 SQL Server,22 种节点按拓扑序执行。
- 存储:SQLite 单文件承载全部元数据;DuckDB 单文件承载物化后的数据模型;上传文件、运行输出与溢出数据落在数据目录。
flowchart LR subgraph Browser"浏览器" Web"管理控制台\
React 19 + Vite + Tailwind" Designer"工作流设计器\
复用 HUSTERYX 画布" BI"仪表板编辑器\
recharts" end subgraph Server"apps/server · Fastify 5" API"REST API + SSE\
会话认证 / 能力守卫" Sched"调度器\
node-cron" Runner"运行编排\
工作流运行 · Job 编排" Model"模型服务\
staging → 原子替换" DB("SQLite\
用户 / 工作流 / Job / 仪表板") Files("数据目录\
uploads / outputs / spill") Duck("DuckDB\
models.duckdb") end Engine"执行引擎\
22 种节点按拓扑序执行" SQL("SQL Server") Server -->|"静态托管 · SPA 回退"| Web Web -->|"HTTP · Cookie 会话"| API Designer -->|"保存发布 / 上传"| API BI -->|"数据集取数 / 保存"| API Sched --> Runner API --> Runner Runner --> Engine API --> Model Model --> Duck Engine --> SQL Runner --> DB Runner --> Files
执行链路很短:调度器或手动触发 → 从 SQLite 读出工作流 / Job payload → 引擎按拓扑序执行 → 节点状态与日志回写 SQLite → SSE 推送到浏览器。没有消息队列,也没有独立的工作进程,单机自洽。
其实这个技术架构对我来说很陌生,因为我以前都是做微软技术体系的。不过很多架构经验上的东西都是通用的,即使有些细节你不懂,那么也可以问AI让帮你解释,辅助你做架构层面的决策。
二、模仿Alteryx的工作流
工作流没有模仿SSIS的编排与调度,而是Alteryx,这个工具在做小规模处理的时候用起来还是很舒服的,它的设计就是一张可拖拽各种工具的画布。目前节点固定 22 种:
| 类别 | 节点 |
|---|---|
| 输入 | CSV、Excel、SQL Server |
| 转换 | Select、Filter、Join、Union、Aggregation、Sort、Formula、Unique、Sample、Data Cleansing、Running Total、Text to Columns、Cross Tab、Transpose |
| 输出 | CSV、Excel、SQL Server、Browser、Data Model |
引擎按工作流里的设计顺序执行,节点之间用 DuckDB 传递数据流。设计器支持拖拽连线、成环检测 、端口约束和节点配置面板;从「新建画布」可以零搭建,从列表或详情可以编辑既有工作流,保存即发布。

工作流保存后,就可以配置在工作流里运行并查看日志。

工作流详情页把「输入绑定 / 输出 / 运行历史」摊在一页里,支持立即运行和 Cron 调度:

每次运行按拓扑顺序逐节点展示状态、行数、耗时和错误,日志通过 SSE 实时推送,运行中页面右上角显示「实时」徽标,结束后自动停止。

到目前为止临摹了常用的模块,主要目的是为了做技术验证。
不过由于我火山引擎两个账号的打折额度都用完了,等下周额度恢复后再慢慢临摹Alteryx里的更多好用模块。(目前的一些常规操作用的是Trae CN里每天赠送的点数,每天没Token的滋味是真不好受。)
三、模仿SSIS的Job编排
Job就是把工作流以及其它常用的操作都编排在一起,这里仿照SSIS包的成分更多一些。
Job 就是这层编排容器。步骤类型目前先做了三种:
- 运行工作流:执行该工作流的完整节点链路
- 运行 SQL:在指定 SQL Server 连接上直接执行语句
- 加载成模型:把 CSV / Excel 或 SQL Server 表加载进平台内的 DuckDB,并取一个模型名
每个步骤单独设置失败策略:
中止:本步失败即终止整个 Job,后续步骤标记为「已跳过」继续:记录失败但继续往下走

步骤弹窗用分段控件切换三种类型,切换时如果步骤名还是默认名会自动同步;调度支持「每天 / 每周 / 每月 / 自定义 cron」,默认每天 08:00、时区 Asia/Shanghai。

Job 运行详情按步骤展示顺序、类型、状态、耗时、结果与错误。工作流步骤的「结果」列可以直接跳到那次工作流的运行详情,SQL 步骤则显示「影响 N 行」。运行中页面自动轮询,直到结束。

另外做了一个 Job 日志 页:汇总全部 Job 的最近一次运行 ,按最近运行时间倒序,从未运行过的 Job 也会列出(显示 --- / 未运行)。这张表的用途很直接 ------ 早上打开就知道昨晚的批到底跑成没跑成。

四、数据模型:把外部数据物化进 DuckDB
这个我也说不好模仿的具体的是哪一块,有点类似Power BI的仪表板数据本地缓存吧。这是我个人用得最多的功能,也是整个系统里设计最讲究的一块。
仪表板如果每次都直连源库取数,会遇到两个问题:源库压力不可控,以及不同图表各自重复拉一遍同样的数据。数据模型把这一步前移:在 Job 里加一个「加载成模型」步骤,指定资源库的 CSV / Excel 或 SQL Server 的表 / 查询,把数据物化 进平台内的持久 DuckDB 单文件(<数据目录>/models.duckdb),并给它一个模型名。之后仪表板直接以这个名字作为数据集来源。
数据结构之外,模型页还提供了四个日常用的动作:
- 新建模型:不用绕去 Job,直接在弹窗里载入(等价于 Job 的「加载成模型」步骤),同名会确认后覆盖
- 数据预览:读取前 1000 行
- 透视 :把字段拖到
X 轴(列)/Y 轴(行)/数值/筛选列,聚合下推到 DuckDB 执行,配置变化即刷新;结果过大时提示「结果已截断」 - 统计:一列一行做列统计 ------ 非空、空值、不重复值数,数值列再加最小 / 最大 / 平均 / 中位数 / 标准差





五、模仿Power BI的仪表板
仪表板是 Power BI 风格的三栏编辑器:左侧在 仪表板 与 数据 两个视图间切换,右侧是 可视化(图表类型与字段井)和 数据(字段列表)两栏,拖字段即成图。
数据集有三种来源:
- 资源库文件(CSV / Excel)
- 连接的数据库表(SQL Server,视图会标注「(视图)」)
- 数据模型(DuckDB 物化的表)

目前临摹了 20 种视觉对象:簇状 / 堆积 / 100% 堆积柱形图、条形图、堆积条形图、折线图、面积图、堆积面积图、折线与柱形图、饼图、环形图、散点图、树状图、分解树、漏斗图、径向条形图、表格、数值卡、填充地图、数据透视表。
其中两个是特意按 Power BI 的交互做的:
- 树状图 采用 Squarified 布局,图块面积与值成正比,字段井是
类别/详细级别(可选)/值;悬停看类别、值与占比,点击图块可以交叉筛选同页其它图表 - 分解树 是列式逐层拆分,字段井为
分析(度量)与说明依据(多个维度);点节点右侧+选择按某维度拆分,或用高值/低值自动找贡献最高 / 最低的类别,节点数据条长度按根节点合计归一化,展开状态随视觉对象保存
字段拖入(或直接点击)时有默认语义:数值字段默认作为度量按「求和」,文本 / 日期优先作为维度、其次作为图例;度量聚合可在 求和 / 计数 / 平均 / 最小 / 最大 / 原始值 之间切换;图表标题留空时按「度量 按 维度」自动生成。

仪表板列表里点名称 是以只读方式预览,点操作列的 编辑 才进编辑器;所有具备查看能力的用户都能看到,不设单独的共享开关。

六、模仿某Service的资源库
资源库是平台内的文件工作区,默认根目录 apps/web/DATA(可用 HUSTSERVER_RESOURCE_DIR 覆盖)。以文件夹树组织,支持上传 CSV / Excel、新建文件夹(支持 a/b/c 多级)、重命名、拖拽移动 、下载与删除;多选支持 Cmd/Ctrl+单击 与 Shift+单击 区间选择,删除可批量。

放在这里的文件都可以被仪表板读取到,并也可以直接加载成数据模型。
写在最后
最近REA很火,相信也会改变很多人创建和使用软件的方式。但这个项目不是基于此,而是把我觉得我认为哪些工具里好的功能都揉在一起,纯私人订制。
然而这个过程我也发现一个问题,就是通常我们自己认为好的东西,不一定就是行业的最佳实践,所以很多东西还得去慢慢的打磨,以及慢慢的去理解,那些专业的软件为什么要那么去设计和规划。
Vibe Coding的好处就在于,具体的代码有人帮你去写,你可以有更多的时间想你要的是什么,缩短了产品的迭代。
同时也看到,国产的模型和智能体与外界的差距,虽然很难超过,但是追赶的脚步从未停下。