@microi.net/cli 5.6.6 → 5.6.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.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +4 -4
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-server.js +45 -44
- package/scripts/microi-skills.meta.json +247 -247
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +208 -208
- package/skills/ai-engine/SKILL.md +3 -2
- package/skills/ai-platform-governance/SKILL.md +8 -8
- package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +9 -9
- package/skills/app-store/SKILL.md +3 -1
- package/skills/datasource-engine/SKILL.md +3 -1
- package/skills/job-engine/SKILL.md +12 -2
- package/skills/microi-client-frontend/SKILL.md +7 -1
- package/skills/microi-codex/SKILL.md +8 -3
- package/skills/microi-form-engine/SKILL.md +3 -0
- package/skills/microi-form-engine/references/component-catalog.md +1 -1
- package/skills/microi-form-layout/SKILL.md +1 -1
- 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
- package/skills/microi-frontend-sdk/SKILL.md +2 -2
- 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
- package/skills/microi-mobile-app-quality/SKILL.md +8 -8
- 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
- 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
- package/skills/microi-sso/SKILL.md +1 -0
- package/skills/microi-uniapp-frontend/SKILL.md +10 -10
- 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
- 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
- package/skills/microi.v8.js +14 -3
- package/skills/module-engine/SKILL.md +8 -2
- package/skills/page-engine/SKILL.md +4 -4
- 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
- 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
- package/skills/system-observability/SKILL.md +2 -1
- package/skills/uniapp-mall-assets/SKILL.md +6 -0
- package/skills/v8-crud-api/SKILL.md +3 -3
- 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
- package/skills/v8-export-import/SKILL.md +9 -5
- 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
- package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +3 -3
- 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
- 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
- package/skills/v8-frontend-events/SKILL.md +4 -3
- package/skills/v8-frontend-events/references/bluetooth-print.md +13 -2
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +2 -2
- package/skills/v8-http-integration/SKILL.md +4 -4
- package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +2 -2
- 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
- package/skills/v8-menu-buttons/SKILL.md +4 -4
- 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
- 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
- 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
- package/skills/v8-mongodb/SKILL.md +8 -1
- package/skills/v8-mq-mqtt/SKILL.md +2 -2
- package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +1 -1
- package/skills/v8-saas-multi-tenant/SKILL.md +5 -2
- package/skills/v8-table-event/SKILL.md +1 -1
- 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
- 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
- package/skills/v8-utilities/SKILL.md +6 -2
- package/skills/v8-workflow/SKILL.md +2 -2
- package/skills/vision-engine/SKILL.md +1 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=v8-crud-api-007 sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
30
|
+
<!-- microi-progressive:chunk id=v8-export-import-001 sha256=9e166678e0cbc3b96814e9945a66c93426dd5ffb6a3c98bfbfe8dcb9e92ea5f9 -->
|
|
29
31
|
## 自定义导出 Excel(接口引擎)
|
|
30
32
|
|
|
31
33
|
平台默认导出仅支持表格已展示的字段。如需自定义(如列重排、合并、计算列、图片),用接口引擎替换【导出接口】。
|
|
@@ -130,7 +132,7 @@ 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=
|
|
135
|
+
<!-- microi-progressive:chunk id=v8-export-import-002 sha256=8a1bdefc16e306ae30a5764760b98af05cc0c804409afb6e86a7440674750413 -->
|
|
134
136
|
## 文件响应与前端调用约定
|
|
135
137
|
|
|
136
138
|
- 接口引擎必须开启【响应文件】,并返回正确的 `FileName`、`ContentType`、`FileByteBase64`。
|
|
@@ -150,7 +152,7 @@ return {
|
|
|
150
152
|
| `NumberFormat/HeaderStyle/Style` | 数字格式与列级样式 |
|
|
151
153
|
|
|
152
154
|
<!-- /microi-progressive:chunk -->
|
|
153
|
-
<!-- microi-progressive:chunk id=v8-export-import-003 sha256=
|
|
155
|
+
<!-- microi-progressive:chunk id=v8-export-import-003 sha256=3391b00657d2cb9a6b3db530c43258ac2b7d69f940add48327618348226ad37e -->
|
|
154
156
|
## 解析上传的 Excel / CSV(导入)
|
|
155
157
|
|
|
156
158
|
```javascript
|
|
@@ -191,6 +193,8 @@ return { Code: 1, Data: dataList, DataCount: dataList.length };
|
|
|
191
193
|
- 结果与进度必须分别统计 `Added/Updated/Failed/Errors`;整批回滚后成功、新增、修改数必须归零,不能把已回滚行计作成功。
|
|
192
194
|
- 用 `V8.Method.UpdateBackgroundTask({Current,Total,Msg,Log})` 上报真实校验/写入工作量;未知总量保持不确定进度,不伪造百分比。
|
|
193
195
|
- 业务幂等键使用后台任务 Id 或明确的导入操作 Id;重试前回读批次,避免重复写入。
|
|
196
|
+
- 平台审计字段(`Id/CreateTime/UpdateTime/UserId/UserName/IsDeleted/OsClient/TenantId/TenantName`)由导入事务统一生成或由 `_CurrentUser` 归属填充,不参与写入。导出的表格天然包含这些列,服务端必须把映射到的保护字段从 INSERT/UPDATE 列清单里剔除,否则会出现 `Column 'CreateTime' specified twice`,或把旧记录的创建时间、租户归属改成 Excel 里的快照值。导入钩子(ImportV8)返回的 `FixedValues` 也不能回填这些字段,命中时按未授权字段拒绝。
|
|
197
|
+
- 写回策略是“新增保护、更新不覆盖”:同一批导入既能安全新增,也不会改写既有记录的平台审计字段;需要保留 Excel 里的原始时间时,另建业务时间字段,不要复用 `CreateTime`。
|
|
194
198
|
|
|
195
199
|
完整前端参数见 `microi.doc/docs/doc/v8-engine/v8-client.md#v8openimportdialog`。
|
|
196
200
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=v8-export-import-004 sha256=
|
|
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=
|
|
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=
|
|
148
|
+
<!-- microi-progressive:chunk id=v8-export-import-006 sha256=fd97ce1f87c32cad8539f3307bfdf679b0abc9e747281f6aaf06e7d322046c8f -->
|
|
149
149
|
## Word 导出
|
|
150
150
|
|
|
151
151
|
新代码使用对象参数的 `ExportWord`;`ExportWordText` 继续保留,只用于兼容旧版纯文本场景。Word 的页面边距、图片宽高单位为厘米,字体大小单位为磅。
|
package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=v8-export-import-007 sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
214
|
-
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
117
|
+
<!-- microi-progressive:chunk id=v8-http-integration-003 sha256=4c7e61dfc8a2539f65ea18d068c13d0168f84d0227ea93f17c8073a2a1cc8643 -->
|
|
118
118
|
## PATCH 请求
|
|
119
119
|
|
|
120
120
|
PATCH 与 POST 的参数完全对称,只需把请求体参数改为 `PatchParam` / `PatchParamString`:
|
package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md
CHANGED
|
@@ -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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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`。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=v8-menu-buttons-004 sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
177
|
+
<!-- microi-progressive:chunk id=v8-table-event-010 sha256=98cd7d87efe30386f8ddfdd52e6d6f3a13e7b69ab4b9b83663aa05472ee144f2 -->
|
|
178
178
|
## 事件上下文变量
|
|
179
179
|
|
|
180
180
|
### 前端事件
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=v8-table-event-011 sha256=
|
|
5
|
+
<!-- microi-progressive:chunk id=v8-table-event-011 sha256=80a4d5538406b23ac45b463def94ef977e365b4dffdefdcbb1d31af0cac71830 -->
|
|
6
6
|
## 前端事件名(V8.EventName 可能的值)
|
|
7
7
|
|
|
8
8
|
| 值 | 说明 |
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
| `WFNodeEnd` | 流程节点结束 V8 事件 |
|
|
26
26
|
|
|
27
27
|
<!-- /microi-progressive:chunk -->
|
|
28
|
-
<!-- microi-progressive:chunk id=v8-table-event-012 sha256=
|
|
28
|
+
<!-- microi-progressive:chunk id=v8-table-event-012 sha256=eb7de1dc530ad35ea2b8d9538ef9e6e687bf93f58cf8d278e5db9034085c3abf -->
|
|
29
29
|
## 注意事项
|
|
30
30
|
|
|
31
31
|
- 前端事件可使用 `window` 对象和 `async/await`,后端事件不可以
|
|
@@ -63,11 +63,15 @@ var clientEncoded = V8.Base64.encode('吾码');
|
|
|
63
63
|
var clientDecoded = V8.Base64.decode(clientEncoded);
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
-
## 能力选择
|
|
66
|
+
## 能力选择
|
|
67
67
|
|
|
68
68
|
- 日期基础函数由新版后端运行时自举,不能要求租户先配置 DateNow 才能安装应用。全局函数管理使用系统设置子表 `mci_global_function`,按 `SysConfigId + Runtime(Client/Server) + FunctionName` 隔离,一行一个同名 function 声明;用 `V8.Method.ValidateGlobalFunction` 只解析验证,不执行源码。
|
|
69
69
|
- 原有前后端全局 V8 必须保留,合并顺序为内置日期、函数库、租户原有代码;同名原有函数优先。不得用官方全局脚本整段覆盖客户脚本。函数库种子 `InsertIfMissing`,不得升级覆盖客户已改源码。
|
|
70
|
-
- 列表和合并代码走 L1/Redis,表单引擎真实提交后更新租户版本并通知其它节点;回滚不变更版本。禁止通过直接 SQL 修改函数库规避失效。前端已打开页面需要刷新。
|
|
70
|
+
- 列表和合并代码走 L1/Redis,表单引擎真实提交后更新租户版本并通知其它节点;回滚不变更版本。禁止通过直接 SQL 修改函数库规避失效。前端已打开页面需要刷新。
|
|
71
|
+
|
|
72
|
+
## 平台兼容入口索引
|
|
73
|
+
|
|
74
|
+
下列旧 HTTP 地址仍由受控兼容链路识别,不能据此绕过 DiyToken、租户或权限校验:`/api/FormEngine/GetSysConfig`、`/api/Os/GetDateTimeNow`、`/api/SysLog/AddSysLog`、`/api/SysUser/`。畅捷通 V2 回调在接口引擎中编排,可信后端只提供当前租户绑定的 `V8.Method.DecodeChanjetCallbackV2` 原子。
|
|
71
75
|
|
|
72
76
|
| 需求 | 专项 Skill |
|
|
73
77
|
|---|---|
|
|
@@ -41,7 +41,7 @@ description: Microi V8 工作流事件指南。用于编写审批流条件、节
|
|
|
41
41
|
生成工作流 V8 代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;路线选择、审批人计算、状态回写、撤回/驳回处理、跨表联动等复杂代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。若工作流存储表支持 `Version`/`ChangeHistory`,历史说明也必须最新在前并保留旧记录。
|
|
42
42
|
|
|
43
43
|
<!-- /microi-progressive:chunk -->
|
|
44
|
-
<!-- microi-progressive:chunk id=v8-workflow-001 sha256=
|
|
44
|
+
<!-- microi-progressive:chunk id=v8-workflow-001 sha256=53550786c531c347cfe9d92247b07d127c348210f07e302a1b68f278136c3e77 -->
|
|
45
45
|
## 工作流物理表
|
|
46
46
|
|
|
47
47
|
| 表名 | 说明 |
|
|
@@ -85,7 +85,7 @@ var history = V8.Db.FromSql(
|
|
|
85
85
|
```
|
|
86
86
|
|
|
87
87
|
<!-- /microi-progressive:chunk -->
|
|
88
|
-
<!-- microi-progressive:chunk id=v8-workflow-002 sha256=
|
|
88
|
+
<!-- microi-progressive:chunk id=v8-workflow-002 sha256=377698ecb64266fb74399ea664010e0a46156d13c3e047de1b2cbae3dbba15c7 -->
|
|
89
89
|
## 流程 V8 事件执行顺序
|
|
90
90
|
|
|
91
91
|
工作流合并提交请求的 `_FormSubmitAction` 可使用 `Add/Edit`;表单后端事件中的
|
|
@@ -94,7 +94,7 @@ var voted = await V8.Vision.Stabilize({
|
|
|
94
94
|
});
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
-
主流流水线方法:`V8.Vision.Analyze`、`V8.Vision.Search`、`V8.Vision.Stabilize`;兼容原子方法:`Extract`、`ExtractBatch`、`Compare`、`CompareBatch`、`GetCapabilities`。业务入口优先使用 `V8.ApiEngine.Run('platform-vision-runtime', ...)`,不要把向量返回给普通浏览器或日志。
|
|
97
|
+
主流流水线方法:`V8.Vision.Analyze`、`V8.Vision.Search`、`V8.Vision.Stabilize`;兼容原子方法:`V8.Vision.Extract`、`V8.Vision.ExtractBatch`、`V8.Vision.Compare`、`V8.Vision.CompareBatch`、`V8.Vision.GetCapabilities`。业务入口优先使用 `V8.ApiEngine.Run('platform-vision-runtime', ...)`,不要把向量返回给普通浏览器或日志。
|
|
98
98
|
|
|
99
99
|
## 模型与准确率门禁
|
|
100
100
|
|