@microi.net/cli 5.6.6 → 5.6.8

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 (70) 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 +81 -79
  10. package/scripts/microi-cli.js +53 -52
  11. package/scripts/microi-skills.meta.json +249 -249
  12. package/skills/.microi-skills-version.json +2 -2
  13. package/skills/.progressive-disclosure-manifest.json +210 -210
  14. package/skills/ai-engine/SKILL.md +6 -3
  15. package/skills/ai-platform-governance/SKILL.md +8 -8
  16. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +9 -9
  17. package/skills/app-store/SKILL.md +3 -1
  18. package/skills/datasource-engine/SKILL.md +3 -1
  19. package/skills/job-engine/SKILL.md +12 -2
  20. package/skills/microi-client-frontend/SKILL.md +7 -1
  21. package/skills/microi-codex/SKILL.md +16 -3
  22. package/skills/microi-codex-installer/SKILL.md +2 -2
  23. package/skills/microi-form-engine/SKILL.md +3 -0
  24. package/skills/microi-form-engine/references/component-catalog.md +1 -1
  25. package/skills/microi-form-layout/SKILL.md +1 -1
  26. 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 +3 -3
  27. package/skills/microi-frontend-sdk/SKILL.md +2 -2
  28. 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 +8 -7
  29. package/skills/microi-mobile-app-quality/SKILL.md +8 -8
  30. 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 +10 -10
  31. 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 +4 -4
  32. package/skills/microi-sso/SKILL.md +1 -0
  33. package/skills/microi-uniapp-frontend/SKILL.md +12 -10
  34. 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 +7 -7
  35. 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 +10 -10
  36. package/skills/microi.v8.js +14 -3
  37. package/skills/module-engine/SKILL.md +8 -2
  38. package/skills/page-engine/SKILL.md +4 -4
  39. 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 +3 -3
  40. 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 +4 -4
  41. package/skills/system-observability/SKILL.md +2 -1
  42. package/skills/ui-design/SKILL.md +10 -3
  43. package/skills/uniapp-mall-assets/SKILL.md +6 -0
  44. package/skills/v8-crud-api/SKILL.md +3 -3
  45. 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 +4 -4
  46. package/skills/v8-export-import/SKILL.md +16 -10
  47. 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 +3 -3
  48. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +3 -3
  49. 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 +1 -1
  50. 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 +2 -0
  51. package/skills/v8-frontend-events/SKILL.md +4 -3
  52. package/skills/v8-frontend-events/references/bluetooth-print.md +13 -2
  53. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +2 -2
  54. package/skills/v8-http-integration/SKILL.md +4 -4
  55. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +2 -2
  56. 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 +1 -1
  57. package/skills/v8-menu-buttons/SKILL.md +10 -6
  58. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +4 -4
  59. 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 +5 -5
  60. 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 +3 -3
  61. package/skills/v8-mongodb/SKILL.md +8 -1
  62. package/skills/v8-mq-mqtt/SKILL.md +2 -2
  63. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +1 -1
  64. package/skills/v8-saas-multi-tenant/SKILL.md +5 -2
  65. package/skills/v8-table-event/SKILL.md +1 -1
  66. 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 +1 -1
  67. 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 +2 -2
  68. package/skills/v8-utilities/SKILL.md +6 -2
  69. package/skills/v8-workflow/SKILL.md +2 -2
  70. package/skills/vision-engine/SKILL.md +1 -1
@@ -10,7 +10,7 @@ description: Microi V8 CRUD 接口引擎开发。用于编写服务端 JavaScrip
10
10
  你正在开发 Microi 吾码平台的 V8 接口引擎。接口引擎是运行在服务端的 JavaScript 函数,通过 `V8.FormEngine` 操作数据库,通过 `V8.Result` 或 `return` 返回结果。
11
11
 
12
12
  <!-- microi-progressive:begin -->
13
- <!-- microi-progressive:chunk id=v8-crud-api-000 sha256=6b43119f4eae78fb6b185d48c5c289878ba86093ae62ce44ad0bdaa48093f605 -->
13
+ <!-- microi-progressive:chunk id=v8-crud-api-000 sha256=d385cc7f9c0048ae1e2263e922ec33a97e8a321bcb88df4dc72a07c269fe1829 -->
14
14
  ## 本地优先与版本头(必做)
15
15
 
16
16
  AI 本地开发接口引擎时,优先修改 `microi-v8-engine/<租户>/<项目>/接口引擎/.../*.js` 本地文件,再通过 MCP 或 VS Code 插件同步到数据库。插件提示“本地和远端不一致”时,必须先读取本地与远端代码并合并有效差异,不能盲目用任一侧覆盖另一侧。
@@ -38,7 +38,7 @@ Microi.net.Api 普通本地启动不要额外设置 `ASPNETCORE_ENVIRONMENT` / `
38
38
  生成接口引擎代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;跨表事务、权限校验、状态机、金额/库存计算、复杂 `_Where` 条件等代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。
39
39
 
40
40
  <!-- /microi-progressive:chunk -->
41
- <!-- microi-progressive:chunk id=v8-crud-api-001 sha256=86768d106f68593e51beb29bcff1ee0291c483706431181da34984b22228ff21 -->
41
+ <!-- microi-progressive:chunk id=v8-crud-api-001 sha256=38155b3a9dedd994309b15913a160a6647ca4c4a7200546268fe0f5e321c4575 -->
42
42
  ## 核心规则
43
43
 
44
44
  - 接口引擎文件是纯 JavaScript(Jint 引擎,非 Node.js)
@@ -51,7 +51,7 @@ Microi.net.Api 普通本地启动不要额外设置 `ASPNETCORE_ENVIRONMENT` / `
51
51
  - 接口内 `return Code=1` 自动提交事务、`Code≠1` 自动回滚事务,**禁止**手动 Commit/Rollback
52
52
 
53
53
  <!-- /microi-progressive:chunk -->
54
- <!-- microi-progressive:chunk id=v8-crud-api-002 sha256=9f10ab278468f292b5e26679b7a7ab2ea91bb6d4094e2bff8adb7cb15e39adce -->
54
+ <!-- microi-progressive:chunk id=v8-crud-api-002 sha256=b1ec527e9a5e97b93ed9d59fdd9cd1dfae74149ab438d1a4a9e3b198976bb6a6 -->
55
55
  ## 性能底线(必须自检)
56
56
 
57
57
  - 写接口引擎前必须先做数据访问计划:需要哪些表、哪些字段、预计数据量、是否分页、是否需要缓存。
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-crud-api-007 sha256=9b2d8de72a10d57a8c969f8b176ebd9892c5810d66ed977d856f294fe4743e0b -->
5
+ <!-- microi-progressive:chunk id=v8-crud-api-007 sha256=0c2f3755beaa958d4642f98835743cc37063725746a256db7c18e1e0628a0e90 -->
6
6
  ## 查询列表(分页)
7
7
 
8
8
  ```javascript
@@ -156,7 +156,7 @@ V8.FormEngine.DelFormDataByWhere('SysUser', {
156
156
  ```
157
157
 
158
158
  <!-- /microi-progressive:chunk -->
159
- <!-- microi-progressive:chunk id=v8-crud-api-011 sha256=26127cc70449e261cd49bf5925419f637dae200e7a1ef01bb2385d3197d2e2a9 -->
159
+ <!-- microi-progressive:chunk id=v8-crud-api-011 sha256=e3fac807511be04f71971c32cfce5c4b87f7a5a349d171624e5c598452dc1def -->
160
160
  ## 事务处理
161
161
 
162
162
  ```javascript
@@ -175,7 +175,7 @@ V8.ApiEngine.Run('other-engine-key', { Id: 'xxx' }, V8.DbTrans);
175
175
  ```
176
176
 
177
177
  <!-- /microi-progressive:chunk -->
