1. 页面概览

1.1 是什么

数据集(DatasetPage.vue,路由 /foundry/datasets)是 LightFoundry「数据目录」的核心页面,承载 V5 Stage 1 B1-1 数据集能力。页面把「外部数据源查询 / 上传文件 / 管道产物 / 对象快照」统一收编为版本化编目的一等公民——每个数据集有 fd_datasets 主表记录(rid/uri/source_type/schema_json/row_count/current_version/status),行数据按数据集独立建动态表 ds_<rid文件安全名>,列随 schema_json 动态创建。

页面上你可以:新建数据集(platform_ds:提交一条查询 SQL,后端立即执行并落数、推断 schema);上传文件(CSV/JSON,multipart 上传建数据集);列表过滤(仅活跃/全部/仅归档);详情抽屉(Schema 列定义 / 行数据预览 50 行 / 版本历史 + 发布版本 / 基础画像);软删归档。页面描述明确其定位:「数据接入 → 数据集 → 管道 → 对象 链路的地基:外部查询/上传文件统一版本化编目。」

1.2 核心价值

维度说明
数据接入统一编目platform_ds 查询 / CSV/JSON 上传 / 管道产物 / 对象快照四类来源统一进入数据集目录
版本化发布版本 = 当前 schema + 行数快照入 fd_dataset_versionscurrent_version++(指针推进,不拷贝数据),分支/回滚语义即切换指针
质量画像详情抽屉「基础画像」Tab:每列 null 率 / distinct / top5(number 列附 avg),聚合 SQL 下推计算
安全落地行数据表 DDL 只允许白名单标识符(列名 ^[a-z][a-z0-9_]*$),全部行值参数化绑定防注入
来源可视化source_type 徽标区分 platform_ds(蓝)/upload(绿)/pipeline_output(橙)/object_snapshot(紫)
血缘打点创建/上传成功自动打血缘边(datasource/upload → dataset),可在「数据血缘」页追溯

1.3 一句话总结

Foundry 数据域的「地基页」:把外部查询与上传文件收编成可预览、可发布版本、可做质量画像的数据集目录,为管道、对象、同步提供统一数据入口。

2. 访问入口

2.1 路由与菜单

2.2 认证与权限

2.3 端口与 API 前缀

3. 界面布局

┌──────────────────────────────────────────────────────────────┐
│ ① 页头:「数据目录 · 数据集」+ 一句话说明                      │
│ ② 操作结果提示条(alert 成功/失败,可「关闭」)                 │
│ ③ 工具栏:「新建数据集(数据源查询)」+「上传文件」            │
│           [状态下拉:仅活跃/全部/仅归档] [刷新]                │
│ ④ 新建表单卡片(platform_ds:名称/数据源ID/查询SQL/描述)      │
│ ⑤ 上传对话框(遮罩 + 居中弹窗:名称/文件/描述)                │
│ ⑥ 数据集列表卡片(表格)                                      │
│    └─ 名称(+描述)/来源/行数/大小/版本/状态/Owner/更新时间/操作 │
│ ⑦ 详情抽屉(右滑 860px)                                      │
│    ├─ 头部:名称+来源+状态+RID+uri+物理表+[关闭]              │
│    ├─ 操作条:版本说明输入 + [发布版本] [刷新]                 │
│    ├─ Tab:[Schema] [预览] [版本历史] [基础画像]              │
│    └─ 各 Tab 内容卡片                                          │
└──────────────────────────────────────────────────────────────┘

各板块职责:

4. 交互元素详解

4.1 工具栏与列表

