@microi.net/cli 4.9.5 → 4.9.7

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 (133) 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/README.md +7 -12
  7. package/assets/build-meta.json +6 -5
  8. package/package.json +1 -1
  9. package/scripts/mcp-server.js +83 -83
  10. package/scripts/microi-cli.js +80 -92
  11. package/scripts/microi-codex-broker.js +418 -0
  12. package/scripts/microi-codex-router.js +159 -65
  13. package/scripts/microi-skills.meta.json +349 -190
  14. package/skills/.microi-skills-version.json +2 -2
  15. package/skills/.progressive-disclosure-manifest.json +3566 -0
  16. package/skills/ai-engine/SKILL.md +1 -1
  17. package/skills/ai-platform-governance/SKILL.md +22 -167
  18. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -0
  19. package/skills/app-store/SKILL.md +1 -1
  20. package/skills/business-blueprint/SKILL.md +1 -1
  21. package/skills/datasource-engine/SKILL.md +1 -1
  22. package/skills/dos-orm/SKILL.md +1 -1
  23. package/skills/job-engine/SKILL.md +1 -1
  24. package/skills/message-notification/SKILL.md +1 -1
  25. package/skills/microi-ai-application/SKILL.md +1 -1
  26. package/skills/microi-client-frontend/SKILL.md +18 -435
  27. 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 +144 -0
  28. 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 +178 -0
  29. 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 +144 -0
  30. package/skills/microi-codex/SKILL.md +4 -4
  31. package/skills/microi-codex-installer/SKILL.md +25 -36
  32. package/skills/microi-datasource-mapping/SKILL.md +1 -1
  33. package/skills/microi-db-schema/SKILL.md +4 -4
  34. package/skills/microi-db-schema/references/schema-overview.md +1 -1
  35. package/skills/microi-db-schema/references/schema.md +1 -1
  36. package/skills/microi-db-schema/references/table-catalog.md +1 -1
  37. package/skills/microi-deployment/SKILL.md +1 -1
  38. package/skills/microi-docs-coverage/SKILL.md +1 -1
  39. package/skills/microi-form-engine/SKILL.md +2 -2
  40. package/skills/microi-form-layout/SKILL.md +20 -226
  41. 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 -0
  42. package/skills/microi-frontend-sdk/SKILL.md +18 -152
  43. package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +171 -0
  44. package/skills/microi-left-right-layout/SKILL.md +1 -1
  45. package/skills/microi-microservice/SKILL.md +8 -1
  46. package/skills/microi-microservice/references/runtime-delivery.md +4 -0
  47. package/skills/microi-mobile-app-quality/SKILL.md +23 -289
  48. package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +209 -0
  49. package/skills/microi-mobile-app-quality/references/progressive-02-9-/344/270/273/351/242/230/345/210/207/346/215/242/345/277/205/351/241/273/347/234/237/345/256/236/344/270/224/345/205/250/345/261/200/347/224/237/346/225/210.md +117 -0
  50. package/skills/microi-solution-quotation/SKILL.md +1 -1
  51. package/skills/microi-system-delivery/SKILL.md +17 -381
  52. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +186 -0
  53. 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 +210 -0
  54. package/skills/microi-ui/SKILL.md +20 -170
  55. package/skills/microi-ui/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/234/272/346/231/257/350/223/235/345/233/276.md +183 -0
  56. package/skills/microi-uniapp-frontend/SKILL.md +27 -336
  57. package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +225 -0
  58. package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +154 -0
  59. package/skills/module-engine/SKILL.md +1 -1
  60. package/skills/ocr-engine/SKILL.md +1 -1
  61. package/skills/page-engine/SKILL.md +24 -272
  62. 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 +234 -0
  63. 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 +60 -0
  64. package/skills/performance-testing/SKILL.md +1 -1
  65. package/skills/playwright-e2e/SKILL.md +25 -591
  66. package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +173 -0
  67. package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +183 -0
  68. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -0
  69. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -0
  70. package/skills/print-engine/SKILL.md +1 -1
  71. package/skills/production-readonly-audit/SKILL.md +1 -1
  72. package/skills/report-engine/SKILL.md +1 -1
  73. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -0
  74. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -0
  75. package/skills/scripts/validate-progressive-disclosure.mjs +52 -0
  76. package/skills/search-engine/SKILL.md +1 -1
  77. package/skills/spider-engine/SKILL.md +1 -1
  78. package/skills/translate-engine/SKILL.md +1 -1
  79. package/skills/ui-design/SKILL.md +27 -1462
  80. package/skills/ui-design/references/progressive-01-/351/242/234/350/211/262/344/275/223/347/263/273-css-variables-/346/224/257/346/214/201/344/270/273/351/242/230/345/210/207/346/215/242.md +218 -0
  81. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +155 -0
  82. package/skills/ui-design/references/progressive-03-/345/212/250/346/225/210/350/247/204/350/214/203-/344/270/260/345/257/214/344/275/206/344/270/215/345/215/241.md +235 -0
  83. package/skills/ui-design/references/progressive-04-/347/273/204/344/273/266/351/243/216/346/240/274/351/200/237/346/237/245.md +152 -0
  84. package/skills/ui-design/references/progressive-05-/347/247/273/345/212/250/347/253/257/344/270/223/347/224/250/350/247/204/350/214/203.md +238 -0
  85. package/skills/ui-design/references/progressive-06-/344/270/273/351/242/230/345/210/207/346/215/242/345/256/236/347/216/260.md +194 -0
  86. package/skills/ui-design/references/progressive-07-/351/200/237/346/237/245-/344/273/216/345/244/264/346/220/255/345/273/272/344/270/200/344/270/252/347/247/273/345/212/250/347/253/257/351/241/265/351/235/242.md +207 -0
  87. package/skills/ui-design/references/progressive-08-/350/241/250/345/215/225/345/210/206/347/273/204/350/247/204/350/214/203-tabs-vs-collapsegroup-/345/274/272/345/210/266.md +142 -0
  88. package/skills/uniapp-mall-assets/SKILL.md +1 -1
  89. package/skills/unity-integration/SKILL.md +1 -1
  90. package/skills/v8-api-config/SKILL.md +1 -1
  91. package/skills/v8-cache-pattern/SKILL.md +1 -1
  92. package/skills/v8-crud-api/SKILL.md +21 -246
  93. package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +226 -0
  94. package/skills/v8-crud-api/references/progressive-02-where-/346/235/241/344/273/266/350/257/255/346/263/225/351/200/237/346/237/245.md +49 -0
  95. package/skills/v8-debugging/SKILL.md +1 -1
  96. package/skills/v8-explorer-tree/SKILL.md +1 -1
  97. package/skills/v8-export-import/SKILL.md +16 -426
  98. package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +211 -0
  99. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -0
  100. package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +42 -0
  101. package/skills/v8-file-upload/SKILL.md +17 -355
  102. package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +227 -0
  103. package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +149 -0
  104. package/skills/v8-formengine-http/SKILL.md +1 -1
  105. package/skills/v8-frontend-events/SKILL.md +20 -206
  106. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -0
  107. package/skills/v8-http-integration/SKILL.md +15 -237
  108. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -0
  109. package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +44 -0
  110. package/skills/v8-image-processing/SKILL.md +1 -1
  111. package/skills/v8-menu-buttons/SKILL.md +16 -512
  112. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +221 -0
  113. package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +224 -0
  114. package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +104 -0
  115. package/skills/v8-mongodb/SKILL.md +1 -1
  116. package/skills/v8-mq-mqtt/SKILL.md +12 -176
  117. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -0
  118. package/skills/v8-saas-multi-tenant/SKILL.md +1 -1
  119. package/skills/v8-security/SKILL.md +17 -330
  120. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +199 -0
  121. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +158 -0
  122. package/skills/v8-sql-query/SKILL.md +1 -1
  123. package/skills/v8-table-event/SKILL.md +17 -237
  124. package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +216 -0
  125. package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +46 -0
  126. package/skills/v8-template-engine/SKILL.md +1 -1
  127. package/skills/v8-utilities/SKILL.md +1 -1
  128. package/skills/v8-workflow/SKILL.md +20 -161
  129. package/skills/v8-workflow/references/progressive-01-/350/212/202/347/202/271/345/274/200/345/247/213-v8-/344/272/213/344/273/266.md +180 -0
  130. package/skills/workspace-conventions/SKILL.md +36 -369
  131. 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 +208 -0
  132. 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 +196 -0
  133. 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 +27 -0