178
- <!-- microi-progressive:chunk id=v8-crud-api-012 sha256=ea59e9c92b84986701a412f53a907fb2243bc7698422c1361d82280d1e4a3e4f -->
178
+ <!-- microi-progressive:chunk id=v8-crud-api-012 sha256=c8fe5dc10f0a971d3763b51f54cd77e4f23aed816206edf019db56dd37f603ce -->
179
179
  ## 请求内异步与后台处理
180
180
 
181
181
  ```javascript
@@ -193,7 +193,7 @@ return resp.StatusCode >= 200 && resp.StatusCode < 300
193
193
  禁止用 `setTimeout` / `Task.Run` 实现“立即返回、后台继续”:接口返回后 Jint Engine、租户上下文、事务和执行租约会释放。脱离请求的任务使用后台任务、Job、MQ 或 outbox,并按 `EventId` 幂等处理与恢复。
194
194
 
195
195
  <!-- /microi-progressive:chunk -->
196
- <!-- microi-progressive:chunk id=v8-crud-api-013 sha256=d4d96c1d82d1fba71100919ff7b0d48441610fdef4602097723cffdcdaaeebf4 -->
196
+ <!-- microi-progressive:chunk id=v8-crud-api-013 sha256=2bc08bec5b03ec51679c79db4b654c5c4f66179d8258de61d949d3e3affa379d -->
197
197
  ## 动态加字段(运行时改表结构)
198
198
 
199
199
  ```javascript
@@ -12,8 +12,10 @@ description: Microi V8 Office 导入导出指南。用于使用 V8.Office 导出
12
12
  文档维护必须优先更新既有后端 V8 主文档 `microi.doc/docs/doc/v8-engine/v8-server.md`,再按需补充已有专题页;不得为同一组 `V8.Office` API 新建重复 Markdown 页面或文档路由。只维护 `microi.doc/docs/doc/` 中文文档,`docs/en/` 由官网统一翻译生成,不手工同步英文版。
13
13
 
14
14
  <!-- microi-progressive:begin -->
15
- <!-- microi-progressive:chunk id=v8-export-import-000 sha256=d3bb04ceec66bdf6b74a5bcce03be9239400497426bee7d827b25ae71bb8d840 -->
16
- ## 核心 API
15
+ <!-- microi-progressive:chunk id=v8-export-import-000 sha256=e4f13e7292335a4ea683c34ae13c3f794bdc297079a61c4099e3f547eb5e07ac -->
16
+ ## 核心 API
17
+
18
+ 标准表格导出使用 `.xlsx` 文件名及对应 OpenXML MIME。历史平台生成的“XLSX 内容但扩展名为 .xls”仅在 Excel 导入入口兼容:必须验证 OpenXML 工作簿包结构,再由 NPOI 解析;真正的 `.xls` 继续支持。禁止取消文件签名检查或把此兼容扩张到 OnlyOffice 回源、任意 ZIP、HTML/可执行文件。
17
19
 
18
20
  | 方法 | 说明 |
19
21
  |------|------|
@@ -25,7 +27,7 @@ description: Microi V8 Office 导入导出指南。用于使用 V8.Office 导出
25
27
  | `V8.Office.SendEmail({...})` | 发送邮件(HTML 内容) |
26
28
 
27
29
  <!-- /microi-progressive:chunk -->
28
- <!-- microi-progressive:chunk id=v8-export-import-001 sha256=05aa0294a3ac75fb841f129fe8c76b26d7391efa7ce67b86f18d6a9e60157722 -->
30
+ <!-- microi-progressive:chunk id=v8-export-import-001 sha256=9e166678e0cbc3b96814e9945a66c93426dd5ffb6a3c98bfbfe8dcb9e92ea5f9 -->
29
31
  ## 自定义导出 Excel(接口引擎)
30
32
 
31
33
  平台默认导出仅支持表格已展示的字段。如需自定义(如列重排、合并、计算列、图片),用接口引擎替换【导出接口】。
