@microi.net/cli 5.7.9 → 5.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +5 -5
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-server.js +106 -106
- package/scripts/microi-skills.meta.json +293 -290
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +441 -441
- package/skills/README.md +2 -1
- package/skills/ai-engine/SKILL.md +1 -1
- package/skills/ai-engine/references/ai-employees.md +4 -0
- 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 +58 -4
- package/skills/job-engine/SKILL.md +4 -3
- package/skills/message-notification/SKILL.md +2 -1
- package/skills/microi/SKILL.md +14 -0
- package/skills/microi-ai-application/SKILL.md +16 -3
- package/skills/microi-client-frontend/SKILL.md +10 -5
- 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 +3 -3
- 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 +4 -4
- 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 +3 -3
- package/skills/microi-codex/SKILL.md +15 -0
- package/skills/microi-datasource-mapping/SKILL.md +4 -0
- package/skills/microi-deployment/SKILL.md +7 -0
- package/skills/microi-deployment/references/deployment-matrix.md +8 -0
- package/skills/microi-docs-coverage/references/capability-map.md +1 -0
- package/skills/microi-form-layout/SKILL.md +6 -6
- 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 +6 -6
- 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 +7 -7
- package/skills/microi-microservice/SKILL.md +1 -0
- package/skills/microi-mobile-app-quality/SKILL.md +12 -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-system-delivery/SKILL.md +5 -5
- package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +1 -1
- 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 +6 -4
- package/skills/microi-ui/SKILL.md +6 -6
- 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 +5 -5
- 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/module-engine/SKILL.md +13 -0
- package/skills/page-engine/SKILL.md +19 -8
- 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/playwright-e2e/SKILL.md +11 -11
- 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 +5 -5
- 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 +3 -3
- package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +7 -7
- package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +4 -4
- package/skills/system-observability/SKILL.md +3 -0
- package/skills/ui-design/SKILL.md +7 -7
- 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 +2 -2
- package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +3 -3
- 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 +2 -2
- 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 +1 -1
- 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 +3 -3
- 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 +2 -2
- 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 +4 -4
- 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 +5 -5
- package/skills/unity-integration/references/ai-app-delivery.md +16 -0
- package/skills/v8-api-config/SKILL.md +6 -0
- package/skills/v8-crud-api/SKILL.md +9 -7
- 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 +8 -8
- 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 +2 -2
- package/skills/v8-explorer-tree/SKILL.md +2 -2
- package/skills/v8-export-import/SKILL.md +4 -4
- 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 +4 -4
- 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/SKILL.md +32 -4
- 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 +3 -3
- 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 +3 -3
- package/skills/v8-frontend-events/SKILL.md +6 -6
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +5 -5
- 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 +7 -7
- 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 +2 -2
- package/skills/v8-image-processing/SKILL.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-mq-mqtt/SKILL.md +3 -2
- package/skills/v8-mq-mqtt/references/mqtt-production.md +1 -1
- 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-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +1 -1
- package/skills/v8-security/SKILL.md +15 -5
- package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +3 -3
- package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +8 -6
- package/skills/v8-table-event/SKILL.md +5 -5
- 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 +6 -6
- 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-tcp-integration/SKILL.md +2 -2
- package/skills/v8-workflow/SKILL.md +42 -7
- 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 +7 -7
- package/skills/workspace-conventions/SKILL.md +19 -10
- 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 +8 -7
- 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 +21 -21
- 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 +1 -1
package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=v8-http-integration-004 sha256=
|
|
5
|
+
<!-- microi-progressive:chunk id=v8-http-integration-004 sha256=36b643a5b4f6df39a09673e872d5dd8cefacef2666ca1987636e7dfd0a51bdd3 -->
|
|
6
6
|
## GET 请求
|
|
7
7
|
|
|
8
8
|
```javascript
|
|
@@ -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=b3c3761d78bb6a57e850e1e5f23cd8ab2a3e8aa309cf97570fffce8ff04bc5cf -->
|
|
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=92592fccdf3ae61d101be02400077ca249847df900ccf6a23ad9449186cc23e5 -->
|
|
62
62
|
## 前端 V8 行为与兼容性
|
|
63
63
|
|
|
64
64
|
- 前端新代码应优先使用 `await V8.Http.Get/Post/Patch`,参数与后端一致;不要再把 `V8.Post/Get` 作为新功能首选。旧 `V8.Post/Get` 仅作为兼容 API 保留,其回调和 Promise 写法保持不变。
|
|
@@ -68,7 +68,7 @@ var resp = V8.Http.PatchResponse({
|
|
|
68
68
|
- 浏览器端不支持后端的 `FilesStream`,可使用 `FilesByteBase64`、`FilesByteString` 或 `FilesByte`。
|
|
69
69
|
|
|
70
70
|
<!-- /microi-progressive:chunk -->
|
|
71
|
-
<!-- microi-progressive:chunk id=v8-http-integration-007 sha256=
|
|
71
|
+
<!-- microi-progressive:chunk id=v8-http-integration-007 sha256=8715b52d42f883e2dc45be404325ba45a1969e31f6daae9a0a4fb0396fd902d7 -->
|
|
72
72
|
## 下载远程文件(图片、PDF 等二进制)
|
|
73
73
|
|
|
74
74
|
```javascript
|
|
@@ -91,7 +91,7 @@ var up = V8.Method.Upload({
|
|
|
91
91
|
> 文件上传/下载完整模式见 `v8-file-upload/SKILL.md`
|
|
92
92
|
|
|
93
93
|
<!-- /microi-progressive:chunk -->
|
|
94
|
-
<!-- microi-progressive:chunk id=v8-http-integration-008 sha256=
|
|
94
|
+
<!-- microi-progressive:chunk id=v8-http-integration-008 sha256=6ff1480c66e30451a51586fc2d71984de1c3f3289778937dc2b83bbe24c084f2 -->
|
|
95
95
|
## 第三方密钥不要硬编码
|
|
96
96
|
|
|
97
97
|
```javascript
|
|
@@ -113,7 +113,7 @@ var resp = V8.Http.GetResponse({
|
|
|
113
113
|
```
|
|
114
114
|
|
|
115
115
|
<!-- /microi-progressive:chunk -->
|
|
116
|
-
<!-- microi-progressive:chunk id=v8-http-integration-009 sha256=
|
|
116
|
+
<!-- microi-progressive:chunk id=v8-http-integration-009 sha256=ffa9ee404ccd38850e55144309f6173ce56229dccaa05b8b4ff48e19c78fa620 -->
|
|
117
117
|
## 实战模式
|
|
118
118
|
|
|
119
119
|
### 微信小程序 access_token
|
|
@@ -201,7 +201,7 @@ return { Code: 1, Msg: 'ok' };
|
|
|
201
201
|
```
|
|
202
202
|
|
|
203
203
|
<!-- /microi-progressive:chunk -->
|
|
204
|
-
<!-- microi-progressive:chunk id=v8-http-integration-010 sha256=
|
|
204
|
+
<!-- microi-progressive:chunk id=v8-http-integration-010 sha256=d38c91b4f643d3bd6c11a474a1f292087db19b78dbe50e9ccd34e8b0dc8ea615 -->
|
|
205
205
|
## V8.Office.SendEmail — 发送邮件
|
|
206
206
|
|
|
207
207
|
```javascript
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=v8-http-integration-011 sha256=
|
|
5
|
+
<!-- microi-progressive:chunk id=v8-http-integration-011 sha256=035d7ba47caf7a9f885bcb507a5e963811f292f3331a45f9b3f1b97ece6c2edc -->
|
|
6
6
|
## 错误处理模式
|
|
7
7
|
|
|
8
8
|
```javascript
|
|
@@ -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=3cd56273cd9f23e8edec8849430d7545e9925a766a06a19be8c87ec1ef4ca0c8 -->
|
|
32
32
|
## 注意事项
|
|
33
33
|
|
|
34
34
|
- `V8.Http.Post` 的 `PostParam` 不支持多级嵌套对象,嵌套需用 `PostParamString`
|
|
@@ -17,7 +17,7 @@ description: Microi V8.Image 服务端图像处理指南。用于在接口引擎
|
|
|
17
17
|
4. 合并时显式设置 `Mode`、尺寸、画布和图层顺序;覆盖合并使用 `ZIndex` 表达上下层,不依赖数组顺序猜测。
|
|
18
18
|
5. 对用户上传、远程下载和批量合并场景先做业务侧数量、类型和权限校验;不要尝试绕过平台内置资源限制。
|
|
19
19
|
6. 编写具体参数前读取 [完整 API 参考](references/api-reference.md);不要发明未列出的模式、输入来源或输出格式。
|
|
20
|
-
7. `FontFamily` 是首选字体而不是无条件信任值:运行时会逐字符验证字形,依次使用服务器字体和程序集内置 Noto Sans CJK SC 回退;零字体 Linux /
|
|
20
|
+
7. `FontFamily` 是首选字体而不是无条件信任值:运行时会逐字符验证字形,依次使用服务器字体和程序集内置 Noto Sans CJK SC 回退;零字体 Linux / 群晖容器也必须能绘制基础拉丁字符、数字和简体中文。Unicode 非字符(`U+FDD0`–`U+FDEF` 及每个平面的 `FFFE/FFFF`)在字体匹配前明确拒绝,不能因系统占位字体声称支持而绘制缺字方框。只有系统字体与内置字体都缺字时才明确失败,绝不输出“口口”缺字方框。业务字体仍用于固定品牌字形、区域异体字、特殊符号和 Emoji。
|
|
21
21
|
|
|
22
22
|
## 工作流程
|
|
23
23
|
|
|
@@ -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=bb9b02dd84d917e61d6a96b2b0222b31678994c38d1a14ea5cbbad02b5a2ab7d -->
|
|
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=bc876765afdb17bd70766ab39e26afacb7207702272465abbc88309356357973 -->
|
|
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=9e242daca15f6ccfeed786b7dba77fa4362a4baeca166981bb8e2a15234a28f7 -->
|
|
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=3b1d5525f9fc40203729f88d7e481b0ae6dc6cc9653f3752b330abbbcf68d4ef -->
|
|
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=05163deb173db359dc91703c98f17afd125e4c56491ebdb12ff30ac5b02352b1 -->
|
|
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=55cbeccd0d5cfdb5f2dcb211ec8848a453afc87a4fe9b8e27e3580659bd1328e -->
|
|
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=e49f7ad868989d5dd0b25699284d6f19e3f752efa22be7b45fcafa7e95f249bd -->
|
|
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=ef40f0fec7fb1257e9cd89f11b0038b7244e57c098cf4c7f251754247a5df5fe -->
|
|
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=495161c95d321f2937486db3fecc4e27d2e38c6d7a21587b5028d04ea6491b90 -->
|
|
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=8cb7f4d399068549be662cc47bd4add8b3d3bbdb6e7a74832e4c63b7768e136b -->
|
|
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=0398a9fc35520d4b17b990efc565ba1d9f6050303e122dc128207adf08434aee -->
|
|
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=16414969be47116a51bab1c6a7e1482bb987b278430e0fb8daaf7d6ecf41bf94 -->
|
|
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=086e02210a949cc0a2c343e7f50c54c48079667999e9264ea5282c9caa951222 -->
|
|
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=30fe801c52356f945f9adabbd5d947d251211d9f3f63f24ca596c1aed6594440 -->
|
|
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=ad4cb3a484857342e8e669163655b604a0a88ee4dec359743400a9493ff3c2d9 -->
|
|
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=a796c29f763905954dbe712f80b5aa3921d57886142542749c1dda79ff6cdc4b -->
|
|
63
63
|
## 11. ⚠️ `V8.CurrentUser` 拿不到的历史陷阱(必看)
|
|
64
64
|
|
|
65
65
|
### 现象
|
|
@@ -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=4a6559aed1af036591a04002c6e3311d9f0957fbbabbcafdc4a6bad95dabd843 -->
|
|
14
14
|
## V8.MQ — RabbitMQ 消息队列
|
|
15
15
|
|
|
16
16
|
### 生产消息(后端)
|
|
@@ -151,12 +151,13 @@ 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=dcf641877c01b65104fbd9b7d5022a9b7b656a6461895d499ab06af9d2bb7d0c -->
|
|
155
155
|
## 注意事项
|
|
156
156
|
|
|
157
157
|
- MQ 消费者接口引擎通过 `V8.Param.Message` 获取消息,包含 `EventId`、兼容 `Id`、`OsClient`、`Message`、`CurrentUserId`
|
|
158
158
|
- MQ 适合异步解耦、削峰填谷、耗时操作异步化
|
|
159
159
|
- MQTT 七类事件在同一个接口引擎中处理,通过 `V8.EventName` 区分
|
|
160
|
+
- MQTT 运行日志确认写入租户 MongoDB 月度系统日志,`TargetType=MqttEvent`;MongoDB 持久化失败才写当前租户的 `mci_mqtt_log`。`platform-mqtt` 的 `Action=Logs` 按月读 MongoDB,查询失败时才回退 MySQL;`Action=HistoryLogs` 显式读旧记录及故障兜底记录,`ClientId` 可选。新版 PC 客户端的设备 `MqttLogs` 字段及 MQTT 日志菜单使用此入口;旧客户端仍读关系库,须随 API 一起升级。
|
|
160
161
|
- MQTT 适合 IoT 设备管理、实时数据采集
|
|
161
162
|
- 设备/告警/工单等业务事实优先进入关系库,高频遥测可进入 MongoDB,大附件进入对象存储
|
|
162
163
|
- RabbitMQ 租户凭据在 SaaS 引擎登记前必须先在真实 RabbitMQ 创建 user/vhost/权限;内嵌 MQTT Broker 直接校验 SaaS 中的 MQTT 凭据,使用外部 MQTT Broker 时另行完成真实 Broker 账号、ACL 与适配器配置
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
4. `Microi.Server/Microi.Core/Interface/IMicroiMQTT.cs`:
|
|
34
34
|
`IMicroiMQTT.PublishAsync(osClient, ...)` 可信后端发布和节点状态接口。
|
|
35
35
|
5. `Microi.Server/Microi.Core/V8Engine/Runtime/V8Method.PlatformPluginRuntimes.cs`
|
|
36
|
-
与 `Microi.Server/
|
|
36
|
+
与 `Microi.Server/OfficialApplications/Resource/platform-mqtt.js`:平台管理员、当前节点
|
|
37
37
|
状态、租户 Topic 边界与接口引擎交付入口。
|
|
38
38
|
6. `microi.doc/docs/doc/system-engine/mqtt-engine.md`:面向用户的完整能力说明。
|
|
39
39
|
|
|
@@ -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=e3917adda6454dc4d17672df3afc11def6fbd2f7a77f24b3ac821320d6df7907 -->
|
|
6
6
|
## V8.MQTT — IoT 物联网
|
|
7
7
|
|
|
8
8
|
先区分两个边界:MQTT 是设备实时双向通道,RabbitMQ 是服务端异步队列;
|
|
@@ -15,7 +15,7 @@ const files = {
|
|
|
15
15
|
mqttInterface: 'Microi.Server/Microi.Core/Interface/IMicroiMQTT.cs',
|
|
16
16
|
tenantSecurity: 'Microi.Server/Microi.Core/SaaSEngine/TenantConfigurationSecurity.cs',
|
|
17
17
|
platformRuntime: 'Microi.Server/Microi.Core/V8Engine/Runtime/V8Method.PlatformPluginRuntimes.cs',
|
|
18
|
-
platformApiEngine: 'Microi.Server/
|
|
18
|
+
platformApiEngine: 'Microi.Server/OfficialApplications/Resource/platform-mqtt.js'
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
const content = {};
|
|
@@ -11,10 +11,20 @@ description: Microi V8 安全指南。用于审查 DiyToken 与权限、可逆
|
|
|
11
11
|
|
|
12
12
|
访问密钥由 `microi_list_my_access_keys`、`microi_create_my_access_key`、`microi_revoke_my_access_key` 管理,只允许当前用户、限期、最小 scope,明文仅创建时返回一次。外部身份回调固定为 `/api/ExternalLogin/Callback`,服务端校验租户、Provider、state、redirect 和回调域名,验证成功后仍签发 DiyToken。
|
|
13
13
|
|
|
14
|
+
微信网站扫码登录先读取当前租户能力、`WeChatLoginEnabled` 和私密设置元信息,
|
|
15
|
+
再核对开放平台已审核网站应用的微信登录权限与授权回调域名。
|
|
16
|
+
`Login.WeChat.ClientId` 保存 AppID,`Login.WeChat.ClientSecret` 通过专用密钥工具保存,
|
|
17
|
+
两项必须启用;Scope 使用 `snsapi_login`。微信 `qrconnect` 的应用标识参数必须为
|
|
18
|
+
`appid`,不能套用 Gitee/GitHub 的 `client_id`;Secret 不进入浏览器授权 URL。
|
|
19
|
+
先由已登录的本人账号在个人中心绑定微信,再验证退出后的扫码登录;不得把昵称或邮箱
|
|
20
|
+
匹配成管理员、伪造绑定或自动注册高权限账号。本地前端可指向公网 API 联调,
|
|
21
|
+
本地后端生成的 `localhost` 回调不能替代登记的公网域名。其它租户只接收能力和空配置模板,
|
|
22
|
+
不能发布源租户 AppID/AppSecret 或用户绑定。自动化协议测试通过与真实微信扫码成功应分开报告。
|
|
23
|
+
|
|
14
24
|
官方升级资源属于独立控制面。`get-microi-upgrade-resource` 可以匿名读取固定白名单,但 `Publish/PublishBatch` 必须调用仅绑定该 Managed ApiEngineKey 的 `V8.Method.AuthorizeOfficialResourcePublish()`:固定 `iTdos` 官方租户、拒绝访问密钥会话,并从主库复核当前用户、状态和平台管理员角色。禁止只相信 `V8.CurrentUser.Level`,也禁止把这个可信原子复用于普通接口、租户 Hook 或表单事件;资源校验、SHA 乐观锁、事务行锁、写入及回读仍由 Managed V8 编排。
|
|
15
25
|
|
|
16
26
|
<!-- microi-progressive:begin -->
|
|
17
|
-
<!-- microi-progressive:chunk id=v8-security-000 sha256=
|
|
27
|
+
<!-- microi-progressive:chunk id=v8-security-000 sha256=a6a4311b1a799ea4ed005b22c01cb8230509aaf09aeead5a17c8c46da74772c8 -->
|
|
18
28
|
## 0. 租户动态系统设置与密钥边界
|
|
19
29
|
|
|
20
30
|
**AI 默认处理路径:** 用户交付第三方 Secret 并授权配置时,优先调用 `microi_manage_server_private_secret`:List 只确认 Key/HasSecret;Save 使用 `confirmExecution=SAVE:<ConfigKey>`,固定 `IsSecret=true / IsPublic=false` 并自动脱敏回读。例如畅捷通使用 `Integration.Changjet.AppSecret`,后端从 `V8.SysConfig.ServerPrivateSettings` 使用。不要仅拒绝硬编码后停止,也不要因为 `OsClientModel` 不暴露密钥而误判服务端 V8 无法调用第三方。工具不提供原文揭示;更换已有 Key 前回读现状,超时只回读、不盲目重写。
|
|
@@ -67,7 +77,7 @@ Secret 只通过租户管理员专用端点写入租户绑定的认证密文。
|
|
|
67
77
|
- 多节点保存连接使用按 `OsClient + DbKey` 隔离的分布式锁,并由数据库唯一索引兜底;同步数据和附件仍必须使用业务幂等键,锁不能替代唯一约束、状态机或 inbox/outbox。
|
|
68
78
|
|
|
69
79
|
<!-- /microi-progressive:chunk -->
|
|
70
|
-
<!-- microi-progressive:chunk id=v8-security-001 sha256=
|
|
80
|
+
<!-- microi-progressive:chunk id=v8-security-001 sha256=51070dc1148f49c796dd605045b7fcb5970290638cf85e844c17d81962afa7aa -->
|
|
71
81
|
## 0.5 接口引擎配置安全
|
|
72
82
|
|
|
73
83
|
代码以外,接口本身的配置项也是安全防线(详见 `v8-api-config/SKILL.md`):
|
|
@@ -92,7 +102,7 @@ Secret 只通过租户管理员专用端点写入租户绑定的认证密文。
|
|
|
92
102
|
- 没有字段上下文的普通上传默认保持私有安全目录;管理员可在普通 `sys_config.HdfsUploadRules` 按可信角色授予业务目录(含有界 glob)与明确公有权限。必须先拒绝实际路径中的通配符、穿越和平台保留目录,再做模式匹配;通配符不是匿名/跨租户/发布授权。微信待审图片、头像、裁剪/压缩原图等更强规则继续优先。测试同时证明公有字段/目录可用、私有请求/伪造上下文/保留目录不可绕过。
|
|
93
103
|
|
|
94
104
|
<!-- /microi-progressive:chunk -->
|
|
95
|
-
<!-- microi-progressive:chunk id=v8-security-002 sha256=
|
|
105
|
+
<!-- microi-progressive:chunk id=v8-security-002 sha256=fdc1cbd297d141bfef8e9e0ee58a972410ffc9b6b778b217b5610f86139f514c -->
|
|
96
106
|
## 1. 防 SQL 注入
|
|
97
107
|
|
|
98
108
|
### 必须:参数化查询
|
|
@@ -121,7 +131,7 @@ V8.Db.FromSql("SELECT * FROM " + V8.Param.table).ToArray();
|
|
|
121
131
|
```
|
|
122
132
|
|
|
123
133
|
<!-- /microi-progressive:chunk -->
|
|
124
|
-
<!-- microi-progressive:chunk id=v8-security-003 sha256=
|
|
134
|
+
<!-- microi-progressive:chunk id=v8-security-003 sha256=4f875f2eaf69716bf7d2b92d42ba079ec952cfcbc3211682b8d73f53ca8fd398 -->
|
|
125
135
|
## 3. 输入验证
|
|
126
136
|
|
|
127
137
|
### 必填校验
|
|
@@ -164,7 +174,7 @@ if (isNaN(amount) || amount <= 0 || amount > 999999.99) {
|
|
|
164
174
|
```
|
|
165
175
|
|
|
166
176
|
<!-- /microi-progressive:chunk -->
|
|
167
|
-
<!-- microi-progressive:chunk id=v8-security-004 sha256=
|
|
177
|
+
<!-- microi-progressive:chunk id=v8-security-004 sha256=13385475478ef17b58798db43779503a924385e599ad6ed5a8abd396949064aa -->
|
|
168
178
|
## 4. 防 XSS
|
|
169
179
|
|
|
170
180
|
四个字符替换不是通用 XSS 防护。必须按输出上下文处理:
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=v8-security-005 sha256=
|
|
5
|
+
<!-- microi-progressive:chunk id=v8-security-005 sha256=09f88aaf8da914fdbec8bc8668cef588a02217354a210515230471fbfdddd27f -->
|
|
6
6
|
## 2. 权限校验
|
|
7
7
|
|
|
8
8
|
### DiyToken 是平台会话与权限入口,不替换为 ASP.NET Identity
|
|
@@ -104,7 +104,7 @@ var result = V8.FormEngine.GetTableData('Order', {
|
|
|
104
104
|
```
|
|
105
105
|
|
|
106
106
|
<!-- /microi-progressive:chunk -->
|
|
107
|
-
<!-- microi-progressive:chunk id=v8-security-006 sha256=
|
|
107
|
+
<!-- microi-progressive:chunk id=v8-security-006 sha256=c7a43f46e8636fc3cbf792dfb8ff6c17890bd0a4d57025ba29cc37de2373dcbe -->
|
|
108
108
|
## 5. 防重复提交
|
|
109
109
|
|
|
110
110
|
前端禁用按钮或普通 Cache 的 `Exists → Set` 只能改善体验,不能保证业务只执行一次。写操作必须接收稳定幂等键,并通过数据库唯一约束、条件更新或状态机原子落库;接口引擎可再配置 `LockKey` 降低并发,但锁不能代替业务幂等。
|
|
@@ -126,7 +126,7 @@ if (old.Code === 1 && old.Data) {
|
|
|
126
126
|
```
|
|
127
127
|
|
|
128
128
|
<!-- /microi-progressive:chunk -->
|
|
129
|
-
<!-- microi-progressive:chunk id=v8-security-007 sha256=
|
|
129
|
+
<!-- microi-progressive:chunk id=v8-security-007 sha256=360a677ffa518b108e304f92922f9eaa2a12d44e863a16ce7439d9afe5616766 -->
|
|
130
130
|
## 6. 敏感数据
|
|
131
131
|
|
|
132
132
|
### 密码与认证
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=v8-security-008 sha256=
|
|
5
|
+
<!-- microi-progressive:chunk id=v8-security-008 sha256=2ff2de57d90237ef31cf6cccdb940b8ebb2a268a7726216946de4ba672a12248 -->
|
|
6
6
|
## 7. 日志记录
|
|
7
7
|
|
|
8
8
|
关键操作必须记录审计日志:
|
|
@@ -43,7 +43,7 @@ if (clearResult.Code != 1) {
|
|
|
43
43
|
- 接口引擎和底层方法都必须校验管理员权限、目标用户 Id 和租户边界,禁止跨租户吊销。
|
|
44
44
|
|
|
45
45
|
<!-- /microi-progressive:chunk -->
|
|
46
|
-
<!-- microi-progressive:chunk id=v8-security-009 sha256=
|
|
46
|
+
<!-- microi-progressive:chunk id=v8-security-009 sha256=e430777e54dc5c9e24e5f981db467dbe0ed3e9a297042a545891dd644e10a485 -->
|
|
47
47
|
## 8. 错误处理
|
|
48
48
|
|
|
49
49
|
不要把内部错误信息暴露给前端:
|
|
@@ -64,7 +64,7 @@ try {
|
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
<!-- /microi-progressive:chunk -->
|
|
67
|
-
<!-- microi-progressive:chunk id=v8-security-010 sha256=
|
|
67
|
+
<!-- microi-progressive:chunk id=v8-security-010 sha256=26ae8c22e1db1edca4d159d68423ae14ec84b528e5cc4deb305010f89871f57e -->
|
|
68
68
|
## 9. Token、终端会话与租户隔离
|
|
69
69
|
|
|
70
70
|
开发 Web、H5、UniApp、小程序、App、VS Code 或 MCP 客户端时,必须同时遵守 `microi-frontend-sdk/SKILL.md` 的 Token 协议:登录传 `_ClientType`,请求头传稳定 `did`,每次响应接收新的 `authorization`,并在浏览器/应用恢复前台时检查续签。
|
|
@@ -90,7 +90,7 @@ try {
|
|
|
90
90
|
- 多节点封禁、解封和到期状态必须进入共享 Redis/数据库;本机静态字典只能做缓存。Redis 可用且共享 block 不存在就是权威已解封,节点必须删除本机旧 block,禁止把旧状态回写复活;Redis 不可用时才允许本机降级。验收要让同一出口分别命中至少两个 API 节点,覆盖普通阈值、受信读取、伪造 Header、手动解除和自动到期。
|
|
91
91
|
|
|
92
92
|
<!-- /microi-progressive:chunk -->
|
|
93
|
-
<!-- microi-progressive:chunk id=v8-security-011 sha256=
|
|
93
|
+
<!-- microi-progressive:chunk id=v8-security-011 sha256=d625724d1e14db9cbd707b74d5ed1e5cd3fc44d58ff46baed65e3fd09728e817 -->
|
|
94
94
|
## 10. Jint 运行时升级边界
|
|
95
95
|
|
|
96
96
|
升级 Jint 时必须逐版阅读官方 release notes,并至少验证以下兼容面,不能只以编译通过作为验收:
|
|
@@ -102,7 +102,7 @@ try {
|
|
|
102
102
|
- 引擎约束必须在平台宿主对象注入完成、用户脚本执行前 `Constraints.Reset()`;同时覆盖超时、语句数、递归、内存、Promise 取消及 CLR 宿主边界返回后的再次检查。
|
|
103
103
|
|
|
104
104
|
<!-- /microi-progressive:chunk -->
|
|
105
|
-
<!-- microi-progressive:chunk id=v8-security-012 sha256=
|
|
105
|
+
<!-- microi-progressive:chunk id=v8-security-012 sha256=5f0a43b36ce88e6fed819887acfda86d2b07f5929c958edade902a95b9dfdb66 -->
|
|
106
106
|
## 安全检查清单
|
|
107
107
|
|
|
108
108
|
- [ ] 所有数据库查询使用参数化(`_Where` 或 `@p0`)
|
|
@@ -133,9 +133,11 @@ try {
|
|
|
133
133
|
- 自动化检查:预置缺少新字段的旧 Redis 快照后验证新版本 Key 不命中;分别覆盖管理员设计器批量字段保存/新增字段、普通用户直接写管理员专用表被拒绝、只读委托表写入被拒绝、`mic_print` 有权读取成功、升级程序可信写入成功,以及 HTTP JSON 伪造可信字段仍失败。
|
|
134
134
|
|
|
135
135
|
<!-- /microi-progressive:chunk -->
|
|
136
|
-
<!-- microi-progressive:chunk id=v8-security-013 sha256=
|
|
136
|
+
<!-- microi-progressive:chunk id=v8-security-013 sha256=1cb38480cbab23ca5f76520f1196943db91a7d21601d3aa61324136ca4ab7695 -->
|
|
137
137
|
## 浏览器访问密钥
|
|
138
138
|
|
|
139
|
+
- 站内 `/...` 路由不得交给绝对 URI 解析器当作本机文件 URI;只有完整地址才提取 HTTP 路径。页面范围归一化在 Windows、Linux、macOS 必须一致,保留精确路径与通配符的授权区别。
|
|
140
|
+
|
|
139
141
|
固定看板、电视和信息屏免输入帐号密码时,使用平台 `mci_user_access_key`,禁止自行在接口引擎中保存明文 Secret,也禁止把长期登录 Token 拼进 URL。
|
|
140
142
|
|
|
141
143
|
- 一个帐号可有多个密钥;每个密钥独立名称、到期时间(90天/自定义/永久)、范围、使用审计和吊销状态。永久密钥必须可单独吊销并建议定期人工轮换。
|
|
@@ -10,7 +10,7 @@ description: Microi V8 表单事件开发。用于编写 InFormV8、SubmitFormV8
|
|
|
10
10
|
你正在开发 Microi 吾码平台的 V8 表单事件。事件绑定在表单引擎的表上,在数据操作的不同阶段自动触发。
|
|
11
11
|
|
|
12
12
|
<!-- microi-progressive:begin -->
|
|
13
|
-
<!-- microi-progressive:chunk id=v8-table-event-000 sha256=
|
|
13
|
+
<!-- microi-progressive:chunk id=v8-table-event-000 sha256=2550fa4a7329b46ccee98d24e0bb1975e99a85b0b78aefd7d96be36505c82cd8 -->
|
|
14
14
|
## 本地优先与版本头(必做)
|
|
15
15
|
|
|
16
16
|
AI 本地开发表单 V8 事件时,优先修改 `microi-v8-engine/<租户>/<项目>/表单引擎/.../<事件Label>(<EventType>).js` 本地文件,再通过 MCP 或 VS Code 插件同步到数据库。文件中文名必须取 `diy_table` 对应 `diy_field.Label`,其中 `SubmitFormV8` 为 `前端表单提交前V8事件(SubmitFormV8).js`,`OutFormV8` 为 `前端表单提交后V8事件(OutFormV8).js`。若插件显示“本地和远端不一致”,先读取本地与远端并合并有效差异,不能直接覆盖。
|
|
@@ -38,7 +38,7 @@ AI 本地开发表单 V8 事件时,优先修改 `microi-v8-engine/<租户>/<
|
|
|
38
38
|
生成 V8 事件代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;提交前校验、提交后联动、字段显隐、数据脱敏、跨表写入、复杂条件判断等代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。
|
|
39
39
|
|
|
40
40
|
<!-- /microi-progressive:chunk -->
|
|
41
|
-
<!-- microi-progressive:chunk id=v8-table-event-001 sha256=
|
|
41
|
+
<!-- microi-progressive:chunk id=v8-table-event-001 sha256=f2517369ec5221c06950d05088793270a53f92cb7b96587d859a264a46c2c6d2 -->
|
|
42
42
|
## 事件类型
|
|
43
43
|
|
|
44
44
|
| 事件 | 运行端 | V8.EventName | 触发时机 | 用途 |
|
|
@@ -51,7 +51,7 @@ AI 本地开发表单 V8 事件时,优先修改 `microi-v8-engine/<租户>/<
|
|
|
51
51
|
| `DataFilterV8.js` | **后端** | `DataFilter` | 获取列表/表单数据后 | 每行数据加工、脱敏、补充字段 |
|
|
52
52
|
|
|
53
53
|
<!-- /microi-progressive:chunk -->
|
|
54
|
-
<!-- microi-progressive:chunk id=v8-table-event-002 sha256=
|
|
54
|
+
<!-- microi-progressive:chunk id=v8-table-event-002 sha256=230de68b48d85dd28ec5667bb46953305b41d34d376cf3eb5f223d63fb463837 -->
|
|
55
55
|
## 事件触发规则
|
|
56
56
|
|
|
57
57
|
- 后端 V8 事件 / 接口引擎中调用 `V8.FormEngine` 增删改 → **不触发**表单 V8 事件
|
|
@@ -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=271cf2359a152663040ed31ecc2289836df4d32d0fc9c47735dffbf9b59b9837 -->
|
|
65
65
|
## ⚠️ 关键陷阱(必读)
|
|
66
66
|
|
|
67
67
|
### 1. 设计模式保护(前端事件必加)
|
|
@@ -113,7 +113,7 @@ V8.ApiEngine.Run('other-engine', { Form: V8.Form }, V8.DbTrans);
|
|
|
113
113
|
---
|
|
114
114
|
|
|
115
115
|
<!-- /microi-progressive:chunk -->
|
|
116
|
-
<!-- microi-progressive:chunk id=v8-table-event-004 sha256=
|
|
116
|
+
<!-- microi-progressive:chunk id=v8-table-event-004 sha256=b3e59588ccfe532602d8f103f3c7b69beb800dc2092aeb8202616b4050324555 -->
|
|
117
117
|
## 前端事件特有 API
|
|
118
118
|
|
|
119
119
|
```javascript
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
4
|
|
|
5
|
-
<!-- microi-progressive:chunk id=v8-table-event-005 sha256=
|
|
5
|
+
<!-- microi-progressive:chunk id=v8-table-event-005 sha256=e4b6982f63971cf590b635f89643ba437bfd714cb78fe5d9690d43100e07c2c1 -->
|
|
6
6
|
## InFormV8.js — 表单打开事件
|
|
7
7
|
|
|
8
8
|
```javascript
|
|
@@ -31,7 +31,7 @@ if (V8.CurrentUser.RoleName.indexOf('管理员') === -1) {
|
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
<!-- /microi-progressive:chunk -->
|
|
34
|
-
<!-- microi-progressive:chunk id=v8-table-event-006 sha256=
|
|
34
|
+
<!-- microi-progressive:chunk id=v8-table-event-006 sha256=961c57d02a597e26abddc7c4d3b9f8f2f0b1f4ba6f8164ee3bbe7800bd78804b -->
|
|
35
35
|
## SubmitFormV8.js — 前端提交校验
|
|
36
36
|
|
|
37
37
|
```javascript
|
|
@@ -50,7 +50,7 @@ if (V8.Form.StartDate > V8.Form.EndDate) {
|
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
<!-- /microi-progressive:chunk -->
|
|
53
|
-
<!-- microi-progressive:chunk id=v8-table-event-007 sha256=
|
|
53
|
+
<!-- microi-progressive:chunk id=v8-table-event-007 sha256=e074fbd1736d4a80e58c4b4c06338a40b5f8f89045eddf0d09f325ff1d48a7d4 -->
|
|
54
54
|
## SubmitBeforeServerV8.js — 服务端提交前
|
|
55
55
|
|
|
56
56
|
```javascript
|
|
@@ -97,7 +97,7 @@ if (V8.FormSubmitAction === 'Insert' || V8.FormSubmitAction === 'Update') {
|
|
|
97
97
|
```
|
|
98
98
|
|
|
99
99
|
<!-- /microi-progressive:chunk -->
|
|
100
|
-
<!-- microi-progressive:chunk id=v8-table-event-008 sha256=
|
|
100
|
+
<!-- microi-progressive:chunk id=v8-table-event-008 sha256=d013a6f8b5cc1c114e7563fc98322ea6fa5ffce93e10d6bdf489c82344985082 -->
|
|
101
101
|
## SubmitAfterServerV8.js — 服务端提交后
|
|
102
102
|
|
|
103
103
|
```javascript
|
|
@@ -139,7 +139,7 @@ V8.Method.AddSysLog({
|
|
|
139
139
|
`SubmitAfterServerV8` 的“After”仍是“写入后、提交前”。需要在事务真正提交后才发布的缓存版本、跨节点通知等副作用,不能直接在事件中执行。平台为 `microi_database` 提供专用 `V8.Method.RefreshExtensionDatabases()`:事件调用时只登记提交后回调,提交成功才递增当前租户共享 Redis 版本,回滚时自动丢弃。普通业务的外部消息仍优先使用同事务 outbox,不能把任意不可撤销副作用都塞进内存回调。
|
|
140
140
|
|
|
141
141
|
<!-- /microi-progressive:chunk -->
|
|
142
|
-
<!-- microi-progressive:chunk id=v8-table-event-009 sha256=
|
|
142
|
+
<!-- microi-progressive:chunk id=v8-table-event-009 sha256=406c88d14167773a0d7597d4b622f9a53c2046f4d4cfd740cfb5addd13f80434 -->
|
|
143
143
|
## DataFilterV8.js — 服务端数据处理事件
|
|
144
144
|
|
|
145
145
|
获取列表/表单数据后,每行数据都会执行一次此事件。
|
|
@@ -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=e41feb40c52d46b7df9c18bf19fe3800194bbc92ce7415864529c69e09b335bc -->
|
|
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=80a852d31b69084c28828f124a83a2240d82309642619bc72debe3e7c271b3db -->
|
|
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=405c8a081022ffa2cc977bc80a591a7315ba208e5b49e176c7708a8037a35cf6 -->
|
|
29
29
|
## 注意事项
|
|
30
30
|
|
|
31
31
|
- 前端事件可使用 `window` 对象和 `async/await`,后端事件不可以
|
|
@@ -9,7 +9,7 @@ description: Microi 后端 V8 TCP 原始字节集成规范。用于通过 V8.Tcp
|
|
|
9
9
|
|
|
10
10
|
使用后端 `V8.Tcp` 完成一次性 TCP 连接、原始字节写入和可选的有界响应读取。典型场景是 RAW/JetDirect 9100 网络小票机、串口服务器和 PLC;具体协议帧、校验码与打印业务仍由接口引擎编排。
|
|
11
11
|
|
|
12
|
-
文档维护时,只在 `microi.doc/docs/doc/v8-engine/v8-server.md` 原位更新后端 API;不要新建重复页面,也不要手工维护英文文档。改变公共契约时同步后端源码/测试、Microi.Client Monaco 定义、Microi.
|
|
12
|
+
文档维护时,只在 `microi.doc/docs/doc/v8-engine/v8-server.md` 原位更新后端 API;不要新建重复页面,也不要手工维护英文文档。改变公共契约时同步后端源码/测试、Microi.Client Monaco 定义、Microi.Agent 类型与生成知识、AI Skill 镜像。
|
|
13
13
|
|
|
14
14
|
## 先判断是否适用
|
|
15
15
|
|
|
@@ -142,6 +142,6 @@ var hex = result.Data.Hex;
|
|
|
142
142
|
|
|
143
143
|
- 源码:`Microi.Server/Microi.V8Engine/Extend/Tcp/V8Tcp.cs` 与 `V8Extend.cs`。
|
|
144
144
|
- 测试:真实 Jint 注入、Byte/Base64/Hex/Text、回环收发、超时/上限/非法参数。
|
|
145
|
-
- 编辑器:`Microi.Client/.../v8-api-server-definitions.js` 与 `Microi.
|
|
145
|
+
- 编辑器:`Microi.Client/.../v8-api-server-definitions.js` 与 `Microi.Agent/src/editor/typingsManager.ts`。
|
|
146
146
|
- 文档与知识:官网中文后端 V8 页面、`microi.skills/README.md`、`v8-utilities` 索引、`Microi.AI/Resource` 镜像和向量资源列表。
|
|
147
147
|
- 验收:目标测试、后端构建、精确重启与健康检查、独立 TCP 回环;真实打印机出纸必须单独报告,不能用回环测试替代。
|