@@ -3,7 +3,7 @@ name: page-engine
3
3
  description: 生成和审查 Microi 界面引擎 Page Engine 页面 JSON。用于创建仪表盘、图表、表格、地图、组件、页面布局,或校验 mic_page formData JSON。
4
4
  ---
5
5
 
6
- > **Codex 强制前置:** 当前宿主为 Codex 时,在使用本 Skill 前必须先完整读取 `../microi-codex-installer/SKILL.md`,完成“Codex 每任务最新版硬门禁”;门禁未通过不得继续本 Skill。非 Codex 宿主跳过此项。
6
+ > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
7
7
 
8
8
  # Microi 界面引擎(Page Engine)页面 JSON 生成
9
9
 
@@ -11,6 +11,8 @@ MCP 的生成/保存入口包含 `microi_build_page_design` 与 `microi_save_pag
11
11
 
12
12
  你正在为 Microi 吾码平台生成界面引擎页面的 JSON 数据。界面引擎页面由 `formData` 对象描述,用户导入 JSON 即可使用。
13
13
 
14
+ <!-- microi-progressive:begin -->
15
+ <!-- microi-progressive:chunk id=page-engine-000 sha256=5b79a31a8484bf0a618c2810e66c0ab542fd86ceeb76e7a5cd07a86284c4f6ac -->
14
16
  ## 设计器源码事件
15
17
 
16
18
  只有在扩展界面引擎设计器源码时才使用全局事件总线。用
@@ -18,6 +20,8 @@ MCP 的生成/保存入口包含 `microi_build_page_design` 与 `microi_save_pag
18
20
  组件卸载时逐项调用 `EventBus.off(eventName)`。重复挂载不解绑会造成一次操作
19
21
  触发多次;普通页面 JSON 生成不需要注册事件总线。
20
22
 
23
+ <!-- /microi-progressive:chunk -->
24
+ <!-- microi-progressive:chunk id=page-engine-001 sha256=fa60ff07b50f0d1fdbbf8c3838e94f5de8333a9072c8a5b7e86c4cc91038dfd9 -->
21
25
  ## 核心数据结构
22
26
 
23
27
  ```
@@ -35,6 +39,8 @@ formData(页面)
35
39
  └── widgetParams[] // 组件私有参数
36
40
  ```
37
41
 
42
+ <!-- /microi-progressive:chunk -->
43
+ <!-- microi-progressive:chunk id=page-engine-002 sha256=6a1a85b40bcb5f8be694b0aad73a805083acd0d6fcd9cba36278dc9b51d24dcb -->
38
44
  ## formConfig 页面全局配置
39
45
 
40
46
  ```json
@@ -51,6 +57,8 @@ formData(页面)
51
57
  }
52
58
  ```
53
59
 
60
+ <!-- /microi-progressive:chunk -->
61
+ <!-- microi-progressive:chunk id=page-engine-003 sha256=8afb75b0e4d85ab9f56a7ba018e1cc50f758d3e604683d8c38d5f0a45d53f135 -->
54
62
  ## 容器类型
55
63
 
56
64
  | type | label | 说明 |
@@ -104,6 +112,8 @@ formData(页面)
104
112
  }
105
113
  ```
106
114
 
115
+ <!-- /microi-progressive:chunk -->
116
+ <!-- microi-progressive:chunk id=page-engine-004 sha256=9c7c85bb0d25267d07e45d9abeb5691c2f0ffd9da233351cf2f448a9b848cea5 -->
107
117
  ## 组件通用结构
108
118
 
109
119
  ```json
@@ -123,6 +133,8 @@ formData(页面)
123
133
  }
124
134
  ```
125
135
 
136
+ <!-- /microi-progressive:chunk -->
137
+ <!-- microi-progressive:chunk id=page-engine-005 sha256=c1e31dede775f14761182fc197cf428d494806c4503a622ffdad3d16d091d3e0 -->
126
138
  ## widgetParams 参数类型
127
139
 
128
140
  | type | 说明 | value 类型 |
@@ -136,6 +148,8 @@ formData(页面)
136
148
  | `select` | 下拉选择 | `string` |
137
149
  | `radio` | 单选组 | `string` |
138
150
 
151
+ <!-- /microi-progressive:chunk -->
152
+ <!-- microi-progressive:chunk id=page-engine-006 sha256=f50da72e63e62c2e1ea2d47ad2294deba20d6ca1ed732835eeab1e794407306e -->
139
153
  ## 数据来源(widgetParams[0])
140
154
 
141
155
  大多数组件的第一个参数(sort=0)是"数据来源":
@@ -147,126 +161,8 @@ formData(页面)
147
161
  $ApiBase$/apiengine/{ApiEngineKey}
148
162
  ```
149
163
 
