@microi.net/cli 5.8.7 → 5.8.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +3 -3
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/microi-skills.meta.json +203 -203
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +17 -17
- package/skills/microi-client-frontend/SKILL.md +3 -2
- package/skills/microi-docs-coverage/references/capability-map.md +1 -1
- package/skills/microi-form-layout/SKILL.md +205 -205
- package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +235 -235
- package/skills/microi-system-delivery/SKILL.md +154 -137
- package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +239 -193
- package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +217 -217
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 1,
|
|
3
|
-
"generatedAt": "2026-10-
|
|
3
|
+
"generatedAt": "2026-10-10T09:22:49.856Z",
|
|
4
4
|
"policy": {
|
|
5
5
|
"maxEntryLines": 285,
|
|
6
6
|
"referenceBudgetLines": 245,
|
|
@@ -169,11 +169,11 @@
|
|
|
169
169
|
]
|
|
170
170
|
},
|
|
171
171
|
"microi-client-frontend": {
|
|
172
|
-
"originalSha256": "
|
|
173
|
-
"originalLines":
|
|
172
|
+
"originalSha256": "6196ee7f5b4530ce410d8e7c3f349b6ccf265331d59e83de0f7cb24863604d61",
|
|
173
|
+
"originalLines": 706,
|
|
174
174
|
"prefixSha256": "9c59063f7561713a30d5433fcaba7d9976b790758634f2a95bf827f251d7da4a",
|
|
175
175
|
"prefixBytes": 1415,
|
|
176
|
-
"entryLines":
|
|
176
|
+
"entryLines": 248,
|
|
177
177
|
"chunks": [
|
|
178
178
|
{
|
|
179
179
|
"id": "microi-client-frontend-000",
|
|
@@ -195,8 +195,8 @@
|
|
|
195
195
|
"id": "microi-client-frontend-002",
|
|
196
196
|
"ordinal": 2,
|
|
197
197
|
"destination": "microi-client-frontend/SKILL.md",
|
|
198
|
-
"sha256": "
|
|
199
|
-
"lines":
|
|
198
|
+
"sha256": "bcb1222e9884f134d9902ed4937e6cb2753e5d3ed37096229efd99646320a4bc",
|
|
199
|
+
"lines": 112,
|
|
200
200
|
"heading": "2. 表单引擎三层结构"
|
|
201
201
|
},
|
|
202
202
|
{
|
|
@@ -316,10 +316,10 @@
|
|
|
316
316
|
]
|
|
317
317
|
},
|
|
318
318
|
"microi-form-layout": {
|
|
319
|
-
"originalSha256": "
|
|
319
|
+
"originalSha256": "8aa4b1223988df95bf6f233362f2eba7540ea4f323fdd20f45680ef3ad0a5bfa",
|
|
320
320
|
"originalLines": 412,
|
|
321
|
-
"prefixSha256": "
|
|
322
|
-
"prefixBytes":
|
|
321
|
+
"prefixSha256": "0f3634988800f3bf2f72771dea8c834d08fdfb4d18dc486305a80d55b548b006",
|
|
322
|
+
"prefixBytes": 4404,
|
|
323
323
|
"entryLines": 206,
|
|
324
324
|
"chunks": [
|
|
325
325
|
{
|
|
@@ -350,7 +350,7 @@
|
|
|
350
350
|
"id": "microi-form-layout-003",
|
|
351
351
|
"ordinal": 4,
|
|
352
352
|
"destination": "microi-form-layout/SKILL.md",
|
|
353
|
-
"sha256": "
|
|
353
|
+
"sha256": "582f8b326f05bf2314ebadcb5f47ca45bbb7aa4d06fac288cfbf3918b98d49c2",
|
|
354
354
|
"lines": 29,
|
|
355
355
|
"heading": "5. 必填与禁止"
|
|
356
356
|
},
|
|
@@ -745,11 +745,11 @@
|
|
|
745
745
|
]
|
|
746
746
|
},
|
|
747
747
|
"microi-system-delivery": {
|
|
748
|
-
"originalSha256": "
|
|
749
|
-
"originalLines":
|
|
750
|
-
"prefixSha256": "
|
|
751
|
-
"prefixBytes":
|
|
752
|
-
"entryLines":
|
|
748
|
+
"originalSha256": "6687993a014804a878f316499bc8fe612f1231b1733d1b527fa1d308eecc1e8d",
|
|
749
|
+
"originalLines": 574,
|
|
750
|
+
"prefixSha256": "823c8d05d59262cbefd7ac544bd87816fc8d0ee46d958f3d1e3c410219d7bdd8",
|
|
751
|
+
"prefixBytes": 2941,
|
|
752
|
+
"entryLines": 155,
|
|
753
753
|
"chunks": [
|
|
754
754
|
{
|
|
755
755
|
"id": "microi-system-delivery-000",
|
|
@@ -795,8 +795,8 @@
|
|
|
795
795
|
"id": "microi-system-delivery-005",
|
|
796
796
|
"ordinal": 2,
|
|
797
797
|
"destination": "microi-system-delivery/references/progressive-01-标准工作流.md",
|
|
798
|
-
"sha256": "
|
|
799
|
-
"lines":
|
|
798
|
+
"sha256": "8f34122f08c3cee8f4aed5054c012cb560904442ea080fa2fc3d495b73b53a25",
|
|
799
|
+
"lines": 229,
|
|
800
800
|
"heading": "标准工作流"
|
|
801
801
|
},
|
|
802
802
|
{
|
|
@@ -58,7 +58,7 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
|
|
|
58
58
|
---
|
|
59
59
|
|
|
60
60
|
<!-- /microi-progressive:chunk -->
|
|
61
|
-
<!-- microi-progressive:chunk id=microi-client-frontend-002 sha256=
|
|
61
|
+
<!-- microi-progressive:chunk id=microi-client-frontend-002 sha256=bcb1222e9884f134d9902ed4937e6cb2753e5d3ed37096229efd99646320a4bc -->
|
|
62
62
|
## 2. 表单引擎三层结构
|
|
63
63
|
|
|
64
64
|
### 模块级跨端视图
|
|
@@ -165,7 +165,8 @@ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue
|
|
|
165
165
|
- 主题色、浅色/深色、菜单子级展开方式等需要“换设备仍生效”的选择必须保存到当前 DiyToken 用户的 `sys_user` 白名单字段;`localStorage` 只作为未安装新字段租户和匿名启动阶段的兼容回退,不能作为跨设备事实源。
|
|
166
166
|
- 已安装用户偏好字段时优先级固定为“当前用户显式值 → 租户 `sys_config` → 平台安全默认”;个人菜单值 `System` 表示继承租户配置。不得让上一位用户的浏览器本地主题覆盖下一位已登录用户。
|
|
167
167
|
- 自助保存优先使用官方 `Managed` 接口引擎,由 `V8.CurrentUser.Id` 与 `V8.OsClient` 推导用户和租户,并在服务端构造固定白名单更新对象;接口参数禁止决定目标 Id/OsClient,也禁止写入 Account、Phone、Tenant、Dept、Role、Level、State、Pwd、认证因子和登录审计字段。只有缺少可复用可信原子能力时才新增 C# DTO/端点。保存成功后调用 `V8.Method.RefreshLoginUser` 刷新登录缓存,并让微服务宿主重新同步 `CurrentUser`。
|
|
168
|
-
- 右上角即时切换可以乐观应用并短防抖保存;远端保存失败时保留当前设备效果并明确提示。个人中心和右上角必须调用同一个应用包交付的白名单接口引擎(当前为 `platform-user-update-preferences`),不能分别形成两套字段、枚举或优先级。
|
|
168
|
+
- 右上角即时切换可以乐观应用并短防抖保存;远端保存失败时保留当前设备效果并明确提示。个人中心和右上角必须调用同一个应用包交付的白名单接口引擎(当前为 `platform-user-update-preferences`),不能分别形成两套字段、枚举或优先级。
|
|
169
|
+
- 导航切入或退出 `TopSide` 会重建顶栏组件;卸载前必须发送尚未保存的偏好,在途请求与后续选择共用按 store、API 地址、租户、账号和登录会话隔离的运行时队列。新顶栏继承失败状态和重试数据,旧响应不能覆盖更新的选择或跨账号合并队列;标准续签保留 `MicroiSessionId` 时也保留最终待保存选择,计算属性显式依赖 Pinia.Token。JWT 解码仅用于本地队列归属,服务端仍通过标准 DiyToken 验证授权;不得将会话凭据写入偏好存储、日志或响应。使用真实 Vue computed 和组件生命周期回归 `theme-select-autosave-lifecycle.spec.mjs` 验证卸载、在途合并、失败重试、续签及账号/租户/会话切换。
|
|
169
170
|
|
|
170
171
|
---
|
|
171
172
|
|
|
@@ -71,7 +71,7 @@ Markdown。第一列是相对 `microi.doc/docs/doc/` 的路径;第二列 Skill
|
|
|
71
71
|
| `system-engine/unity-integration.md` | unity-integration, v8-api-config, microi-client-frontend | Unity UPM、WebGL/Windows、多人租约、公屏、DiyToken 与 V8 通讯边界 |
|
|
72
72
|
| `system-engine/visualization-engine.md` | page-engine, microi-ui | 3D、CAD、goView 与数据大屏能力边界 |
|
|
73
73
|
| `system-engine/wf-engine.md` | v8-workflow | 工作流设计和事件 |
|
|
74
|
-
| `v8-engine/ai-apiengine.md` | ai-engine, v8-api-config | AI
|
|
74
|
+
| `v8-engine/ai-apiengine.md` | ai-engine, v8-api-config, microi-system-delivery | AI 编程与短提示词;完整开发默认清单覆盖原推荐提示词 1–8 |
|
|
75
75
|
| `v8-engine/api-engine.md` | v8-api-config, v8-utilities | 接口上下文、配置、分布式锁续租和调用 |
|
|
76
76
|
| `v8-engine/apiengine-index.md` | v8-crud-api, v8-api-config | 接口引擎实战和规范 |
|
|
77
77
|
| `v8-engine/form-engine.md` | v8-crud-api, v8-formengine-http, module-engine, microi-form-engine | FormEngine API、HTTP、原生查询身份/统计范围与按表主库策略 |
|
|
@@ -1,205 +1,205 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: microi-form-layout
|
|
3
|
-
description: Microi 吾码低代码表单布局分组规范。用于通过 MCP、Manifest、VS Code 插件或 V8 引擎创建/优化 `diy_table` 和 `diy_field` 时,决定使用 `diy_table.Tabs` 表单全局 Tab、字段级 `Tabs` 控件、字段级 `CollapseGroup` 折叠分组,还是直接平铺字段。覆盖"何时分 Tab、何时分折叠分组、有效表单行判断阈值、JSON 配置示例、回读验收与回滚"。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
> **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
|
|
7
|
-
|
|
8
|
-
# Microi 表单布局分组规范(Tabs vs CollapseGroup)
|
|
9
|
-
|
|
10
|
-
Microi 吾码低代码提供 **三种** 表单分组能力,但每种都有明确的使用场景。**AI 必须先按本规范评估,再决定如何分组**,禁止盲目创建 Tab。
|
|
11
|
-
|
|
12
|
-
本 Skill 中的 Tabs、CollapseGroup、Divider 是编辑表单布局。模块级 Detail/Edit/List/Card 跨端视图必须配置在 `sys_menu.ViewSchema` 物理字段中;EntityHero、MetricStrip、ActionGrid、ResponsiveSection 属于独立视图区块,不得伪装成 `diy_field`。三个核心表的 `DiyConfig` 均已废弃,禁止作为新布局或新功能配置入口。
|
|
13
|
-
|
|
14
|
-
控件事实源:`Microi.Client/src/views/form-engine/diy-field-component/diy-component-list.json` 中 `Sort=1000` 附近的 `Divider`、`CollapseGroup`、`Tabs`、`Alert`、`StaticText`、`Html`、`RichText` 等都属于 Advanced 布局控件。
|
|
15
|
-
|
|
16
|
-
全局遮罩毛玻璃使用正向开关 `sys_config.FormMaskBlur`:缺失、空值或 `0/false` 默认关闭,只有显式 `1/true` 才开启。表级仍使用负向开关 `diy_table.DisableFormMaskBlur`;全局开启后,某张表显式 `1/true` 可单独关闭。旧全局字段 `sys_config.DisableFormMaskBlur` 只作未升级租户兼容回退,元数据必须设置 `Visible=0`、`AppVisible=0`,不得同时向用户展示两套开关。
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
`FormOpenWidth=80
|
|
20
|
-
才评估 Drawer;不能用 Drawer 代替 Tabs/CollapseGroup 的信息架构。Dialog 统一使用居中、可拖动、
|
|
21
|
-
大圆角弹层;Drawer 贴边且不使用大圆角。
|
|
22
|
-
|
|
23
|
-
`CollapseGroup` 的运行态视觉统一使用清爽的白色/主题表面卡片:短主题色指示条、紧凑
|
|
24
|
-
标题、可选图标、单行副标题、标题旁轻量 `x 项` 文案,以及最右侧无底色的折叠箭头。
|
|
25
|
-
不得使用整块主题色填充、蓝色大描边或醒目的实心数量胶囊;分组内容与标题属于同一张
|
|
26
|
-
卡片,展开后不再嵌套第二套外框。深色模式使用 Element 主题变量,不能写死白色/蓝色。
|
|
27
|
-
|
|
28
|
-
## 配置类表单的二级分组硬规则
|
|
29
|
-
|
|
30
|
-
- `sys_config`、`sys_user`、SaaS 设置、接口参数、打印/工作流设置等“配置类表单”不能因为已经有表级 Tab 就停止信息架构审计。表级 Tab 只负责一级领域;同一 Tab 内存在 **7 个以上可见设置**或 **2 个以上明确语义域**时,必须继续按语义放入 `CollapseGroup`。
|
|
31
|
-
- 水印、主题、菜单、登录入口、安全策略、桌面偏好等一组相互关联的开关/参数必须由一个带图标、说明、计数的 CollapseGroup 包裹;不能把 5~20 个设置直接平铺在 Tab 中,也不能让每个小设置单独占一个 Tab。
|
|
32
|
-
- 新增设置字段时必须同时审计所在 Tab 的现有字段,而不只是包住本次新增字段。若相邻设置已形成稳定语义域,应一次性补齐该域的 CollapseGroup;隐藏兼容字段继续保留但不计入可见项数。
|
|
33
|
-
- 配置表采用“表级 Tab + Tab 内 CollapseGroup”时,CollapseGroup 必须与成员字段写入同一个 `Tab`,并用连续 `Sort` 保证作用范围在下一个布局节点前结束。发布前必须打开真实编辑表单验证,不能只凭元数据字符串判断布局成功。
|
|
34
|
-
|
|
35
|
-
<!-- microi-progressive:begin -->
|
|
36
|
-
<!-- microi-progressive:chunk id=microi-form-layout-000 sha256=cade6a415454aa04f5fcf840e6d9df1323ac9751c0e3c8e1b07b360007413819 -->
|
|
37
|
-
## 1. 三种分组能力速查
|
|
38
|
-
|
|
39
|
-
| 能力 | 存储位置 | 控件 | 核心作用 | 适用场景 |
|
|
40
|
-
|------|---------|------|---------|---------|
|
|
41
|
-
| **A. diy_table.Tabs(表级 Tab)** | `diy_table.Tabs`(JSON 字符串) | 表单顶部 Tab 条 | 把整张表的字段切到不同 Tab 中,**同屏只能看一个 Tab** | 表单整体很长,单个 Tab 通常占 **≥6 个有效表单行**,且 Tab 之间字段**业务强隔离**(扫码操作 vs 单据信息、主数据 vs 大型子表) |
|
|
42
|
-
| **B. 字段级 Tabs 控件** | `diy_field.Component='Tabs'` + `Config.FieldTabs` | 字段本身就是 Tab 容器 | 多个 Tab 字段组合嵌套,**同屏只能看一个 Tab** | 同一张表内需要二级 Tab,或 Tab 内容互相独立 |
|
|
43
|
-
| **C. 字段级 CollapseGroup(折叠分组)** | `diy_field.Component='CollapseGroup'` + `Config.CollapseGroup` | 字段是折叠面板标题 | **所有分组可在同一页面展开**,用户一屏看到全部标题和分组字段 | 只占 **≤5 个有效表单行** 的小分组(短字段即使有 8~10 个,也常只占 4~5 行) |
|
|
44
|
-
| **D. 不分组(默认平铺)** | 无 | — | 全部字段在第一屏 | 总有效表单行 ≤ 6、没有复杂控件,且没有必须强调的业务分组 |
|
|
45
|
-
|
|
46
|
-
<!-- /microi-progressive:chunk -->
|
|
47
|
-
<!-- microi-progressive:chunk id=microi-form-layout-001 sha256=f43f8c6f1c156ef3669f0c1f9a9d9d2cb7baf630d0b0cb2f48307a31f3f82ae2 -->
|
|
48
|
-
## 2. 黄金决策流程(AI 必须按此顺序判断)
|
|
49
|
-
|
|
50
|
-
### 2.1 先算“有效表单行”,禁止只数字段
|
|
51
|
-
|
|
52
|
-
字段数不能直接代表视觉高度。AI 必须按 `diy_table.Column` 估算每组字段占用的有效表单行:
|
|
53
|
-
|
|
54
|
-
- 普通 Text / Select / NumberText / DateTime 等短控件:占 `1 / Column` 行;双列布局中 8 个短字段约为 4 行。
|
|
55
|
-
- `FormWidth=24` 或 Textarea / RichText / FileUpload / ImgUpload / Map:每个至少占 1 行。
|
|
56
|
-
- TableChild / CodeEditor / DevComponent / 大型 JsonTable:视为独立任务区,不能按普通字段数压缩。
|
|
57
|
-
- 隐藏字段、Id、纯布局控件不计入视觉行数,但必须保留其排序和业务配置。
|
|
58
|
-
|
|
59
|
-
**一级字段数门槛**:`<=6` 个核心可见字段优先平铺;`7~29` 个字段按基础、业务、状态、附件等信息域使用 CollapseGroup;`30+` 个字段优先评估表级 Tabs。字段数只是一级门槛,仍须结合下方“有效表单行”和任务隔离判断。
|
|
60
|
-
|
|
61
|
-
**表级 Tab 的默认准入条件**:除 `30+` 字段外,表单总有效行通常大于 12 行,并且至少两个 Tab 各自达到 6 个有效行;否则优先平铺或 CollapseGroup。多个大型子表,或扫码、代码编辑、运行测试等强任务域,可以直接进入 Tabs 评估;字段达到 8 个不再自动获得独立 Tab 资格。
|
|
62
|
-
|
|
63
|
-
**强任务隔离例外**:扫码/报工/质检操作区、可独立滚动的大型子表、运行测试、代码编辑、工作流事件等即使行数较少,也可以保留 Tab,因为切换代表任务模式而不是装饰性分组。
|
|
64
|
-
|
|
65
|
-
```
|
|
66
|
-
开始
|
|
67
|
-
↓
|
|
68
|
-
Q1: 核心可见字段数、子表和强任务域?
|
|
69
|
-
├─ ≤ 6 字段且无复杂控件 → D. 不分组(默认平铺)
|
|
70
|
-
├─ 7 ~ 29 字段且无多个大型子表/强任务域 → 按信息域使用 C. CollapseGroup
|
|
71
|
-
└─ ≥ 30 字段,或多个大型子表/强任务域 → 优先评估 A. diy_table.Tabs
|
|
72
|
-
↓
|
|
73
|
-
Q2: 是否至少有两个需要切换的独立业务域?
|
|
74
|
-
├─ 否 → D. 平铺,或用 CollapseGroup 收起次要字段
|
|
75
|
-
└─ 是
|
|
76
|
-
↓
|
|
77
|
-
Q3: 每个业务域的有效表单行数?
|
|
78
|
-
├─ 至少两个业务域均 ≥ 6 行 → A. diy_table.Tabs(表级 Tab)
|
|
79
|
-
└─ 存在 ≤ 5 行的小业务域
|
|
80
|
-
↓
|
|
81
|
-
混合方案:Tab 容纳大业务域(≥6 个有效行)+ CollapseGroup 收起小业务域(≤5 个有效行)
|
|
82
|
-
↓
|
|
83
|
-
注意:所有 Tab 内的 ≤5 个有效行小业务域,必须用 CollapseGroup 折叠分组
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
**简明决策表**:
|
|
87
|
-
|
|
88
|
-
| 场景 | 推荐方案 | 禁止做法 |
|
|
89
|
-
|------|---------|---------|
|
|
90
|
-
| 13 字段双列表单 + 3 个小业务域(2/9/2 个字段) | 3 个 CollapseGroup,核心业务组默认展开 | 禁止建立 3 个 Tab;9 个短字段通常只有 4.5 行,仍不足以独占一页 |
|
|
91
|
-
| 13 字段表 + 1 个"MRP 运算"子集(3 字段) | C. CollapseGroup 折叠"MRP 运算"分组,剩余 10 字段平铺 | 禁止用 diy_table.Tabs 拆出"MRP 运算"Tab(用户必须点击切换才能看到 3 个字段) |
|
|
92
|
-
| 35 字段表 + 4 个业务域(10/8/9/8) | A. diy_table.Tabs(4 个 Tab) | 禁止把每个 Tab 内 ≤5 字段的"备注/其他"再开 Tab |
|
|
93
|
-
| 42 字段表 + 5 个业务域(14/13/6/5/4) | A. diy_table.Tabs(5 个 Tab),后两个 Tab 内用 C. CollapseGroup 收次要字段 | 禁止为了 4~5 字段"审核信息"单独建 Tab |
|
|
94
|
-
| 8 字段简单登记表 | D. 不分组 | 禁止任何 Tab/折叠 |
|
|
95
|
-
| 工作流审批表(≤10 字段) | D. 不分组 | 禁止使用 Tab |
|
|
96
|
-
|
|
97
|
-
<!-- /microi-progressive:chunk -->
|
|
98
|
-
<!-- microi-progressive:chunk id=microi-form-layout-002 sha256=9165f561ba90696ce130d24f71a0e56c521b5f8935eac2ddcffb852f3af5d9b2 -->
|
|
99
|
-
## 4. AI 生成表单布局的标准动作
|
|
100
|
-
|
|
101
|
-
### 4.1 必做顺序
|
|
102
|
-
|
|
103
|
-
1. **先数字段**:调用 `microi_get_field_list` 拉出全部字段,统计**有效字段数**(排除 `Visible=0` 隐藏字段、`Id`、系统字段)。
|
|
104
|
-
2. **再分业务域**:用 `Sort` 顺序浏览字段,把字段聚类到 2~5 个业务域(基础信息 / 业务明细 / 业主/组织 / 财务 / 附件备注 / 状态 / 时间 / 其他)。
|
|
105
|
-
3. **算每个域有效表单行**:A. 大于等于 6 行且存在强隔离价值 → Tab;B. 小于等于 5 行 → CollapseGroup;C. 等于 0 → 删除该域。
|
|
106
|
-
4. **决定顶层方案**:A. 全 Tab / B. Tab+CollapseGroup 混合 / C. 全 CollapseGroup / D. 平铺。
|
|
107
|
-
5. **写配置**:先写 `diy_table.Tabs`(若有 Tab),再逐字段写 `Tab` 归属;新增 `Component=CollapseGroup/Tabs/Divider/Alert` 等布局节点时,只能使用明确标注为“仅元数据”的布局专用路径,不能使用会同步建业务列的普通新增字段接口。
|
|
108
|
-
6. **回读验收**:调用 `microi_get_field_list` 回读,确认 `Tab` 字段、`Sort`、`Component`、`Config.FieldTabs` / `Config.CollapseGroup` JSON 正确。
|
|
109
|
-
7. **V8 完整性校验**:修改前后比较表级六类 V8 事件、字段 `V8Code/KeyupV8Code/Config`;布局迁移不得覆盖业务代码。若代码出现 `HideFormTab/ShowFormTab/ClickFormTab`,必须先适配或跳过该表。
|
|
110
|
-
8. **清缓存**:`microi_refresh_schema_cache tables=['表名']`,避免前端看到旧配置。
|
|
111
|
-
|
|
112
|
-
### 4.2 存量表自动审计与安全迁移
|
|
113
|
-
|
|
114
|
-
当用户要求“检查所有表单设计”时,AI 必须执行自动化盘点,不能只修截图中的一张表:
|
|
115
|
-
|
|
116
|
-
1. 读取所有 `diy_table.Tabs`,排除只有一个 `none` 默认页签的表。
|
|
117
|
-
2. 一次性读取候选表的 `diy_field`,按 `Tab + Sort + Component + FormWidth + Visible` 计算每组有效行数。
|
|
118
|
-
3. 保留扫码、报工、质检操作、大型子表、代码编辑、运行测试等强任务 Tab。
|
|
119
|
-
4. 将“总有效行 ≤12、每组 ≤5 行、无复杂控件、无 Tab 控制 V8”的表列为高置信迁移候选。
|
|
120
|
-
5. 修改前记录 `Tabs`、字段 `Tab/Sort/Component/Config/V8Code/KeyupV8Code` 和表级 V8 摘要;修改后逐项回读,业务代码摘要必须一致。
|
|
121
|
-
6. 迁移为 CollapseGroup 时,只能通过布局专用的“仅元数据”路径新增布局节点,再清空原字段 `Tab` 和表级 `Tabs`;不得重建业务字段,不得改数据源、必填、只读、默认值或 V8。普通新增字段可能触发物理 DDL,严禁把通用 `AddFormData(diy_field)` 或普通字段创建接口当作元数据写入捷径。
|
|
122
|
-
7. 平台控制面、安全表和存在歧义的业务表只报告,不自动批量迁移。
|
|
123
|
-
|
|
124
|
-
### 4.3 后端实现备忘
|
|
125
|
-
|
|
126
|
-
后端表结构(`diy_table`):
|
|
127
|
-
- `Tabs` 字段:JSON 字符串,存表级 Tab 列表。
|
|
128
|
-
- `TabsPosition` 字段:top / bottom / left / right。
|
|
129
|
-
- `TableTabs` / `TableTabsPosition`:表格视图的 Tab,与表单 Tab 独立。
|
|
130
|
-
- `FormArticle` / `TableArticle`:表单/表格的说明文案(不是 Tab)。
|
|
131
|
-
|
|
132
|
-
后端字段结构(`diy_field`):
|
|
133
|
-
- `Tab` 字段:归属 Tab 名(与 `diy_table.Tabs.Id` 对应)。
|
|
134
|
-
- `Component = Tabs` / `CollapseGroup` / `Divider` / `Alert` 等 Advanced 控件,作为布局节点。
|
|
135
|
-
- `Config` 字段:JSON 字符串,存 `FieldTabs` / `CollapseGroup` 等子配置。
|
|
136
|
-
|
|
137
|
-
V8 事件中可用 `V8.HideFormTab('tabId')` / `V8.ShowFormTab('tabId')` / `V8.ClickFormTab('tabId')` 动态控制 Tab 显隐和默认选中。
|
|
138
|
-
|
|
139
|
-
<!-- /microi-progressive:chunk -->
|
|
140
|
-
<!-- microi-progressive:chunk id=microi-form-layout-003 sha256=
|
|
141
|
-
## 5. 必填与禁止
|
|
142
|
-
|
|
143
|
-
### 5.1 必填
|
|
144
|
-
|
|
145
|
-
- 字段数 13~30 的表单,必须有可见的**业务分组**(Tab 或 CollapseGroup 二选一),不能让用户上下滚动 5 屏找字段。
|
|
146
|
-
- 创建 CollapseGroup 分组时,必须设置 `Icon`(如 `fas fa-calculator` / `fas fa-info-circle`),不要默认空白。
|
|
147
|
-
- 任何 Tab / CollapseGroup 都必须有 `Description` 解释分组用途,不要只放一个标题。
|
|
148
|
-
- 每个 CollapseGroup 必须回读到 `FormWidth=24`;`Config.CollapseGroup.ShowFieldCount` 默认必须为 `true`。
|
|
149
|
-
- 可扩展配置表或设置页的末尾 CollapseGroup 不得无边界使用 `ScopeMode=UntilNextGroup`。已知标准子项数量时必须改用 `ScopeMode=FieldCount` 并显式保存准确 `FieldCount`;否则必须增加后续分组边界,避免未来新增字段或租户扩展字段被末尾分组误吞。
|
|
150
|
-
- 表级 Tab 与 CollapseGroup 的 `Description` 作为副标题显示;开启计数时统一追加 `x 项`,禁止继续显示 `x 个字段`。运行时动态显隐字段后必须重算计数,已有数字角标配置继续生效,不能被静态字段数覆盖。
|
|
151
|
-
- 分组/Tab 的字段计数必须基于字段原始可见性(如 `_baseIsShow`),不能把“当前因折叠而隐藏”误判成不可见,否则收起后的分组会错误显示 `0 项`。
|
|
152
|
-
- 表级分组方向完整支持 `TabsPosition=left/top/right/bottom`;每个方向都要检查标题、副标题、动态角标和选中指示线,纵向指示线端点固定为直角。
|
|
153
|
-
- 修改 `diy_table.Tabs` 或 `diy_field.Tab` / `Config.CollapseGroup` / `Config.FieldTabs` 后,必须调用 `microi_refresh_schema_cache`。
|
|
154
|
-
-
|
|
155
|
-
- 新增布局节点后必须同时回读 `diy_field` 元数据和目标业务表结构,确认没有新增物理业务列;若当前工具不提供仅元数据能力,只报告设计建议,不得绕过后端直接写表。
|
|
156
|
-
|
|
157
|
-
### 5.2 禁止
|
|
158
|
-
|
|
159
|
-
- ❌ **禁止**为 ≤5 个有效表单行的业务域单独创建 Tab(必须改用 CollapseGroup);8~10 个双列短字段通常仍属于此范围。
|
|
160
|
-
- ❌ **禁止**仅凭 13~30 个原始字段决定平铺或分 Tab;总有效行超过 6 且存在明确业务域时,至少使用 CollapseGroup 分组。
|
|
161
|
-
- ❌ **禁止**为 8~10 字段的简单业务表创建多层 Tab 嵌套(直接用 CollapseGroup 即可)。
|
|
162
|
-
- ❌ **禁止**在用户没有要求时使用 `Tabs` 字段控件(`diy_field.Component='Tabs'`),更优先用 `diy_table.Tabs`。
|
|
163
|
-
- ❌ **禁止**让 `CollapseGroup.FormWidth` 为空或依赖表默认列宽;CollapseGroup 默认必须显式保存 `FormWidth=24`。Tabs / Divider / Alert 继续按各自运行时规范处理。
|
|
164
|
-
- ❌ **禁止**只创建 Tab 不写字段的 `Tab` 归属(每个 Tab 必须有至少 1 个非空 `Tab` 的字段)。
|
|
165
|
-
- ❌ **禁止**用 Tabs 控件的 `FieldCount` 跨过 CollapseGroup 或 Divider 计数(不同布局控件的计数是隔离的)。
|
|
166
|
-
- ❌ **禁止**把高频访问的字段(如单据编号、项目名称)放进默认收起的 CollapseGroup。
|
|
167
|
-
- ❌ **禁止**用普通新增字段或通用表单数据写入创建布局节点;这类路径可能对目标业务表执行物理 DDL。
|
|
168
|
-
|
|
169
|
-
<!-- /microi-progressive:chunk -->
|
|
170
|
-
<!-- microi-progressive:chunk id=microi-form-layout-004 sha256=539ae919554ca9eda5b5a26ac405181f601f4195f6a59baf1fd368d315987e6c -->
|
|
171
|
-
## 6. 验收清单
|
|
172
|
-
|
|
173
|
-
修改或新建表单布局后,AI 必须按以下顺序验收:
|
|
174
|
-
|
|
175
|
-
1. **回读字段**:`microi_get_field_list` 检查 `Tab` / `Component` / `Config` 与设计一致。
|
|
176
|
-
CollapseGroup 还必须检查 `FormWidth=24`、`Config.CollapseGroup.ShowFieldCount=true`(除非用户明确覆盖)。
|
|
177
|
-
2. **回读表与结构**:`microi_get_table_data _SelectFields=['Id'] _PageSize=1` 验证表可读,并检查实时表结构未因纯布局节点新增物理业务列。
|
|
178
|
-
3. **清缓存**:`microi_refresh_schema_cache tables=['表名']`。
|
|
179
|
-
4. **手动打开表单**:通过 Playwright 或 V8 引擎调用,截图第一屏。
|
|
180
|
-
5. **视觉确认**:
|
|
181
|
-
- 第一屏必须能看到核心业务信息,通常至少 6~10 个短字段或一个完整任务区(而不是 2~3 个字段加大片空白)。
|
|
182
|
-
- Tab 或 CollapseGroup 标题与说明文字清晰可见。
|
|
183
|
-
- 没有任何"只剩 1 个字段的 Tab"。
|
|
184
|
-
6. **业务闭环**:新建一条测试数据、编辑、查看、删除,验证字段在正确分组中显示。
|
|
185
|
-
|
|
186
|
-
若“表单设计器能看到、真实新增/编辑/查看表单看不到”,必须先读取表级 `InFormV8`
|
|
187
|
-
以及相关字段 V8,搜索 `V8.FieldSet`、`hideField`、`Visible=false`、`HideFields`。设计模式
|
|
188
|
-
通常跳过这些运行态事件;未完成这一步不得直接判定为 Microi.Client 渲染缺陷。
|
|
189
|
-
|
|
190
|
-
<!-- /microi-progressive:chunk -->
|
|
191
|
-
<!-- microi-progressive:chunk id=microi-form-layout-005 sha256=db6759bef83e520e5f137347070f85df1275e14dcbc742bebfdaac4da14be375 -->
|
|
192
|
-
## 9. 与其他 Skill 的关系
|
|
193
|
-
|
|
194
|
-
- 字段创建流程:`v8-table-event/SKILL.md` 写 InFormV8 / SubmitFormV8 等。
|
|
195
|
-
- 外键 Id+Name 双字段:`ui-design/SKILL.md` 中的"外键字段必须使用 Id+Name 双控件设计"。
|
|
196
|
-
- 整行控件规则:`microi-system-delivery/SKILL.md` 中 `FormWidth=24` 的使用条件。
|
|
197
|
-
- 表单设计器与按钮:`v8-menu-buttons/SKILL.md`。
|
|
198
|
-
- V8 事件 Tab 显隐 API:`v8-table-event/SKILL.md` 中 `V8.HideFormTab` / `V8.ShowFormTab` / `V8.ClickFormTab`。
|
|
199
|
-
<!-- /microi-progressive:chunk -->
|
|
200
|
-
## 详细参考路由(渐进披露)
|
|
201
|
-
|
|
202
|
-
仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
|
|
203
|
-
|
|
204
|
-
- [references/progressive-01-3-三种分组的存储与配置.md](references/progressive-01-3-三种分组的存储与配置.md):3. 三种分组的存储与配置;7. 反例参考(必须避免);8. 快速参考代码片段
|
|
205
|
-
<!-- microi-progressive:end -->
|
|
1
|
+
---
|
|
2
|
+
name: microi-form-layout
|
|
3
|
+
description: Microi 吾码低代码表单布局分组规范。用于通过 MCP、Manifest、VS Code 插件或 V8 引擎创建/优化 `diy_table` 和 `diy_field` 时,决定使用 `diy_table.Tabs` 表单全局 Tab、字段级 `Tabs` 控件、字段级 `CollapseGroup` 折叠分组,还是直接平铺字段。覆盖"何时分 Tab、何时分折叠分组、有效表单行判断阈值、JSON 配置示例、回读验收与回滚"。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
|
|
7
|
+
|
|
8
|
+
# Microi 表单布局分组规范(Tabs vs CollapseGroup)
|
|
9
|
+
|
|
10
|
+
Microi 吾码低代码提供 **三种** 表单分组能力,但每种都有明确的使用场景。**AI 必须先按本规范评估,再决定如何分组**,禁止盲目创建 Tab。
|
|
11
|
+
|
|
12
|
+
本 Skill 中的 Tabs、CollapseGroup、Divider 是编辑表单布局。模块级 Detail/Edit/List/Card 跨端视图必须配置在 `sys_menu.ViewSchema` 物理字段中;EntityHero、MetricStrip、ActionGrid、ResponsiveSection 属于独立视图区块,不得伪装成 `diy_field`。三个核心表的 `DiyConfig` 均已废弃,禁止作为新布局或新功能配置入口。
|
|
13
|
+
|
|
14
|
+
控件事实源:`Microi.Client/src/views/form-engine/diy-field-component/diy-component-list.json` 中 `Sort=1000` 附近的 `Divider`、`CollapseGroup`、`Tabs`、`Alert`、`StaticText`、`Html`、`RichText` 等都属于 Advanced 布局控件。
|
|
15
|
+
|
|
16
|
+
全局遮罩毛玻璃使用正向开关 `sys_config.FormMaskBlur`:缺失、空值或 `0/false` 默认关闭,只有显式 `1/true` 才开启。表级仍使用负向开关 `diy_table.DisableFormMaskBlur`;全局开启后,某张表显式 `1/true` 可单独关闭。旧全局字段 `sys_config.DisableFormMaskBlur` 只作未升级租户兼容回退,元数据必须设置 `Visible=0`、`AppVisible=0`,不得同时向用户展示两套开关。
|
|
17
|
+
|
|
18
|
+
表单打开方式与分组是两个独立决策:顶层新表默认 `FormOpenType=Dialog`、
|
|
19
|
+
`FormOpenWidth=80%`。完整系统开发的子表宽度按 `microi-system-delivery` 必读清单第 4 项配置:第一层 75%、第二层 70%,再逐层递减 5 个百分点。只有约 36 个以上业务字段、至少 2 个大型子表,或同等密度的重型控件
|
|
20
|
+
才评估 Drawer;不能用 Drawer 代替 Tabs/CollapseGroup 的信息架构。Dialog 统一使用居中、可拖动、
|
|
21
|
+
大圆角弹层;Drawer 贴边且不使用大圆角。
|
|
22
|
+
|
|
23
|
+
`CollapseGroup` 的运行态视觉统一使用清爽的白色/主题表面卡片:短主题色指示条、紧凑
|
|
24
|
+
标题、可选图标、单行副标题、标题旁轻量 `x 项` 文案,以及最右侧无底色的折叠箭头。
|
|
25
|
+
不得使用整块主题色填充、蓝色大描边或醒目的实心数量胶囊;分组内容与标题属于同一张
|
|
26
|
+
卡片,展开后不再嵌套第二套外框。深色模式使用 Element 主题变量,不能写死白色/蓝色。
|
|
27
|
+
|
|
28
|
+
## 配置类表单的二级分组硬规则
|
|
29
|
+
|
|
30
|
+
- `sys_config`、`sys_user`、SaaS 设置、接口参数、打印/工作流设置等“配置类表单”不能因为已经有表级 Tab 就停止信息架构审计。表级 Tab 只负责一级领域;同一 Tab 内存在 **7 个以上可见设置**或 **2 个以上明确语义域**时,必须继续按语义放入 `CollapseGroup`。
|
|
31
|
+
- 水印、主题、菜单、登录入口、安全策略、桌面偏好等一组相互关联的开关/参数必须由一个带图标、说明、计数的 CollapseGroup 包裹;不能把 5~20 个设置直接平铺在 Tab 中,也不能让每个小设置单独占一个 Tab。
|
|
32
|
+
- 新增设置字段时必须同时审计所在 Tab 的现有字段,而不只是包住本次新增字段。若相邻设置已形成稳定语义域,应一次性补齐该域的 CollapseGroup;隐藏兼容字段继续保留但不计入可见项数。
|
|
33
|
+
- 配置表采用“表级 Tab + Tab 内 CollapseGroup”时,CollapseGroup 必须与成员字段写入同一个 `Tab`,并用连续 `Sort` 保证作用范围在下一个布局节点前结束。发布前必须打开真实编辑表单验证,不能只凭元数据字符串判断布局成功。
|
|
34
|
+
|
|
35
|
+
<!-- microi-progressive:begin -->
|
|
36
|
+
<!-- microi-progressive:chunk id=microi-form-layout-000 sha256=cade6a415454aa04f5fcf840e6d9df1323ac9751c0e3c8e1b07b360007413819 -->
|
|
37
|
+
## 1. 三种分组能力速查
|
|
38
|
+
|
|
39
|
+
| 能力 | 存储位置 | 控件 | 核心作用 | 适用场景 |
|
|
40
|
+
|------|---------|------|---------|---------|
|
|
41
|
+
| **A. diy_table.Tabs(表级 Tab)** | `diy_table.Tabs`(JSON 字符串) | 表单顶部 Tab 条 | 把整张表的字段切到不同 Tab 中,**同屏只能看一个 Tab** | 表单整体很长,单个 Tab 通常占 **≥6 个有效表单行**,且 Tab 之间字段**业务强隔离**(扫码操作 vs 单据信息、主数据 vs 大型子表) |
|
|
42
|
+
| **B. 字段级 Tabs 控件** | `diy_field.Component='Tabs'` + `Config.FieldTabs` | 字段本身就是 Tab 容器 | 多个 Tab 字段组合嵌套,**同屏只能看一个 Tab** | 同一张表内需要二级 Tab,或 Tab 内容互相独立 |
|
|
43
|
+
| **C. 字段级 CollapseGroup(折叠分组)** | `diy_field.Component='CollapseGroup'` + `Config.CollapseGroup` | 字段是折叠面板标题 | **所有分组可在同一页面展开**,用户一屏看到全部标题和分组字段 | 只占 **≤5 个有效表单行** 的小分组(短字段即使有 8~10 个,也常只占 4~5 行) |
|
|
44
|
+
| **D. 不分组(默认平铺)** | 无 | — | 全部字段在第一屏 | 总有效表单行 ≤ 6、没有复杂控件,且没有必须强调的业务分组 |
|
|
45
|
+
|
|
46
|
+
<!-- /microi-progressive:chunk -->
|
|
47
|
+
<!-- microi-progressive:chunk id=microi-form-layout-001 sha256=f43f8c6f1c156ef3669f0c1f9a9d9d2cb7baf630d0b0cb2f48307a31f3f82ae2 -->
|
|
48
|
+
## 2. 黄金决策流程(AI 必须按此顺序判断)
|
|
49
|
+
|
|
50
|
+
### 2.1 先算“有效表单行”,禁止只数字段
|
|
51
|
+
|
|
52
|
+
字段数不能直接代表视觉高度。AI 必须按 `diy_table.Column` 估算每组字段占用的有效表单行:
|
|
53
|
+
|
|
54
|
+
- 普通 Text / Select / NumberText / DateTime 等短控件:占 `1 / Column` 行;双列布局中 8 个短字段约为 4 行。
|
|
55
|
+
- `FormWidth=24` 或 Textarea / RichText / FileUpload / ImgUpload / Map:每个至少占 1 行。
|
|
56
|
+
- TableChild / CodeEditor / DevComponent / 大型 JsonTable:视为独立任务区,不能按普通字段数压缩。
|
|
57
|
+
- 隐藏字段、Id、纯布局控件不计入视觉行数,但必须保留其排序和业务配置。
|
|
58
|
+
|
|
59
|
+
**一级字段数门槛**:`<=6` 个核心可见字段优先平铺;`7~29` 个字段按基础、业务、状态、附件等信息域使用 CollapseGroup;`30+` 个字段优先评估表级 Tabs。字段数只是一级门槛,仍须结合下方“有效表单行”和任务隔离判断。
|
|
60
|
+
|
|
61
|
+
**表级 Tab 的默认准入条件**:除 `30+` 字段外,表单总有效行通常大于 12 行,并且至少两个 Tab 各自达到 6 个有效行;否则优先平铺或 CollapseGroup。多个大型子表,或扫码、代码编辑、运行测试等强任务域,可以直接进入 Tabs 评估;字段达到 8 个不再自动获得独立 Tab 资格。
|
|
62
|
+
|
|
63
|
+
**强任务隔离例外**:扫码/报工/质检操作区、可独立滚动的大型子表、运行测试、代码编辑、工作流事件等即使行数较少,也可以保留 Tab,因为切换代表任务模式而不是装饰性分组。
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
开始
|
|
67
|
+
↓
|
|
68
|
+
Q1: 核心可见字段数、子表和强任务域?
|
|
69
|
+
├─ ≤ 6 字段且无复杂控件 → D. 不分组(默认平铺)
|
|
70
|
+
├─ 7 ~ 29 字段且无多个大型子表/强任务域 → 按信息域使用 C. CollapseGroup
|
|
71
|
+
└─ ≥ 30 字段,或多个大型子表/强任务域 → 优先评估 A. diy_table.Tabs
|
|
72
|
+
↓
|
|
73
|
+
Q2: 是否至少有两个需要切换的独立业务域?
|
|
74
|
+
├─ 否 → D. 平铺,或用 CollapseGroup 收起次要字段
|
|
75
|
+
└─ 是
|
|
76
|
+
↓
|
|
77
|
+
Q3: 每个业务域的有效表单行数?
|
|
78
|
+
├─ 至少两个业务域均 ≥ 6 行 → A. diy_table.Tabs(表级 Tab)
|
|
79
|
+
└─ 存在 ≤ 5 行的小业务域
|
|
80
|
+
↓
|
|
81
|
+
混合方案:Tab 容纳大业务域(≥6 个有效行)+ CollapseGroup 收起小业务域(≤5 个有效行)
|
|
82
|
+
↓
|
|
83
|
+
注意:所有 Tab 内的 ≤5 个有效行小业务域,必须用 CollapseGroup 折叠分组
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**简明决策表**:
|
|
87
|
+
|
|
88
|
+
| 场景 | 推荐方案 | 禁止做法 |
|
|
89
|
+
|------|---------|---------|
|
|
90
|
+
| 13 字段双列表单 + 3 个小业务域(2/9/2 个字段) | 3 个 CollapseGroup,核心业务组默认展开 | 禁止建立 3 个 Tab;9 个短字段通常只有 4.5 行,仍不足以独占一页 |
|
|
91
|
+
| 13 字段表 + 1 个"MRP 运算"子集(3 字段) | C. CollapseGroup 折叠"MRP 运算"分组,剩余 10 字段平铺 | 禁止用 diy_table.Tabs 拆出"MRP 运算"Tab(用户必须点击切换才能看到 3 个字段) |
|
|
92
|
+
| 35 字段表 + 4 个业务域(10/8/9/8) | A. diy_table.Tabs(4 个 Tab) | 禁止把每个 Tab 内 ≤5 字段的"备注/其他"再开 Tab |
|
|
93
|
+
| 42 字段表 + 5 个业务域(14/13/6/5/4) | A. diy_table.Tabs(5 个 Tab),后两个 Tab 内用 C. CollapseGroup 收次要字段 | 禁止为了 4~5 字段"审核信息"单独建 Tab |
|
|
94
|
+
| 8 字段简单登记表 | D. 不分组 | 禁止任何 Tab/折叠 |
|
|
95
|
+
| 工作流审批表(≤10 字段) | D. 不分组 | 禁止使用 Tab |
|
|
96
|
+
|
|
97
|
+
<!-- /microi-progressive:chunk -->
|
|
98
|
+
<!-- microi-progressive:chunk id=microi-form-layout-002 sha256=9165f561ba90696ce130d24f71a0e56c521b5f8935eac2ddcffb852f3af5d9b2 -->
|
|
99
|
+
## 4. AI 生成表单布局的标准动作
|
|
100
|
+
|
|
101
|
+
### 4.1 必做顺序
|
|
102
|
+
|
|
103
|
+
1. **先数字段**:调用 `microi_get_field_list` 拉出全部字段,统计**有效字段数**(排除 `Visible=0` 隐藏字段、`Id`、系统字段)。
|
|
104
|
+
2. **再分业务域**:用 `Sort` 顺序浏览字段,把字段聚类到 2~5 个业务域(基础信息 / 业务明细 / 业主/组织 / 财务 / 附件备注 / 状态 / 时间 / 其他)。
|
|
105
|
+
3. **算每个域有效表单行**:A. 大于等于 6 行且存在强隔离价值 → Tab;B. 小于等于 5 行 → CollapseGroup;C. 等于 0 → 删除该域。
|
|
106
|
+
4. **决定顶层方案**:A. 全 Tab / B. Tab+CollapseGroup 混合 / C. 全 CollapseGroup / D. 平铺。
|
|
107
|
+
5. **写配置**:先写 `diy_table.Tabs`(若有 Tab),再逐字段写 `Tab` 归属;新增 `Component=CollapseGroup/Tabs/Divider/Alert` 等布局节点时,只能使用明确标注为“仅元数据”的布局专用路径,不能使用会同步建业务列的普通新增字段接口。
|
|
108
|
+
6. **回读验收**:调用 `microi_get_field_list` 回读,确认 `Tab` 字段、`Sort`、`Component`、`Config.FieldTabs` / `Config.CollapseGroup` JSON 正确。
|
|
109
|
+
7. **V8 完整性校验**:修改前后比较表级六类 V8 事件、字段 `V8Code/KeyupV8Code/Config`;布局迁移不得覆盖业务代码。若代码出现 `HideFormTab/ShowFormTab/ClickFormTab`,必须先适配或跳过该表。
|
|
110
|
+
8. **清缓存**:`microi_refresh_schema_cache tables=['表名']`,避免前端看到旧配置。
|
|
111
|
+
|
|
112
|
+
### 4.2 存量表自动审计与安全迁移
|
|
113
|
+
|
|
114
|
+
当用户要求“检查所有表单设计”时,AI 必须执行自动化盘点,不能只修截图中的一张表:
|
|
115
|
+
|
|
116
|
+
1. 读取所有 `diy_table.Tabs`,排除只有一个 `none` 默认页签的表。
|
|
117
|
+
2. 一次性读取候选表的 `diy_field`,按 `Tab + Sort + Component + FormWidth + Visible` 计算每组有效行数。
|
|
118
|
+
3. 保留扫码、报工、质检操作、大型子表、代码编辑、运行测试等强任务 Tab。
|
|
119
|
+
4. 将“总有效行 ≤12、每组 ≤5 行、无复杂控件、无 Tab 控制 V8”的表列为高置信迁移候选。
|
|
120
|
+
5. 修改前记录 `Tabs`、字段 `Tab/Sort/Component/Config/V8Code/KeyupV8Code` 和表级 V8 摘要;修改后逐项回读,业务代码摘要必须一致。
|
|
121
|
+
6. 迁移为 CollapseGroup 时,只能通过布局专用的“仅元数据”路径新增布局节点,再清空原字段 `Tab` 和表级 `Tabs`;不得重建业务字段,不得改数据源、必填、只读、默认值或 V8。普通新增字段可能触发物理 DDL,严禁把通用 `AddFormData(diy_field)` 或普通字段创建接口当作元数据写入捷径。
|
|
122
|
+
7. 平台控制面、安全表和存在歧义的业务表只报告,不自动批量迁移。
|
|
123
|
+
|
|
124
|
+
### 4.3 后端实现备忘
|
|
125
|
+
|
|
126
|
+
后端表结构(`diy_table`):
|
|
127
|
+
- `Tabs` 字段:JSON 字符串,存表级 Tab 列表。
|
|
128
|
+
- `TabsPosition` 字段:top / bottom / left / right。
|
|
129
|
+
- `TableTabs` / `TableTabsPosition`:表格视图的 Tab,与表单 Tab 独立。
|
|
130
|
+
- `FormArticle` / `TableArticle`:表单/表格的说明文案(不是 Tab)。
|
|
131
|
+
|
|
132
|
+
后端字段结构(`diy_field`):
|
|
133
|
+
- `Tab` 字段:归属 Tab 名(与 `diy_table.Tabs.Id` 对应)。
|
|
134
|
+
- `Component = Tabs` / `CollapseGroup` / `Divider` / `Alert` 等 Advanced 控件,作为布局节点。
|
|
135
|
+
- `Config` 字段:JSON 字符串,存 `FieldTabs` / `CollapseGroup` 等子配置。
|
|
136
|
+
|
|
137
|
+
V8 事件中可用 `V8.HideFormTab('tabId')` / `V8.ShowFormTab('tabId')` / `V8.ClickFormTab('tabId')` 动态控制 Tab 显隐和默认选中。
|
|
138
|
+
|
|
139
|
+
<!-- /microi-progressive:chunk -->
|
|
140
|
+
<!-- microi-progressive:chunk id=microi-form-layout-003 sha256=582f8b326f05bf2314ebadcb5f47ca45bbb7aa4d06fac288cfbf3918b98d49c2 -->
|
|
141
|
+
## 5. 必填与禁止
|
|
142
|
+
|
|
143
|
+
### 5.1 必填
|
|
144
|
+
|
|
145
|
+
- 字段数 13~30 的表单,必须有可见的**业务分组**(Tab 或 CollapseGroup 二选一),不能让用户上下滚动 5 屏找字段。
|
|
146
|
+
- 创建 CollapseGroup 分组时,必须设置 `Icon`(如 `fas fa-calculator` / `fas fa-info-circle`),不要默认空白。
|
|
147
|
+
- 任何 Tab / CollapseGroup 都必须有 `Description` 解释分组用途,不要只放一个标题。
|
|
148
|
+
- 每个 CollapseGroup 必须回读到 `FormWidth=24`;`Config.CollapseGroup.ShowFieldCount` 默认必须为 `true`。
|
|
149
|
+
- 可扩展配置表或设置页的末尾 CollapseGroup 不得无边界使用 `ScopeMode=UntilNextGroup`。已知标准子项数量时必须改用 `ScopeMode=FieldCount` 并显式保存准确 `FieldCount`;否则必须增加后续分组边界,避免未来新增字段或租户扩展字段被末尾分组误吞。
|
|
150
|
+
- 表级 Tab 与 CollapseGroup 的 `Description` 作为副标题显示;开启计数时统一追加 `x 项`,禁止继续显示 `x 个字段`。运行时动态显隐字段后必须重算计数,已有数字角标配置继续生效,不能被静态字段数覆盖。
|
|
151
|
+
- 分组/Tab 的字段计数必须基于字段原始可见性(如 `_baseIsShow`),不能把“当前因折叠而隐藏”误判成不可见,否则收起后的分组会错误显示 `0 项`。
|
|
152
|
+
- 表级分组方向完整支持 `TabsPosition=left/top/right/bottom`;每个方向都要检查标题、副标题、动态角标和选中指示线,纵向指示线端点固定为直角。
|
|
153
|
+
- 修改 `diy_table.Tabs` 或 `diy_field.Tab` / `Config.CollapseGroup` / `Config.FieldTabs` 后,必须调用 `microi_refresh_schema_cache`。
|
|
154
|
+
- CollapseGroup(含 Tab 内嵌套)默认设 `DefaultCollapsed=false`,让业务信息直接可见;仅明确非关键、低频信息可设 `true`。不得因嵌套于 Tab 就把所有分组默认收起。
|
|
155
|
+
- 新增布局节点后必须同时回读 `diy_field` 元数据和目标业务表结构,确认没有新增物理业务列;若当前工具不提供仅元数据能力,只报告设计建议,不得绕过后端直接写表。
|
|
156
|
+
|
|
157
|
+
### 5.2 禁止
|
|
158
|
+
|
|
159
|
+
- ❌ **禁止**为 ≤5 个有效表单行的业务域单独创建 Tab(必须改用 CollapseGroup);8~10 个双列短字段通常仍属于此范围。
|
|
160
|
+
- ❌ **禁止**仅凭 13~30 个原始字段决定平铺或分 Tab;总有效行超过 6 且存在明确业务域时,至少使用 CollapseGroup 分组。
|
|
161
|
+
- ❌ **禁止**为 8~10 字段的简单业务表创建多层 Tab 嵌套(直接用 CollapseGroup 即可)。
|
|
162
|
+
- ❌ **禁止**在用户没有要求时使用 `Tabs` 字段控件(`diy_field.Component='Tabs'`),更优先用 `diy_table.Tabs`。
|
|
163
|
+
- ❌ **禁止**让 `CollapseGroup.FormWidth` 为空或依赖表默认列宽;CollapseGroup 默认必须显式保存 `FormWidth=24`。Tabs / Divider / Alert 继续按各自运行时规范处理。
|
|
164
|
+
- ❌ **禁止**只创建 Tab 不写字段的 `Tab` 归属(每个 Tab 必须有至少 1 个非空 `Tab` 的字段)。
|
|
165
|
+
- ❌ **禁止**用 Tabs 控件的 `FieldCount` 跨过 CollapseGroup 或 Divider 计数(不同布局控件的计数是隔离的)。
|
|
166
|
+
- ❌ **禁止**把高频访问的字段(如单据编号、项目名称)放进默认收起的 CollapseGroup。
|
|
167
|
+
- ❌ **禁止**用普通新增字段或通用表单数据写入创建布局节点;这类路径可能对目标业务表执行物理 DDL。
|
|
168
|
+
|
|
169
|
+
<!-- /microi-progressive:chunk -->
|
|
170
|
+
<!-- microi-progressive:chunk id=microi-form-layout-004 sha256=539ae919554ca9eda5b5a26ac405181f601f4195f6a59baf1fd368d315987e6c -->
|
|
171
|
+
## 6. 验收清单
|
|
172
|
+
|
|
173
|
+
修改或新建表单布局后,AI 必须按以下顺序验收:
|
|
174
|
+
|
|
175
|
+
1. **回读字段**:`microi_get_field_list` 检查 `Tab` / `Component` / `Config` 与设计一致。
|
|
176
|
+
CollapseGroup 还必须检查 `FormWidth=24`、`Config.CollapseGroup.ShowFieldCount=true`(除非用户明确覆盖)。
|
|
177
|
+
2. **回读表与结构**:`microi_get_table_data _SelectFields=['Id'] _PageSize=1` 验证表可读,并检查实时表结构未因纯布局节点新增物理业务列。
|
|
178
|
+
3. **清缓存**:`microi_refresh_schema_cache tables=['表名']`。
|
|
179
|
+
4. **手动打开表单**:通过 Playwright 或 V8 引擎调用,截图第一屏。
|
|
180
|
+
5. **视觉确认**:
|
|
181
|
+
- 第一屏必须能看到核心业务信息,通常至少 6~10 个短字段或一个完整任务区(而不是 2~3 个字段加大片空白)。
|
|
182
|
+
- Tab 或 CollapseGroup 标题与说明文字清晰可见。
|
|
183
|
+
- 没有任何"只剩 1 个字段的 Tab"。
|
|
184
|
+
6. **业务闭环**:新建一条测试数据、编辑、查看、删除,验证字段在正确分组中显示。
|
|
185
|
+
|
|
186
|
+
若“表单设计器能看到、真实新增/编辑/查看表单看不到”,必须先读取表级 `InFormV8`
|
|
187
|
+
以及相关字段 V8,搜索 `V8.FieldSet`、`hideField`、`Visible=false`、`HideFields`。设计模式
|
|
188
|
+
通常跳过这些运行态事件;未完成这一步不得直接判定为 Microi.Client 渲染缺陷。
|
|
189
|
+
|
|
190
|
+
<!-- /microi-progressive:chunk -->
|
|
191
|
+
<!-- microi-progressive:chunk id=microi-form-layout-005 sha256=db6759bef83e520e5f137347070f85df1275e14dcbc742bebfdaac4da14be375 -->
|
|
192
|
+
## 9. 与其他 Skill 的关系
|
|
193
|
+
|
|
194
|
+
- 字段创建流程:`v8-table-event/SKILL.md` 写 InFormV8 / SubmitFormV8 等。
|
|
195
|
+
- 外键 Id+Name 双字段:`ui-design/SKILL.md` 中的"外键字段必须使用 Id+Name 双控件设计"。
|
|
196
|
+
- 整行控件规则:`microi-system-delivery/SKILL.md` 中 `FormWidth=24` 的使用条件。
|
|
197
|
+
- 表单设计器与按钮:`v8-menu-buttons/SKILL.md`。
|
|
198
|
+
- V8 事件 Tab 显隐 API:`v8-table-event/SKILL.md` 中 `V8.HideFormTab` / `V8.ShowFormTab` / `V8.ClickFormTab`。
|
|
199
|
+
<!-- /microi-progressive:chunk -->
|
|
200
|
+
## 详细参考路由(渐进披露)
|
|
201
|
+
|
|
202
|
+
仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
|
|
203
|
+
|
|
204
|
+
- [references/progressive-01-3-三种分组的存储与配置.md](references/progressive-01-3-三种分组的存储与配置.md):3. 三种分组的存储与配置;7. 反例参考(必须避免);8. 快速参考代码片段
|
|
205
|
+
<!-- microi-progressive:end -->
|