1. 页面概览

1.1 是什么

数据治理页面(路由 /foundry/governance)是 LightFoundry 承载"元数据治理三件套"的操作台:术语表数据分类保留策略。它把散落在各处的治理动作集中到一个三 Tab 页面:Tab1 管理业务术语并对接本体属性(对象类型 → 属性级联下拉,把术语与具体字段绑定);Tab2 管理数据分类标签(敏感等级 0~3)并把标签打到本体属性上,同时提供属性治理汇总查询(一个属性关联了哪些术语、被打了哪些标签);Tab3 管理保留策略(按目标类型 + 目标 ID 配置保留天数与到期动作,并可启用/停用)。

页面对应的设计文档是 TAD-12 数据治理,后端实现分布在 action/products/foundry/governance 包与 action/products/foundry/server/governance_handlers.go。与同一产品下的 MarkingPage(密级打标,第二道列级闸门)不同,本页治理的对象是术语字典分类标签,目标是让业务字段"说人话、有分级、可回收"。

1.2 核心价值

价值点说明
术语统一术语表为业务字段提供标准命名、缩写、定义与同义词,形成企业级数据字典
术语-属性关联术语可关联到具体本体对象的属性,让字典落到字段粒度
分类分级数据分类标签带敏感等级(0 公开 / 1 内部 / 2 机密 / 3 绝密),可打到属性上,为后续 CLS 策略提供依据
属性治理汇总单个属性一站式看到"术语 + 分类"全貌,治理状态一目了然
保留策略按数据源/管道输出/查询缓存/审计日志四类目标配置保留天数与动作(删除/归档/匿名化)
策略启停策略支持启用/停用切换,治理规则可灰度生效

1.3 一句话总结

数据治理页把"术语字典、分类打标、保留策略"三大治理动作收进一个三 Tab 页面,让字段级治理从"记录"走向"可关联、可分级、可回收"。

2. 访问入口

2.1 路由与菜单

项目
路由 path/foundry/governance
路由 nameFoundryGovernance
路由 title数据治理
requiresAuthtrue
菜单位置Foundry 左侧边栏(FoundryLayout.vue)菜单项「数据治理」
前端源码action/web/src/views/GovernancePage.vue
路由注册action/web/src/router/index.js

侧边栏菜单注册项为 { path: '/foundry/governance', label: '数据治理' }。页面头部标题「数据治理」旁展示副标题「术语表 / 数据分类 / 保留策略」。

2.2 认证与权限

2.3 端口与 API 前缀

Foundry 后端端口 18081,API 前缀 /api(请求路径带 /v1,如 /api/v1/governance/glossary)。开发环境 Vite 代理转发。

3. 界面布局

+---------------------------------------------------------------------+
| 数据治理                    术语表 / 数据分类 / 保留策略                |
+---------------------------------------------------------------------+
| [操作结果提示 alert(可关闭)]                                         |
+---------------------------------------------------------------------+
| Tab 栏:[术语表] [数据分类] [保留策略]                                 |
+---------------------------------------------------------------------+
| Tab1 术语表:                                                         |
|   card「术语表」:[+ 新建术语|收起表单]                                 |
|     创建表单:术语名称*/缩写/分类/状态(draft|approved|deprecated)       |
|               定义/同义词(逗号分隔)/负责人OwnerID + [创建术语][取消]     |
|     术语表格:ID|名称|缩写|分类|状态|负责人|关联属性|操作                 |
|       行内展开:关联本体属性(对象类型→属性级联 + 关联)                 |
|                  已关联属性表(对象类型|属性|数据类型|取消关联)          |
+---------------------------------------------------------------------+
| Tab2 数据分类:                                                       |
|   card「分类标签管理」:[+ 新建分类|收起表单]                            |
|     创建表单:分类名称*/敏感等级level*(0公开|1内部|2机密|3绝密)          |
|               颜色/描述 + [创建分类][取消]                              |
|     分类表格:ID|名称|等级|颜色|描述|操作(删除)                          |
|   card「属性打标签 / 属性治理查询」:                                    |
|     对象类型→属性→分类标签 三下拉 + [打标签][查询治理]                   |
|     结果:属性「object.property」(data_type)                          |
|       左:关联术语(名称|缩写|状态)  右:分类标签(分类|等级|打标人|移除)|
+---------------------------------------------------------------------+
| Tab3 保留策略:                                                       |
|   card「保留策略」:[+ 新建策略|收起表单]                                |
|     创建表单:策略名称*/目标类型target_type*(datasource|pipeline_output  |
|                |query_cache|audit_log) 目标ID(0=全部)/保留天数*/动作*    |
|               (delete|archive|anonymize) + [创建后即启用]              |
|               + [创建策略][取消]                                       |
|     策略表格:ID|名称|目标类型|目标ID|保留天数|动作|状态|操作(停用/启用,删除) |
+---------------------------------------------------------------------+

