status: propose created: 2026-06-27 complexity: 🔴复杂
AiCrudPage 当前已承载低代码运行态、动态 CRUD 页面和页面模板渲染。列表区需要补齐更接近飞书多维表格的表格体验:列宽配置、列宽拖拽、固定头部、固定列,以及最重要的行展开能力。
行展开不能只理解为“展开一个子表”。业务上常见展开内容包括子表、描述信息、只读表单、多个分组、多个子表 Tab、自定义组件和插槽。目标是新增一个通用 expandConfig 协议,让用户在设计器里用低门槛配置展开内容,运行态按同一协议加载数据和渲染。
完成后的效果:
table、descriptions、form、tabs、custom 等内容类型,不局限于表格。forge-admin-ui/src/components/ai-form/AiCrudPage.vue
<AiTable> 渲染主列表,传入 tableColumns、dataSource、paginationConfig、computedMaxHeight、computedScrollX 和 tableProps。tableColumns 负责把 props.columns 转为运行态列,并补默认操作列。computedScrollX 会按列 width/minWidth 自动计算横向滚动宽度。computedMaxHeight 默认返回 calc(100vh - 280px),已经为固定表头提供基础。forge-admin-ui/src/components/ai-form/AiTable.vue
n-data-table 的封装,主表通过 v-bind="$attrs" 透传部分 Naive UI 属性。width/minWidth/maxWidth/fixed/ellipsis/sorter/filter 等列属性。forge-admin-ui/src/components/ai-form/AiCrudPageProps.js
columns、maxHeight、scrollX、tableProps、childrenConfig 等 props。childrenConfig 当前用于新增/编辑/详情中的 ChildTableEditor,不是列表行展开能力。forge-admin-ui/src/components/page-templates/MasterDetailCrudTemplate.vue
childrenConfig 注入 AiCrudPage,用于表单/详情里的子表编辑。forge-admin-ui/src/views/app-center/components/designer/BusinessListDesigner.vue
crudProps,已经传递 maxHeight、scrollX、tableSize、bordered、striped、hideSelection 等列表配置。forge-admin-ui/src/components/lowcode-builder/page/ListPageGridDesigner.vue
width/minWidth/maxWidth,AiTable 会传给 Naive UI。fixed,默认操作列固定在右侧。maxHeight,Naive UI 在有 max-height 时可固定表头。scrollX,未传时按列宽自动计算。childrenConfig + ChildTableEditor,但用于表单区域,不用于主表行展开。tableProps 透传给 n-data-table,否则低代码设计器、运行态、预览和生成器无法统一。childrenConfig 可以作为“推荐子表来源”,但展开面板要支持描述、表单、Tabs 和自定义组件,不能命名成 childTableExpandConfig。scrollX,设计器需要引导或自动补默认宽度。tableProps.resizable 开启列宽拖拽,拖拽后更新运行态列宽状态;设计态可写回 schema。expandConfig.enabled 开启主表行展开。table、descriptions、form、tabs、custom。childrenConfig 或低代码模型关系中选择子表,自动生成展开表格列和参数映射。expandConfig 渲染。expandConfig 是 AiCrudPage 的一级配置,不放入普通列配置中。expandConfig.enabled=true 时,现有列表行为不变。cache=true 时同一行重复展开复用缓存。orderId: row.id、tenantId: row.tenantId。table、descriptions、tabs 可用。table 展开内的子表默认不显示工具栏,不显示多选,不启用行操作,除非显式配置。expandConfig: {
enabled: true,
trigger: 'icon', // icon | row | both
lazy: true,
cache: true,
defaultExpanded: false,
rowExpandable: {
type: 'expression',
expression: 'row.hasDetail != false'
},
panels: [
{
key: 'items',
title: '明细',
type: 'table',
dataSource: {
type: 'api',
api: 'get@/api/order/item/page',
method: 'get',
paramsMap: {
orderId: 'row.id'
},
dataField: 'records',
totalField: 'total'
},
table: {
rowKey: 'id',
columns: [
{ prop: 'productName', label: '商品名称', width: 180 },
{ prop: 'quantity', label: '数量', width: 100 },
{ prop: 'amount', label: '金额', width: 120 }
],
pagination: false,
maxHeight: 320
}
},
{
key: 'summary',
title: '概览',
type: 'descriptions',
dataSource: {
type: 'row'
},
descriptions: {
columns: 3,
fields: [
{ field: 'customerName', label: '客户' },
{ field: 'statusName', label: '状态' },
{ field: 'remark', label: '备注', span: 3 }
]
}
}
],
layout: {
mode: 'tabs', // single | tabs | stack
density: 'compact',
padding: 12
}
}
| type | 展示形式 | 数据来源 | 典型场景 |
|---|---|---|---|
table |
内嵌表格 | API / row 字段 / 子表关系 | 订单明细、项目成员、附件列表 |
descriptions |
描述列表 | row / detail API | 飞书式展开概览、关键字段补充 |
form |
只读 AiForm | row / detail API | 复杂字段分组、布局化详情 |
tabs |
多 Tab 容器 | 子 panels | 多个子表或“明细+日志+流程” |
custom |
插槽/组件 | row + dataSource | 特殊业务卡片、图表、时间线 |
| 操作 | 表名 | 字段/索引 | 说明 |
|---|---|---|---|
| 无 | - | - | 本变更优先使用现有页面 schema/config JSON 扩展,不新增数据库表字段。若后续运行态列宽需按用户持久化,可另开用户偏好配置变更。 |
| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 复用 | 子表/详情接口 | GET/POST | 展开数据源复用已有 CRUD/detail/list 接口,通过 paramsMap 传当前行参数。 |
| 无强制新增 | - | - | AiCrudPage 不强制后端新增统一展开接口。低代码运行态如需子表数据,可由发布流程生成或复用已有运行态 API。 |
forge-admin-ui/src/components/ai-form/AiCrudPage.vueforge-admin-ui/src/components/ai-form/AiCrudPageProps.jsforge-admin-ui/src/components/ai-form/AiTable.vueforge-admin-ui/src/components/ai-form/AiCrudRowExpand.vue(建议)forge-admin-ui/src/components/ai-form/expand-renderers/*(建议)forge-admin-ui/src/views/app-center/components/designer/BusinessListDesigner.vueforge-admin-ui/src/components/lowcode-builder/page/ListPageGridDesigner.vueforge-admin-ui/src/components/lowcode-builder/preview/LowcodePreviewPane.vueforge-admin-ui/src/components/lowcode-builder/page/GridBlockRenderer.vuetest-spec.md。ChildTableEditor。custom 类型组件来源是否限制在已注册组件白名单,避免任意组件 key 带来安全和维护风险。expandConfig,不是 childTableConfig,避免限制在子表。panels[],即使单面板也走同一结构,方便后续 tabs/stack 扩展。table、descriptions、tabs,第二优先级支持 form、custom。childrenConfig 只作为子表展开的配置来源之一,不替代 expandConfig。| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| 方案沉淀 | 已完成 | spec.md |
本轮只记录方案,不改业务代码。 |
待实现后审查。