150
- ## 所有组件类型
151
-
152
- ### statistic — 统计面板
153
- ```json
154
- { "data": [{ "name": "指标名", "value": 100000, "icon": "Top", "bgColor": "", "bgImage": "linear-gradient(...)", "linkUrl": "/" }], "searchData": [] }
155
- ```
156
-
157
- ### progress — 进度
158
- ```json
159
- { "data": [{ "title": "标题", "value": "¥1,000", "subTitle": "目标", "percentage": 60, "color": "#409EFF" }], "searchData": [] }
160
- ```
161
-
162
- ### links — 快捷导航
163
- ```json
164
- [{ "title": "导航名", "iconUrl": "图标URL", "linkUrl": "/路径" }]
165
- ```
166
-
167
- ### carousel — 轮播图
168
- ```json
169
- [{ "url": "图片URL" }]
170
- ```
171
-
172
- ### tabel — 表格
173
- ```json
174
- {
175
- "headerData": [{ "prop": "字段名", "label": "列标题", "width": "", "align": "center" }],
176
- "bodyData": [{ "字段名": "值" }],
177
- "total": 2,
178
- "searchData": []
179
- }
180
- ```
181
- 特殊列标记:`progress_ui`(进度条), `chart_ui`(迷你图), `rate_ui`(评分), `status_ui`(状态标签), `children`(多级表头)
182
-
183
- ### line / bar — 折线图 / 柱状图
184
- ```json
185
- { "xAxis": ["Mon", "Tue", "Wed"], "series": [{ "name": "系列", "data": [420, 132, 101] }], "searchData": [] }
186
- ```
187
-
188
- ### pie — 饼图
189
- ```json
190
- { "data": [{ "value": 1048, "name": "搜索引擎" }], "searchData": [] }
191
- ```
192
-
193
- ### funnel — 漏斗图
194
- ```json
195
- { "data": [{ "value": 100, "name": "展示" }], "searchData": [] }
196
- ```
197
-
198
- ### linebar — 折柱混合
199
- ```json
200
- { "xAxis": ["周一"], "series": [{ "name": "蒸发量", "type": "bar", "unit": "ml", "data": [2.0] }, { "name": "温度", "type": "line", "unit": "°C", "data": [2.0] }], "searchData": [] }
201
- ```
202
-
203
- ### map — 高德地图
204
- ```json
205
- [{ "id": "1", "title": "标记名", "position": "经度,纬度", "icon": "", "content": "" }]
206
- ```
207
-
208
- ### areamap — 区域地图
209
- ```json
210
- [{ "name": "地区名", "value": 74, "path": "/路径" }]
211
- ```
212
-
213
- ### gantt — 甘特图
214
- ```json
215
- {
216
- "tasks": [{ "id": 10, "text": "任务名", "type": "project", "progress": 0.1, "open": true }],
217
- "links": [{ "id": 10, "source": 12, "target": 13, "type": 1 }],
218
- "columns": [{ "name": "text", "label": "任务名称", "width": 220, "tree": true }]
219
- }
220
- ```
221
-
222
- ### fullcalendar — 日历看板
223
- ```json
224
- [{ "id": "event_01", "title": "事件名", "start": "2025-05-12", "end": "2025-05-13", "allDay": true }]
225
- ```
226
-
227
- ### html — 超文本
228
- ```json
229
- { "dataJson": { "col21": "替换值" }, "dataHtml": "<!DOCTYPE html>...<td>${col21}</td>..." }
230
- ```
231
-
232
- ### descriptions — 描述列表
233
- ```json
234
- [{ "label": "字段名", "value": "值", "span": 1, "align": "center" }]
235
- ```
236
-
237
- ### 其他组件
238
- | 组件 | dataJson |
239
- |------|----------|
240
- | workbench | `{ "icon": "URL", "title": "欢迎", "subTitle": "副标题" }` |
241
- | calendar | `[{ "date": "2024-12-01", "content": "事件" }]` |
242
- | collapse | `[{ "title": "标题", "content": "HTML内容" }]` |
243
- | steps | `{ "activeIndex": 0, "stepArr": [{ "title": "步骤1", "description": "描述" }] }` |
244
- | timeline | `[{ "date": "2024-05-01", "title": "标题", "content": "内容" }]` |
245
- | fish | `[{ "label": "类别", "children": [{ "label": "子项" }] }]` |
246
- | webgl | `{ "gltfPath": "模型URL", "hdrPath": "HDR URL" }` |
247
- | office | `{ "filePath": "文件URL" }` |
248
- | image | widgetParams[0] 为 `input` 类型,value 为图片URL |
249
- | video | widgetParams[0] 为 `input` 类型,value 为视频URL |
250
- | browser | widgetParams[0] 为 `input` 类型,value 为网址 |
251
- | diytable | 传入模块ID和菜单ID,嵌入低代码表格 |
252
- | diyform | 传入表ID和记录ID,嵌入低代码表单 |
253
-
254
- ### 平台内置业务组件
255
-
256
- | type | label | 关键参数 | 说明 |
257
- |------|-------|----------|------|
258
- | `aiengine` | AI引擎 | 无 | 嵌入 `Microi.Client/src/views/ai-engine/index.vue`;运行态使用紧凑嵌入模式,缩小英雄区、统计卡和快捷入口 |
259
- | `workcenter` | 工作中心 | `[0]` 内容;`[1]` 待办模块;`[2]` 流程模块 | 展示“我的工作”时可用两个隐藏 `sys_menu` 模块让 `diy-table` 承载待办与流程列表;日历/公告为兼容模式 |
260
- | `pageengine` | 界面引擎 | `widgetParams[0].type = "pageengine"`,`value` 为 `mic_page.Id` | 嵌入另一个界面引擎页面,设计器提供图形化页面下拉选择 |
261
-
262
- 界面引擎嵌套必须使用 `pageengine-widget.vue` 直接加载 `form-renderer` 组件,不得使用 iframe。每个嵌套页面由 `PAGE_ENGINE_STORE_KEY` 注入独立的 Pinia store,避免子页面覆盖父页面 `formData`;递归页面 Id 通过 `PAGE_ENGINE_RENDER_CONTEXT_KEY` 检测并阻止循环嵌套。父容器和组件高度设为 `0` 表示自动高度,由最外层页面统一滚动。
263
-
264
- `mic_page` 是按角色管理的运行资源:普通登录用户读取或嵌套页面时必须拥有菜单权限或高级表 `Read`,新增、修改、删除分别要求明确的 `Add`、`Edit`、`Del`;所有匿名 FormEngine 调用仍拒绝。角色页只展示服务端返回的分级策略,最终授权和当前操作者的平台管理员身份由后端主库复核。
265
-
266
- 界面引擎渲染页会为 `_IsAdmin` 或 `Level >= 9999` 的用户提供“界面设计”入口,跳转 `/mic/autopage?Id={mic_page.Id}`。入口优先放入后台 TagsView 页签右键菜单,并在页面第一个容器标题栏右侧提供紧凑快捷入口,与 `moreOption` 等操作使用同一个 flex 操作区垂直居中、右对齐;不得额外占用页面高度、增加顶部空白或覆盖标题,非管理员不显示。嵌套 `pageengine` 也必须显示其自身页面的设计入口,并由父页面直接打开对应子页面设计器。
267
-
268
- 首页编排可以组合 `aiengine`、`workcenter`、`diycalendar`、`diytable` 和一个占大区域的 `pageengine`。公告应优先通过绑定 `diy_notice` 的 `diytable` 渲染,使增删改权限继续由 `sys_menu + _RoleLimits` 控制;统计子页面由客户独立替换时,只需修改被嵌入的 `mic_page`,无需重做首页布局。
269
-
164
+ <!-- /microi-progressive:chunk -->
165
+ <!-- microi-progressive:chunk id=page-engine-007 sha256=bf6b4a76b11f27e62fe55e91258e3edb547aeb8456efde9d1ff787136533bf70 -->
270
166
  ## 运行态布局与滚动规范
271
167
 
272
168
  - 页面只保留一个主滚动容器:仪表盘、首页和嵌套界面优先继承最外层页面滚动;单个 `pannel`、`workcenter`、`diytable`、`diycalendar`、嵌套 `pageengine` 在运行态默认使用内容自适应高度和 `overflow: visible`,不得无条件设置 `overflow: auto`。
@@ -279,155 +175,11 @@ $ApiBase$/apiengine/{ApiEngineKey}
279
175
  - `aiengine` 在移动端嵌入首页时应使用内容自适应高度和外层页面滚动,指标卡与快捷入口优先两列紧凑排布,避免 4 个指标和全部快捷入口单列堆叠造成超长首屏;输入区和模型/推理设置必须保持可见且不横向溢出。
280
176
  - 交付前必须在真实运行页检查:是否存在内部纵向/横向滚动条、15 条表格分页是否可见、同排容器是否对齐、四周边距是否一致、组件底部是否有异常空白。仅检查设计器画布不算验收完成。
281
177
 