各板块职责:

4. 交互元素详解

4.1 Tab 栏

元素含义操作效果
术语表 Tab进入术语表子区activeTab='glossary',显示术语表 card
数据分类 Tab进入数据分类子区activeTab='classifications',显示分类标签管理 + 属性打标签两个 card
保留策略 Tab进入保留策略子区activeTab='retention',显示保留策略 card

4.2 Tab1 术语表 —— 创建表单

元素含义必填与默认值操作效果触发的后端调用
+ 新建术语/收起表单按钮展开/收起创建表单切换 showTermForm
术语名称输入框术语标准名必填,placeholder「如 客户生命周期价值」术语唯一标识(后端唯一索引)POST /governance/glossary
缩写输入框缩写选填,placeholder「如 CLV」术语缩写同上
分类输入框术语业务分类选填,placeholder「如 customer」便于归类检索同上
状态下拉draft(草稿)/ approved(已批准)/ deprecated(已废弃)默认 draft术语生命周期状态同上
定义文本域详细定义选填术语说明同上
同义词输入框逗号分隔的同义词选填,placeholder「如 LTV, 客户终身价值」前端按 , 拆分数组提交同上
负责人 OwnerID 输入框术语负责人选填,placeholder「如 alice」责任归属同上
创建术语按钮提交创建busy 时显示「提交中...」并禁用成功提示"术语创建成功 id=..."并重置表单POST /governance/glossary
取消按钮关闭表单resetTermForm 清空并收起

4.3 Tab1 术语表 —— 列表与关联面板