位置元素含义默认值/必填操作效果触发的后端调用
工具栏「新建数据集(数据源查询)」展开/收起新建表单切换 showCreateForm
工具栏「上传文件」展开/收起上传对话框切换 showUploadForm
工具栏状态下拉列表状态过滤默认 仅活跃;选项 仅活跃/全部/仅归档change 即刷新GET /datasets?status=
工具栏「刷新」手动刷新列表fetchDatasets()GET /datasets?status=
列表列名称名称 + 描述(cell-sub,无描述显示 -只读
列表列来源src-badge 徽标(src-platform_ds/src-upload/src-pipeline_output/src-object_snapshot)只读
列表列行数 / 大小row_count / fmtSize(size_bytes)(B/KB/MB 智能换算)只读
列表列版本current_version > 0 ? 'v'+n : '未发布'只读
列表列状态status-badge(status-active/status-archived)只读
列表列Owner / 更新时间owner / fmtTime(updated_at)(T 替换 + slice 19)只读
列表行「详情」打开详情抽屉openDetail(d) 并发加载详情/预览/版本GET /datasets/:id + GET /datasets/:id/preview + GET /datasets/:id/versions
列表行「删除」软删归档(仅 status=active 显示)confirm 提示「确认删除数据集「xx」?(软删归档,可在"仅归档"过滤中查看)」归档后刷新列表DELETE /datasets/:id

4.2 新建表单(platform_ds)

位置元素含义默认值/必填操作效果触发的后端调用
表单数据集名称 *name必填,占位 如 orders_daily文本输入
表单数据源 ID(ds_id)*来源数据源 id必填,占位 如 1文本输入
表单来源查询 SQL *立即执行的查询必填,默认 SELECT * FROM orders LIMIT 1000;hint「建议带 LIMIT;查询立即执行,结果落平台行数据表并推断 schema。」文本域
表单描述数据集描述可空文本输入
表单「创建」/「创建中...」提交busy 时禁用成功 alert「数据集创建成功」并刷新列表POST /datasets(body {name, description, source_type:'platform_ds', source_ref:{ds_id, query}}
表单「取消」关闭表单showCreateForm=false

4.3 上传对话框

位置元素含义默认值/必填操作效果触发的后端调用
对话框数据集名称(留空则用文件名)name可空文本输入
对话框文件 *上传文件必填;accept=".csv,.json"(仅 CSV/JSON)onFileChange 记录文件
对话框描述描述可空文本输入
对话框hint「CSV 首行为表头;空字段按 NULL 处理;XLSX 本版降级不支持,请另存为 CSV。」提示文案
对话框「上传」/「上传中...」提交busy || !uploadForm.file 时禁用成功 alert「上传成功,数据集已创建」并刷新列表POST /datasets/upload(multipart:name 可空 + file 必填,timeout 120s)
对话框「取消」/遮罩点击关闭showUploadForm=false

4.4 详情抽屉

位置元素含义操作效果触发的后端调用
抽屉头来源/状态徽标 + RID + uri + 物理表数据集元信息只读
抽屉头「关闭」关闭抽屉closeDetail()
操作条版本说明(可空)publish changelog文本输入
操作条「发布版本」发布当前快照成功 alert 已发布版本 v<version> 并刷新详情与版本历史POST /datasets/:id/versions/publish(body {changelog}
操作条「刷新」重载详情refreshDetail()(重新 openDetail)详情三接口
TabSchema列定义表只读;空表提示「无 schema(登记型数据集,行数据由管道/同步写入)」详情接口已带 schema
Tab预览行数据预览(前 50 行)懒加载;NULL 显示为「NULL」GET /datasets/:id/preview?limit=50
Tab版本历史版本快照列表懒加载;空提示「尚未发布版本(发布后将当前 schema+行数快照入版本)」GET /datasets/:id/versions
Tab基础画像列画像懒加载;「重新计算」按钮触发GET /datasets/:id/profile

4.5 详情 Tab 细节

Tab列/字段说明
Schema# / 列名 / 类型 / 可空列名 cell-code、类型 type-tag、可空 是/否(本版统一 true)
预览动态列 + 行preview.columns 为表头、preview.rows 为行数组;单元格 null 渲染「NULL」;空表提示「暂无行数据」
版本历史版本 / 行数 / 说明 / 操作人 / 时间当前版本行带「当前」蓝色 cur-tag
基础画像总行数/物理表/生成于 + 每列 列/类型/Null 率/Distinct/Avg/Top5null_rate*100 保留 1 位小数 + (null_count);avg 保留 2 位小数(非 number 列显示 -);top5 为 value ×count 标签;profile.note 展示降级说明

5. 后端关联

5.1 API 客户端

action/web/src/api/datasetApi.js

5.2 端点表

方法路径请求要点超时
GET/datasetsquery: status(空=active / archived / all)、limitoffset60s
POST/datasets{name, description, source_type, source_ref{ds_id,query}, owner}60s
POST/datasets/uploadmultipart:file 必填 + name 可空;上限 32MB120s
GET/datasets/:id60s
PUT/datasets/:id{name?, description?} 指针语义60s
DELETE/datasets/:id无(软删 archived,幂等)60s
POST/datasets/:id/versions/publish{changelog}(可空,空 body 也允许)60s
GET/datasets/:id/versions无(version 倒序)60s
GET/datasets/:id/previewquery: limit(默认 50,服务端钳制 500)60s
GET/datasets/:id/profile60s

5.3 响应结构

统一 {code: 0, data: ...};失败 {code, error}(dataset 包自包含 okData/errorResponse,模式对齐 server 包)。

列表:

{ "code": 0, "data": { "datasets": [ { "id": "...", "rid": "rid.foundry.dataset.xxx", "uri": "dataset://foundry/rid.foundry.dataset.xxx", "name": "orders_daily", "source_type": "platform_ds", "row_count": 1000, "size_bytes": 20480, "current_version": 1, "status": "active", "owner": "admin" } ], "total": 1 } }

详情:

{ "code": 0, "data": { "dataset": { "...": "..." }, "schema": [ { "name": "order_id", "type": "number", "nullable": true } ], "table": "ds_dataset___foundry_rid_foundry_dataset_xxx", "source_ref": { "ds_id": "1", "query": "SELECT * FROM orders LIMIT 1000" } } }

版本发布:

{ "code": 0, "data": { "version": 2 } }

预览:

{ "code": 0, "data": { "columns": ["order_id", "amount"], "rows": [[1, 99.5], [2, 120]] } }

基础画像:

{ "code": 0, "data": { "dataset_id": "...", "table_name": "ds_...", "row_count": 1000, "generated_at": "...", "columns": [ { "name": "amount", "type": "number", "null_count": 5, "null_rate": 0.005, "distinct": 300, "avg": 88.75, "top5": [ { "value": "99.5", "count": 12 } ] } ], "note": "" } }

5.4 关联模块表

后端包/文件职责
products/foundry/dataset/rest.go全部数据集端点(RegisterRoutes 挂 protected 组)+ 自包含 okData/errorResponse
products/foundry/dataset/models.goDataset / DatasetVersion(表 fd_datasets / fd_dataset_versions)+ SourceRef/ColumnDef + RowTableName + AutoMigrate
products/foundry/dataset/service.goCreate(platform_ds 拉数)/ Upload(CSV/JSON 解析)/ Get/List/Preview/Profile/PublishVersion/Update/Delete/DeleteRows
products/foundry/lineage血缘打点(datasource/upload → dataset 边,允许 nil)
platform/connectorplatform_ds 拉数用连接器(ConnectorProvider 注入)
platform/resource资源 URI 生成与 FileSafeName(行表名安全化)

5.5 关键机制

6. 核心流程详解

6.1 新建数据集(platform_ds 立即拉数)

  1. 工具栏点「新建数据集(数据源查询)」展开表单;
  2. 填数据集名称(必填)、数据源 ID(必填)、来源查询 SQL(必填,默认 SELECT * FROM orders LIMIT 1000,建议带 LIMIT)、描述(可选);
  3. 点「创建」→ POST /datasets,body {name, description, source_type:'platform_ds', source_ref:{ds_id, query}}
  4. 后端 Create:校验来源 → 经 ConnectorProvider 连接 ds_id 数据源执行 query → 从结果推断 schema(列名归一化后过白名单)→ 动态建行数据表 ds_<rid安全名> → 参数化逐行落数 → 更新 row_count/size_bytes → 打血缘边(datasource → dataset);
  5. 前端 alert「数据集创建成功」,关闭表单并刷新列表;新数据集出现在列表(来源徽标 platform_ds)。

6.2 上传文件建数据集

  1. 工具栏点「上传文件」打开对话框(点遮罩空白也可关闭);
  2. 数据集名称可留空(留空用文件名),选文件(accept=".csv,.json" 仅 CSV/JSON,必填),描述可选;
  3. 点「上传」→ uploadDataset(name, file):FormData 构造 name(非空才 append)+ filePOST /datasets/upload(multipart,timeout 120s);
  4. 后端 Upload:读文件(超 32MB 报「上传文件超过大小上限(32MB)」)→ 按扩展名分派 CSV/JSON 解析(非法列名拒绝)→ schema 推断 → 建行表参数化落数 → 原始文件落盘 data/foundry/datasets/<FileSafeName(uri)>/ → 打血缘边(upload → dataset);
  5. 前端 alert「上传成功,数据集已创建」并刷新列表(来源徽标 upload)。

6.3 查看详情与质量画像

  1. 列表点「详情」→ openDetail 并发加载详情 / 预览 / 版本历史;
  2. 抽屉 Tab 默认 Schema:查看列定义(#/列名/类型/可空);
  3. 切「预览」:行数据预览前 50 行(懒加载,drawerTab watch 在无数据时补拉),NULL 显示「NULL」;
  4. 切「版本历史」:查看各版本 vN + 「当前」标记;
  5. 切「基础画像」:懒加载 GET /datasets/:id/profile;可点「重新计算」手动重算(loadProfile);表格展示每列 Null 率(含 null_count)/Distinct/Avg/Top5 高频值,顶部汇总总行数、物理表名与生成时间;note 非空时展示降级说明。

6.4 发布版本

  1. 详情抽屉操作条「版本说明(可空)」输入 changelog(可空);
  2. 点「发布版本」→ POST /datasets/:id/versions/publish(body {changelog});
  3. 后端 PublishVersion:校验未归档 → 快照当前 schema_json+row_count 入版本表(version = current_version+1)→ 事务内推进 current_version → 并发冲突重试最多 3 次;
  4. 前端 alert 已发布版本 v<version>,随后 refreshDetail + loadVersions 刷新;列表「版本」列显示 v<新版本>,版本历史出现该条并带「当前」标记。

6.5 软删归档与恢复查看

  1. 列表「删除」(仅 active 显示)→ confirm(提示软删归档)→ DELETE /datasets/:id
  2. 后端 Delete 置 status=archived(幂等,已归档视为成功);
  3. 前端 alert「数据集已归档」;若详情抽屉正打开该数据集则自动关闭;刷新列表后该行消失;
  4. 查看归档:工具栏状态下拉切「仅归档」,列表展示 archived 数据(无「删除」按钮,可再「详情」查看历史)。

6.6 上传失败分支(XLSX)

.xlsx 文件时浏览器 accept 过滤即无法选择;若强行上传,后端 Upload 对 XLSX 显式拒绝并明示(本版未引入 excelize,降级只支持 CSV/JSON)。请先在 Excel 另存为 CSV 再上传。

7. 权限与安全

8. 常见问题与排错

8.1 上传报「上传失败:缺少上传文件字段 file」或「上传文件超过大小上限(32MB)」

8.2 上传 CSV 报列名非法(表头含大写/中文/空格)

8.3 发布版本后列表「版本」列不更新

8.4 详情抽屉「预览」无数据或报错

8.5 基础画像为空的可能原因

9. 已知缺陷与边界

缺陷/边界说明影响
XLSX 不支持本版未引入 excelize,上传显式拒绝 XLSX需另存为 CSV
上传 32MB 上限maxUploadBytes 服务端强制大文件需拆分
列名白名单严格^[a-z][a-z0-9_]*$,非法列名拒绝中文/大写表头需改名
行表无主键约束ColumnDef.Nullable 本版统一 true,行表不设主键无唯一性约束
版本不可回滚 UI版本机制支持指针切换,但页面无「回溯/回滚」操作入口回滚需 API/后续版本
预览上限 500服务端钳制 preview limit 500大表预览受限
登记型无预览pipeline_output/object_snapshot 无行表,预览空属设计行为
删除不可恢复软删后无「恢复」入口(需 API 改 status)归档只能查看

注:列表无分页已于 2026-09-06 修复(列表前端本地分页展示,支持第 X/Y 页与每页条数切换)。

注:发布后列表不刷新已于 2026-09-06 修复(发布成功后同步刷新列表,行上 current_version 版本列即时更新)。