@microi.net/cli 5.2.0 → 5.2.2
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 +4 -4
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-server.js +122 -101
- package/scripts/microi-skills.meta.json +192 -192
- package/skills/.microi-skills-version.json +2 -2
- package/skills/app-store/SKILL.md +8 -4
- package/skills/microi-client-frontend/SKILL.md +15 -1
- package/skills/microi-form-engine/SKILL.md +85 -53
- package/skills/microi-form-layout/SKILL.md +16 -2
- package/skills/microi-system-delivery/SKILL.md +10 -4
- package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +50 -45
- package/skills/module-engine/SKILL.md +6 -6
- package/skills/module-engine/references/module-config.md +204 -201
- package/skills/v8-api-config/SKILL.md +167 -154
- package/skills/v8-cache-pattern/SKILL.md +114 -113
|
@@ -12,7 +12,7 @@ description: Microi 表单引擎设计与控件配置指南。用于创建或修
|
|
|
12
12
|
Config/Data、菜单查询列与缓存保持一致。
|
|
13
13
|
|
|
14
14
|
平台创建 DIY 表时会自动加入 `DiyCommon.FixedDiyField` 定义的 Id、创建/更新时间、
|
|
15
|
-
创建人、租户等固定字段。业务 Manifest 不重复声明这些字段;读取实时 Schema 或离线快照时也不能
|
|
15
|
+
创建人、租户等固定字段。业务 Manifest 不重复声明这些字段;读取实时 Schema 或离线快照时也不能
|
|
16
16
|
因为 `_Fields` 只列出可配置字段,就误判物理表缺少固定字段。
|
|
17
17
|
|
|
18
18
|
## 必读参考
|
|
@@ -32,17 +32,49 @@ Config/Data、菜单查询列与缓存保持一致。
|
|
|
32
32
|
3. 新表用 `microi_create_table`;字段用 `microi_add_field`,不得直接写
|
|
33
33
|
`diy_field` 或执行临时 DDL。
|
|
34
34
|
4. 选项控件同时设置 `data/config`;关联控件明确保存字段和显示字段。
|
|
35
|
-
5. 字段多时设置 `diy_table.Tabs` 与字段 `Tab`;只有整行控件设置
|
|
36
|
-
`FormWidth=24`,普通字段省略。`CollapseGroup` 属于整行控件,必须显式保存
|
|
37
|
-
`FormWidth=24`,且 `Config.CollapseGroup.ShowFieldCount` 默认补为 `true`。
|
|
35
|
+
5. 字段多时设置 `diy_table.Tabs` 与字段 `Tab`;只有整行控件设置
|
|
36
|
+
`FormWidth=24`,普通字段省略。`CollapseGroup` 属于整行控件,必须显式保存
|
|
37
|
+
`FormWidth=24`,且 `Config.CollapseGroup.ShowFieldCount` 默认补为 `true`。
|
|
38
38
|
6. 绑定菜单后补齐/允许平台推断列表列、搜索列、隐藏列、排序列、移动端列和默认排序。
|
|
39
|
-
7. 回读 `diy_field`、刷新 schema 缓存,再在真实新增/编辑/查看表单中验收。
|
|
40
|
-
|
|
41
|
-
新建表/模块时,除非用户显式指定或表单达到极重阈值(约 36+ 业务字段、2+ 子表或同等
|
|
42
|
-
重型控件密度),默认保存 `diy_table.FormOpenType=Dialog` 与 `FormOpenWidth=80%`。
|
|
43
|
-
Drawer 只服务超长复杂表单,不能作为所有 CRUD 模块的模板默认值。
|
|
44
|
-
若设计器显示而运行态不显示,先检查 `InFormV8`/字段 V8 是否调用
|
|
45
|
-
`V8.FieldSet(..., 'Visible', false)`、`hideField` 或传入 `HideFields`,再判断前端源码。
|
|
39
|
+
7. 回读 `diy_field`、刷新 schema 缓存,再在真实新增/编辑/查看表单中验收。
|
|
40
|
+
|
|
41
|
+
新建表/模块时,除非用户显式指定或表单达到极重阈值(约 36+ 业务字段、2+ 子表或同等
|
|
42
|
+
重型控件密度),默认保存 `diy_table.FormOpenType=Dialog` 与 `FormOpenWidth=80%`。
|
|
43
|
+
Drawer 只服务超长复杂表单,不能作为所有 CRUD 模块的模板默认值。
|
|
44
|
+
若设计器显示而运行态不显示,先检查 `InFormV8`/字段 V8 是否调用
|
|
45
|
+
`V8.FieldSet(..., 'Visible', false)`、`hideField` 或传入 `HideFields`,再判断前端源码。
|
|
46
|
+
|
|
47
|
+
## 表单 Banner(所有新业务表必做)
|
|
48
|
+
|
|
49
|
+
标准表单 Banner 默认显示,以当前主题色约 50% 混合强度叠加深蓝灰渐变,并适配浅色、
|
|
50
|
+
深色与移动端。视觉应有层次但保持清爽,标题始终维持安全对比度;统计卡片使用半透明背景
|
|
51
|
+
和柔和阴影分层,避免堆叠边框。它属于表单语义,配置
|
|
52
|
+
必须写入 `diy_table` 的 `FormBannerEnabled`、`FormBannerTitleField`、
|
|
53
|
+
`FormBannerSubtitleField`、`FormBannerImageField`、`FormBannerIcon`、
|
|
54
|
+
`FormBannerBackgroundField`、`FormBannerTagFields`、`FormBannerMetrics`,禁止写进
|
|
55
|
+
`sys_menu`、`DiyConfig` 或项目定制组件。
|
|
56
|
+
|
|
57
|
+
- 标题优先业务自动编号/单号/编码,再选名称或标题;副标题优先客户、项目、公司、分类、
|
|
58
|
+
日期等可读字段。
|
|
59
|
+
- 左侧图片使用 `ImgUpload`。单图、多图取首图,继续遵循吾码公有/私有文件路径与授权
|
|
60
|
+
规则;图片为空时必须有语义合适的 Font Awesome 图标回退。
|
|
61
|
+
- 右侧标签优先 `Select/Radio/Switch/Checkbox/SelectTree/Department` 等选项字段,最多
|
|
62
|
+
选择 3 个有业务意义的状态、类型或等级。显式 `[]` 表示不要自动标签。
|
|
63
|
+
- 自动统计最多 3 项,只选择真实金额、合计、数量、成本、余额、评分、比率、进度等具有
|
|
64
|
+
明确业务口径的数值字段;必须排除 Id、排序、启用、状态、版本、分页和本页加载量。
|
|
65
|
+
存在 `TableChild` 时,默认统计必须携带完整父表/父字段/父记录授权上下文,在服务端对全部
|
|
66
|
+
关联子表数据计算行数或业务数值合计,不能只统计当前页。跨表自定义口径使用 `ApiEngineKey +
|
|
67
|
+
ValuePath + ParamMap + RefreshSeconds`,相同接口批量返回,禁止 N+1、随机数和固定演示数;
|
|
68
|
+
没有可靠指标时隐藏统计区。显式 `[]` 表示不要自动统计。
|
|
69
|
+
- 兼容旧模块 Hero 时仅迁移视觉、`Source=Field` 或显式记录作用域指标;列表总数、分类数量和
|
|
70
|
+
未引用当前 `Form/RecordId` 的全局接口统计不得进入单记录 Banner,缺省时回到当前记录和
|
|
71
|
+
授权 `TableChild` 的语义统计。
|
|
72
|
+
- 未配置的存量表由运行时按字段类型智能推断,不能因为物理字段为空而隐藏或展示空壳。
|
|
73
|
+
只有 `FormBannerEnabled=0` 才隐藏。
|
|
74
|
+
- 完整系统 Manifest 使用 `tables[].formBanner`;未提供时 `microi_generate_system` 仍须写入
|
|
75
|
+
类型感知的默认值。逐步创建字段后调用 `microi_configure_form_banner` 并回读验证。
|
|
76
|
+
- 表单设计器验收必须覆盖有/无图片、有/无统计、子表完整聚合、接口失败回退、浅色、深色、
|
|
77
|
+
PC 和窄屏,并检查文字对比度以及不存在技术字段伪统计。
|
|
46
78
|
|
|
47
79
|
## 物理类型底线
|
|
48
80
|
|
|
@@ -92,10 +124,10 @@ MCP 建模只使用:
|
|
|
92
124
|
- 语义仍不明确时必须在任何 MCP 写入前询问基数;禁止静默退化为 `JoinForm`。
|
|
93
125
|
- 禁止把“明细”设计为主表 `XxxId + JoinForm`;禁止让 `JoinForm.TableId/TableName`
|
|
94
126
|
指向当前表;禁止把 1:N 外键放在主表。
|
|
95
|
-
- 完整系统 Manifest 中,`JoinForm` / `TableChild` 字段必须声明 `relation.cardinality`;
|
|
96
|
-
`microi_plan_system` 与 `microi_generate_system` 会在任何写入前执行本节门禁。直接调用
|
|
97
|
-
`microi_add_field` / `microi_update_field` 时,后端仍会校验目标表、主/子外键、隐藏菜单
|
|
98
|
-
和子表索引,不能靠绕过 Manifest 写入未初始化配置。
|
|
127
|
+
- 完整系统 Manifest 中,`JoinForm` / `TableChild` 字段必须声明 `relation.cardinality`;
|
|
128
|
+
`microi_plan_system` 与 `microi_generate_system` 会在任何写入前执行本节门禁。直接调用
|
|
129
|
+
`microi_add_field` / `microi_update_field` 时,后端仍会校验目标表、主/子外键、隐藏菜单
|
|
130
|
+
和子表索引,不能靠绕过 Manifest 写入未初始化配置。
|
|
99
131
|
|
|
100
132
|
示例:
|
|
101
133
|
|
|
@@ -111,27 +143,27 @@ MCP 建模只使用:
|
|
|
111
143
|
`tables[].indexes`,并以 `microi_get_table_indexes` 回读。
|
|
112
144
|
3. 为子表创建绑定其 `diyTableId` 的隐藏 CRUD 菜单:`Display=0`、`AppDisplay=0`、
|
|
113
145
|
`HasChild=0`。
|
|
114
|
-
4. 在完整系统 Manifest 的主表字段声明:
|
|
115
|
-
|
|
116
|
-
```json
|
|
117
|
-
{
|
|
118
|
-
"name": "Items",
|
|
119
|
-
"label": "明细",
|
|
120
|
-
"component": "TableChild",
|
|
121
|
-
"formWidth": 24,
|
|
122
|
-
"relation": {
|
|
123
|
-
"cardinality": "1:N",
|
|
124
|
-
"targetTable": "Biz_OrderItem",
|
|
125
|
-
"childForeignKey": "OrderId",
|
|
126
|
-
"childModule": "订单明细(隐藏)",
|
|
127
|
-
"primaryTableFieldName": "Id"
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
`microi_generate_system` 会先创建全部表与普通字段,再创建隐藏菜单,最后回读并写入
|
|
133
|
-
当前租户真实的 `diy_table.Id` / `sys_menu.Id`。禁止在 Manifest 中编造这些 Id,禁止
|
|
134
|
-
因依赖尚未创建而退化成 `JoinForm`。
|
|
146
|
+
4. 在完整系统 Manifest 的主表字段声明:
|
|
147
|
+
|
|
148
|
+
```json
|
|
149
|
+
{
|
|
150
|
+
"name": "Items",
|
|
151
|
+
"label": "明细",
|
|
152
|
+
"component": "TableChild",
|
|
153
|
+
"formWidth": 24,
|
|
154
|
+
"relation": {
|
|
155
|
+
"cardinality": "1:N",
|
|
156
|
+
"targetTable": "Biz_OrderItem",
|
|
157
|
+
"childForeignKey": "OrderId",
|
|
158
|
+
"childModule": "订单明细(隐藏)",
|
|
159
|
+
"primaryTableFieldName": "Id"
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
`microi_generate_system` 会先创建全部表与普通字段,再创建隐藏菜单,最后回读并写入
|
|
165
|
+
当前租户真实的 `diy_table.Id` / `sys_menu.Id`。禁止在 Manifest 中编造这些 Id,禁止
|
|
166
|
+
因依赖尚未创建而退化成 `JoinForm`。
|
|
135
167
|
5. `TableChild` 控件字段通常只是表单配置位,关系事实存放在子表外键。至少保存:
|
|
136
168
|
|
|
137
169
|
```json
|
|
@@ -173,23 +205,23 @@ MCP 建模只使用:
|
|
|
173
205
|
优先使用现有 44 类标准控件。只有标准控件无法表达交互、且该交互会长期复用时,
|
|
174
206
|
才使用 `DevComponent`:
|
|
175
207
|
|
|
176
|
-
- 多租户共用且与主框架强耦合的 Vue 组件,路径必须稳定并纳入 `Microi.Client` 源码/构建。
|
|
177
|
-
- 支持 Add/Edit/View、只读、必填、清空、校验、移动端和暗色主题。
|
|
178
|
-
- 不在组件内绕过 FormEngine 权限直接访问任意表。
|
|
179
|
-
- 复杂但租户独有、需要固定嵌入表单的区域,优先使用 `DevComponent` + MicroService 路由;临时打开的复杂页面使用 `V8.OpenAppDialog`,都避免把客户逻辑打进主前端。
|
|
180
|
-
- MicroService 表单嵌入使用 `microi.routes.json` 页面级 `LegacyComponentPaths` 作为稳定别名,字段 `Config.DevComponentPath` 与其匹配。主前端存在同路径 Vue 文件时本地优先;不存在时平台自动加载对应 `sys_microiservice_page.RoutePath`。新别名不得与 `/src/views` 真实文件冲突。
|
|
181
|
-
- 组件宿主下发 `componentMode=true`、可序列化 `componentData` 与 `permissionContext`;子应用用 `dev-component:resize` 同步高度,用 `dev-component:event` 回传 `update:modelValue`、`CallbackFormValueChange`、`FormSet` 或 `ParentFormSet`。不传 Vue 实例、函数、循环引用或 `ParentV8`,不直接操作父页面 DOM。
|
|
182
|
-
- 表单嵌入验收必须覆盖 Add/Edit/View/只读、初始值与回写、自动高度、窄屏、暗色主题,以及当前菜单 `ModuleEngineKey` 下的有权/无权账号。
|
|
183
|
-
- `DevComponent` 配置了非空字段标题时必须正常渲染 Label;只有标题本身为空时才允许隐藏,
|
|
184
|
-
不能按组件类型全局吞掉业务标题。`el-form--label-top` 下的字段级 `Button` 仍保留与其它
|
|
185
|
-
控件等高的不可见 Label 占位,使按钮对齐控件区而不是对齐标题行。
|
|
186
|
-
- 字段显式配置 `FormLabelPosition=left/right/top` 时优先于子表、代码编辑器等特殊组件的默认
|
|
187
|
-
`top` 布局;移动端仍可统一回落到 `top`。验收时必须在真实设计器保存后回读该字段配置。
|
|
188
|
-
- 同一标签行同时显示 `Label` 与 `Description` 时,业务 Label 不允许收缩或省略;说明文字使用
|
|
189
|
-
剩余宽度并以省略号截断,完整说明通过 Element Plus tooltip 提供。自定义组件内部不得再次
|
|
190
|
-
输出与宿主字段相同的标题;需要补充的是说明或安全提示。
|
|
191
|
-
- 权限树勾选子菜单时必须补齐全部祖先菜单的 `Read` 权限,祖先不得被动继承子菜单的增删改查;
|
|
192
|
-
这样既保证路由可见,又避免扩大业务操作权限。
|
|
208
|
+
- 多租户共用且与主框架强耦合的 Vue 组件,路径必须稳定并纳入 `Microi.Client` 源码/构建。
|
|
209
|
+
- 支持 Add/Edit/View、只读、必填、清空、校验、移动端和暗色主题。
|
|
210
|
+
- 不在组件内绕过 FormEngine 权限直接访问任意表。
|
|
211
|
+
- 复杂但租户独有、需要固定嵌入表单的区域,优先使用 `DevComponent` + MicroService 路由;临时打开的复杂页面使用 `V8.OpenAppDialog`,都避免把客户逻辑打进主前端。
|
|
212
|
+
- MicroService 表单嵌入使用 `microi.routes.json` 页面级 `LegacyComponentPaths` 作为稳定别名,字段 `Config.DevComponentPath` 与其匹配。主前端存在同路径 Vue 文件时本地优先;不存在时平台自动加载对应 `sys_microiservice_page.RoutePath`。新别名不得与 `/src/views` 真实文件冲突。
|
|
213
|
+
- 组件宿主下发 `componentMode=true`、可序列化 `componentData` 与 `permissionContext`;子应用用 `dev-component:resize` 同步高度,用 `dev-component:event` 回传 `update:modelValue`、`CallbackFormValueChange`、`FormSet` 或 `ParentFormSet`。不传 Vue 实例、函数、循环引用或 `ParentV8`,不直接操作父页面 DOM。
|
|
214
|
+
- 表单嵌入验收必须覆盖 Add/Edit/View/只读、初始值与回写、自动高度、窄屏、暗色主题,以及当前菜单 `ModuleEngineKey` 下的有权/无权账号。
|
|
215
|
+
- `DevComponent` 配置了非空字段标题时必须正常渲染 Label;只有标题本身为空时才允许隐藏,
|
|
216
|
+
不能按组件类型全局吞掉业务标题。`el-form--label-top` 下的字段级 `Button` 仍保留与其它
|
|
217
|
+
控件等高的不可见 Label 占位,使按钮对齐控件区而不是对齐标题行。
|
|
218
|
+
- 字段显式配置 `FormLabelPosition=left/right/top` 时优先于子表、代码编辑器等特殊组件的默认
|
|
219
|
+
`top` 布局;移动端仍可统一回落到 `top`。验收时必须在真实设计器保存后回读该字段配置。
|
|
220
|
+
- 同一标签行同时显示 `Label` 与 `Description` 时,业务 Label 不允许收缩或省略;说明文字使用
|
|
221
|
+
剩余宽度并以省略号截断,完整说明通过 Element Plus tooltip 提供。自定义组件内部不得再次
|
|
222
|
+
输出与宿主字段相同的标题;需要补充的是说明或安全提示。
|
|
223
|
+
- 权限树勾选子菜单时必须补齐全部祖先菜单的 `Read` 权限,祖先不得被动继承子菜单的增删改查;
|
|
224
|
+
这样既保证路由可见,又避免扩大业务操作权限。
|
|
193
225
|
|
|
194
226
|
## 固定审计字段
|
|
195
227
|
|
|
@@ -20,6 +20,18 @@ Microi 吾码低代码提供 **三种** 表单分组能力,但每种都有明
|
|
|
20
20
|
才评估 Drawer;不能用 Drawer 代替 Tabs/CollapseGroup 的信息架构。Dialog 统一使用居中、可拖动、
|
|
21
21
|
大圆角弹层;Drawer 贴边且不使用大圆角。
|
|
22
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
|
+
|
|
23
35
|
<!-- microi-progressive:begin -->
|
|
24
36
|
<!-- microi-progressive:chunk id=microi-form-layout-000 sha256=cade6a415454aa04f5fcf840e6d9df1323ac9751c0e3c8e1b07b360007413819 -->
|
|
25
37
|
## 1. 三种分组能力速查
|
|
@@ -133,8 +145,10 @@ V8 事件中可用 `V8.HideFormTab('tabId')` / `V8.ShowFormTab('tabId')` / `V8.C
|
|
|
133
145
|
- 字段数 13~30 的表单,必须有可见的**业务分组**(Tab 或 CollapseGroup 二选一),不能让用户上下滚动 5 屏找字段。
|
|
134
146
|
- 创建 CollapseGroup 分组时,必须设置 `Icon`(如 `fas fa-calculator` / `fas fa-info-circle`),不要默认空白。
|
|
135
147
|
- 任何 Tab / CollapseGroup 都必须有 `Description` 解释分组用途,不要只放一个标题。
|
|
136
|
-
- 每个 CollapseGroup 必须回读到 `FormWidth=24`;`Config.CollapseGroup.ShowFieldCount` 默认必须为 `true`。
|
|
137
|
-
-
|
|
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 项`。
|
|
138
152
|
- 表级分组方向完整支持 `TabsPosition=left/top/right/bottom`;每个方向都要检查标题、副标题、动态角标和选中指示线,纵向指示线端点固定为直角。
|
|
139
153
|
- 修改 `diy_table.Tabs` 或 `diy_field.Tab` / `Config.CollapseGroup` / `Config.FieldTabs` 后,必须调用 `microi_refresh_schema_cache`。
|
|
140
154
|
- Tab 内嵌套 CollapseGroup 时,CollapseGroup 必须设 `DefaultCollapsed=true`(默认收起),避免 Tab 内继续被折叠分组抢首屏空间。
|
|
@@ -9,6 +9,12 @@ description: Microi 吾码从自然语言交付完整系统的总控规范。用
|
|
|
9
9
|
|
|
10
10
|
本 Skill 来自一次完整业务系统交付复盘。目标是让下一套 OA、ERP、MES、CRM、商城、预约、互联网项目等 Microi 系统少走返工路:先固定事实源,再用 MCP 正确建模,最后用可视化和业务闭环测试证明可交付。
|
|
11
11
|
|
|
12
|
+
每张由 AI/MCP 创建的业务表都必须同时设计默认表单 Banner,不能只建字段和菜单。完整
|
|
13
|
+
Manifest 使用 `tables[].formBanner`;未显式配置时仍按字段类型选择业务编号/名称标题、
|
|
14
|
+
客户/项目副标题、首个 `ImgUpload`、状态/类型标签和真实数值指标,并写入 `diy_table`
|
|
15
|
+
语义字段。跨表统计由接口引擎批量返回,禁止随机数、固定演示值和 N+1;Banner 不属于
|
|
16
|
+
模块引擎或 `sys_menu`。逐步建模在字段完成后调用 `microi_configure_form_banner` 回读验收。
|
|
17
|
+
|
|
12
18
|
<!-- microi-progressive:begin -->
|
|
13
19
|
<!-- microi-progressive:chunk id=microi-system-delivery-000 sha256=b09c3f2d05e2927322de0c42913f85813296e9001bccf31b6dc85779cbe3099f -->
|
|
14
20
|
## 交付总原则
|
|
@@ -19,8 +25,8 @@ description: Microi 吾码从自然语言交付完整系统的总控规范。用
|
|
|
19
25
|
4. **本地改完必须远端验收**:V8 文件、表单事件、菜单按钮、数据源、工作流、页面配置等不能只改本地文件。必须写入远端数据库,并通过 HTTP 或平台工具回读确认。
|
|
20
26
|
5. **测试不等于接口能通**:交付前必须跑构建、接口契约、真实登录、核心写流程、截图、人眼复核、网络 404/5xx 守卫、远端同步状态。
|
|
21
27
|
6. **生产数据谨慎优先**:涉及真实会员、余额、积分、订单、库存、卡券、收益、佣金、分润等资金/资产数据时,先确认服务器、租户、目标表、筛选条件和影响范围,再执行 MCP、接口引擎或 SQL 写操作。除用户明确要求清理/重置或必须修复错误数据外,不得擅自批量改真实数据。
|
|
22
|
-
7. **默认按分布式交付**:任何后端能力都假设会有至少两个节点连接同一数据库和 Redis,并经历滚动升级、重复投递与节点硬重启。定时任务/消费者使用分布式租约且业务本身幂等;会话、票据和任务状态使用共享存储;新旧版本并存时采用“先扩展、后迁移、再收缩”。只在单节点验证通过不能视为完整交付。
|
|
23
|
-
8. **业务逻辑默认接口引擎、元数据升级默认应用商城**:先用低代码 CRUD/事件,再用接口引擎;只缺底层原子能力时先扩展 V8,只有协议/鉴权/密钥隔离/运行时内核才进入 C#。表、字段、Tab、菜单、权限、引擎、页面和任务等可打包资源不得新增 `Microi.Upgrade` 定制类;官方开发者通过 `microi_itdos` 发布官方应用后再由目标租户 MCP 更新,无官方权限时只升级自己的租户。
|
|
28
|
+
7. **默认按分布式交付**:任何后端能力都假设会有至少两个节点连接同一数据库和 Redis,并经历滚动升级、重复投递与节点硬重启。定时任务/消费者使用分布式租约且业务本身幂等;会话、票据和任务状态使用共享存储;新旧版本并存时采用“先扩展、后迁移、再收缩”。只在单节点验证通过不能视为完整交付。
|
|
29
|
+
8. **业务逻辑默认接口引擎、元数据升级默认应用商城**:先用低代码 CRUD/事件,再用接口引擎;只缺底层原子能力时先扩展 V8,只有协议/鉴权/密钥隔离/运行时内核才进入 C#。表、字段、Tab、菜单、权限、引擎、页面和任务等可打包资源不得新增 `Microi.Upgrade` 定制类;官方开发者通过 `microi_itdos` 发布官方应用后再由目标租户 MCP 更新,无官方权限时只升级自己的租户。
|
|
24
30
|
|
|
25
31
|
<!-- /microi-progressive:chunk -->
|
|
26
32
|
<!-- microi-progressive:chunk id=microi-system-delivery-001 sha256=174d99145946baf94a5eee934fc1453921fa7eed544b853f86be515582dc1343 -->
|
|
@@ -56,14 +62,14 @@ AI 零代码交付不能只验证管理员帐号和页面能打开。任何涉
|
|
|
56
62
|
|
|
57
63
|
### 保护表、控制面与缓存
|
|
58
64
|
|
|
59
|
-
- SaaS、接口引擎、表/字段、菜单角色、用户、任务、数据源、MQ/MQTT、页面、打印、工作流、数据库、应用商城、AI 与安全审计等保护表,普通客户端 `Level < 9999` 硬拒绝;菜单或表权限不能覆盖。
|
|
65
|
+
- SaaS、接口引擎、表/字段、菜单角色、用户、任务、数据源、MQ/MQTT、页面、打印、工作流、数据库、应用商城、AI 与安全审计等保护表,普通客户端 `Level < 9999` 硬拒绝;菜单或表权限不能覆盖。
|
|
60
66
|
- 创建 V8、接口引擎、任务、数据源和 Redis 管理等控制面 API 继续要求 `Level >= 9999`。不能只靠前端隐藏菜单。
|
|
61
67
|
- 权限缓存使用按 `OsClient` 隔离的共享 Redis `epoch`、用户快照、短 TTL L1/L2。用户/角色/菜单/权限变化后提升 `epoch`;验收至少使用两个节点确认无需清 Redis或重启即可生效。
|
|
62
68
|
- Upgrade15 只清理普通角色的保护表直接授权,不能删除正常业务菜单权限。
|
|
63
69
|
|
|
64
70
|
### 上传、私有文件与 SaaS
|
|
65
71
|
|
|
66
|
-
- 上传业务默认值为 100 MB/文件、200 MB/次、10 文件、2 GB/帐号/日、20 GB/租户/日。有效值只按当前租户 `sys_osclients` → 代码安全默认值解析,租户可以提高或降低业务默认值;不得为上传开关、额度或硬上限新增 API 环境变量或 `appsettings` 节点。最终仍受代码内不可突破的灾难保护、HTTP/Multipart/Form 和反向代理上限约束。共享 Redis 原子预留,Redis 故障失败关闭。
|
|
72
|
+
- 上传业务默认值为 100 MB/文件、200 MB/次、10 文件、2 GB/帐号/日、20 GB/租户/日。有效值只按当前租户 `sys_osclients` → 代码安全默认值解析,租户可以提高或降低业务默认值;不得为上传开关、额度或硬上限新增 API 环境变量或 `appsettings` 节点。最终仍受代码内不可突破的灾难保护、HTTP/Multipart/Form 和反向代理上限约束。共享 Redis 原子预留,Redis 故障失败关闭。
|
|
67
73
|
- 普通交互式上传强制私有桶,一级目录只能是 `file`、`img`、`avatar`、`editor`。可信后端 V8 仍受全局文件大小硬上限。
|
|
68
74
|
- 普通客户端私有文件签名必须提交 `FormEngineKey`、`FormDataId`、`FieldId`、`SysMenuId` 并验证记录字段真实引用;不能把后端 `V8.Method.GetPrivateFileUrl({FilePathName})` 的可信调用方式照搬到浏览器。
|
|
69
75
|
- Upgrade16 六个上传字段全部可空,空值保持老租户兼容;升级后回读字段元数据、租户值并刷新 SaaS 缓存。
|
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
+
新建业务表的字段落地后必须配置默认表单 Banner:完整 Manifest 使用
|
|
6
|
+
`tables[].formBanner`,逐步建模调用 `microi_configure_form_banner`。标题、图片、标签和
|
|
7
|
+
统计都应来自真实字段或真实接口引擎;配置写 `diy_table`,禁止写入 `sys_menu`。即使用户
|
|
8
|
+
没有逐项指定,也必须写入类型感知的合理默认值,不能交付空 Banner。
|
|
9
|
+
|
|
5
10
|
<!-- microi-progressive:chunk id=microi-system-delivery-005 sha256=e27ee98421974395b858927ab7b7fbebe27f314e54a8f616064b9c77c01ba808 -->
|
|
6
11
|
## 标准工作流
|
|
7
12
|
|
|
@@ -23,8 +28,8 @@
|
|
|
23
28
|
- 对资金/资产类生产数据执行清理、重算、修复、补发、扣减前,必须留下可审计痕迹:中文备注 SQL、维护接口说明、执行时间、影响行数、回读验证结果。能用小范围条件时不要全表更新。
|
|
24
29
|
- 写入菜单时,业务按钮一次性配齐 `MoreBtns`、`FormBtns`、`PageBtns`、`BatchSelectMoreBtns`、`PageTabs`,按钮前端只负责交互,后端逻辑放接口引擎。
|
|
25
30
|
- 写入后台菜单时必须至少规划两级菜单树:先创建业务域父菜单,再把 CRUD、报表、日志、设置模块挂到对应父菜单。不要把客户、设备、工单、报告、日志、配置等所有模块直接创建为一级菜单。Manifest dry-run 和最终交付说明都必须列出菜单树。
|
|
26
|
-
- 新建前端 MicroService 时,必须先 `microi_list_applications` 盘点,再用 `microi_scaffold_vue_microservice` 在当前租户 `AI应用/{appKey}` 做预演和确认创建;构建后依次同步私有源码、发布公有产物、回读页面 Id。每个菜单通过 `microi_create_module` 一次绑定 `MicroServiceId/MicroServicePageId/MicroServiceRoutePath/MicroServiceKey`,写后用 `microi_get_module` 回读,不得把普通 URL 菜单的创建成功误报成微服务菜单已交付。
|
|
27
|
-
- 完整系统 Manifest 中的 MicroService 菜单使用 `microServiceKey + microServiceRoutePath` 作为跨租户可移植引用;`microi_generate_system` 必须在任何写入前回读并解析当前租户的服务/页面 Id。直接调用 `microi_create_module` 时仍须一次提供全部四个绑定字段。
|
|
31
|
+
- 新建前端 MicroService 时,必须先 `microi_list_applications` 盘点,再用 `microi_scaffold_vue_microservice` 在当前租户 `AI应用/{appKey}` 做预演和确认创建;构建后依次同步私有源码、发布公有产物、回读页面 Id。每个菜单通过 `microi_create_module` 一次绑定 `MicroServiceId/MicroServicePageId/MicroServiceRoutePath/MicroServiceKey`,写后用 `microi_get_module` 回读,不得把普通 URL 菜单的创建成功误报成微服务菜单已交付。
|
|
32
|
+
- 完整系统 Manifest 中的 MicroService 菜单使用 `microServiceKey + microServiceRoutePath` 作为跨租户可移植引用;`microi_generate_system` 必须在任何写入前回读并解析当前租户的服务/页面 Id。直接调用 `microi_create_module` 时仍须一次提供全部四个绑定字段。
|
|
28
33
|
- Windows 上脚手架从临时目录原子改名时,杀毒软件或索引器可能短暂返回 `EPERM/EACCES/EBUSY`;MCP 应做有上限的短重试并保持原子改名,重试仍失败才清理临时目录并报错,禁止改成逐文件覆盖目标目录。
|
|
29
34
|
- 编译产物优先调用 `microi_publish_application_directory_stream`。流式端点失败时必须检查 `uploadedCount/retrySafe`:只有 `uploadedCount=0` 且 `retrySafe=true`、并且产物较小时,才可临时回退 `microi_publish_microservice`;已上传部分文件时先按版本和哈希回读,禁止无判断重复发布。回退与远端版本缺口必须写进交付结论。
|
|
30
35
|
- `microi_get_application_context` 返回文件清单不等于源码可读;必须检查 `ContentsComplete/ContentErrorCount` 以及逐文件 `ContentReadError`。MinIO 服务端读取私有源码应走内网端点,不能因公网代理拒绝私有桶而把 `IncludedContents=true` 误判为完整上下文。
|
|
@@ -41,19 +46,19 @@
|
|
|
41
46
|
- EntityHero、MetricStrip、ActionGrid、ResponsiveSection 是独立视图区块,不是 `diy_field` 数据字段,也不能用 DevComponent 或虚拟字段模拟。
|
|
42
47
|
- 小程序仅执行白名单 ActionSchema 和声明式显隐/参数映射,不执行任意前端 V8。复杂业务动作调用接口引擎,重要校验进入后端表单事件。
|
|
43
48
|
|
|
44
|
-
绑定 `diyTableId` 创建 CRUD 菜单时,必须配置或允许 MCP/后端自动推断 `TableDiyFieldIds`、`SelectFields`、`SearchFieldIds`、`SortFieldIds`、`NotShowFields`、`StatisticsFields`、`MobileListFields`、`CardTitleTagFields`、`CardBottomTagFields`、`DefaultOrderBy`。列表列、搜索列、移动端卡片列不能为空白;`Id/XxxId/XxxIds`、系统字段、布局控件和富文本/上传/地图/子表等重字段默认不展示在列表。
|
|
45
|
-
|
|
46
|
-
搜索字段默认覆盖名称/标题/编号、状态/类型/分类、负责人/部门/客户、日期时间;金额、价格、数量、积分、余额、人数等数值字段默认进入 `StatisticsFields`。选择类、开关、部门、树、级联、地址等字段应尽量使用等值筛选。
|
|
47
|
-
|
|
48
|
-
每个可见业务模块还必须通过视觉交付门禁:逐字段设置合理列表宽度;每个模块都有紧凑
|
|
49
|
-
标题、业务副标题和 2~4 个真实动态指标;只给少量重要菜单设置行动型侧栏角标;为状态
|
|
50
|
-
PageTabs 和有决策价值的更多按钮设置批量统计角标;PC 至少一个合理宽度且去重普通列的
|
|
51
|
-
复合主列;复合列一般只用“主字段 + 1 个 Lines”组成双行,可以配置多个双行复合列,
|
|
52
|
-
不要把两个 Lines 堆进同一列形成三行高表格;移动端按图片/标题/副标题/顶部/状态/
|
|
53
|
-
右侧金额/正文/Meta/底部规划动态区域。
|
|
54
|
-
自动生成只是最低兜底,AI 必须按业务表、状态机和数据口径精调。禁止用随机数、固定演示数
|
|
55
|
-
或无来源值装饰指标;当前页求和必须明确标注“本页”。`EnableViewSchema` 只控制
|
|
56
|
-
Detail/Edit 自定义表单,不能用它关闭 List/Card 展示设计。
|
|
49
|
+
绑定 `diyTableId` 创建 CRUD 菜单时,必须配置或允许 MCP/后端自动推断 `TableDiyFieldIds`、`SelectFields`、`SearchFieldIds`、`SortFieldIds`、`NotShowFields`、`StatisticsFields`、`MobileListFields`、`CardTitleTagFields`、`CardBottomTagFields`、`DefaultOrderBy`。列表列、搜索列、移动端卡片列不能为空白;`Id/XxxId/XxxIds`、系统字段、布局控件和富文本/上传/地图/子表等重字段默认不展示在列表。
|
|
50
|
+
|
|
51
|
+
搜索字段默认覆盖名称/标题/编号、状态/类型/分类、负责人/部门/客户、日期时间;金额、价格、数量、积分、余额、人数等数值字段默认进入 `StatisticsFields`。选择类、开关、部门、树、级联、地址等字段应尽量使用等值筛选。
|
|
52
|
+
|
|
53
|
+
每个可见业务模块还必须通过视觉交付门禁:逐字段设置合理列表宽度;每个模块都有紧凑
|
|
54
|
+
标题、业务副标题和 2~4 个真实动态指标;只给少量重要菜单设置行动型侧栏角标;为状态
|
|
55
|
+
PageTabs 和有决策价值的更多按钮设置批量统计角标;PC 至少一个合理宽度且去重普通列的
|
|
56
|
+
复合主列;复合列一般只用“主字段 + 1 个 Lines”组成双行,可以配置多个双行复合列,
|
|
57
|
+
不要把两个 Lines 堆进同一列形成三行高表格;移动端按图片/标题/副标题/顶部/状态/
|
|
58
|
+
右侧金额/正文/Meta/底部规划动态区域。
|
|
59
|
+
自动生成只是最低兜底,AI 必须按业务表、状态机和数据口径精调。禁止用随机数、固定演示数
|
|
60
|
+
或无来源值装饰指标;当前页求和必须明确标注“本页”。`EnableViewSchema` 只控制
|
|
61
|
+
Detail/Edit 自定义表单,不能用它关闭 List/Card 展示设计。
|
|
57
62
|
|
|
58
63
|
字段较多的表单必须做视觉分组,但**优先用 `CollapseGroup` 折叠分组**,**只有大业务域(≥8 字段)才用 Tabs**。详细决策表、Config JSON 示例、字段数阈值和回读验收必须先读 `microi-form-layout/SKILL.md`,再按以下快速决策表执行:
|
|
59
64
|
|
|
@@ -70,12 +75,12 @@ Detail/Edit 自定义表单,不能用它关闭 List/Card 展示设计。
|
|
|
70
75
|
- ❌ **禁止**为 ≤7 字段的业务域单独建 Tab(必须改用 `CollapseGroup`,否则用户必须点击 Tab 才能看到 3~5 个字段,违反"首屏信息密度"原则)。
|
|
71
76
|
- ❌ **禁止**为 13~30 字段的表把所有字段平铺(必须用 Tab 或 CollapseGroup 分组)。
|
|
72
77
|
- ❌ **禁止**在用户没有要求时使用 `Component='Tabs'` 字段级控件(更优先用 `diy_table.Tabs` 表级 Tab)。
|
|
73
|
-
- ❌ **禁止**让 CollapseGroup 依赖空 `FormWidth`;CollapseGroup 默认必须显式保存 `FormWidth=24`,并默认设置 `Config.CollapseGroup.ShowFieldCount=true`。Tabs / Divider / Alert 按各自运行时规范处理。
|
|
78
|
+
- ❌ **禁止**让 CollapseGroup 依赖空 `FormWidth`;CollapseGroup 默认必须显式保存 `FormWidth=24`,并默认设置 `Config.CollapseGroup.ShowFieldCount=true`。Tabs / Divider / Alert 按各自运行时规范处理。
|
|
74
79
|
- ❌ **禁止**只创建 Tab 不写字段的 `Tab` 归属(每个 Tab 必须有至少 1 个非空 `Tab` 的字段)。
|
|
75
80
|
|
|
76
81
|
典型反例:`yutaoliaojieguo` 表 13 字段有"MRP 运算"3 字段 Tab — 这是错误的,应该用 `CollapseGroup` 把 MRP 3 字段收起(默认展开),让用户第一屏看到基础信息 + MRP 字段而不是必须点击 Tab 切换。详见 `microi-form-layout/SKILL.md` 的"反例参考"章节。
|
|
77
82
|
|
|
78
|
-
表单控件选择必须参考 `Microi.Client/src/views/form-engine/diy-field-component/diy-component-list.json`,包括文本、数字、日期、选择、树、部门、地址、关联表单、弹窗选表、子表、上传、富文本、代码、地图、二维码、布局控件等;普通字段不手动设置 `FormWidth`,整行控件才设 `24`。CollapseGroup 必须显式设 `24`,并默认开启 `ShowFieldCount`。
|
|
83
|
+
表单控件选择必须参考 `Microi.Client/src/views/form-engine/diy-field-component/diy-component-list.json`,包括文本、数字、日期、选择、树、部门、地址、关联表单、弹窗选表、子表、上传、富文本、代码、地图、二维码、布局控件等;普通字段不手动设置 `FormWidth`,整行控件才设 `24`。CollapseGroup 必须显式设 `24`,并默认开启 `ShowFieldCount`。
|
|
79
84
|
|
|
80
85
|
### 3. 主子表与关联表单设计
|
|
81
86
|
|
|
@@ -86,33 +91,33 @@ Detail/Edit 自定义表单,不能用它关闭 List/Card 展示设计。
|
|
|
86
91
|
回查索引,并创建 `Display=0`、`AppDisplay=0`、`HasChild=0` 的子表菜单。
|
|
87
92
|
- `JoinForm` 只用于主表保存一个目标 Id、并嵌入一条独立目标记录完整表单的 N:1/1:1
|
|
88
93
|
场景;目标表不能是当前表。需要列表、多行增删改或可能有多条记录时禁止使用。
|
|
89
|
-
- `TableChild` 的 `TableChildTableId`、`TableChildSysMenuId`、`TableChildFkFieldName`
|
|
90
|
-
必须引用回读后的真实资源。完整系统 Manifest 使用
|
|
91
|
-
`relation:{cardinality:"1:N",targetTable,childForeignKey,childModule}`,生成器按“全部表与
|
|
92
|
-
普通字段 → 隐藏子表菜单 → 关系字段”分阶段解析当前租户 Id;禁止猜 Id,禁止退化成
|
|
93
|
-
`JoinForm`。
|
|
94
|
-
- 基数不清楚时必须在远端写入前询问用户。调用 `microi_plan_system` / `dryRun` 前先做
|
|
95
|
-
关系语义审查。MCP 会硬性拒绝“1:N + JoinForm”、自关联 JoinForm、缺主/子外键、缺
|
|
96
|
-
`Display=0/AppDisplay=0/HasChild=0` 隐藏子菜单或缺 `(OsClient, FK)` 回查索引;AI
|
|
97
|
-
不得改用直接单字段工具绕过。
|
|
98
|
-
- 复用已有子表时,优先复用源 `TableChild` 已验证、当前用户有权限的子表菜单;只有不存在
|
|
99
|
-
可复用菜单时才新建隐藏菜单。设计器显示但运行表单不显示时,必须先检查主表 `InFormV8`
|
|
100
|
-
是否通过 `V8.FieldSet`/`hideField` 把目标 TableChild 设为不可见。
|
|
101
|
-
|
|
102
|
-
`JoinForm` 的可移植 Manifest 只写名称,不写租户 Id:
|
|
103
|
-
|
|
104
|
-
```json
|
|
105
|
-
{
|
|
106
|
-
"name": "CustomerProfile",
|
|
107
|
-
"label": "客户资料",
|
|
108
|
-
"component": "JoinForm",
|
|
109
|
-
"relation": {
|
|
110
|
-
"cardinality": "N:1",
|
|
111
|
-
"targetTable": "Biz_Customer",
|
|
112
|
-
"joinFieldName": "CustomerId"
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
```
|
|
94
|
+
- `TableChild` 的 `TableChildTableId`、`TableChildSysMenuId`、`TableChildFkFieldName`
|
|
95
|
+
必须引用回读后的真实资源。完整系统 Manifest 使用
|
|
96
|
+
`relation:{cardinality:"1:N",targetTable,childForeignKey,childModule}`,生成器按“全部表与
|
|
97
|
+
普通字段 → 隐藏子表菜单 → 关系字段”分阶段解析当前租户 Id;禁止猜 Id,禁止退化成
|
|
98
|
+
`JoinForm`。
|
|
99
|
+
- 基数不清楚时必须在远端写入前询问用户。调用 `microi_plan_system` / `dryRun` 前先做
|
|
100
|
+
关系语义审查。MCP 会硬性拒绝“1:N + JoinForm”、自关联 JoinForm、缺主/子外键、缺
|
|
101
|
+
`Display=0/AppDisplay=0/HasChild=0` 隐藏子菜单或缺 `(OsClient, FK)` 回查索引;AI
|
|
102
|
+
不得改用直接单字段工具绕过。
|
|
103
|
+
- 复用已有子表时,优先复用源 `TableChild` 已验证、当前用户有权限的子表菜单;只有不存在
|
|
104
|
+
可复用菜单时才新建隐藏菜单。设计器显示但运行表单不显示时,必须先检查主表 `InFormV8`
|
|
105
|
+
是否通过 `V8.FieldSet`/`hideField` 把目标 TableChild 设为不可见。
|
|
106
|
+
|
|
107
|
+
`JoinForm` 的可移植 Manifest 只写名称,不写租户 Id:
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"name": "CustomerProfile",
|
|
112
|
+
"label": "客户资料",
|
|
113
|
+
"component": "JoinForm",
|
|
114
|
+
"relation": {
|
|
115
|
+
"cardinality": "N:1",
|
|
116
|
+
"targetTable": "Biz_Customer",
|
|
117
|
+
"joinFieldName": "CustomerId"
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
116
121
|
|
|
117
122
|
`JoinForm` / `OpenTable` 等单记录关联仍需兼顾可读字段,不能只生成一个裸 `XxxId`。
|
|
118
123
|
|
|
@@ -143,7 +148,7 @@ Detail/Edit 自定义表单,不能用它关闭 List/Card 展示设计。
|
|
|
143
148
|
### 5. V8 接口引擎与事件
|
|
144
149
|
|
|
145
150
|
- 接口引擎代码必须格式化、语义版本可追踪、可回读。
|
|
146
|
-
- 保存后必须走 HTTP 稳定路径 `/apiengine/{ApiEngineKey}` 并通过 `osclient` Header 传租户做 smoke test;只用内部 run 通过不够。普通 POST/PUT/PATCH/DELETE 禁止追加 `--OsClient--...--`;只有调用方无法设置 Header/Query 的第三方回调才使用 `--OsClient--{OsClient}--`,可使用 Query 时固定为 `?OsClient=`。
|
|
151
|
+
- 保存后必须走 HTTP 稳定路径 `/apiengine/{ApiEngineKey}` 并通过 `osclient` Header 传租户做 smoke test;只用内部 run 通过不够。普通 POST/PUT/PATCH/DELETE 禁止追加 `--OsClient--...--`;只有调用方无法设置 Header/Query 的第三方回调才使用 `--OsClient--{OsClient}--`,可使用 Query 时固定为 `?OsClient=`。
|
|
147
152
|
- 返回必须是标准 DosResult,除明确文件/HTML场景外,不允许返回字符串 `null`、空响应、非 JSON。
|
|
148
153
|
- 业务异常必须给用户可理解的 `Msg`,不能吞异常或只 `catch(e){}`。
|
|
149
154
|
- 定时任务、超时取消、VIP 过期、自动拒绝、库存释放等跨时间逻辑,必须建 Job 或可被 Job 调用的接口引擎。
|
|
@@ -119,11 +119,11 @@ Iframe 不把长期 Token、密码或连接串放 URL。第三方单点登录使
|
|
|
119
119
|
|
|
120
120
|
顶层 PC 数据列表默认使用紧凑的新模块标题样式;即使未启用自定义表单视图,也不能退回无标题的旧外观。无指标头部固定 `44px`、含指标头部固定 `62px`,连同间距总纵向占用约 `50px / 68px`。子表、关联表、嵌入表不重复显示,移动端由固定导航栏承载标题。`Scene=List/Card` 的个性化标题、指标、复合列和卡片配置存在时必须直接生效;`EnableViewSchema` 只控制 Detail/Edit 自定义表单视图。
|
|
121
121
|
|
|
122
|
-
PC 列表的固定结构顺序是“模块 Hero(标题/副标题/动态指标)→ PageTabs → 查询与表格”,Hero 必须渲染在页面多 Tab 上方。头部只使用一次性入场和一次性轻量光效,禁止持续循环动画;`prefers-reduced-motion: reduce` 必须关闭动画和过渡。
|
|
123
|
-
|
|
124
|
-
PageTabs 通过 `TargetSysMenuId` 切换不同模块/表时,入口模块必须作为稳定宿主:客户端在同一个 `diy-table` 实例内加载目标模块的菜单、表、字段与列表数据,只更新当前 URL 的 `Tab` 查询参数,不替换路由、面包屑、顶部访问标签或宿主 Hero。入口模块只配置一组 PageTabs;目标菜单可隐藏导航,但只需保留目标表格设计和角色权限,不得复制同一组 PageTabs。隐藏目标菜单统一设置 `ParentId=入口菜单Id、Display=0、AppDisplay=0、HasChild=0、PageTabs=[]`,入口菜单保持 `HasChild=0` 以继续作为可点击业务入口。模块设计器必须用可搜索菜单树显示 `TargetSysMenuId` 的模块名称,不能只在运行时 JSON 中保存不可见 Id。切换时必须中止旧请求并以模块上下文版本丢弃迟到响应,失败时回滚原模块。
|
|
125
|
-
|
|
126
|
-
模块首屏或跨模块切换期间,Hero 标题/指标、PageTabs、工具栏与列表必须显示与最终布局同尺寸的主题化骨架屏;不能先渲染空白旧布局再整体位移。骨架屏同样遵守 `prefers-reduced-motion: reduce`,并在无指标或无 PageTabs 时按元数据提示隐藏对应占位。
|
|
122
|
+
PC 列表的固定结构顺序是“模块 Hero(标题/副标题/动态指标)→ PageTabs → 查询与表格”,Hero 必须渲染在页面多 Tab 上方。头部只使用一次性入场和一次性轻量光效,禁止持续循环动画;`prefers-reduced-motion: reduce` 必须关闭动画和过渡。
|
|
123
|
+
|
|
124
|
+
PageTabs 通过 `TargetSysMenuId` 切换不同模块/表时,入口模块必须作为稳定宿主:客户端在同一个 `diy-table` 实例内加载目标模块的菜单、表、字段与列表数据,只更新当前 URL 的 `Tab` 查询参数,不替换路由、面包屑、顶部访问标签或宿主 Hero。入口模块只配置一组 PageTabs;目标菜单可隐藏导航,但只需保留目标表格设计和角色权限,不得复制同一组 PageTabs。隐藏目标菜单统一设置 `ParentId=入口菜单Id、Display=0、AppDisplay=0、HasChild=0、PageTabs=[]`,入口菜单保持 `HasChild=0` 以继续作为可点击业务入口。模块设计器必须用可搜索菜单树显示 `TargetSysMenuId` 的模块名称,不能只在运行时 JSON 中保存不可见 Id。切换时必须中止旧请求并以模块上下文版本丢弃迟到响应,失败时回滚原模块。
|
|
125
|
+
|
|
126
|
+
模块首屏或跨模块切换期间,Hero 标题/指标、PageTabs、工具栏与列表必须显示与最终布局同尺寸的主题化骨架屏;不能先渲染空白旧布局再整体位移。骨架屏同样遵守 `prefers-reduced-motion: reduce`,并在无指标或无 PageTabs 时按元数据提示隐藏对应占位。
|
|
127
127
|
|
|
128
128
|
`ViewSchema` 是模块级视图,不写入已废弃的通用 `DiyConfig`。优先通过 sys_menu“跨端视图”的 `DiyModulePresentationDesigner` 配置;Detail/Edit 使用独立的“自定义表单视图 JSON”,需要完整协议、角色优先级或未知扩展字段时再使用高级 JSON。启用自定义表单视图后仍须:
|
|
129
129
|
|
|
@@ -136,7 +136,7 @@ PageTabs 通过 `TargetSysMenuId` 切换不同模块/表时,入口模块必须
|
|
|
136
136
|
### 重要模块的统计与信息层级
|
|
137
137
|
|
|
138
138
|
- 待办、库存预警、未读、逾期、待收/待付等有行动含义的菜单,主动询问并配置
|
|
139
|
-
`MenuBadgeEnabled=1`
|
|
139
|
+
`MenuBadgeEnabled=1`、`MenuBadgeApiEngineKey` 与说明统计口径的 `MenuBadgeTooltip`。接口统一返回
|
|
140
140
|
`{ Code:1, Data:{ Value: number } }`,并按当前用户权限统计。
|
|
141
141
|
- `Scene=List` 的 `Layout.Hero` 用 `Eyebrow/Title/Description/Metrics` 建立模块标题与
|
|
142
142
|
指标条。相同 `ApiEngineKey` 的指标必须由一个聚合接口批量返回,使用 `ValuePath`
|