@microi.net/cli 6.0.9 → 6.1.1

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.
Files changed (122) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.workbuddy-plugin/marketplace.json +2 -2
  5. package/.workbuddy-plugin/plugin.json +1 -1
  6. package/assets/build-meta.json +5 -5
  7. package/cordis.patch.yml +1 -1
  8. package/package.json +1 -1
  9. package/scripts/mcp-server.js +116 -116
  10. package/scripts/microi-cli.js +1 -1
  11. package/scripts/microi-skills.meta.json +312 -312
  12. package/skills/.microi-skills-version.json +2 -2
  13. package/skills/.progressive-disclosure-manifest.json +45 -45
  14. package/skills/README.md +1 -1
  15. package/skills/ai-engine/SKILL.md +2 -2
  16. package/skills/ai-engine/references/ai-employees.md +48 -48
  17. package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
  18. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +2 -2
  19. package/skills/app-store/SKILL.md +531 -531
  20. package/skills/business-blueprint/SKILL.md +193 -193
  21. package/skills/datasource-engine/SKILL.md +93 -93
  22. package/skills/dos-orm/SKILL.md +105 -105
  23. package/skills/dos-orm/references/api-reference.md +229 -229
  24. package/skills/email-engine/SKILL.md +81 -81
  25. package/skills/email-engine/references/v8-email.md +34 -34
  26. package/skills/job-engine/SKILL.md +176 -176
  27. package/skills/message-notification/SKILL.md +156 -156
  28. package/skills/message-notification/references/contracts.md +102 -102
  29. package/skills/microi/SKILL.md +14 -14
  30. package/skills/microi-ai-app-auth.js +1 -1
  31. package/skills/microi-ai-application/SKILL.md +115 -115
  32. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  33. package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +10 -10
  34. package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +10 -10
  35. package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +10 -10
  36. package/skills/microi-codex/SKILL.md +130 -130
  37. package/skills/microi-codex-installer/SKILL.md +1 -1
  38. package/skills/microi-datasource-mapping/SKILL.md +131 -122
  39. package/skills/microi-db-schema/SKILL.md +175 -175
  40. package/skills/microi-db-schema/references/core-tables.md +695 -695
  41. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  42. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  43. package/skills/microi-db-schema/references/schema.md +646 -646
  44. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  45. package/skills/microi-deployment/SKILL.md +260 -260
  46. package/skills/microi-deployment/references/deployment-matrix.md +109 -109
  47. package/skills/microi-docs-coverage/SKILL.md +133 -133
  48. package/skills/microi-docs-coverage/references/capability-map.md +91 -91
  49. package/skills/microi-form-engine/SKILL.md +338 -338
  50. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  51. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  52. package/skills/microi-left-right-layout/SKILL.md +141 -141
  53. package/skills/microi-microservice/SKILL.md +6 -1
  54. package/skills/microi-microservice/references/runtime-delivery.md +282 -282
  55. package/skills/microi-solution-quotation/SKILL.md +78 -78
  56. package/skills/microi-sso/SKILL.md +102 -102
  57. package/skills/microi-sso/references/acceptance.md +1 -1
  58. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  59. package/skills/microi-sso/references/inbound.md +53 -53
  60. package/skills/microi-sso/references/outbound.md +43 -43
  61. package/skills/microi-system-delivery/SKILL.md +102 -100
  62. package/skills/microi-system-delivery/references/context-quality.md +56 -56
  63. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +11 -11
  64. 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 +12 -12
  65. package/skills/microi-system-delivery/references/progressive-03-/345/256/211/345/205/250/344/270/216/350/267/250/347/253/257/351/252/214/346/224/266.md +71 -71
  66. package/skills/module-engine/SKILL.md +297 -297
  67. package/skills/module-engine/references/module-config.md +204 -204
  68. package/skills/ocr-engine/SKILL.md +113 -113
  69. package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +10 -10
  70. package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +12 -12
  71. package/skills/performance-testing/SKILL.md +227 -227
  72. package/skills/playwright-e2e/SKILL.md +2 -0
  73. package/skills/print-engine/SKILL.md +259 -259
  74. package/skills/production-readonly-audit/SKILL.md +41 -41
  75. package/skills/report-engine/SKILL.md +83 -83
  76. package/skills/search-engine/SKILL.md +75 -75
  77. package/skills/spider-engine/SKILL.md +190 -190
  78. package/skills/system-observability/SKILL.md +264 -264
  79. package/skills/system-observability/references/memory-incident-triage.md +77 -77
  80. package/skills/translate-engine/SKILL.md +140 -140
  81. package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
  82. package/skills/ui-design/references/design-pattern-library.md +184 -184
  83. package/skills/ui-design/references/mci-design-contract.md +163 -163
  84. package/skills/ui-design/references/motion-and-media.md +78 -78
  85. package/skills/ui-design/references/product-flow-recipes.md +94 -94
  86. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  87. package/skills/unity-integration/SKILL.md +178 -178
  88. package/skills/unity-integration/references/ai-app-delivery.md +1 -1
  89. package/skills/unity-integration/references/sdk-api.md +82 -82
  90. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  91. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  92. package/skills/v8-api-config/SKILL.md +400 -400
  93. package/skills/v8-cache-pattern/SKILL.md +320 -320
  94. package/skills/v8-debugging/SKILL.md +284 -284
  95. package/skills/v8-explorer-tree/SKILL.md +228 -228
  96. package/skills/v8-file-upload/SKILL.md +1 -1
  97. package/skills/v8-file-upload/references/cdn-alias-repair.md +13 -13
  98. package/skills/v8-formengine-http/SKILL.md +1 -1
  99. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  100. package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
  101. package/skills/v8-image-processing/SKILL.md +190 -190
  102. package/skills/v8-image-processing/references/api-reference.md +623 -623
  103. package/skills/v8-mongodb/SKILL.md +201 -201
  104. package/skills/v8-mq-mqtt/references/mqtt-production.md +352 -352
  105. package/skills/v8-saas-multi-tenant/SKILL.md +4 -0
  106. package/skills/v8-security/SKILL.md +2 -0
  107. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +9 -3
  108. package/skills/v8-sql-query/SKILL.md +302 -302
  109. package/skills/v8-tcp-integration/SKILL.md +69 -2
  110. package/skills/v8-template-engine/SKILL.md +167 -167
  111. package/skills/v8-utilities/SKILL.md +1 -0
  112. package/skills/v8-utilities/references/client-api-index.md +143 -143
  113. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  114. package/skills/v8-utilities/references/server-api-index.md +2 -1
  115. package/skills/v8-workflow/references/workflow-configuration.md +49 -49
  116. package/skills/vision-engine/SKILL.md +160 -160
  117. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  118. package/skills/workspace-conventions/SKILL.md +168 -162
  119. package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +2 -2
  120. package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +34 -34
  121. package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +6 -6
  122. package/skills/workspace-conventions/references/progressive-04-/345/267/245/344/275/234/345/214/272/344/270/216/345/271/263/345/217/260/344/270/223/351/241/271/344/277/235/351/232/234.md +188 -188