@@ -130,12 +132,14 @@ return {
130
132
  优先级:列级样式覆盖全局样式;`Width` 覆盖 `DefaultColumnWidth`;开启 `AutoSize` 后以自动宽度为准,再应用 `MinWidth/MaxWidth`。不传这些新参数时保持旧版导出行为。
131
133
 
132
134
  <!-- /microi-progressive:chunk -->
133
- <!-- microi-progressive:chunk id=v8-export-import-002 sha256=c0a4d4c30ecbb2da52a02aab3442cb4e4c76720f19c0001fb8c1d500ba432902 -->
134
- ## 文件响应与前端调用约定
135
-
136
- - 接口引擎必须开启【响应文件】,并返回正确的 `FileName`、`ContentType`、`FileByteBase64`。
137
- - `V8.Office.ExportExcel/ExportWord/ExportPowerPoint` 返回的是 `DosResult<byte[]>`;先判断 `Code`,再对 `Data` 调用 `System.Convert.ToBase64String`。
138
- - 前端调用 Office 导出接口时,新代码优先使用 `V8.Http.GetResponse/PostResponse`;`V8.Post/V8.Get` 仅用于兼容历史代码,不再作为新代码首选。
135
+ <!-- microi-progressive:chunk id=v8-export-import-002 sha256=c18ba2c06baf3e7fb2cea79fe46637d3223d1f6b6454aa46057cfb80addd352a -->
136
+ ## 文件响应与前端调用约定
137
+
138
+ - 接口引擎必须开启【响应文件】,并返回正确的 `FileName`、`ContentType`、`FileByteBase64`。
139
+ - 后台菜单的【导出接口替换】默认仍是登录态调用,不要为了消除“请求未携带 Token”而开启【允许匿名调用】。平台会把当前 DiyToken 放入 `Authorization: Bearer ...` 请求头;接口引擎保持【允许匿名调用】关闭即可使用 `V8.CurrentUser` 和既有权限边界。
140
+ - 自定义导出无论收到业务错误、无法解析的文件响应还是网络异常,都必须结束按钮 Loading;前端应 `await` 导出 Promise 并在 `finally` 恢复状态,不能只依赖成功分支回调。
141
+ - `V8.Office.ExportExcel/ExportWord/ExportPowerPoint` 返回的是 `DosResult<byte[]>`;先判断 `Code`,再对 `Data` 调用 `System.Convert.ToBase64String`。
142
+ - 前端调用 Office 导出接口时,新代码优先使用 `V8.Http.GetResponse/PostResponse`;`V8.Post/V8.Get` 仅用于兼容历史代码,不再作为新代码首选。
139
143
 
140
144
  ### 表头基础配置项
141
145
 
@@ -150,7 +154,7 @@ return {
150
154
  | `NumberFormat/HeaderStyle/Style` | 数字格式与列级样式 |
151
155
 
152
156
  <!-- /microi-progressive:chunk -->
153
- <!-- microi-progressive:chunk id=v8-export-import-003 sha256=51a6c3e7a44ca35dc17b5536545ac7a1d47a8915045283841d304a04c04cd219 -->
157
+ <!-- microi-progressive:chunk id=v8-export-import-003 sha256=5975618ee1d3b9a4828d9f88cf35bc4efe4a8d7f45b94bd40077fa50b1d89c1f -->
154
158
  ## 解析上传的 Excel / CSV(导入)
155
159
 
156
160
  ```javascript
@@ -191,6 +195,8 @@ return { Code: 1, Data: dataList, DataCount: dataList.length };
191
195
  - 结果与进度必须分别统计 `Added/Updated/Failed/Errors`;整批回滚后成功、新增、修改数必须归零,不能把已回滚行计作成功。
192
196
  - 用 `V8.Method.UpdateBackgroundTask({Current,Total,Msg,Log})` 上报真实校验/写入工作量;未知总量保持不确定进度,不伪造百分比。
193
197
  - 业务幂等键使用后台任务 Id 或明确的导入操作 Id;重试前回读批次,避免重复写入。
198
+ - 平台审计字段(`Id/CreateTime/UpdateTime/UserId/UserName/IsDeleted/OsClient/TenantId/TenantName`)由导入事务统一生成或由 `_CurrentUser` 归属填充,不参与写入。导出的表格天然包含这些列,服务端必须把映射到的保护字段从 INSERT/UPDATE 列清单里剔除,否则会出现 `Column 'CreateTime' specified twice`,或把旧记录的创建时间、租户归属改成 Excel 里的快照值。导入钩子(ImportV8)返回的 `FixedValues` 也不能回填这些字段,命中时按未授权字段拒绝。
199
+ - 写回策略是“新增保护、更新不覆盖”:同一批导入既能安全新增,也不会改写既有记录的平台审计字段;需要保留 Excel 里的原始时间时,另建业务时间字段,不要复用 `CreateTime`。
194
200
 
195
201
  完整前端参数见 `microi.doc/docs/doc/v8-engine/v8-client.md#v8openimportdialog`。
196
202
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-export-import-004 sha256=828669707ddc19320767ac4b787383136ec820deb6ad1dc861b42b5d39097677 -->
5
+ <!-- microi-progressive:chunk id=v8-export-import-004 sha256=db7feb545a95cfb37daca76a8bd25c386f508be3d26914d8dcbdda860c8d2b05 -->
6
6
  ## `ExcelLayout` 高级自由布局
7
7
 
8
8
  审批单、套打表、主子表、多级表头和复杂合并单元格不要硬塞入 `ExcelData + ExcelHeader`。改用 `ExcelLayout`:
@@ -94,7 +94,7 @@ V8.Result = exportResult;
94
94
  预览 URL 形式:`/?OsClient=tenant_demo#/online-office?fileUrl=<URL编码后的接口地址>&fileName=示例.xlsx&fileType=xlsx&canEdit=0`。`canEdit` 只是编辑申请,不是授权依据;未登录时即使传 `canEdit=1` 也必须强制只读,并隐藏左侧菜单、顶部导航和页签。公网匿名文件接口应配置频率限制或让导出逻辑足够轻量,不能依赖进程内变量控制并发。
95
95
 
96
96
  <!-- /microi-progressive:chunk -->
97
- <!-- microi-progressive:chunk id=v8-export-import-005 sha256=401c2cd0a4b9ea45b1709d14277cf71d74ab29dcda72d404f452a0e67b56eddc -->
97
+ <!-- microi-progressive:chunk id=v8-export-import-005 sha256=28d8f6a66069fa5774f090cab74c5231228f48425caa0145729c86a8405e535e -->
98
98
  ## 多 Sheet Excel 导出
99
99
 
100
100
  `ExcelSheets` 中每项是一张独立工作表,可以使用 `ExcelLayout` 高级布局,也可以传 `ExcelData + ExcelHeader` 标准表格;标准表格还可传 `FormEngineKey`、查询条件等让后端自行查询。两种模式可以在同一工作簿混用。`Sheets` 是兼容别名;新代码统一使用 `ExcelSheets`。
@@ -145,7 +145,7 @@ return {
145
145
  图片列:`ImgUpload.Multiple=1` 会按最大图片数展开为多列并合并表头;列上的 `Width` 会应用到每个展开列,`DataRowHeight/RowHeight` 控制图片行高。自动列宽会遍历单元格,大批量导出不要对所有列盲目开启。
146
146
 
147
147
  <!-- /microi-progressive:chunk -->
148
- <!-- microi-progressive:chunk id=v8-export-import-006 sha256=1a74f8359e67ca4b270de414000f8416a7564c1595189c091281d0fea6dd4a45 -->
148
+ <!-- microi-progressive:chunk id=v8-export-import-006 sha256=fd97ce1f87c32cad8539f3307bfdf679b0abc9e747281f6aaf06e7d322046c8f -->
149
149
  ## Word 导出
150
150
 
151
151
  新代码使用对象参数的 `ExportWord`;`ExportWordText` 继续保留,只用于兼容旧版纯文本场景。Word 的页面边距、图片宽高单位为厘米,字体大小单位为磅。
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-export-import-007 sha256=d2958751b32d5143693cbdb6fb72aeca97f450c80c360aa7d826d4f6595c0ab1 -->
5
+ <!-- microi-progressive:chunk id=v8-export-import-007 sha256=33d817757174d42d2833f2ce3bbca6d8da341938f242d48bdad3891d6ab25230 -->
6
6
  ## PowerPoint 导出
7
7
 
8
8
  PowerPoint 的幻灯片尺寸、图片/表格位置与宽高单位均为英寸,默认画布为 16:9(13.333 × 7.5)。
@@ -139,7 +139,7 @@ return { Code: 1, Data: stepStr ? JSON.parse(stepStr) : [] };
139
139
  ```
140
140
 
141
141
  <!-- /microi-progressive:chunk -->
142
- <!-- microi-progressive:chunk id=v8-export-import-009 sha256=76d08b493419719094a95a5b760a83ae09b136bd54d66d2362efd428dea03ff8 -->
142
+ <!-- microi-progressive:chunk id=v8-export-import-009 sha256=ba923bb2b464910d063e94a6f88dbb9b3229739cb5e39611c8cf275bc77b743c -->
143
143
  ## 接收并下载文件(HTTP 链接转 Excel)
144
144
 
145
145
  ```javascript
@@ -152,7 +152,7 @@ var base64 = System.Convert.ToBase64String(bytes);
152
152
  ```
153
153
 
154
154
  <!-- /microi-progressive:chunk -->
155
- <!-- microi-progressive:chunk id=v8-export-import-010 sha256=0df463f76ba60100c087364b48dab1886d1315b093577ea9485471b34a7a3f6c -->
155
+ <!-- microi-progressive:chunk id=v8-export-import-010 sha256=372a60e928fe1b46d20ed8a7b8bd3736b2bc96465d6e6645c4ae849ca71ce987 -->
156
156
  ## 子表导入自动关联主表
157
157
 
158
158
  当单独导入 `TableChild` 子表时,Excel 经常没有主表 Id,只带项目编号、客户名称等业务字段。默认导入引擎支持通过子表控件配置批量反查主表,并自动补齐子表外键。
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-export-import-011 sha256=63cfa4a963d5c37e81c63f5c2b6b47a4709d1a0896d76e9feba4566d118cfe6b -->
5
+ <!-- microi-progressive:chunk id=v8-export-import-011 sha256=a98c3b7c70f039fdd37128c3254acebd6fb527e78900f8fb38294e03baca083e -->
6
6
  ## 安全 / 性能注意
7
7
 
8
8
  - ❌ 不要在循环中逐条 `AddFormData` 而不传 `V8.DbTrans`:每条独立事务,性能差且部分失败会留脏数据
@@ -119,6 +119,8 @@ function publicUploadUrl(path) {
119
119
 
120
120
  私有桶(`Limit === true`)不要拼 `FileServer`,必须把归一化后的 `Path` 传给 `V8.Method.GetPrivateFileUrl({ FilePathName: path })` 或后端签名接口换临时 URL。
121
121
 
122
+ 跨端保存时保留上传响应的实际 `Limit`(兼容布尔值、`1/0` 与对应字符串),只删除临时签名地址和本地预览状态。历史对象缺少该标记时按字段配置取址;已有私有标记优先于公有字段缺省值。单图字段兼容历史单元素数组,不应在字段值预处理阶段把数组直接清空。
123
+
122
124
  <!-- /microi-progressive:chunk -->
123
125
  <!-- microi-progressive:chunk id=v8-file-upload-010 sha256=229294a07a8db953219c35292db5558430addb576505695b9ce88a275eb46232 -->
124
126
  ## 安全注意
@@ -14,11 +14,12 @@ description: Microi 前端 V8 事件与客户端能力指南。用于编写浏
14
14
  > 本文重点是 **字段事件、按钮事件、列表事件、模板引擎、其它前端钩子**。
15
15
 
16
16
  <!-- microi-progressive:begin -->
17
- <!-- microi-progressive:chunk id=v8-frontend-events-000 sha256=df2662a9a006d35d989d7ff7316890ffff2c08e422d0e88033f44cdd40210c88 -->
17
+ <!-- microi-progressive:chunk id=v8-frontend-events-000 sha256=70e28f65232cb781fcf3dadd2e1896bd1534b15876545170e81667aa6322724d -->
18
18
  ## 能力路由
19
19
 
20
20
  - 查询前端 V8 全部上下文、导航、表单、列表、网络、引擎与工具入口时,读取 `../v8-utilities/references/client-api-index.md`。
21
- - 需求包含“蓝牙打印、标签打印、TSC/TSPL、CPCL、ESC/POS、小票打印、佳博/GP-M322、ZICOX/芝柯/CC4、BLE/SPP”时,必须先读取 `references/bluetooth-print.md`;需要完整指令签名、型号转换范围、编码或位图参数时,再读取 `references/bluetooth-print-api.md`。
21
+ - 需求包含“蓝牙打印、标签打印、TSC/TSPL、CPCL、ESC/POS、小票打印、佳博/GP-M322、ZICOX/芝柯/CC4、BLE/SPP”时,必须先读取 `references/bluetooth-print.md`;需要完整指令签名、型号转换范围、编码或位图参数时,再读取 `references/bluetooth-print-api.md`。
22
+ - `microi.app` 是 5+ 在线壳,不能假设存在 `uni` 或 Web Bluetooth。BLE 连接、发现和写入必须统一使用 `plus.bluetooth`,禁止用 `uni.writeBLECharacteristicValue` 写入由 `plus.bluetooth` 建立的连接。5+ `V8.Print.getConnectionState()` 的 `mtu/maxWriteBytes/recommendedPacketSize/writeType/packetIntervalMs` 描述本次连接能力。Android GP-M322 在特征支持时优先 `writeNoResponse`,即使协商出 180 字节有效载荷也只采用 100 字节连续发送稳定档,并保留约 8ms 包间保护;不支持无响应写时兼容 `write`,空 MTU 成功、失败、超时或旧壳只用 20 字节。详见蓝牙参考。
22
23
  - 浏览器模板打印、PDF/纸张模板、`mic_print`、`PageObj`、`PrintObj` 使用 `print-engine/SKILL.md`,不要与直接蓝牙指令混为一套 API。
23
24
  - 扫码使用 `V8.Method.ScanCode`,结果从 Promise/回调取得;`V8.ScanCodeRes` 只作兼容结果槽,详见客户端 API 索引。
24
25
  - 登录后的敏感操作使用 `V8.Identity.Verify` 完成 Passkey/严格人脸交互;前端只取得一次性 Ticket,后端接口引擎必须重算 `ActionHash` 并原子消费,不能把前端成功当作授权。
@@ -110,7 +111,7 @@ V8.OpenAnyTable({
110
111
  `ReadOnlyButton` 的产品文案是【禁用插槽按钮】:只控制按钮是否可点击,不等同于字段只读,应保留用于权限和状态控制。
111
112
 
112
113
  <!-- /microi-progressive:chunk -->
113
- <!-- microi-progressive:chunk id=v8-frontend-events-002 sha256=986a67e78b0274941c6f2ab6589b06b8545f8f3261d4972dc56d4061b019d799 -->
114
+ <!-- microi-progressive:chunk id=v8-frontend-events-002 sha256=332a6ed2c90fe8ff23f04d7fd1c3a24df263b2692f2c292337a468a0423b409f -->
114
115
  ## 按钮事件
115
116
 
116
117
  ### V8BtnRun — 按钮点击执行(菜单按钮、表单按钮)
@@ -210,8 +210,18 @@ async function printBatch(rows, startIndex) {
210
210
  当前没有公开的自定义服务配置,并选择枚举到的第一个可写特征;其它型号可能需要扩展源码。
211
211
  CC4 固件若只开放 SPP 或使用其它私有 UUID,Web 端不可连接;Android 5+App 使用已配对 SPP,
212
212
  或先取得厂家准确 BLE UUID 再扩展源码,禁止猜 UUID。
213
- - `prepareSend` 默认每包 20 字节、包间约 20ms;同一缓冲区多份打印间约 100ms。这只是
214
- BLE 写节奏,不是打印完成等待时间。包长必须是已实测的正整数,空缓冲区不得发送。
213
+ - `prepareSend` 默认每包 20 字节;Android 5+ 的佳博 GP-M322 在特征支持时优先使用同一
214
+ `plus.bluetooth` 连接的 `writeNoResponse`,逐包 await API 回调并保留约 8ms 的 GATT 保护窗口;
215
+ 即使协商出 180 字节有效载荷也只采用 100 字节稳定档。不支持无响应写时保留 `write` 兼容路径。其它型号、iOS、Web 与 SPP
216
+ 保留约 20ms,同一缓冲区多份间约 100ms。5+ BLE 的连接、服务发现和写入统一使用 `plus.bluetooth`,
217
+ 禁止用 `uni.writeBLECharacteristicValue` 写入由 `plus.bluetooth` 建立的连接。
218
+ 这是写节奏,不是物理走纸确认。5+ BLE 同时受本次连接的 `maxWriteBytes` 和更保守的
219
+ `recommendedPacketSize` 限制;未知 MTU 为 20。
220
+ - 5+ 佳博在服务发现后协商 MTU,最多等待 1.5 秒,`getConnectionState()` 返回 `mtu`、
221
+ `maxWriteBytes`、`recommendedPacketSize`(20/100)、`writeType`、`packetIntervalMs`。
222
+ 必须读取真实回调的 `mtu`;空成功、失败、超时或缺 API 不可按请求值升档,迟到回调不得提升能力,
223
+ 断开时清除能力。自定义微服务需按这些字段判断,不能只允许 `engine === 'web'`。
224
+ `microi.app` 在线壳更新远程前端即可获取本修复;WebView 缺少 Web Bluetooth 时不增加无效切换选项。
215
225
  - 当前分包公式使用 `Math.ceil(length / packetSize)`,长度恰好整除时不会产生 0 字节末包;
216
226
  空数据、非法包长和非法份数会直接抛错。合法数值仍须按目标打印机实测。
217
227
  - TSC 与 ESC 文本使用仓库内置 `encoding.js` + `encoding-indexes.js` 转为 GB18030,运行时
@@ -232,6 +242,7 @@ async function printBatch(rows, startIndex) {
232
242
  - 金额、数量、坐标、纸张尺寸、包长和份数先做类型/范围校验,避免无限循环或超大缓冲区。
233
243
  - 打印内容含个人信息、票据或密钥时,不写控制台、系统日志或异常上报正文。
234
244
  - 浏览器权限拒绝、用户取消、GATT 断开、找不到服务/特征和写包失败都必须可理解地提示。
245
+ - 搜索不到设备的头号原因是残留 GATT 连接:BLE 外设在已连接期间停止广播,上一次连接被并发流程打断或 App 重启后系统仍保留旧链路时,打印机“没在用”但也搜不到。平台在开始发现前会先 `getConnectedBluetoothDevices` 并关闭应用未持有的连接,被断开/重连事件接管时也会显式关闭自己建立的链路;排查顺序据此固定为“清理残留连接 → 打印机重新上电 → 系统蓝牙忽略设备 → 再搜索”,不要先去改包长、MTU 或指令集。
235
246
 
236
247
  ## 实机验收
237
248
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-frontend-events-006 sha256=f9b273e42b9bf94893ecef53797876a373ad92d46f421c90c603c52259bbd2d2 -->
5
+ <!-- microi-progressive:chunk id=v8-frontend-events-006 sha256=7ef892121df52256c6d8c4e9da546c3f60d365f2a3cab0cb315da0b8d1fe68cd -->
6
6
  ## 列表事件
7
7
 
8
8
  ### TableRowClick — 行点击
@@ -40,7 +40,7 @@ V8.RefreshTable({ _PageIndex: 1 });
40
40
  ```
41
41
 
42
42
  <!-- /microi-progressive:chunk -->
43
- <!-- microi-progressive:chunk id=v8-frontend-events-007 sha256=3a8ad420eed127357a6b5e799792325bc5c152ff8607722a7dc96c252fae0da2 -->
43
+ <!-- microi-progressive:chunk id=v8-frontend-events-007 sha256=3f634f1942bdd72c87a68a2a6c4883eb2bf1e95b64bc9dc895646484f9d77a9d -->
44
44
  ## 常用前端 API
45
45
 
46
46
  | API | 说明 |
@@ -14,7 +14,7 @@ description: Microi V8 HTTP 集成指南。用于通过 V8.Http.Get/Post/Patch
14
14
  文档维护时,前端用法更新现有 `microi.doc/docs/doc/v8-engine/v8-client.md`,后端用法更新现有 `microi.doc/docs/doc/v8-engine/v8-server.md`;不要新建重复的 V8.Http 文档页面或路由。只维护中文 `docs/doc/`,英文 `docs/en/` 由官网统一翻译生成。
15
15
 
16
16
  <!-- microi-progressive:begin -->
17
- <!-- microi-progressive:chunk id=v8-http-integration-000 sha256=c5600510764ba7a160557ef9acd34719d1ab8c65acf635f3d4183ed5ab2e2e1f -->
17
+ <!-- microi-progressive:chunk id=v8-http-integration-000 sha256=0a2600eb1fc1308232c8b23aa9e6859a4927df69b20f043537df305628d46c89 -->
18
18
  ## V8.Http API
19
19
 
20
20
  | 方法 | 说明 | 返回值 |
@@ -71,7 +71,7 @@ if (resp.StatusCode < 200 || resp.StatusCode >= 300) {
71
71
  `GetResponse/PostResponse/PatchResponse` 返回 `Content`、`Headers`、`RawBytes`、`StatusCode`、`ErrorMessage`。后端 `RawBytes` 是 `.NET byte[]`,前端是 `Uint8Array`。
72
72
 
73
73
  <!-- /microi-progressive:chunk -->
74
- <!-- microi-progressive:chunk id=v8-http-integration-001 sha256=4cbbdd385e24d19413b7534665333c07f2516067e9f34aa40e6adabe9e0506f4 -->
74
+ <!-- microi-progressive:chunk id=v8-http-integration-001 sha256=3ea3068fc215afae5c0f36ac54f277542a218e7a2aa2a953be8403e77b31f947 -->
75
75
  ## V8.AI 与底层 HTTP
76
76
 
77
77
  - 前端 V8 的平台 AI 普通调用优先 `await V8.AI.Chat(...)`。它自动使用当前 ApiBase 和平台登录头、接收响应 Token 轮换,并清除调用参数中的租户、身份、Endpoint、ApiKey 和认证头覆盖;只有确认问题适合进入 URL 日志时才用 `V8.AI.ChatGet(...)`。
@@ -94,7 +94,7 @@ else V8.Result = result.Data;
94
94
  完整授权矩阵、SSE、后端安全边界与 MCP 示例维护在官网现有 `system-engine/ai-engine.md`,不要新建重复文档。
95
95
 
96
96
  <!-- /microi-progressive:chunk -->
97
- <!-- microi-progressive:chunk id=v8-http-integration-002 sha256=14439c586d3379c6976513df7b3c0b2f9d586ceb4d845d6f6a1abdcb1d58705a -->
97
+ <!-- microi-progressive:chunk id=v8-http-integration-002 sha256=bf9d4f5162ff81798521f69a82e41db50c95f4a0b3d1338d35983c1b161d6192 -->
98
98
  ## POST 请求(对象参数格式)
99
99
 
100
100
  > V8 接口引擎中必须使用对象参数格式。尤其禁止 `V8.Http.Get(url)`:当前 .NET 同名重载包含 `Task<string> Get(string)`,Jint 可能把字符串调用解析为异步重载,脚本最终拿到 `[object Promise]`。GET 必须写成 `V8.Http.Get({ Url: url })`;第三方登录、微信 `jscode2session`、AccessToken 等链路保存后必须用无效 code 烟测,确认返回的是第三方明确错误而不是 Promise。
@@ -114,7 +114,7 @@ var data = JSON.parse(result);
114
114
  ```
115
115
 
116
116
  <!-- /microi-progressive:chunk -->
117
- <!-- microi-progressive:chunk id=v8-http-integration-003 sha256=4c7c1346ea1e17b2c2ff096f1cc9b6502ae95b73087f62bc6b3531d01297eddf -->
117
+ <!-- microi-progressive:chunk id=v8-http-integration-003 sha256=4c7e61dfc8a2539f65ea18d068c13d0168f84d0227ea93f17c8073a2a1cc8643 -->
118
118
  ## PATCH 请求
119
119
 
120
120
  PATCH 与 POST 的参数完全对称,只需把请求体参数改为 `PatchParam` / `PatchParamString`:
@@ -17,7 +17,7 @@ var data = JSON.parse(result);
17
17
  ```
18
18
 
19
19
  <!-- /microi-progressive:chunk -->
20
- <!-- microi-progressive:chunk id=v8-http-integration-005 sha256=ae05f44b4857a7244fdeafab994ef41217252694228569a9701988a3857b5438 -->
20
+ <!-- microi-progressive:chunk id=v8-http-integration-005 sha256=055100b212469d8ebd7e42fa9220fbb25b89b5ba10413d8867d2ba4f2c014c94 -->
21
21
  ## 获取完整响应(含状态码和响应头)
22
22
 
23
23
  ```javascript
@@ -58,7 +58,7 @@ var resp = V8.Http.PatchResponse({
58
58
  - DNS 校验不能代替网络层出站 ACL。生产环境还应在容器、主机或网关阻断云元数据和非必要私网段。
59
59
 
60
60
  <!-- /microi-progressive:chunk -->
61
- <!-- microi-progressive:chunk id=v8-http-integration-006 sha256=b5e8b317857ac4d81818ba230dadd927d12ef9cddb989921bdbeffe8e96527a3 -->
61
+ <!-- microi-progressive:chunk id=v8-http-integration-006 sha256=6e787d9b46d5ba82ef5d2394525d8a36649b1d722a6a59eacf8dd54884e14b3b -->
62
62
  ## 前端 V8 行为与兼容性
63
63
 
64
64
  - 前端新代码应优先使用 `await V8.Http.Get/Post/Patch`,参数与后端一致;不要再把 `V8.Post/Get` 作为新功能首选。旧 `V8.Post/Get` 仅作为兼容 API 保留,其回调和 Promise 写法保持不变。
@@ -28,7 +28,7 @@ try {
28
28
  ```
29
29
 
30
30
  <!-- /microi-progressive:chunk -->
31
- <!-- microi-progressive:chunk id=v8-http-integration-012 sha256=5be87e89ec429dd9b79e89014485b7745c2a400f2066d0d989f71c9779de32fc -->
31
+ <!-- microi-progressive:chunk id=v8-http-integration-012 sha256=321e3eee95847088ca6c48ee0dba2b926e834fa492cfd97d1a347ae6cbb843d5 -->
32
32
  ## 注意事项
33
33
 
34
34
  - `V8.Http.Post` 的 `PostParam` 不支持多级嵌套对象,嵌套需用 `PostParamString`
@@ -14,7 +14,7 @@ description: Microi 菜单按钮与 Tab V8 指南。用于配置 sys_menu MoreBt
14
14
  ---
15
15
 
16
16
  <!-- microi-progressive:begin -->
17
- <!-- microi-progressive:chunk id=v8-menu-buttons-000 sha256=b706679cdd4bff28f2d20c94dfea2f6f68303d768d53d3907827d43eedfaa72d -->
17
+ <!-- microi-progressive:chunk id=v8-menu-buttons-000 sha256=9ed7af82b50d25263818ad4b1ec1b5c6290d9d4a5a8cdc7f046440c0e6a0a1ff -->
18
18
  ## 1. 字段总览
19
19
 
20
20
  | 字段 | 渲染位置 | 必填项 |
@@ -29,7 +29,7 @@ description: Microi 菜单按钮与 Tab V8 指南。用于配置 sys_menu MoreBt
29
29
  ---
30
30
 
31
31
  <!-- /microi-progressive:chunk -->
32
- <!-- microi-progressive:chunk id=v8-menu-buttons-001 sha256=baf0987fff87b6a144361f9aa19598d30c9e747867bd170de4ccd40447df9377 -->
32
+ <!-- microi-progressive:chunk id=v8-menu-buttons-001 sha256=21a4d64e3ddf27766ecf2325a8af935c3b6e3134c4fa4df484ace9f1f356de6c -->
33
33
  ## 3. 模式 A:弹窗收集参数 → 调接口引擎(最常用)
34
34
 
35
35
  ```js
@@ -57,7 +57,7 @@ V8.OpenAnyForm({
57
57
  ```
58
58
 
59
59
  <!-- /microi-progressive:chunk -->
60
- <!-- microi-progressive:chunk id=v8-menu-buttons-002 sha256=f1e1bc64623a26a6c06bccd3e7da3f7e3b16e76b85d2fb398efe2c74407fba04 -->
60
+ <!-- microi-progressive:chunk id=v8-menu-buttons-002 sha256=911b9cddbd448bb27d39d0de93274b0f67622e0b61026267d13300297931f34a -->
61
61
  ## 4. 模式 B:直接确认 + 接口调用
62
62
 
63
63
  `ConfirmTips` 使用 HTML 模式渲染内容,只传固定文案或经过 HTML 转义的简单文本;不要拼接用户输入、接口消息或数据库富文本。
@@ -76,7 +76,7 @@ V8.ConfirmTips('确认领取该任务?', function () {
76
76
  ```
77
77
 
78
78
  <!-- /microi-progressive:chunk -->
79
- <!-- microi-progressive:chunk id=v8-menu-buttons-003 sha256=d04e7a71ffe8baa47c2430077d0fd0bb44dffc62c7e7ce2bca9d02b220ae24f5 -->
79
+ <!-- microi-progressive:chunk id=v8-menu-buttons-003 sha256=b58b1c9990f905a0b65bb72c472461bb46ce22eb1f5c73bec68938a162bdcb55 -->
80
80
  ## 4.1 模式 B2:在线微服务定制页(OpenAppDialog)
81
81
 
82
82
  当弹窗包含复杂布局、多步骤交互、实时校验或后续需要 AI 在线维护时,优先把页面实现为在线微服务,按钮 V8 代码只负责打开页面、传入上下文和接收结果。不要把长篇 HTML/CSS 写进 `V8Code`。
@@ -111,7 +111,9 @@ V8.OpenAppDialog({
111
111
  | `AppKey` | 是 | - | `sys_microiservice.MsKey`,目标微服务必须已经编译发布。 |
112
112
  | `RoutePath` | 否 | `/` | 子应用内部路由;`MicroRoute` 是兼容别名,优先取 `RoutePath`。 |
113
113
  | `Version` | 否 | 当前 `BuildVersion` | 固定加载某个发布版本;通常省略以使用当前版本。 |
114
- | `Title` | 否 | `应用` | Dialog/Drawer 标题。 |
114
+ | `Title` | 否 | `应用` | Dialog/Drawer 标题。 |
115
+ | `Header` | 否 | - | 初始外层标题栏 `{ title, tags, actions }`;仅可序列化文本和动作标识。 |
116
+ | `OnHeaderAction(actionId, V8)` | 否 | - | 可选调用方前端 V8 动作;不设置时由子应用处理按钮点击。 |
115
117
  | `TitleIcon` | 否 | `fas fa-window-maximize` | 标题图标 class。 |
116
118
  | `Width` | 否 | `min(920px, calc(100vw - 32px))` | CSS 宽度值,推荐带移动端安全边距。 |
117
119
  | `OpenType` | 否 | `Dialog` | `Dialog` 或 `Drawer`。 |
@@ -120,7 +122,9 @@ V8.OpenAppDialog({
120
122
  | `OnCancel(data)` | 否 | - | 子应用取消回调,回调后自动关闭。 |
121
123
  | `OnError(error)` | 否 | - | 加载或执行错误回调,不自动关闭。 |
122
124
 
123
- 宿主还会自动传入 `apiBase`、`osClient`、`token`、`appKey`、`version`、`microRoute`、`dialog:true`。子应用返回协议:
125
+ 宿主还会自动传入 `apiBase`、`osClient`、`token`、`appKey`、`version`、`microRoute`、`dialog:true`。子应用返回协议:
126
+
127
+ 宿主支持 `dialogHeaderBridge:true` 时,子应用可隐藏内部工具栏,使用 `window.microApp.forceDispatch({ type:'app-dialog:header', data:{ title:'单据号', tags:[{text:'待审核',tone:'warning'}], actions:[{id:'approve',text:'审核',tone:'success'}] } })` 更新外层标题栏。若未传 `OnHeaderAction`,宿主会把按钮点击作为 `host:dialog-action` 数据消息回传 `actionId/requestId`,子应用仍需向后端重新核验权限;旧宿主继续显示子应用自己的工具栏。
124
128
 
125
129
  ```js
126
130
  window.microApp.dispatch({ type: 'app-dialog:success', data: { message: '已提交' } });
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-menu-buttons-004 sha256=9550f2e3a75583bb6f2ab940d423931511f39b6ad8a11fc982c6b24bca6416d1 -->
5
+ <!-- microi-progressive:chunk id=v8-menu-buttons-004 sha256=c936a3246ce8148f77f98dfb5d8d0f0be4b87de63310dfd7ac84c2725707d3ea -->
6
6
  ## 2. 按钮对象 Schema
7
7
 
8
8
  ```jsonc
@@ -159,7 +159,7 @@ V8.OpenAnyTable({
159
159
  ---
160
160
 
161
161
  <!-- /microi-progressive:chunk -->
162
- <!-- microi-progressive:chunk id=v8-menu-buttons-005 sha256=1dddbfaac5cd9a350686ff72c47f1cd5ed022bcdc425a7d54b790537df445cd5 -->
162
+ <!-- microi-progressive:chunk id=v8-menu-buttons-005 sha256=ca6d6eb9f75e80f2f0a420ed4b959ed2da879d44b8eedb2bc7a013e13561e1a2 -->
163
163
  ## 5. 模式 C:状态机推进(无需弹窗)
164
164
 
165
165
  ```js
@@ -182,7 +182,7 @@ if (next) {
182
182
  状态机必须由接口引擎校验当前状态、目标状态、权限和并发版本;不要在前端直接更新状态字段。
183
183
 
184
184
  <!-- /microi-progressive:chunk -->
185
- <!-- microi-progressive:chunk id=v8-menu-buttons-006 sha256=86eb74f9e150eb398b010f2cc0a00920669e12f2e6f2729f2443250659e5c0bd -->
185
+ <!-- microi-progressive:chunk id=v8-menu-buttons-006 sha256=661e9eda504167d3eaca091ae759d49b8ddae64f5b1b3b7aab20ed31da33750a -->
186
186
  ## 6. 模式 D:批量操作(BatchSelectMoreBtns)
187
187
 
188
188
  ```js
@@ -200,7 +200,7 @@ V8.ConfirmTips('确认删除选中的 ' + ids.length + ' 条?', function () {
200
200
  ```
201
201
 
202
202
  <!-- /microi-progressive:chunk -->
203
- <!-- microi-progressive:chunk id=v8-menu-buttons-007 sha256=cb0ccac7faf880e55f33a510fdf43b024ace93d5c80618ddd6a40ca3efbcbb1b -->
203
+ <!-- microi-progressive:chunk id=v8-menu-buttons-007 sha256=03346fa906eccc815f6f5be4ed9c5c0ef8c1cdce22e8aba47576ea258c6113a1 -->
204
204
  ## 7. 模式 E:PageTabs 切换筛选
205
205
 
206
206
  ```js
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-menu-buttons-008 sha256=495161c95d321f2937486db3fecc4e27d2e38c6d7a21587b5028d04ea6491b90 -->
5
+ <!-- microi-progressive:chunk id=v8-menu-buttons-008 sha256=8109ed4c7386f8cd1c89db1a8629962b26a448f68082abbb81c75277d5aa1843 -->
6
6
  ## 8. 模式 F:后台任务按钮(长任务)
7
7
 
8
8
  应用安装、初始化多语言、批量导入、批量修复、跨系统同步等可能超过浏览器或网关等待时间的操作,必须优先设计为后台任务。判断阈值:预计超过 2 分钟、500 条以上、1000 个以上扇出子操作、100 次以上外部调用,或总量未知且可能持续运行。前端按钮只负责提交任务,后台任务列表通过 WebSocket/SignalR 推送并以轮询兜底。
@@ -114,7 +114,7 @@ reportProgress(2, 5, '正在写入表结构');
114
114
  ---
115
115
 
116
116
  <!-- /microi-progressive:chunk -->
117
- <!-- microi-progressive:chunk id=v8-menu-buttons-009 sha256=8cb7f4d399068549be662cc47bd4add8b3d3bbdb6e7a74832e4c63b7768e136b -->
117
+ <!-- microi-progressive:chunk id=v8-menu-buttons-009 sha256=dc4cda219daf751e6943d1bc518776b67c15963cf7a9a5ebdfecaf6884aa89a0 -->
118
118
  ## 9. 通过 MCP 创建菜单 + 按钮(一次到位)
119
119
 
120
120
  > AI 在 `microi_create_module` 调用时,把按钮 JSON **作为字符串** 传入对应字段。
@@ -157,7 +157,7 @@ var modulePayload = {
157
157
  ---
158
158
 
159
159
  <!-- /microi-progressive:chunk -->
160
- <!-- microi-progressive:chunk id=v8-menu-buttons-010 sha256=0398a9fc35520d4b17b990efc565ba1d9f6050303e122dc128207adf08434aee -->
160
+ <!-- microi-progressive:chunk id=v8-menu-buttons-010 sha256=fd43cbb167733a5a722938f7c8c412b52999aa61ffe7b3016efc09a0e383dd41 -->
161
161
  ## 前端 FormEngine 权限与兼容
162
162
 
163
163
  - 当前按钮所在菜单绑定表会由 scoped facade 自动补真实 `_SysMenuId`,历史按钮不需要逐个修改。
@@ -171,7 +171,7 @@ var modulePayload = {
171
171
  ---
172
172
 
173
173
  <!-- /microi-progressive:chunk -->
174
- <!-- microi-progressive:chunk id=v8-menu-buttons-011 sha256=16414969be47116a51bab1c6a7e1482bb987b278430e0fb8daaf7d6ecf41bf94 -->
174
+ <!-- microi-progressive:chunk id=v8-menu-buttons-011 sha256=3e7e5f9faac605ca1c8e8eeb3d5aa8a2a5aabeb4716179955942bd243302c521 -->
175
175
  ## 10. 与接口引擎配套的工作流
176
176
 
177
177
  业务按钮通常与接口引擎配套:
@@ -186,7 +186,7 @@ var modulePayload = {
186
186
  ---
187
187
 
188
188
  <!-- /microi-progressive:chunk -->
189
- <!-- microi-progressive:chunk id=v8-menu-buttons-012 sha256=086e02210a949cc0a2c343e7f50c54c48079667999e9264ea5282c9caa951222 -->
189
+ <!-- microi-progressive:chunk id=v8-menu-buttons-012 sha256=4236db974612bd9eeeb35200c7e583a93e3dd17c72736e1674c9fb757698a550 -->
190
190
  ## 10.1 后台直充/调账类行按钮
191
191
 
192
192
  会员积分、余额、库存、额度等会改动资产的后台行按钮,必须采用“前端按钮只收参数,后端接口负责事务”的模式。
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-menu-buttons-013 sha256=1d6b1f06fb41007012f9ce2b57913404549a40d1e52f6a87a69f8079c6bf6919 -->
5
+ <!-- microi-progressive:chunk id=v8-menu-buttons-013 sha256=52939e7f29d0e3c7a2622c39bfc8484e27830ecb39a4205e57d5bdd437d60629 -->
6
6
  ## 10. 反模式(避免)
7
7
 
8
8
  ❌ 把所有业务逻辑塞进 `V8Code`,不创建接口引擎
@@ -27,7 +27,7 @@
27
27
  ✅ 先用 `microi_list_applications` / `microi_get_application_context` 查找现有微服务;优先在已有微服务新增页面,否则通过 MCP 创建微服务,再用 `V8.OpenAppDialog` 打开
28
28
 
29
29
  <!-- /microi-progressive:chunk -->
30
- <!-- microi-progressive:chunk id=v8-menu-buttons-014 sha256=746db9437039915f805d5e2e34741506060ee8739ea1a436ae3f7af8bb0ccdfc -->
30
+ <!-- microi-progressive:chunk id=v8-menu-buttons-014 sha256=2d11f4bb4b670c1051e4495ef1d95758420f520fea7d8c7d1c948f251a2ad4a3 -->
31
31
  ## 10.2 复杂定制弹窗必须使用微服务
32
32
 
33
33
  `V8.ConfirmTips` 只适合纯文本确认或极少量一次性输入。出现以下任一情况即视为复杂页面:三个以上字段、响应式布局、联动校验、上传、表格、Tab、步骤条、代码编辑器、需要复用、后续会持续迭代。
@@ -59,7 +59,7 @@ V8.OpenAppDialog({
59
59
  ---
60
60
 
61
61
  <!-- /microi-progressive:chunk -->
62
- <!-- microi-progressive:chunk id=v8-menu-buttons-015 sha256=c019984973cb3c722e63c34f268440f300fdd8e2e672fd629e9d6769a676ffa8 -->
62
+ <!-- microi-progressive:chunk id=v8-menu-buttons-015 sha256=ab2bb9924c4468c8619237beaf94b86a98f9027649ab5c9e499652ae0068fbd4 -->
63
63
  ## 11. ⚠️ `V8.CurrentUser` 拿不到的历史陷阱(必看)
64
64
 
65
65
  ### 现象
@@ -9,7 +9,14 @@ description: Microi V8 MongoDB 指南。用于使用 V8.MongoDb AddFormData、Up
9
9
 
10
10
  你正在开发 Microi 吾码平台的 V8 引擎代码,需要使用 MongoDB 存储非结构化数据(如日志、IoT 数据、大文档等)。
11
11
 
12
- ## V8.MongoDb API
12
+ ## V8.MongoDb API
13
+
14
+ ### 存量 MongoDB 兼容诊断
15
+
16
+ - `reports wire version 6 ... requires at least 9` 是驱动与服务端不兼容,不是日志为空,也不是 Token 失效。先记录原始错误和服务端真实协议,不能把 wire version 6 推断成 MongoDB 4.2。
17
+ - 平台兼容镜像以含安全修复的驱动 3.11.2 构建,恢复平台 CRUD/日志所需的 MongoDB 3.6 协议路径;不是降级至 2.30,也不声明上游继续维护 3.6。来源、单文件补丁和摘要维护在 `Microi.Server/ThirdParty/MongoDB.Driver/`。
18
+ - 修改该兼容层必须通过真实 3.6 与当前 7.x 的认证、BSON、读写、索引、幂等重放、游标和租户隔离矩阵。不得只验证编译或 ping,也不得把驱动兼容当作修复旧数据库服务端自身漏洞。
19
+ - C# 驱动改动需要更新后端镜像才生效。镜像更新后通过 `microi_query_system_observability` 回读日志、队列持久化和错误状态;查询失败应原样报错,禁止返回成功空表。
13
20
 
14
21
  | 方法 | 说明 |
15
22
  |------|------|
@@ -10,7 +10,7 @@ description: Microi V8 消息队列与 MQTT 生产指南。用于 V8.MQ.SendMsg
10
10
  你正在开发 Microi 吾码平台的 V8 引擎代码,需要使用 RabbitMQ 消息队列或 MQTT 物联网协议。
11
11
 
12
12
  <!-- microi-progressive:begin -->
13
- <!-- microi-progressive:chunk id=v8-mq-mqtt-000 sha256=4a6559aed1af036591a04002c6e3311d9f0957fbbabbcafdc4a6bad95dabd843 -->
13
+ <!-- microi-progressive:chunk id=v8-mq-mqtt-000 sha256=bc9ac85a8a0b6af88602e0d5419f6d61b192b5262193f6cb8c8ebd26af7bef25 -->
14
14
  ## V8.MQ — RabbitMQ 消息队列
15
15
 
16
16
  ### 生产消息(后端)
@@ -151,7 +151,7 @@ try {
151
151
  ---
152
152
 
153
153
  <!-- /microi-progressive:chunk -->
154
- <!-- microi-progressive:chunk id=v8-mq-mqtt-001 sha256=f65fe365f1adca83c0eabe95f73a658d6d79f33b3d9a8d34c5b35ede841e7d73 -->
154
+ <!-- microi-progressive:chunk id=v8-mq-mqtt-001 sha256=e38b5b491e061fc87f7e1f1446f5c4a7eb6d5f9616d18ca63632a566810c98d9 -->
155
155
  ## 注意事项
156
156
 
157
157
  - MQ 消费者接口引擎通过 `V8.Param.Message` 获取消息,包含 `EventId`、兼容 `Id`、`OsClient`、`Message`、`CurrentUserId`
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-mq-mqtt-002 sha256=1fb410755c51211b4b978d64c9c88fc5649489f4bced8870ebbf255a31b75177 -->
5
+ <!-- microi-progressive:chunk id=v8-mq-mqtt-002 sha256=7f130288432d55ab82bc57b7be6bd6a44c46d12df009a91a50534d5c54ef2ba9 -->
6
6
  ## V8.MQTT — IoT 物联网
7
7
 
8
8
  先区分两个边界:MQTT 是设备实时双向通道,RabbitMQ 是服务端异步队列;
@@ -66,7 +66,8 @@ V8.OsClientModel.AliOssPublicDomain // 可公开的文件域名
66
66
  - 文件上传的租户业务开关与额度按“当前租户 `sys_osclients` → 代码默认值”解析;现行负向字段 `DisableFileUpload` 默认关闭/空值即允许上传,只有 `1/true` 才禁止。旧 `FileUploadEnabled` 只在新物理字段尚不存在的滚动升级节点回退读取,并须在新版 SaaS 表单隐藏。平台固定灾难保护、HTTP/Multipart/Form 和反向代理上限不可由租户覆盖,也不要求安装者维护额外上传环境变量。
67
67
  - 类似 MQTT 端口、PressureGuard、V8Limits、OrmLimits、StartupLimits、SecurityGuard 这类影响整进程资源的配置,不能让每个子租户各自抬高全局上限。子租户同名隔离字段只能降低自己的并发、等待时间或资源额度,用于隔离弱租户、试用租户或异常租户。
68
68
  - 修改 `sys_osclients` 的表、字段、数据源或配置值后,必须刷新 SaaS 引擎运行缓存,并回读验证字段 `Component`、`Data`、`Config`、实际数据值和前端真实消费结果。不要只看 MCP 写入成功。
69
- - SaaS 配置只在启动、管理员保存 `sys_osclients` 或显式租户刷新时发布到共享 Redis。初始化数据库会话、创建 `V8.Dbs` 运行态对象、普通 FormEngine 请求和表单设计器保存不得冒充配置变更反复发布。
69
+ - SaaS 配置只在启动、管理员保存 `sys_osclients` 或显式租户刷新时发布到共享 Redis。初始化数据库会话、创建 `V8.Dbs` 运行态对象、普通 FormEngine 请求和表单设计器保存不得冒充配置变更反复发布。
70
+ - JWT Key 由可信后端生成并持久化;SaaS 表单只读显示配置状态,不允许普通表单或 V8 写入 `AuthSecret`。手动接入旧库的 NULL/空白值必须支持原子写回,多节点竞争后回读持久胜者;重复刷新不能轮换有效 Key。只读状态查询不得初始化目标租户数据库。验收只记录是否已配置、是否稳定,不输出密钥原文。
70
71
  - 扩展库缓存必须区分“尚未加载”和“已加载但为 0 条”;后者是有效结果。没有配置 `microi_database` 的租户不能在每次 V8 执行时重复查询、调用 `AddOrUptClient` 或打印“缓存 OsClient 配置到 Redis”。
71
72
  - 多节点的缓存失效订阅只做本节点失效与数据库回源,禁止收到消息后再次发布形成回声。进程内初始化标记仅是可丢失优化,真正租户配置仍以共享数据库/Redis 为准。
72
73
  - 新增平台级字段时,字段名建议保持英文稳定,例如 `PressureGlobalMaxConcurrentRequests`、`PressureV8MaxConcurrentExecutions`、`PressureOrmMaxConcurrentConnectionOpens`;字段标签和说明必须中文,说明中写清楚“主租户有效/子租户仅可降低”。
@@ -190,7 +191,9 @@ V8.CurrentUser.Wife;
190
191
  SELECT * FROM Contact WHERE OwnerId = $CurrentUser.Id$ AND Spouse = $CurrentUser.Wife$
191
192
  ```
192
193
 
193
- ## 常见错误
194
+ ## 常见错误
195
+
196
+ - 旧库升级的内置应用包包含定时任务时,升级内核按“资源独立提交 → 幂等保存并回读 Quartz/任务元数据 → 确认安装版本”执行。仅程序集白名单包及不可伪造的宿主授权可进入该兼容流程;普通应用安装仍必须使用持久后台任务分片。任一阶段失败不推进 ServerVersion,修复后从原升级入口重试,不手动抬高版本或伪造任务信封。
194
197
 
195
198
  ❌ 绕开 `V8.Cache` 使用底层 Redis → 租户数据串号(V8 已不再暴露底层句柄)
196
199
  ❌ MongoDB DbName 不带 OsClient → 数据混淆
@@ -61,7 +61,7 @@ AI 本地开发表单 V8 事件时,优先修改 `microi-v8-engine/<租户>/<
61
61
  - `diy_table.V8Limit` 是表后端提交前、提交后和数据处理 V8 的正向开关:缺失、`null`、`0/false` 均不设置 Jint 单次超时、语句、函数递归和累计分配预算,只有 `1/true` 才启用这些限制。旧 `V8Unlimited` 仅在新字段不存在时反向推断,新的 MCP、Manifest 和应用资源只写 `V8Limit`。进程常驻内存、取消、并发、接口嵌套深度、权限和数据库保护始终生效。
62
62
 
63
63
  <!-- /microi-progressive:chunk -->
64
- <!-- microi-progressive:chunk id=v8-table-event-003 sha256=65a1e728982d4e534d06dc2440eac111fe53a08f0a3012c6a9f8b1de45b4b81f -->
64
+ <!-- microi-progressive:chunk id=v8-table-event-003 sha256=5140cd224fd5ac044715f0b3ac79d18f8816d4ce36b6c05cc04e044dbf956214 -->
65
65
  ## ⚠️ 关键陷阱(必读)
66
66
 
67
67
  ### 1. 设计模式保护(前端事件必加)
@@ -174,7 +174,7 @@ if (V8.Form.Phone) {
174
174
  ```
175
175
 
176
176
  <!-- /microi-progressive:chunk -->
177
- <!-- microi-progressive:chunk id=v8-table-event-010 sha256=e3e0593f037fcfe66b6aa12dd342a10e8b270fcfef2cb3dd0dac52d3796973c5 -->
177
+ <!-- microi-progressive:chunk id=v8-table-event-010 sha256=98cd7d87efe30386f8ddfdd52e6d6f3a13e7b69ab4b9b83663aa05472ee144f2 -->
178
178
  ## 事件上下文变量
179
179
 
180
180
  ### 前端事件