元素含义操作效果触发的后端调用
术语表格ID/名称/缩写/分类/状态/负责人/关联属性/操作只读展示;状态标签按 term-draft/term-approved/term-deprecated 着色GET /governance/glossary
关联属性按钮/收起关联按钮展开/收起行内关联面板展开时初始化级联下拉并加载已关联属性GET /governance/glossary/:id/properties
删除按钮删除术语confirm"确定删除术语"xx"吗?(关联属性将一并移除)"后删除DELETE /governance/glossary/:id
对象类型下拉(关联面板)本体对象类型(name(display_name)选中后重置属性下拉并加载该对象属性GET /ontology/objects(选项);GET /ontology/objects/:id(属性)
属性下拉(关联面板)对象属性(name(display_name)选择待关联属性无(提交时请求)
关联按钮提交术语-属性关联校验对象类型与属性均选;成功提示"关联成功"并刷新已关联列表POST /governance/glossary/:id/link,body {object_type_id, property_id}
已关联属性表对象类型(name(#id))/属性/数据类型/操作展示已关联属性与数据类型GET /governance/glossary/:id/properties
取消关联按钮移除术语-属性关联confirm"确定取消该属性关联吗?"后移除并刷新DELETE /governance/glossary-links/:linkId

4.4 Tab2 数据分类 —— 分类标签管理

元素含义必填与默认值操作效果触发的后端调用
+ 新建分类/收起表单按钮展开/收起创建表单切换 showClassForm
分类名称输入框分类名必填,placeholder「如 PII / 财务敏感 / 内部机密」分类标识POST /governance/classifications
敏感等级 level 下拉0 公开 / 1 内部 / 2 机密 / 3 绝密默认 1决定敏感度(level-0~3 徽章着色)同上
颜色输入框分类色值选填,placeholder「如 #e53e3e」前端色块展示同上
描述输入框分类说明选填,placeholder「如 个人身份信息」辅助理解同上
创建分类按钮提交创建busy 时显示「提交中...」并禁用成功提示"分类创建成功 id=..."并重置POST /governance/classifications
取消按钮关闭表单resetClassForm 清空并收起
分类表格ID/名称/等级/颜色/描述/操作只读展示;等级徽章 level + levelText(公开/内部/机密/绝密)GET /governance/classifications
删除按钮删除分类confirm"确定删除分类"xx"吗?(属性上的标签将一并移除)"后删除DELETE /governance/classifications/:id

4.5 Tab2 数据分类 —— 属性打标签与治理查询

元素含义必填与默认值操作效果触发的后端调用
对象类型下拉本体对象类型必选(打标/查询前置)选中后重置属性下拉并加载属性GET /ontology/objects/:id
属性下拉对象属性必选(打标/查询前置)选择待治理属性
分类标签下拉分类(name(Llevel)打标签时必选选择要打的标签
打标签按钮给属性打分类标签分类与属性必选(否则禁用)成功提示"打标签成功"并自动查询治理汇总POST /governance/properties/:objId/:propId/classify,body {classification_id}
查询治理按钮查询属性治理汇总属性必选展示关联术语 + 分类标签GET /governance/properties/:objId/:propId
治理汇总区属性「object.property」(data_type) + 左关联术语 / 右分类标签查询成功展示术语表(术语/缩写/状态);分类标签表(分类/等级/打标人/操作)
移除按钮(标签)移除属性上的分类标签confirm"确定移除分类"xx"标签吗?"后移除并重新查询DELETE /governance/property-classifications/:pcId

4.6 Tab3 保留策略 —— 创建表单

元素含义必填与默认值操作效果触发的后端调用
+ 新建策略/收起表单按钮展开/收起创建表单切换 showPolicyForm
策略名称输入框策略名必填,placeholder「如 审计日志保留 90 天」策略标识POST /governance/retention-policies
目标类型 target_type 下拉datasource(数据源)/ pipeline_output(管道输出)/ query_cache(查询缓存)/ audit_log(审计日志)默认 audit_log决定策略作用对象类别同上
目标 ID 输入框目标 ID默认 0(全部),type=number0 = 全部目标,非 0 = 指定目标同上
保留天数 retention_days 输入框保留天数必填,min 1,默认 90,placeholder「90」超过该天数的数据触发动作同上
动作 action 下拉delete(删除)/ archive(归档)/ anonymize(匿名化)默认 delete到期处理动作同上
创建后即启用复选框是否立即启用默认勾选(is_enabled: true创建后即进入启用态同上
创建策略按钮提交创建busy 时显示「提交中...」并禁用成功提示"保留策略创建成功 id=..."并重置POST /governance/retention-policies
取消按钮关闭表单resetPolicyForm 清空并收起

4.7 Tab3 保留策略 —— 策略列表

元素含义操作效果触发的后端调用
策略表格ID/名称/目标类型/目标ID/保留天数/动作/状态/操作只读展示;target_id=0 显示「全部」;动作徽章 action-delete/archive/anonymize 着色;状态徽章 status-enabled「启用」/ status-disabled「停用」GET /governance/retention-policies
停用/启用按钮切换策略启停提示"策略"xx"已停用/启用"PUT /governance/retention-policies/:id,body 带 is_enabled: !p.is_enabled
删除按钮删除策略confirm"确定删除保留策略"xx"吗?"后删除DELETE /governance/retention-policies/:id

5. 后端关联

5.1 API 客户端

页面使用 action/web/src/api/client.js 默认导出 apiClient:baseURL /api/v1、timeout 30000、JSON 头、Authorization: Bearer <aip_token>、401 清 Token 跳登录。治理请求全部走该实例,路径写 /governance/.../ontology/...

5.2 端点表

方法路径请求参数超时
GET/governance/glossary30s
POST/governance/glossarybody {name, abbreviation, definition, category, synonyms[], owner_id, status}30s
DELETE/governance/glossary/:id无(级联删除属性关联)30s
GET/governance/glossary/:id/properties30s
POST/governance/glossary/:id/linkbody {object_type_id, property_id}30s
DELETE/governance/glossary-links/:linkId30s
GET/governance/classifications30s
POST/governance/classificationsbody {name, level, description, color}30s
DELETE/governance/classifications/:id无(级联删除属性标签)30s
POST/governance/properties/:objId/:propId/classifybody {classification_id}(applied_by 可选,缺省取当前用户名)30s
GET/governance/properties/:objId/:propId无(属性治理汇总:术语 + 分类)30s
DELETE/governance/property-classifications/:pcId30s
GET/governance/retention-policies30s
POST/governance/retention-policiesbody {name, target_type, target_id, retention_days, action, is_enabled}30s
PUT/governance/retention-policies/:idbody 同 POST(前端用于启停切换)30s
DELETE/governance/retention-policies/:id30s
GET/ontology/objects无(对象类型选项)30s
GET/ontology/objects/:id无(对象属性列表)30s

5.3 响应结构

统一成功包裹 {"code": 0, "data": ...};错误 {"code", "error"}

术语列表响应 data(数组元素):

{
  "id": 1,
  "name": "客户生命周期价值",
  "abbreviation": "CLV",
  "definition": "客户在生命周期内贡献的价值",
  "category": "customer",
  "synonyms": ["LTV", "客户终身价值"],
  "owner_id": "alice",
  "status": "approved"
}

术语关联属性响应 data(数组元素):

{
  "id": 21,
  "object_name": "customer",
  "object_type_id": 3,
  "property_name": "clv",
  "property_display": "客户生命周期价值",
  "data_type": "number"
}

属性治理汇总(GET /governance/properties/:objId/:propId)响应 data

{
  "object_name": "customer",
  "property_name": "clv",
  "data_type": "number",
  "terms": [{ "term_id": 1, "name": "客户生命周期价值", "abbreviation": "CLV", "status": "approved" }],
  "classifications": [
    { "id": 31, "classification_name": "财务敏感", "level": 2, "applied_by": "alice", "applied_at": "..." }
  ]
}

保留策略列表响应 data(数组元素):

{
  "id": 1,
  "name": "审计日志保留 90 天",
  "target_type": "audit_log",
  "target_id": 0,
  "retention_days": 90,
  "action": "delete",
  "is_enabled": true
}

5.4 关联模块表

后端包职责
action/products/foundry/server/governance_handlers.go治理全部 handler(术语/分类/保留/属性打标/治理汇总)
action/products/foundry/governance/models.goGlossaryTerm / Classification / PropertyClassification / RetentionPolicy 模型
action/products/foundry/governance/service.go治理业务服务:CRUD、术语-属性关联、属性打标、治理汇总
action/products/foundry/governance/models_marking.go / marking.go密级打标(MarkingPage 用,第二道列级闸门,与本页分类标签并存)
action/products/foundry/ontology对象类型/属性元数据(级联下拉数据源)
action/products/foundry/server/server.goprotected 组路由注册(1080-1104 行)与治理服务临时构造
注意:治理服务是 handler 每次请求经 governance.NewGovernanceService(s.db) 临时构造的,不注入 Server 结构体。

5.5 关键机制

6. 核心流程详解

6.1 页面加载

onMounted 并行拉取四类数据:fetchTerms(GET /governance/glossary)、fetchClasses(GET /governance/classifications)、fetchPolicies(GET /governance/retention-policies)、fetchObjectTypes(GET /ontology/objects)。各自失败独立 alert,互不影响。

6.2 术语治理主流程

  1. 点「+ 新建术语」展开表单,填写名称(必填)、缩写、分类、状态、定义、同义词、负责人。
  2. 点「创建术语」→ POST /governance/glossary → 成功提示并重置表单、刷新列表。
  3. 术语行「编辑」→ startEditTerm(t) 回填表单(同义词数组渲染为逗号文本)并置 editingTermId,表单头部提示「正在编辑术语 id=...」;点「保存修改」→ PUT /governance/glossary/:id。后端 UpdateGlossaryTerm 为全字段语义:name 必填、重名冲突校验,abbreviation/definition/category/synonyms/owner_id 整体覆盖,status 非空才更新;故前端提交携带全部表单字段。
  4. 在术语行点「关联属性」展开面板:先选对象类型(触发加载属性),再选属性,点「关联」→ POST /governance/glossary/:id/link → 成功提示并刷新已关联列表。
  5. 已关联属性可点「取消关联」→ DELETE /governance/glossary-links/:linkId
  6. 术语可「删除」(级联移除关联),确认框明示级联影响。点「取消」退出编辑态并清空表单。

6.3 数据分类与打标主流程

  1. 点「+ 新建分类」展开表单,填名称(必填)、等级、颜色、描述 → 「创建分类」→ POST /governance/classifications
  2. 分类行「编辑」→ startEditClass(c) 回填表单并置 editingClassId,表单头部提示「正在编辑分类 id=...」;「保存修改」→ PUT /governance/classifications/:id。后端 UpdateClassification 为全字段语义:name 必填、level 取值 0-3、重名校验,description/color 整体覆盖;前端提交前做同样校验。
  3. 在"属性打标签 / 属性治理查询"区:选对象类型 → 选属性 → 选分类标签 → 「打标签」→ POST /governance/properties/:objId/:propId/classify → 成功提示并自动执行治理查询。
  4. 「查询治理」→ GET /governance/properties/:objId/:propId → 汇总区展示关联术语(左)与分类标签(右)。
  5. 标签行「移除」→ DELETE /governance/property-classifications/:pcId → 重新查询刷新。
  6. 分类可「删除」(级联移除属性上的标签)。点「取消」退出编辑态并清空表单。

6.4 保留策略主流程

  1. 点「+ 新建策略」展开表单,填名称(必填)、目标类型、目标 ID(0=全部)、保留天数(必填,>0 校验)、动作、是否勾选"创建后即启用"。
  2. 「创建策略」→ 前端校验"保留天数必须大于 0" → POST /governance/retention-policies → 成功提示并重置表单、刷新列表。
  3. 策略行「编辑」→ startEditPolicy(p) 回填全部字段(含 is_enabled)并置 editingPolicyId,表单头部提示「正在编辑策略 id=...」,勾选框文案变为「启用该策略」;「保存修改」→ PUT /governance/retention-policies/:id。后端 UpdateRetentionPolicy 要求 name 必填、target_type/action 取值合法、retention_days>0,is_enabled*bool(显式传值即覆盖);前端提交前做同样校验。
  4. 列表行点「停用/启用」→ PUT /governance/retention-policies/:id(翻转 is_enabled)→ 提示"策略"xx"已停用/启用"。
  5. 列表行点「删除」→ confirm → DELETE /governance/retention-policies/:id。点「取消」退出编辑态并清空表单。

6.5 状态与终态语义

7. 权限与安全

8. 常见问题与排错

问题 1:关联属性面板的对象类型/属性下拉为空

问题 2:创建术语/分类/策略提示失败

问题 3:打标签后治理汇总里看不到标签

问题 4:策略启停不生效

问题 5:删除术语/分类后出现"孤儿"引用

9. 已知缺陷与边界

说明
编辑为全字段覆盖术语/分类/策略均提供行内「编辑」入口(PUT);术语/分类更新为全字段替换,表单未含字段会被覆盖,故回填全部字段后提交
术语无状态流转status 创建/编辑时可选,无独立的"批准/废弃"动作按钮
打标签无多选一次只能选一个分类打一个标签,批量打标需 API
搜索/分页为渲染层(后端无此能力)后端三个列表接口 GET /governance/glossary/governance/classifications/governance/retention-policies 均不接收 limit/offset/q 等参数(governance_handlers.go:31/157/321),服务层签名 ListGlossaryTerms/ListClassifications/ListRetentionPolicies(ctx) 亦无分页/搜索入参(governance/service.go:127/140/153)。页面改为一次全量拉取 + 前端搜索 + 前端分页:三个列表各带搜索框(术语按名称/缩写/分类/定义/负责人/同义词,分类按名称/等级/描述/颜色,策略按名称/目标类型/动作/天数),每页 20 条、上/下一页 + 命中计数,页面顶部常驻诚实提示。数据量极大时首次加载仍为全量
保留策略执行依赖调度本页仅管理策略元数据(启停/删除/编辑),到期执行由后端调度器消费
分类与打标双体系分类标签(本页)与密级打标(MarkingPage)是两套机制,语义不可混用
治理服务临时构造后端每次请求 new GovernanceService,无服务级缓存,高频查询有性能开销

注:关联面板缓存不过期问题已于 2026-09-06 修复(objPropsCache 属性缓存带 30s TTL,过期自动失效并重新拉取,无需整页刷新)。