@@ -1,124 +1,124 @@
1
- # 字段数据源、属性与事件
2
-
3
- ## 数据源类型
4
-
5
- | 类型 | 适用场景 | 配置要点 |
6
- |---|---|---|
7
- | `Data` | 显示值和保存值相同的固定数组 | 适合少量稳定枚举 |
8
- | `KeyValue` | 保存 Key、显示 Label | 推荐;便于翻译和状态演进 |
9
- | `Sql` | 基于当前库的受控查询 | 参数化、限制条数、选择明确字段 |
10
- | `DataSource` | 复用数据源引擎 | 使用稳定 DataSourceId/Key |
11
- | `ApiEngine` | 复杂权限、跨表或外部数据 | 接口返回稳定的 Label/Value 字段 |
12
-
13
- KeyValue 示例:
14
-
15
- ```text
16
- draft|草稿,enabled|启用,disabled|禁用
17
- ```
18
-
19
- 对应核心语义:
20
-
21
- ```json
22
- {
23
- "DataSource": "KeyValue",
24
- "SelectLabel": "Value",
25
- "SelectSaveField": "Key"
26
- }
27
- ```
28
-
29
- 动态 SQL 示例只选择必要字段并限制返回量:
30
-
31
- ```json
32
- {
33
- "DataSource": "Sql",
34
- "Sql": "select Id,Name from biz_customer where Name like '%$Keyword$%' limit 0,20",
35
- "SelectLabel": "Name",
36
- "SelectSaveField": "Id",
37
- "DataSourceSqlRemote": true
38
- }
39
- ```
40
-
41
- SQL 仍必须经过平台受控数据源;不要把用户文本拼成标识符或任意 SQL。复杂权限、
42
- 跨库或外部服务使用数据源引擎/接口引擎。
43
-
44
- ## 动态联动
45
-
46
- 字段值变化时可用前端 V8 更新另一个字段的数据源:
47
-
48
- ```javascript
49
- if (V8.LoadMode === 'Design') return;
50
-
51
- var result = await V8.FormEngine.GetTableData('biz_contact', {
52
- _SelectFields: ['Id', 'Name'],
53
- _Where: [['CustomerId', '=', V8.ThisValue]],
54
- _PageIndex: 1,
55
- _PageSize: 100
56
- });
57
-
58
- V8.FieldSet('ContactId', 'Data', result.Code === 1 ? result.Data : []);
59
- ```
60
-
61
- 前端联动不能替代后端权限和提交校验。
62
-
63
- ## 表单生命周期
64
-
65
- | 配置 | 运行端 | 用途 |
66
- |---|---|---|
67
- | `InFormV8` | 前端 | 默认值、字段显隐、初始化交互 |
68
- | `SubmitFormV8` | 前端 | 即时校验;HTTP 直调不会触发 |
69
- | `SubmitBeforeServerV8` | 后端事务内 | 最终校验、加工、阻止提交 |
70
- | `SubmitAfterServerV8` | 后端事务内 | 同事务联动其它表 |
71
- | `OutFormV8` | 前端 | 关闭后刷新/跳转 |
72
- | `DataFilterV8` | 后端 | 每行脱敏/展示加工 |
73
-
74
- 事件代码、版本和表单属性都必须从当前 `diy_table/diy_field` 回读。后端阻止提交:
75
-
76
- ```javascript
77
- if (!V8.Form.Name) return { Code: 0, Msg: '名称不能为空' };
78
- ```
79
-
80
- ## 字段属性
81
-
82
- 常用属性包括 `Visible`、`AppVisible`、`Required`、`Readonly`、`Data`、
83
- `Config`、`FormWidth`、`TableWidth`、`Tab`、角色绑定和前端事件代码。
84
-
85
- - 除非明确隐藏,`Visible=1`、`AppVisible=1`。
86
- - 角色绑定只缩小界面可见性,不能代替服务器数据权限。
87
- - 修改防抖编辑器/代码字段前必须刷新待保存值,避免最后一次输入未入库。
88
- - `Data/Config` 修改后回读并刷新 schema 缓存。
89
-
90
- ### 历史字段 V8 双存储兼容
91
-
92
- - `diy_field.V8Code` 是历史租户和官方应用包实际使用的物理列,按钮点击/字段值变更代码可能只存在于该列;`Config.V8Code` 是部分新版前端使用的镜像,不能假定它是唯一事实源。
93
- - 后端 `DiyField` 实体、字段查询投影和 `DiyFieldParam` 必须保留 `V8Code`,否则数据库代码虽然仍在,设计器列表和单字段回读都会表现成“0 字”。
94
- - 前端回读顺序固定为:先安全解码历史 Base64,再取“非空物理 `V8Code` 优先、否则 `Config.V8Code`”,最后同步两处。禁止用空镜像覆盖非空物理代码;保存和显式清空时则必须同步写入两处。
95
- - 回归至少包含一个 `Component=Button`、根级 `V8Code` 非空而 `Config.V8Code` 为空的官方包字段,并验证列表回读、选中编辑、保存、刷新后代码仍完整。
96
-
97
- ## DevComponent 定制组件
98
-
99
- 定制组件至少处理:
100
-
101
- - `value/modelValue` 的输入与变更通知;
102
- - 当前字段模型、表单模型、表单模式和只读状态;
103
- - 校验错误、清空、禁用、加载与销毁;
104
- - Add/Edit/View 回显;
105
- - PC、移动端和暗色主题;
106
- - 组件内部请求的 Token/OsClient 传递与错误态。
107
-
108
- 定制组件需要修改并发布主前端。若只服务单一租户、包含多个字段或复杂页面,
109
- 优先创建 MicroService 页面,通过 `V8.OpenAppDialog` 与宿主交互。
110
-
111
- 历史 Options API 定制组件可通过宿主 facade 调用数据源引擎:
112
-
113
- ```javascript
114
- this.Microi.DataSourceEngine.Run('customer_summary', { Id: customerId }, (result) => {
115
- if (this.Microi.CheckResult(result)) {
116
- this.summary = result.Data;
117
- }
118
- });
119
- ```
120
-
121
- `Microi.DataSourceEngine.Run` 是回调式宿主接口,`Microi.CheckResult` 负责按
122
- DosResult 约定判断并展示错误。组件卸载后要阻止迟到回调继续写状态;新页面
123
- 优先使用项目现有的组合式 facade,不要假定 `this.Microi` 在任意 Vue 组件中
124
- 都存在。
1
+ # 字段数据源、属性与事件
2
+
3
+ ## 数据源类型
4
+
5
+ | 类型 | 适用场景 | 配置要点 |
6
+ |---|---|---|
7
+ | `Data` | 显示值和保存值相同的固定数组 | 适合少量稳定枚举 |
8
+ | `KeyValue` | 保存 Key、显示 Label | 推荐;便于翻译和状态演进 |
9
+ | `Sql` | 基于当前库的受控查询 | 参数化、限制条数、选择明确字段 |
10
+ | `DataSource` | 复用数据源引擎 | 使用稳定 DataSourceId/Key |
11
+ | `ApiEngine` | 复杂权限、跨表或外部数据 | 接口返回稳定的 Label/Value 字段 |
12
+
13
+ KeyValue 示例:
14
+
15
+ ```text
16
+ draft|草稿,enabled|启用,disabled|禁用
17
+ ```
18
+
19
+ 对应核心语义:
20
+
21
+ ```json
22
+ {
23
+ "DataSource": "KeyValue",
24
+ "SelectLabel": "Value",
25
+ "SelectSaveField": "Key"
26
+ }
27
+ ```
28
+
29
+ 动态 SQL 示例只选择必要字段并限制返回量:
30
+
31
+ ```json
32
+ {
33
+ "DataSource": "Sql",
34
+ "Sql": "select Id,Name from biz_customer where Name like '%$Keyword$%' limit 0,20",
35
+ "SelectLabel": "Name",
36
+ "SelectSaveField": "Id",
37
+ "DataSourceSqlRemote": true
38
+ }
39
+ ```
40
+
41
+ SQL 仍必须经过平台受控数据源;不要把用户文本拼成标识符或任意 SQL。复杂权限、
42
+ 跨库或外部服务使用数据源引擎/接口引擎。
43
+
44
+ ## 动态联动
45
+
46
+ 字段值变化时可用前端 V8 更新另一个字段的数据源:
47
+
48
+ ```javascript
49
+ if (V8.LoadMode === 'Design') return;
50
+
51
+ var result = await V8.FormEngine.GetTableData('biz_contact', {
52
+ _SelectFields: ['Id', 'Name'],
53
+ _Where: [['CustomerId', '=', V8.ThisValue]],
54
+ _PageIndex: 1,
55
+ _PageSize: 100
56
+ });
57
+
58
+ V8.FieldSet('ContactId', 'Data', result.Code === 1 ? result.Data : []);
59
+ ```
60
+
61
+ 前端联动不能替代后端权限和提交校验。
62
+
63
+ ## 表单生命周期
64
+
65
+ | 配置 | 运行端 | 用途 |
66
+ |---|---|---|
67
+ | `InFormV8` | 前端 | 默认值、字段显隐、初始化交互 |
68
+ | `SubmitFormV8` | 前端 | 即时校验;HTTP 直调不会触发 |
69
+ | `SubmitBeforeServerV8` | 后端事务内 | 最终校验、加工、阻止提交 |
70
+ | `SubmitAfterServerV8` | 后端事务内 | 同事务联动其它表 |
71
+ | `OutFormV8` | 前端 | 关闭后刷新/跳转 |
72
+ | `DataFilterV8` | 后端 | 每行脱敏/展示加工 |
73
+
74
+ 事件代码、版本和表单属性都必须从当前 `diy_table/diy_field` 回读。后端阻止提交:
75
+
76
+ ```javascript
77
+ if (!V8.Form.Name) return { Code: 0, Msg: '名称不能为空' };
78
+ ```
79
+
80
+ ## 字段属性
81
+
82
+ 常用属性包括 `Visible`、`AppVisible`、`Required`、`Readonly`、`Data`、
83
+ `Config`、`FormWidth`、`TableWidth`、`Tab`、角色绑定和前端事件代码。
84
+
85
+ - 除非明确隐藏,`Visible=1`、`AppVisible=1`。
86
+ - 角色绑定只缩小界面可见性,不能代替服务器数据权限。
87
+ - 修改防抖编辑器/代码字段前必须刷新待保存值,避免最后一次输入未入库。
88
+ - `Data/Config` 修改后回读并刷新 schema 缓存。
89
+
90
+ ### 历史字段 V8 双存储兼容
91
+
92
+ - `diy_field.V8Code` 是历史租户和官方应用包实际使用的物理列,按钮点击/字段值变更代码可能只存在于该列;`Config.V8Code` 是部分新版前端使用的镜像,不能假定它是唯一事实源。
93
+ - 后端 `DiyField` 实体、字段查询投影和 `DiyFieldParam` 必须保留 `V8Code`,否则数据库代码虽然仍在,设计器列表和单字段回读都会表现成“0 字”。
94
+ - 前端回读顺序固定为:先安全解码历史 Base64,再取“非空物理 `V8Code` 优先、否则 `Config.V8Code`”,最后同步两处。禁止用空镜像覆盖非空物理代码;保存和显式清空时则必须同步写入两处。
95
+ - 回归至少包含一个 `Component=Button`、根级 `V8Code` 非空而 `Config.V8Code` 为空的官方包字段,并验证列表回读、选中编辑、保存、刷新后代码仍完整。
96
+
97
+ ## DevComponent 定制组件
98
+
99
+ 定制组件至少处理:
100
+
101
+ - `value/modelValue` 的输入与变更通知;
102
+ - 当前字段模型、表单模型、表单模式和只读状态;
103
+ - 校验错误、清空、禁用、加载与销毁;
104
+ - Add/Edit/View 回显;
105
+ - PC、移动端和暗色主题;
106
+ - 组件内部请求的 Token/OsClient 传递与错误态。
107
+
108
+ 定制组件需要修改并发布主前端。若只服务单一租户、包含多个字段或复杂页面,
109
+ 优先创建 MicroService 页面,通过 `V8.OpenAppDialog` 与宿主交互。
110
+
111
+ 历史 Options API 定制组件可通过宿主 facade 调用数据源引擎:
112
+
113
+ ```javascript
114
+ this.Microi.DataSourceEngine.Run('customer_summary', { Id: customerId }, (result) => {
115
+ if (this.Microi.CheckResult(result)) {
116
+ this.summary = result.Data;
117
+ }
118
+ });
119
+ ```
120
+
121
+ `Microi.DataSourceEngine.Run` 是回调式宿主接口,`Microi.CheckResult` 负责按
122
+ DosResult 约定判断并展示错误。组件卸载后要阻止迟到回调继续写状态;新页面
123
+ 优先使用项目现有的组合式 facade,不要假定 `this.Microi` 在任意 Vue 组件中
124
+ 都存在。
@@ -1,141 +1,141 @@
1
- ---
2
- name: microi-left-right-layout
3
- description: Microi 吾码模块引擎“树形+表格/表单”左右结构配置规范。用于通过 MCP、模块引擎或源码配置 `diy_LeftJoinRightView`,把项目、分类、组织等主数据作为左树,并用主外键过滤右侧列表;覆盖字段语义、初始化 V8、移动端自适应、幂等写入和回读验收。
4
- ---
5
-
6
- > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
-
8
- # Microi 左右树表配置规范
9
-
10
- 当需求是“左侧按项目/分类导航,右侧显示该节点的数据列表或表单”时,使用模块组件 `/diy/left-right/LeftTreeJoinRightForm`,配置表为 `diy_LeftJoinRightView`。不要为每个业务菜单复制定制 Vue 页面。
11
-
12
- ## 适用与禁用场景
13
-
14
- - 适用:项目及其成品、用料、请购、提料、锁料、文档,分类及商品,组织及人员。
15
- - 左侧必须是稳定的主数据;右侧必须能通过明确的主外键过滤。
16
- - 左右两边没有关联字段、左侧仅是装饰性筛选,或数据量极大却没有分页/搜索方案时,不应直接套用。
17
-
18
- ## 模块配置
19
-
20
- 目标 `sys_menu` 必须配置:
21
-
22
- ```json
23
- {
24
- "ComponentName": "树形+表格",
25
- "ComponentPath": "/diy/left-right/LeftTreeJoinRightForm"
26
- }
27
- ```
28
-
29
- 同一菜单只能有一条有效的 `diy_LeftJoinRightView` 配置。创建前先按 `GuanlianCD Like 菜单Id` 回读并复用,禁止重复插入。
30
-
31
- ## `diy_LeftJoinRightView` 字段
32
-
33
- | 字段 | 必填 | 含义与写法 |
34
- | --- | --- | --- |
35
- | `GuanlianCD` | 是 | 当前右侧业务菜单链,JSON 数组;末级必须是当前 `sys_menu.Id`。 |
36
- | `ShuxingGLCD` | 是 | 左侧主数据菜单链,JSON 数组;末级对应左表模块。 |
37
- | `GuanlianBD` | 是 | 左侧主表名,例如 `xiangmuguanli`。 |
38
- | `FubiaoGLZD` | 是 | 左表参与关联的字段,通常为 `Id`。 |
39
- | `ZibiaoGLZD` | 右表格必填 | 右表外键,例如 `XiangmuID`、`ProjectId`、`Guid`。必须以实时表结构为准。 |
40
- | `GuanlianPPLJ` | 右表格必填 | 匹配操作符,普通主外键使用 `=`。 |
41
- | `ZuobianZSZJ` | 是 | 左侧组件,通常为 `树形控件`。 |
42
- | `YoubianZSZJ` | 是 | `表格`、`表单` 或 `表单/表格`。 |
43
- | `ShuxianSZDM` | 是 | 左树显示字段,必须与初始化结果的属性名一致。 |
44
- | `ChushiHDM` | 是 | 初始化 V8。必须读取 `V8.Form._PageIndex/_PageSize/inputText`,最终返回 `Data` 和 `DataCount`。 |
45
- | `ZuoyouXSZB` | 否 | 24 栅格比例,例如 `6/18`、`4/20`,中间 `/` 必须保留。 |
46
- | `ShubiaoT` | 否 | 左树标题,例如 `项目目录`。 |
47
- | `ShumoHSS` | 否 | 模糊搜索开关。 |
48
- | `ShuxiaLSS` | 否 | 搜索字段下拉开关。 |
49
- | `ShusouSAN` | 否 | 搜索按钮开关。 |
50
- | `ShushuaX` | 否 | 刷新按钮开关。 |
51
- | `ShudingJXZ` | 否 | 是否允许新增顶级树节点。 |
52
- | `ShuxinZ`、`ShubianJ`、`ShushanC` | 否 | 树节点新增、编辑、删除开关。只在业务允许时开启。 |
53
- | `ShujieDDJSJ` | 否 | 节点点击 V8;可读取 `V8.Form`,异步结果写入 `V8.Result`。 |
54
- | `YincangBSF` | 否 | 节点命中该字段时隐藏右侧区域。 |
55
- | `TanchuangLX`、`TanchuangDX` | 否 | 树节点维护弹窗类型和尺寸。 |
56
- | `LanjiaZ`、`LanjiaZDM` | 否 | 懒加载开关和代码;大树优先使用。 |
57
- | `DefaultExpandLevel` | 否 | 左树默认展开层级。未配置、空值或 `0` 均不展开;`1` 展开一级节点,`2` 再展开二级节点,以此类推。 |
58
-
59
- ## 初始化 V8 与分页契约
60
-
61
- 左树按数据表对待,默认每页 20 条,允许 10/20/50/100 条切换。无论当前只有多少数据,都不能用 `_PageSize:500` 一次拉完整主表。搜索时把页码重置为 1,并在服务端按关键字过滤后返回真实总数。
62
-
63
- 当初始化 V8 使用 `V8.FormEngine.GetTableTree/GetTableDataTree` 时,左侧来源 `diy_table.IsTree` 必须为 `1`,并显式配置真实存在的 `TreeParentField`(通常是 `ParentId`);否则接口会成功返回 `Code=0`,页面只显示“暂无数据”。应用包必须同时携带这两项表元数据,并在发布前通过真实树接口回读,不能只验收 `diy_LeftJoinRightView` 配置行。
64
-
65
- ```js
66
- var form = V8.Form || {};
67
- var pageIndex = Math.max(1, parseInt(form._PageIndex || 1, 10));
68
- var pageSize = Math.min(100, Math.max(1, parseInt(form._PageSize || 20, 10)));
69
- var keyword = String(form.inputText || '').trim();
70
- var query = {
71
- _SelectFields: ['Id', 'Code', 'Name'],
72
- _OrderBy: 'CreateTime',
73
- _OrderByType: 'DESC',
74
- _PageIndex: pageIndex,
75
- _PageSize: pageSize
76
- };
77
-
78
- if (keyword) {
79
- query._Where = [
80
- ['Code', 'Like', keyword],
81
- ['OR', 'Name', 'Like', keyword]
82
- ];
83
- }
84
-
85
- var result = await V8.FormEngine.GetTableData('xiangmuguanli', query);
86
-
87
- if (result.Code !== 1) {
88
- V8.Result = result;
89
- return;
90
- }
91
-
92
- V8.Result = {
93
- Code: 1,
94
- Data: (result.Data || []).map(function (item) {
95
- return {
96
- Id: item.Id,
97
- TreeTitle: [item.Code, item.Name].filter(Boolean).join(' '),
98
- Code: item.Code,
99
- Name: item.Name
100
- };
101
- }),
102
- DataCount: Number(result.DataCount || 0),
103
- PageIndex: pageIndex,
104
- PageSize: pageSize
105
- };
106
- ```
107
-
108
- 对应配置为 `ShuxianSZDM=TreeTitle`、`FubiaoGLZD=Id`。右侧新增时,组件会通过 `ParentDataAppend` 把父节点、父键和 `ZibiaoGLZD` 传给表格;业务字段仍需由表单事件兜底校验。
109
-
110
- 加载请求期间必须显示明确的“正在加载项目...”状态,不能先渲染“暂无数据”;多次搜索或翻页并发返回时,只应用最后一次请求,防止旧结果覆盖新页。
111
-
112
- ## MCP 实施顺序
113
-
114
- 1. 调用实时 Schema/模块查询,确认左右表、菜单 Id、主键、外键和已有配置。
115
- 2. 读取一个已正常运行的左右结构作为基线,只复用结构,不复制租户或业务字段。
116
- 3. 按当前菜单回读 `diy_LeftJoinRightView`;有记录则更新,无记录才新增。
117
- 4. 更新模块 `ComponentName`、`ComponentPath`,随后回读模块和配置行。
118
- 5. 验证“全部”、单节点切换、右表筛选、右侧新增自动关联、刷新和搜索。
119
-
120
- ## 移动端要求
121
-
122
- - `<=767px` 时不在列表上方直接堆放左树。右侧业务列表占满宽度,顶部显示当前项目和“项目目录”按钮。
123
- - 点击“项目目录”后,从左向右打开全高抽屉;推荐宽度 `88%`,保留一段遮罩用于快速关闭。抽屉必须支持关闭按钮、点击遮罩和 Esc 关闭。
124
- - 左树在抽屉内独立滚动,搜索、分页和每页条数选择都必须可操作;关闭抽屉后右表筛选状态不得丢失。
125
- - 右表与页面使用正常纵向滚动,禁止祖先容器 `overflow:hidden` 截断内容。
126
- - 右侧卡片、表格 Tab、列表卡片在移动端必须使用 `height:auto` 和 `overflow:visible`;底部操作栏不得盖住最后一条数据。
127
- - 至少验收桌面 1440x900、手机 390x844;在手机上分别滚动左树和整页到末尾。
128
-
129
- ## 验收清单
130
-
131
- - 当前菜单只匹配一条配置,模块路径正确。
132
- - 使用树接口的左表已启用 `IsTree=1`,`TreeParentField` 与物理父级字段一致。
133
- - 左树标题无 `undefined`、`{}`、空白重复项。
134
- - 点击“全部”清空右侧外键条件;点击节点只显示该节点数据。
135
- - 后端 `_HasChild=true` 表示可展开,Element Plus 的 `isLeaf` 必须映射为独立 `_IsLeaf=!_HasChild`,不得把 `_HasChild` 直接当叶子标记。
136
- - `DefaultExpandLevel` 未配置时必须保持全部折叠;只展开有子节点且深度不超过配置值的节点,不能把平台默认值改成一级展开。
137
- - 页面初始已处于“全部”时,再次点击“全部”不得先清空已加载列表;只清除树节点外键条件并避免重复请求。
138
- - 右侧新增数据自动写入正确外键,切换节点后不会串数据。
139
- - 普通用户不出现仅管理员可用的“页面配置”。
140
- - 桌面左树每页默认 20 条,可翻页并切换 10/20/50/100;加载时不出现错误的空状态。
141
- - 手机初始不显示树,抽屉打开/节点选择自动关闭/遮罩关闭均正常;列表与操作区可滚动到底,无横向挤压和固定高度裁切。
1
+ ---
2
+ name: microi-left-right-layout
3
+ description: Microi 吾码模块引擎“树形+表格/表单”左右结构配置规范。用于通过 MCP、模块引擎或源码配置 `diy_LeftJoinRightView`,把项目、分类、组织等主数据作为左树,并用主外键过滤右侧列表;覆盖字段语义、初始化 V8、移动端自适应、幂等写入和回读验收。
4
+ ---
5
+
6
+ > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
+
8
+ # Microi 左右树表配置规范
9
+
10
+ 当需求是“左侧按项目/分类导航,右侧显示该节点的数据列表或表单”时,使用模块组件 `/diy/left-right/LeftTreeJoinRightForm`,配置表为 `diy_LeftJoinRightView`。不要为每个业务菜单复制定制 Vue 页面。
11
+
12
+ ## 适用与禁用场景
13
+
14
+ - 适用:项目及其成品、用料、请购、提料、锁料、文档,分类及商品,组织及人员。
15
+ - 左侧必须是稳定的主数据;右侧必须能通过明确的主外键过滤。
16
+ - 左右两边没有关联字段、左侧仅是装饰性筛选,或数据量极大却没有分页/搜索方案时,不应直接套用。
17
+
18
+ ## 模块配置
19
+
20
+ 目标 `sys_menu` 必须配置:
21
+
22
+ ```json
23
+ {
24
+ "ComponentName": "树形+表格",
25
+ "ComponentPath": "/diy/left-right/LeftTreeJoinRightForm"
26
+ }
27
+ ```
28
+
29
+ 同一菜单只能有一条有效的 `diy_LeftJoinRightView` 配置。创建前先按 `GuanlianCD Like 菜单Id` 回读并复用,禁止重复插入。
30
+
31
+ ## `diy_LeftJoinRightView` 字段
32
+
33
+ | 字段 | 必填 | 含义与写法 |
34
+ | --- | --- | --- |
35
+ | `GuanlianCD` | 是 | 当前右侧业务菜单链,JSON 数组;末级必须是当前 `sys_menu.Id`。 |
36
+ | `ShuxingGLCD` | 是 | 左侧主数据菜单链,JSON 数组;末级对应左表模块。 |
37
+ | `GuanlianBD` | 是 | 左侧主表名,例如 `xiangmuguanli`。 |
38
+ | `FubiaoGLZD` | 是 | 左表参与关联的字段,通常为 `Id`。 |
39
+ | `ZibiaoGLZD` | 右表格必填 | 右表外键,例如 `XiangmuID`、`ProjectId`、`Guid`。必须以实时表结构为准。 |
40
+ | `GuanlianPPLJ` | 右表格必填 | 匹配操作符,普通主外键使用 `=`。 |
41
+ | `ZuobianZSZJ` | 是 | 左侧组件,通常为 `树形控件`。 |
42
+ | `YoubianZSZJ` | 是 | `表格`、`表单` 或 `表单/表格`。 |
43
+ | `ShuxianSZDM` | 是 | 左树显示字段,必须与初始化结果的属性名一致。 |
44
+ | `ChushiHDM` | 是 | 初始化 V8。必须读取 `V8.Form._PageIndex/_PageSize/inputText`,最终返回 `Data` 和 `DataCount`。 |
45
+ | `ZuoyouXSZB` | 否 | 24 栅格比例,例如 `6/18`、`4/20`,中间 `/` 必须保留。 |
46
+ | `ShubiaoT` | 否 | 左树标题,例如 `项目目录`。 |
47
+ | `ShumoHSS` | 否 | 模糊搜索开关。 |
48
+ | `ShuxiaLSS` | 否 | 搜索字段下拉开关。 |
49
+ | `ShusouSAN` | 否 | 搜索按钮开关。 |
50
+ | `ShushuaX` | 否 | 刷新按钮开关。 |
51
+ | `ShudingJXZ` | 否 | 是否允许新增顶级树节点。 |
52
+ | `ShuxinZ`、`ShubianJ`、`ShushanC` | 否 | 树节点新增、编辑、删除开关。只在业务允许时开启。 |
53
+ | `ShujieDDJSJ` | 否 | 节点点击 V8;可读取 `V8.Form`,异步结果写入 `V8.Result`。 |
54
+ | `YincangBSF` | 否 | 节点命中该字段时隐藏右侧区域。 |
55
+ | `TanchuangLX`、`TanchuangDX` | 否 | 树节点维护弹窗类型和尺寸。 |
56
+ | `LanjiaZ`、`LanjiaZDM` | 否 | 懒加载开关和代码;大树优先使用。 |
57
+ | `DefaultExpandLevel` | 否 | 左树默认展开层级。未配置、空值或 `0` 均不展开;`1` 展开一级节点,`2` 再展开二级节点,以此类推。 |
58
+
59
+ ## 初始化 V8 与分页契约
60
+
61
+ 左树按数据表对待,默认每页 20 条,允许 10/20/50/100 条切换。无论当前只有多少数据,都不能用 `_PageSize:500` 一次拉完整主表。搜索时把页码重置为 1,并在服务端按关键字过滤后返回真实总数。
62
+
63
+ 当初始化 V8 使用 `V8.FormEngine.GetTableTree/GetTableDataTree` 时,左侧来源 `diy_table.IsTree` 必须为 `1`,并显式配置真实存在的 `TreeParentField`(通常是 `ParentId`);否则接口会成功返回 `Code=0`,页面只显示“暂无数据”。应用包必须同时携带这两项表元数据,并在发布前通过真实树接口回读,不能只验收 `diy_LeftJoinRightView` 配置行。
64
+
65
+ ```js
66
+ var form = V8.Form || {};
67
+ var pageIndex = Math.max(1, parseInt(form._PageIndex || 1, 10));
68
+ var pageSize = Math.min(100, Math.max(1, parseInt(form._PageSize || 20, 10)));
69
+ var keyword = String(form.inputText || '').trim();
70
+ var query = {
71
+ _SelectFields: ['Id', 'Code', 'Name'],
72
+ _OrderBy: 'CreateTime',
73
+ _OrderByType: 'DESC',
74
+ _PageIndex: pageIndex,
75
+ _PageSize: pageSize
76
+ };
77
+
78
+ if (keyword) {
79
+ query._Where = [
80
+ ['Code', 'Like', keyword],
81
+ ['OR', 'Name', 'Like', keyword]
82
+ ];
83
+ }
84
+
85
+ var result = await V8.FormEngine.GetTableData('xiangmuguanli', query);
86
+
87
+ if (result.Code !== 1) {
88
+ V8.Result = result;
89
+ return;
90
+ }
91
+
92
+ V8.Result = {
93
+ Code: 1,
94
+ Data: (result.Data || []).map(function (item) {
95
+ return {
96
+ Id: item.Id,
97
+ TreeTitle: [item.Code, item.Name].filter(Boolean).join(' '),
98
+ Code: item.Code,
99
+ Name: item.Name
100
+ };
101
+ }),
102
+ DataCount: Number(result.DataCount || 0),
103
+ PageIndex: pageIndex,
104
+ PageSize: pageSize
105
+ };
106
+ ```
107
+
108
+ 对应配置为 `ShuxianSZDM=TreeTitle`、`FubiaoGLZD=Id`。右侧新增时,组件会通过 `ParentDataAppend` 把父节点、父键和 `ZibiaoGLZD` 传给表格;业务字段仍需由表单事件兜底校验。
109
+
110
+ 加载请求期间必须显示明确的“正在加载项目...”状态,不能先渲染“暂无数据”;多次搜索或翻页并发返回时,只应用最后一次请求,防止旧结果覆盖新页。
111
+
112
+ ## MCP 实施顺序
113
+
114
+ 1. 调用实时 Schema/模块查询,确认左右表、菜单 Id、主键、外键和已有配置。
115
+ 2. 读取一个已正常运行的左右结构作为基线,只复用结构,不复制租户或业务字段。
116
+ 3. 按当前菜单回读 `diy_LeftJoinRightView`;有记录则更新,无记录才新增。
117
+ 4. 更新模块 `ComponentName`、`ComponentPath`,随后回读模块和配置行。
118
+ 5. 验证“全部”、单节点切换、右表筛选、右侧新增自动关联、刷新和搜索。
119
+
120
+ ## 移动端要求
121
+
122
+ - `<=767px` 时不在列表上方直接堆放左树。右侧业务列表占满宽度,顶部显示当前项目和“项目目录”按钮。
123
+ - 点击“项目目录”后,从左向右打开全高抽屉;推荐宽度 `88%`,保留一段遮罩用于快速关闭。抽屉必须支持关闭按钮、点击遮罩和 Esc 关闭。
124
+ - 左树在抽屉内独立滚动,搜索、分页和每页条数选择都必须可操作;关闭抽屉后右表筛选状态不得丢失。
125
+ - 右表与页面使用正常纵向滚动,禁止祖先容器 `overflow:hidden` 截断内容。
126
+ - 右侧卡片、表格 Tab、列表卡片在移动端必须使用 `height:auto` 和 `overflow:visible`;底部操作栏不得盖住最后一条数据。
127
+ - 至少验收桌面 1440x900、手机 390x844;在手机上分别滚动左树和整页到末尾。
128
+
129
+ ## 验收清单
130
+
131
+ - 当前菜单只匹配一条配置,模块路径正确。
132
+ - 使用树接口的左表已启用 `IsTree=1`,`TreeParentField` 与物理父级字段一致。
133
+ - 左树标题无 `undefined`、`{}`、空白重复项。
134
+ - 点击“全部”清空右侧外键条件;点击节点只显示该节点数据。
135
+ - 后端 `_HasChild=true` 表示可展开,Element Plus 的 `isLeaf` 必须映射为独立 `_IsLeaf=!_HasChild`,不得把 `_HasChild` 直接当叶子标记。
136
+ - `DefaultExpandLevel` 未配置时必须保持全部折叠;只展开有子节点且深度不超过配置值的节点,不能把平台默认值改成一级展开。
137
+ - 页面初始已处于“全部”时,再次点击“全部”不得先清空已加载列表;只清除树节点外键条件并避免重复请求。
138
+ - 右侧新增数据自动写入正确外键,切换节点后不会串数据。
139
+ - 普通用户不出现仅管理员可用的“页面配置”。
140
+ - 桌面左树每页默认 20 条,可翻页并切换 10/20/50/100;加载时不出现错误的空状态。
141
+ - 手机初始不显示树,抽屉打开/节点选择自动关闭/遮罩关闭均正常;列表与操作区可滚动到底,无横向挤压和固定高度裁切。
@@ -7,6 +7,8 @@ description: Microi 前端微服务 MicroService 开发与交付指南。用于
7
7
 