282
- ## Office/PDF 在线预览自然语言生成规则
283
-
284
- 当用户用自然语言要求“界面引擎预览 PDF/Word/Excel/PPT”“接口引擎返回 PDF 文件”“打开时跳到第 N 页”“按角色显示不同页码”“每 5 秒/10 秒轮询,但只有文件变化才刷新”时,优先生成 `office` 组件,而不是 `iframe/html/browser` 拼接。
285
-
286
- `office` 组件图形化参数必须完整:
287
-
288
- ```json
289
- {
290
- "type": "office",
291
- "label": "Office/PDF预览",
292
- "widgetOption": { "span": 24, "height": 720 },
293
- "widgetParams": [
294
- { "sort": 0, "label": "接口引擎地址", "type": "textarea", "value": "$ApiBase$/apiengine/{ApiEngineKey}" },
295
- { "sort": 1, "label": "静态文件地址", "type": "input", "value": "" },
296
- { "sort": 2, "label": "文件类型", "type": "select", "value": "pdf" },
297
- { "sort": 3, "label": "初始页码", "type": "number", "value": 1 },
298
- { "sort": 4, "label": "轮询接口秒数", "type": "number", "value": 0 }
299
- ]
300
- }
301
- ```
302
-
303
- 接口引擎返回契约:
304
-
305
- ```javascript
306
- return {
307
- Code: 1,
308
- Data: {
309
- FileName: 'report.pdf',
310
- ContentType: 'application/pdf',
311
- FileByteBase64: base64,
312
- PageNumber: 2,
313
- InitialPage: 2,
314
- FileKey: activeFileKey + ':p2',
315
- RefreshSeconds: 5
316
- }
317
- };
318
- ```
319
-
320
- 轮询但不刷新时,不要重复返回文件内容;返回下面任一写法即可,前端会保持当前预览不重建:
321
-
322
- ```javascript
323
- return { Code: 1, Data: { NeedRefresh: false, FileKey: currentFileKey, PageNumber: currentPage } };
324
- return { Code: 1, Data: { NotModified: true, FileKey: currentFileKey } };
325
- ```
326
-
327
- 接口引擎应读取前端轮询参数:`V8.Param.CurrentFileKey`、`V8.Param.CurrentPageNumber`、`V8.Param.PageNumber`、`V8.Param.WidgetNumber`。当 Redis/缓存中的活动文件、版本号、角色页码没有变化时返回 `NeedRefresh:false`;当文件或页码变化时返回 `FileByteBase64` 或 `FileUrl`,同时返回新的 `FileKey` 和 `PageNumber/InitialPage`。
328
-
329
- 角色页码建议在接口引擎中根据 `V8.CurrentUser.Level`、`RoleName`、`RoleIds` 判断,例如管理员第 2 页、财务第 3 页;不要把角色判断写死在前端 Page JSON。缓存 Key 使用 `Microi:${V8.OsClient}:PageEnginePdfPreview:{业务Key}`。
178
+ <!-- /microi-progressive:chunk -->
179
+ ## 详细参考路由(渐进披露)
330
180
 