8
8
  # Microi 前端微服务
9
9
 
10
+ > **每次修改前必做:** 重新拉取当前租户完整私有源码,逐文件核对本地字节与远端哈希,并完成 Base/Local/Remote 合并后才开始编辑。记录修改前的 `SourceManifestHash`,源码同步显式传 `expectedSourceManifestHash`。禁止用刚读取的新哈希为旧代码补票;正文不全、远端漂移或冲突未解决时停止写入。完整下载由工具完成,模型只按需要阅读正文。
11
+
10
12
  这里的 MicroService 是运行在吾码主站中的前端微应用,不是 .NET/Java 后端微服务。
11
13
  它适合复杂租户页面、多页面应用、完整表格/上传/步骤交互和独立版本交付;业务事务、
12
14
  权限和最终校验仍放接口引擎或可信后端。
@@ -29,7 +31,7 @@ description: Microi 前端微服务 MicroService 开发与交付指南。用于
29
31
  开始写代码前:
30
32
 
31
33
  1. `microi_list_applications` 盘点当前租户全部 Web、UniApp、MicroService 和文件清单。
32
- 2. `microi_get_application_context` 默认只读取元数据、文件哈希、运行时和页面;需要少量正文时显式开启内容读取。
34
+ 2. `microi_get_application_context` 默认只读取元数据、文件哈希、运行时和页面;只读分析按需读取正文。准备修改已有应用时必须完整拉取源码到本地并逐文件验签,不能把默认元数据预览当成完整拉取。
33
35
  3. 单个大文件按需使用 `microi_get_application_file`,不要为了查看清单把全量源码 Base64 拉入上下文。
34
36
  4. 合适应用存在时在其中新增页面/路由,不创建“一页一个微服务”。
35
37
  5. 没有合适应用时才脚手架/创建新 AppKey。
@@ -110,6 +112,9 @@ AppKey 稳定且只含安全字符。`microi.routes.json` 是页面事实源,
110
112
 
111
113
  ### 多人协作发布前远端合并门禁(强制)
112
114
 
115
+ - 此门禁首先在**开始修改之前**执行,再在发布前复核。同步现有源码必须显式传修改前记录的 `expectedSourceManifestHash`;缺失或不匹配分别报 `SOURCE_EDIT_BASELINE_REQUIRED/CHANGED`,不能在工具内部用当前远端哈希替调用方建立编辑基线。旧 API 没有原子源码 CAS 时不得覆盖已有源码,先升级;空应用仍可初始化。
116
+ - 路由清单同时维护组件实际注册、`microi.routes.json` 和数据库页面映射。顶层或 `RouteMetaJson` 中的 `LegacyComponentPaths/LegacyMenuUrls` 都应保留。旧发布协议会合并现存兼容别名;V3 不可变快照若遗漏现有启用路由或兼容别名会报 `MICROSERVICE_ROUTE_BASELINE_LOST`。确需停用时保留路由并明确设置 `IsEnable=0`,不能通过空对象或漏传页面隐式删除。
117
+
113
118
  - 每一次同步或发布(包括同版本重试、紧急修复和仅编译产物发布)开始前,必须重新调用 `microi_get_application_context` 拉取目标租户当前完整私有源码清单、正文、版本与逐文件哈希;禁止沿用任务开始时或上一次发布后的旧快照。
114
119
  - 以最近一次已确认同步的源码清单为 Base,对 Base、本地 Local、远端 Remote 做逐文件三方比较:仅远端变化先拉取,仅本地变化保留本地,双方变化必须按真实业务语义合并并重新构建测试;删除/重命名同样纳入冲突判断。没有可靠 Base、远端源码不完整或冲突未解决时失败关闭,不能把时间戳较新当作自动胜出规则。
115
120
  - `replace`、`ReplacePrivateSourceOnly` 和流式发布都不是覆盖他人代码的授权。发现远端版本、文件正文或哈希晚于本地基线时,禁止直接用本地目录整包覆盖;必须先完成上述合并,并让本地唯一事实源保存合并结果。