331
- ### Office/PDF 接口返回字段细则
332
-
333
- - `FileName`:文件名,例如 `report.pdf`。
334
- - `ContentType`:文件类型,PDF 必须用 `application/pdf`;Word/Excel/PPT 可用对应 Office MIME。
335
- - `FileByteBase64`:文件字节 Base64;适合接口引擎动态生成或转发 PDF。
336
- - `FileUrl`:文件 URL;适合文件已在 HDFS/OSS/公网可访问时返回。
337
- - `PageNumber` / `InitialPage`:PDF 打开后跳转页码。角色控制页码必须在接口引擎中根据 `V8.CurrentUser` 判断,不要写死在页面 JSON。
338
- - `FileKey` / `CacheKey`:文件版本标识,建议包含业务 Key、缓存版本号、角色页码,例如 `activePdf:v3:page2`。
339
- - `NeedRefresh:false` / `NotModified:true`:轮询时文件和页码未变化,前端保持当前预览并重新按当前页码定位,不重新下载文件。
340
- - `RefreshSeconds`:接口可返回建议轮询秒数,但页面图形化配置仍是主要控制项;没有自动刷新需求时配置为 `0`。
341
-
342
- 接口引擎要显式读取这些前端参数:
343
-
344
- - `V8.Param.PageNumber`:组件配置的初始页码。
345
- - `V8.Param.CurrentPageNumber`:前端当前页码。
346
- - `V8.Param.CurrentFileKey`:前端当前文件 Key。
347
- - `V8.Param.CurrentFileUrl`:前端当前文件地址。
348
- - `V8.Param.WidgetNumber`:当前 office 组件编号。
349
-
350
- 生成示例接口时必须写清楚中文注释:每个参数的含义、Redis/缓存 Key 的作用、什么情况下返回 `NeedRefresh:false`、什么情况下返回新的 `FileByteBase64/FileUrl` 和 `PageNumber`。
351
-
352
- ## searchData 查询条件通用结构
353
-
354
- ```json
355
- [
356
- { "prop": "period", "value": "month", "defaultValue": "month", "label": "统计周期", "type": "select", "remote": false, "options": [{ "label": "本日", "value": "today" }, { "label": "本周", "value": "week" }, { "label": "本月", "value": "month" }, { "label": "本季", "value": "quarter" }, { "label": "本年", "value": "year" }, { "label": "去年", "value": "lastYear" }] },
357
- { "prop": "department", "value": "", "label": "部门", "type": "select", "remote": false, "optionUrl": "", "options": [{ "label": "全部", "value": "" }] },
358
- { "prop": "keyword", "value": "", "label": "关键词", "type": "input" }
359
- ]
360
- ```
361
-
362
- ### 统计周期与更多筛选
363
-
364
- - 统计类组件 `statistic`、`progress`、`bar`、`line`、`linebar`、`pie`、`funnel`、`tabel` 默认必须支持周期筛选。
365
- - 周期按钮固定包含:本日 `today`、本周 `week`、本月 `month`、本季 `quarter`、本年 `year`、去年 `lastYear`。
366
- - 同时开启组件的显示查询和日期筛选开关:`statistic` 为 `widgetParams[18]/[19]`,`progress` 为 `[26]/[27]`,`bar/line` 为 `[1]/[16]`,`linebar` 为 `[1]/[18]`,`pie` 为 `[1]/[19]`,`funnel/tabel` 为 `[1]/[13]`。
367
- - 接口引擎会收到 `period`、`_period`、`start`、`end`、`startDate`、`endDate`。当 `period` 是 `today/week/month/quarter/year/lastYear` 时,必须优先按 `period` 计算时间范围、标题前缀和图表粒度;只有 `period=custom` 或没有 `period` 但有 `start/end` 时,才按自定义时间范围处理。
368
- - “更多”筛选里放业务条件,例如 `keyword`、`ownerId`、`customerType`、`status`、`department` 等;日期范围作为自定义时间范围保留在更多筛选中。
369
-
370
- ### 交付类首页例外与乱码验收
371
-
372
- - 如果用户明确说明首页是“项目交付看板、全量采集看板、客户交付状态看板”,或统计的是表单数、模块数、接口引擎数、用户数等平台全量资源,并明确不要本日/本周/本月/本年筛选,则统计组件的 `searchData` 必须保持 `[]`,相关显示查询开关必须为 `false`,不要套用经营看板的周期筛选默认值。
373
- - 交付类首页优先使用 `statistic`、`progress`、`pie`、`bar`、`linebar`、`html` 等图形化组件,不要为了凑数据把明细表格放到首页;明细应放在低代码表单菜单里查看。
374
- - 使用脚本或 FormEngine 写入 `mic_page.JsonObj` 时,中文 JSON 必须做编码安全处理:可将最终 JSON 字符串中的非 ASCII 字符转为 `\uXXXX` 后写入,避免数据库或中间层把标题写成 `????`。
375
- - 写入界面引擎后必须回读 `mic_page.JsonObj` 并检查:不包含 `????`;用户要求无周期筛选时,不包含 `period`、`本日`、`本周`、`本月`、`本年`;`JSON.parse(JsonObj)` 后标题能还原为中文。
376
- - 如果使用 MCP 或自动页面生成工具后发现它注入了默认周期筛选,必须在最终写入前移除这些筛选,并再次回读验证。
377
- - 交付类首页必须做可读性验收:彩色统计卡片、深色渐变、图表标签、HTML 组件中的文字必须显式设置高对比文字色。深色/饱和背景使用白色或接近白色文字;浅色背景使用 `#0f172a/#334155` 等深色文字。不得只设置背景色而遗漏标题、数值、图标颜色。
378
- - 写入后必须检查页面 JSON 和接口返回内容不包含直接暴露的 ECharts 模板占位符:`{a}`、`{b}`、`{c}`、`{d}`、`{value}`。这些只能作为图表 formatter 内部配置使用,不能出现在用户可见标题、饼图中心标题、HTML 文案或默认加载文本中。
379
- - 容器标题栏的 `moreOption.hidden` 语义必须按“true=隐藏、false=显示”处理。交付首页、统计驾驶舱如无明确跳转需求,容器标题可直接留空并在 HTML/组件内部渲染标题,避免右上角出现默认 `More/更多`。
380
- - 如果 Page Engine 前端标准图表组件会因为远程数据源自动显示周期筛选,而用户明确要求不要筛选条,可优先使用 `html` 组件承载实时接口返回的图形化驾驶舱;接口返回扁平字段如 `{ html: "<div>...</div>" }`,页面 `dataHtml` 使用 `${html}`。写入后回读验证无周期词、无 `More/更多`、无占位符、无低对比色。
381
- - 生成首页前必须判断组件沉淀层级:如果某个能力是平台高频标准能力(如指标卡、进度列表、状态分布、排行榜、时间线、描述列表、Office 预览),优先使用或补充 Page Engine 标准组件源码;如果只是当前项目的强业务驾驶舱、组合排版、一次性说明区块,可以用 `html` 组件定制。不要把明显可复用的标准能力长期塞进项目 HTML,也不要为了单个业务驾驶舱新增一堆低复用组件。
382
- - `html` 组件承载长文本、失败原因、来源清单、备注说明、交付结论时,必须设置 `white-space:normal`、`overflow-wrap:anywhere` 或使用逐条列表/卡片渲染;禁止把多条内容用 `;`、`,` 拼成一整行导致底部说明挤在一起。写入后必须检查长文本在 1366/1440 宽度下能自然换行且不横向溢出。
383
- - 交付类首页如果使用一个远程 `html` 组件承载整页驾驶舱,运行态应由外层框架滚动,不要给容器和组件写死 1000px 这类固定高度。页面 JSON 可将 `wrapperOption.height` 与 `widgetOption.height` 设为 `0`(或运行态支持的 `auto`),前端运行态必须按内容自适应高度;设计器模式再使用可编辑的默认高度。
384
- - 首页写入口径说明时,必须区分“用户口头期望数量”“原始资料条目数量”“按业务主体合并后的数量”“后台项目/规则/别名数量”。不要只显示一个“未交付 N 个”,应同时列出部分交付、待执行、阻塞/需业务人员配合的清单和原因。
385
-
386
- ## 版本历史、并发保存与回滚
387
-
388
- 修改现有页面时必须先读取页面详情中的 `CurrentHash`,保存时把它作为 `expectedHash` 传入,并填写简短 `changeSummary`。不要仅凭本地旧 JSON 覆盖远端页面。
389
-
390
- | MCP 工具 | 用途 |
391
- |---|---|
392
- | `microi_list_page_history` | 获取历史元数据与当前哈希 |
393
- | `microi_get_page_history` | 获取指定不可变快照 |
394
- | `microi_compare_page_versions` | 结构化比较两个版本;右侧省略时比较当前页面 |
395
- | `microi_export_page_design` | 导出 `microi.page.v1` 设计包 |
396
- | `microi_rollback_page_design` | 使用 `expectedCurrentHash` 回滚并新增审计版本 |
397
-
398
- - 内容规范化后哈希未变化时,不应新增空历史。
399
- - 遇到哈希冲突先重新读取、比较,再决定合并或重做;禁止去掉 `expectedHash` 强行覆盖。
400
- - 回滚不是删除:目标快照成为新当前版本,回滚前内容仍保留。
401
- - 写后必须再次读取页面详情和历史,确认 `CurrentHash`、版本号、变更摘要和 JSON 一致。
402
- - 页面历史属于当前租户数据库;不要假定业务表有物理 `OsClient` 列。
403
-
404
- ## 本地撤销、Vue 源码桥与资产包
405
-
406
- - 设计器本地历史最多 50 步、总计最多 20MB;连续编辑允许合并,但保存前必须刷新当前 `CurrentHash`。
407
- - `Ctrl/Cmd+Z`、`Ctrl/Cmd+Shift+Z`、`Ctrl/Cmd+Y` 不能抢占输入框、textarea、contenteditable 或代码编辑器自己的撤销行为。
408
- - 本地 Undo/Redo 不是审计版本;跨会话恢复仍使用服务端历史与 CAS。
409
- - Page JSON → Vue SFC 只使用确定性 `microi.page.sfc.v1` 模板;禁止 eval、动态执行用户 JSON 或注入任意 import。
410
- - Vue SFC → Page JSON 只接受平台生成标记、完整元数据和匹配 Hash;任意手写 Vue、第三方 SFC 或未知 script 必须拒绝。
411
- - 导入源码后先规范化、显示 Diff,再由用户确认写入;不得因为“解析成功”直接覆盖当前页面。
412
- - 可复用组件/区块使用治理中心 `microi.asset.v1`,声明 Props、Setters、DataAdapters、Platforms 和 DependencyPackages;调用 `mci-asset-publish` DryRun 后再发布。
413
- - 资产依赖必须检查缺失、语义版本范围、循环和最大深度;运行时使用 `mci-asset-resolve` 返回的 `LoadOrder`。
414
- - 复杂页面需要完整工程能力时提升为前端微服务;不要承诺任意 Vue 源码无损反编译回界面引擎。
415
-
416
- ## 生成 JSON 注意事项
417
-
418
- 1. **编号唯一**:`wrapperOption.number` 和 `widgetOption.number` 页面内唯一(随机5位整数)
419
- 2. **关联一致**:`widgetOption.wrapperNumber` 必须等于所在容器的 `wrapperOption.number`
420
- 3. **高度合理**:容器高度 >= 内部组件高度之和
421
- 4. **widgetParams 完整**:必须包含该组件定义的所有参数,不能遗漏
422
- 5. **栅格布局**:span 总和 24 为一行,如 span=12 的两个容器为两列布局
423
- 6. **数据来源**:接口引擎 value 使用稳定路径 `$ApiBase$/apiengine/{Key}`,由运行时通过 `osclient` Header 传入 `$OsClient$`;只有无法设置 Header/Form/Query 的 GET/HEAD 或第三方回调才使用特殊租户路径
424
- 7. **formConfig 完整**:所有字段都应包含,不能省略
425
- 8. **选项卡容器**:组件放在 `tabWidgetMap[tabKey][]` 中,不放在 `widgetList` 中
426
- ## 经营看板周期筛选与布局规则
427
-
428
- - 老板驾驶舱、经营看板、CRM/订单/售后统计页面,所有统计类组件默认都要提供统一周期筛选:本日、本周、本月、本季、本年、去年,以及“更多”里的自定义时间范围和业务条件。
429
- - 指标名称不要写死为“月订单金额、月新增客户、月跟进活跃”等固定月份口径。优先使用“订单金额、新增客户、跟进活跃”等中性名称;如业务需要展示周期前缀,运行态会根据当前 `period` 自动显示为“本日/本周/本月/本季/本年/去年”。
430
- - `statistic`、`progress` 这类内容型组件在运行态必须允许按内容自适应高度。生成 JSON 时也要按数据条数预留高度:统计卡片按每行列数计算行数,避免首次打开时出现卡片底部被遮挡或容器内部滚动条。
431
- - 有远程数据源的图表/表格/统计组件,点击周期按钮必须真实触发接口请求,并把 `period`、`_period`、`startDate`、`endDate` 等查询条件传给接口。接口返回数据时不要清空组件已有的 `searchData`,除非明确返回新的完整筛选配置。
432
- - 接口返回的指标名、图例名、表格列名禁止固定写成“月新增客户、月订单金额”等,必须根据最终生效周期输出“本日/本周/本月/本季/本年/去年/自定义”或保持中性名称;否则切换周期后文案会和数据口径冲突。
433
- - `/mic/autopage/:Id` 面向最终用户运行态展示,应渲染 `formRenderer`;设计器入口才渲染 `formDesigner`,避免导航、组件面板、引导遮罩干扰看板访问和自动化截图。
181
+ 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
182
+
183
+ - [references/progressive-01-所有组件类型.md](references/progressive-01-所有组件类型.md):所有组件类型;Office/PDF 在线预览自然语言生成规则;searchData 查询条件通用结构
184
+ - [references/progressive-02-版本历史-并发保存与回滚.md](references/progressive-02-版本历史-并发保存与回滚.md):版本历史、并发保存与回滚;本地撤销、Vue 源码桥与资产包;生成 JSON 注意事项;经营看板周期筛选与布局规则
185
+ <!-- microi-progressive:end -->
@@ -0,0 +1,234 @@
1
+ # page-engine 详细参考 1
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=page-engine-008 sha256=91bce1411def87c7382ab3759f5fdd9c8d139af3687f8bfb8e000a9c812681a2 -->
6
+ ## 所有组件类型
7
+
8
+ ### statistic — 统计面板
9
+ ```json
10
+ { "data": [{ "name": "指标名", "value": 100000, "icon": "Top", "bgColor": "", "bgImage": "linear-gradient(...)", "linkUrl": "/" }], "searchData": [] }
11
+ ```
12
+
13
+ ### progress — 进度
14
+ ```json
15
+ { "data": [{ "title": "标题", "value": "¥1,000", "subTitle": "目标", "percentage": 60, "color": "#409EFF" }], "searchData": [] }
16
+ ```
17
+
18
+ ### links — 快捷导航
19
+ ```json
20
+ [{ "title": "导航名", "iconUrl": "图标URL", "linkUrl": "/路径" }]
21
+ ```
22
+
23
+ ### carousel — 轮播图
24
+ ```json
25
+ [{ "url": "图片URL" }]
26
+ ```
27
+
28
+ ### tabel — 表格
29
+ ```json
30
+ {
31
+ "headerData": [{ "prop": "字段名", "label": "列标题", "width": "", "align": "center" }],
32
+ "bodyData": [{ "字段名": "值" }],
33
+ "total": 2,
34
+ "searchData": []
35
+ }
36
+ ```
37
+ 特殊列标记:`progress_ui`(进度条), `chart_ui`(迷你图), `rate_ui`(评分), `status_ui`(状态标签), `children`(多级表头)
38
+
39
+ ### line / bar — 折线图 / 柱状图
40
+ ```json
41
+ { "xAxis": ["Mon", "Tue", "Wed"], "series": [{ "name": "系列", "data": [420, 132, 101] }], "searchData": [] }
42
+ ```
43
+
44
+ ### pie — 饼图
45
+ ```json
46
+ { "data": [{ "value": 1048, "name": "搜索引擎" }], "searchData": [] }
47
+ ```
48
+
49
+ ### funnel — 漏斗图
50
+ ```json
51
+ { "data": [{ "value": 100, "name": "展示" }], "searchData": [] }
52
+ ```
53
+
54
+ ### linebar — 折柱混合
55
+ ```json
56
+ { "xAxis": ["周一"], "series": [{ "name": "蒸发量", "type": "bar", "unit": "ml", "data": [2.0] }, { "name": "温度", "type": "line", "unit": "°C", "data": [2.0] }], "searchData": [] }
57
+ ```
58
+
59
+ ### map — 高德地图
60
+ ```json
61
+ [{ "id": "1", "title": "标记名", "position": "经度,纬度", "icon": "", "content": "" }]
62
+ ```
63
+
64
+ ### areamap — 区域地图
65
+ ```json
66
+ [{ "name": "地区名", "value": 74, "path": "/路径" }]
67
+ ```
68
+
69
+ ### gantt — 甘特图
70
+ ```json
71
+ {
72
+ "tasks": [{ "id": 10, "text": "任务名", "type": "project", "progress": 0.1, "open": true }],
73
+ "links": [{ "id": 10, "source": 12, "target": 13, "type": 1 }],
74
+ "columns": [{ "name": "text", "label": "任务名称", "width": 220, "tree": true }]
75
+ }
76
+ ```
77
+
78
+ ### fullcalendar — 日历看板
79
+ ```json
80
+ [{ "id": "event_01", "title": "事件名", "start": "2025-05-12", "end": "2025-05-13", "allDay": true }]
81
+ ```
82
+
83
+ ### html — 超文本
84
+ ```json
85
+ { "dataJson": { "col21": "替换值" }, "dataHtml": "<!DOCTYPE html>...<td>${col21}</td>..." }
86
+ ```
87
+
88
+ ### descriptions — 描述列表
89
+ ```json
90
+ [{ "label": "字段名", "value": "值", "span": 1, "align": "center" }]
91
+ ```
92
+
93
+ ### 其他组件
94
+ | 组件 | dataJson |
95
+ |------|----------|
96
+ | workbench | `{ "icon": "URL", "title": "欢迎", "subTitle": "副标题" }` |
97
+ | calendar | `[{ "date": "2024-12-01", "content": "事件" }]` |
98
+ | collapse | `[{ "title": "标题", "content": "HTML内容" }]` |
99
+ | steps | `{ "activeIndex": 0, "stepArr": [{ "title": "步骤1", "description": "描述" }] }` |
100
+ | timeline | `[{ "date": "2024-05-01", "title": "标题", "content": "内容" }]` |
101
+ | fish | `[{ "label": "类别", "children": [{ "label": "子项" }] }]` |
102
+ | webgl | `{ "gltfPath": "模型URL", "hdrPath": "HDR URL" }` |
103
+ | office | `{ "filePath": "文件URL" }` |
104
+ | image | widgetParams[0] 为 `input` 类型,value 为图片URL |
105
+ | video | widgetParams[0] 为 `input` 类型,value 为视频URL |
106
+ | browser | widgetParams[0] 为 `input` 类型,value 为网址 |
107
+ | diytable | 传入模块ID和菜单ID,嵌入低代码表格 |
108
+ | diyform | 传入表ID和记录ID,嵌入低代码表单 |
109
+
110
+ ### 平台内置业务组件
111
+
112
+ | type | label | 关键参数 | 说明 |
113
+ |------|-------|----------|------|
114
+ | `aiengine` | AI引擎 | 无 | 嵌入 `Microi.Client/src/views/ai-engine/index.vue`;运行态使用紧凑嵌入模式,缩小英雄区、统计卡和快捷入口 |
115
+ | `workcenter` | 工作中心 | `[0]` 内容;`[1]` 待办模块;`[2]` 流程模块 | 展示“我的工作”时可用两个隐藏 `sys_menu` 模块让 `diy-table` 承载待办与流程列表;日历/公告为兼容模式 |
116
+ | `pageengine` | 界面引擎 | `widgetParams[0].type = "pageengine"`,`value` 为 `mic_page.Id` | 嵌入另一个界面引擎页面,设计器提供图形化页面下拉选择 |
117
+
118
+ 界面引擎嵌套必须使用 `pageengine-widget.vue` 直接加载 `form-renderer` 组件,不得使用 iframe。每个嵌套页面由 `PAGE_ENGINE_STORE_KEY` 注入独立的 Pinia store,避免子页面覆盖父页面 `formData`;递归页面 Id 通过 `PAGE_ENGINE_RENDER_CONTEXT_KEY` 检测并阻止循环嵌套。父容器和组件高度设为 `0` 表示自动高度,由最外层页面统一滚动。
119
+
120
+ `mic_page` 是按角色管理的运行资源:普通登录用户读取或嵌套页面时必须拥有菜单权限或高级表 `Read`,新增、修改、删除分别要求明确的 `Add`、`Edit`、`Del`;所有匿名 FormEngine 调用仍拒绝。角色页只展示服务端返回的分级策略,最终授权和当前操作者的平台管理员身份由后端主库复核。
121
+
122
+ 界面引擎渲染页会为 `_IsAdmin` 或 `Level >= 9999` 的用户提供“界面设计”入口,跳转 `/mic/autopage?Id={mic_page.Id}`。入口优先放入后台 TagsView 页签右键菜单,并在页面第一个容器标题栏右侧提供紧凑快捷入口,与 `moreOption` 等操作使用同一个 flex 操作区垂直居中、右对齐;不得额外占用页面高度、增加顶部空白或覆盖标题,非管理员不显示。嵌套 `pageengine` 也必须显示其自身页面的设计入口,并由父页面直接打开对应子页面设计器。
123
+
124
+ 首页编排可以组合 `aiengine`、`workcenter`、`diycalendar`、`diytable` 和一个占大区域的 `pageengine`。公告应优先通过绑定 `diy_notice` 的 `diytable` 渲染,使增删改权限继续由 `sys_menu + _RoleLimits` 控制;统计子页面由客户独立替换时,只需修改被嵌入的 `mic_page`,无需重做首页布局。
125
+
126
+ <!-- /microi-progressive:chunk -->
127
+ <!-- microi-progressive:chunk id=page-engine-009 sha256=f54168759ae63e6a89d5ccc50ba569915f7e04485b5cb721ff279fff83c9efe0 -->
128
+ ## Office/PDF 在线预览自然语言生成规则
129
+
130
+ 当用户用自然语言要求“界面引擎预览 PDF/Word/Excel/PPT”“接口引擎返回 PDF 文件”“打开时跳到第 N 页”“按角色显示不同页码”“每 5 秒/10 秒轮询,但只有文件变化才刷新”时,优先生成 `office` 组件,而不是 `iframe/html/browser` 拼接。
131
+
132
+ `office` 组件图形化参数必须完整:
133
+
134
+ ```json
135
+ {
136
+ "type": "office",
137
+ "label": "Office/PDF预览",
138
+ "widgetOption": { "span": 24, "height": 720 },
139
+ "widgetParams": [
140
+ { "sort": 0, "label": "接口引擎地址", "type": "textarea", "value": "$ApiBase$/apiengine/{ApiEngineKey}" },
141
+ { "sort": 1, "label": "静态文件地址", "type": "input", "value": "" },
142
+ { "sort": 2, "label": "文件类型", "type": "select", "value": "pdf" },
143
+ { "sort": 3, "label": "初始页码", "type": "number", "value": 1 },
144
+ { "sort": 4, "label": "轮询接口秒数", "type": "number", "value": 0 }
145
+ ]
146
+ }
147
+ ```
148
+
149
+ 接口引擎返回契约:
150
+
151
+ ```javascript
152
+ return {
153
+ Code: 1,
154
+ Data: {
155
+ FileName: 'report.pdf',
156
+ ContentType: 'application/pdf',
157
+ FileByteBase64: base64,
158
+ PageNumber: 2,
159
+ InitialPage: 2,
160
+ FileKey: activeFileKey + ':p2',
161
+ RefreshSeconds: 5
162
+ }
163
+ };
164
+ ```
165
+
166
+ 轮询但不刷新时,不要重复返回文件内容;返回下面任一写法即可,前端会保持当前预览不重建:
167
+
168
+ ```javascript
169
+ return { Code: 1, Data: { NeedRefresh: false, FileKey: currentFileKey, PageNumber: currentPage } };
170
+ return { Code: 1, Data: { NotModified: true, FileKey: currentFileKey } };
171
+ ```
172
+
173
+ 接口引擎应读取前端轮询参数:`V8.Param.CurrentFileKey`、`V8.Param.CurrentPageNumber`、`V8.Param.PageNumber`、`V8.Param.WidgetNumber`。当 Redis/缓存中的活动文件、版本号、角色页码没有变化时返回 `NeedRefresh:false`;当文件或页码变化时返回 `FileByteBase64` 或 `FileUrl`,同时返回新的 `FileKey` 和 `PageNumber/InitialPage`。
174
+
175
+ 角色页码建议在接口引擎中根据 `V8.CurrentUser.Level`、`RoleName`、`RoleIds` 判断,例如管理员第 2 页、财务第 3 页;不要把角色判断写死在前端 Page JSON。缓存 Key 使用 `Microi:${V8.OsClient}:PageEnginePdfPreview:{业务Key}`。
176
+
177
+ ### Office/PDF 接口返回字段细则
178
+
179
+ - `FileName`:文件名,例如 `report.pdf`。
180
+ - `ContentType`:文件类型,PDF 必须用 `application/pdf`;Word/Excel/PPT 可用对应 Office MIME。
181
+ - `FileByteBase64`:文件字节 Base64;适合接口引擎动态生成或转发 PDF。
182
+ - `FileUrl`:文件 URL;适合文件已在 HDFS/OSS/公网可访问时返回。
183
+ - `PageNumber` / `InitialPage`:PDF 打开后跳转页码。角色控制页码必须在接口引擎中根据 `V8.CurrentUser` 判断,不要写死在页面 JSON。
184
+ - `FileKey` / `CacheKey`:文件版本标识,建议包含业务 Key、缓存版本号、角色页码,例如 `activePdf:v3:page2`。
185
+ - `NeedRefresh:false` / `NotModified:true`:轮询时文件和页码未变化,前端保持当前预览并重新按当前页码定位,不重新下载文件。
186
+ - `RefreshSeconds`:接口可返回建议轮询秒数,但页面图形化配置仍是主要控制项;没有自动刷新需求时配置为 `0`。
187
+
188
+ 接口引擎要显式读取这些前端参数:
189
+
190
+ - `V8.Param.PageNumber`:组件配置的初始页码。
191
+ - `V8.Param.CurrentPageNumber`:前端当前页码。
192
+ - `V8.Param.CurrentFileKey`:前端当前文件 Key。
193
+ - `V8.Param.CurrentFileUrl`:前端当前文件地址。
194
+ - `V8.Param.WidgetNumber`:当前 office 组件编号。
195
+
196
+ 生成示例接口时必须写清楚中文注释:每个参数的含义、Redis/缓存 Key 的作用、什么情况下返回 `NeedRefresh:false`、什么情况下返回新的 `FileByteBase64/FileUrl` 和 `PageNumber`。
197
+
198
+ <!-- /microi-progressive:chunk -->
199
+ <!-- microi-progressive:chunk id=page-engine-010 sha256=98256e1f8068f29e3e7cb2096fb8290966a58d47390371bec965001a9e706ddd -->
200
+ ## searchData 查询条件通用结构
201
+
202
+ ```json
203
+ [
204
+ { "prop": "period", "value": "month", "defaultValue": "month", "label": "统计周期", "type": "select", "remote": false, "options": [{ "label": "本日", "value": "today" }, { "label": "本周", "value": "week" }, { "label": "本月", "value": "month" }, { "label": "本季", "value": "quarter" }, { "label": "本年", "value": "year" }, { "label": "去年", "value": "lastYear" }] },
205
+ { "prop": "department", "value": "", "label": "部门", "type": "select", "remote": false, "optionUrl": "", "options": [{ "label": "全部", "value": "" }] },
206
+ { "prop": "keyword", "value": "", "label": "关键词", "type": "input" }
207
+ ]
208
+ ```
209
+
210
+ ### 统计周期与更多筛选
211
+
212
+ - 统计类组件 `statistic`、`progress`、`bar`、`line`、`linebar`、`pie`、`funnel`、`tabel` 默认必须支持周期筛选。
213
+ - 周期按钮固定包含:本日 `today`、本周 `week`、本月 `month`、本季 `quarter`、本年 `year`、去年 `lastYear`。
214
+ - 同时开启组件的显示查询和日期筛选开关:`statistic` 为 `widgetParams[18]/[19]`,`progress` 为 `[26]/[27]`,`bar/line` 为 `[1]/[16]`,`linebar` 为 `[1]/[18]`,`pie` 为 `[1]/[19]`,`funnel/tabel` 为 `[1]/[13]`。
215
+ - 接口引擎会收到 `period`、`_period`、`start`、`end`、`startDate`、`endDate`。当 `period` 是 `today/week/month/quarter/year/lastYear` 时,必须优先按 `period` 计算时间范围、标题前缀和图表粒度;只有 `period=custom` 或没有 `period` 但有 `start/end` 时,才按自定义时间范围处理。
216
+ - “更多”筛选里放业务条件,例如 `keyword`、`ownerId`、`customerType`、`status`、`department` 等;日期范围作为自定义时间范围保留在更多筛选中。
217
+
218
+ ### 交付类首页例外与乱码验收
219
+
220
+ - 如果用户明确说明首页是“项目交付看板、全量采集看板、客户交付状态看板”,或统计的是表单数、模块数、接口引擎数、用户数等平台全量资源,并明确不要本日/本周/本月/本年筛选,则统计组件的 `searchData` 必须保持 `[]`,相关显示查询开关必须为 `false`,不要套用经营看板的周期筛选默认值。
221
+ - 交付类首页优先使用 `statistic`、`progress`、`pie`、`bar`、`linebar`、`html` 等图形化组件,不要为了凑数据把明细表格放到首页;明细应放在低代码表单菜单里查看。
222
+ - 使用脚本或 FormEngine 写入 `mic_page.JsonObj` 时,中文 JSON 必须做编码安全处理:可将最终 JSON 字符串中的非 ASCII 字符转为 `\uXXXX` 后写入,避免数据库或中间层把标题写成 `????`。
223
+ - 写入界面引擎后必须回读 `mic_page.JsonObj` 并检查:不包含 `????`;用户要求无周期筛选时,不包含 `period`、`本日`、`本周`、`本月`、`本年`;`JSON.parse(JsonObj)` 后标题能还原为中文。
224
+ - 如果使用 MCP 或自动页面生成工具后发现它注入了默认周期筛选,必须在最终写入前移除这些筛选,并再次回读验证。
225
+ - 交付类首页必须做可读性验收:彩色统计卡片、深色渐变、图表标签、HTML 组件中的文字必须显式设置高对比文字色。深色/饱和背景使用白色或接近白色文字;浅色背景使用 `#0f172a/#334155` 等深色文字。不得只设置背景色而遗漏标题、数值、图标颜色。
226
+ - 写入后必须检查页面 JSON 和接口返回内容不包含直接暴露的 ECharts 模板占位符:`{a}`、`{b}`、`{c}`、`{d}`、`{value}`。这些只能作为图表 formatter 内部配置使用,不能出现在用户可见标题、饼图中心标题、HTML 文案或默认加载文本中。
227
+ - 容器标题栏的 `moreOption.hidden` 语义必须按“true=隐藏、false=显示”处理。交付首页、统计驾驶舱如无明确跳转需求,容器标题可直接留空并在 HTML/组件内部渲染标题,避免右上角出现默认 `More/更多`。
228
+ - 如果 Page Engine 前端标准图表组件会因为远程数据源自动显示周期筛选,而用户明确要求不要筛选条,可优先使用 `html` 组件承载实时接口返回的图形化驾驶舱;接口返回扁平字段如 `{ html: "<div>...</div>" }`,页面 `dataHtml` 使用 `${html}`。写入后回读验证无周期词、无 `More/更多`、无占位符、无低对比色。
229
+ - 生成首页前必须判断组件沉淀层级:如果某个能力是平台高频标准能力(如指标卡、进度列表、状态分布、排行榜、时间线、描述列表、Office 预览),优先使用或补充 Page Engine 标准组件源码;如果只是当前项目的强业务驾驶舱、组合排版、一次性说明区块,可以用 `html` 组件定制。不要把明显可复用的标准能力长期塞进项目 HTML,也不要为了单个业务驾驶舱新增一堆低复用组件。
230
+ - `html` 组件承载长文本、失败原因、来源清单、备注说明、交付结论时,必须设置 `white-space:normal`、`overflow-wrap:anywhere` 或使用逐条列表/卡片渲染;禁止把多条内容用 `;`、`,` 拼成一整行导致底部说明挤在一起。写入后必须检查长文本在 1366/1440 宽度下能自然换行且不横向溢出。
231
+ - 交付类首页如果使用一个远程 `html` 组件承载整页驾驶舱,运行态应由外层框架滚动,不要给容器和组件写死 1000px 这类固定高度。页面 JSON 可将 `wrapperOption.height` 与 `widgetOption.height` 设为 `0`(或运行态支持的 `auto`),前端运行态必须按内容自适应高度;设计器模式再使用可编辑的默认高度。
232
+ - 首页写入口径说明时,必须区分“用户口头期望数量”“原始资料条目数量”“按业务主体合并后的数量”“后台项目/规则/别名数量”。不要只显示一个“未交付 N 个”,应同时列出部分交付、待执行、阻塞/需业务人员配合的清单和原因。
233
+
234
+ <!-- /microi-progressive:chunk -->