@microi.net/cli 5.5.9 → 5.6.0
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/.mcp.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/README.md +71 -71
- package/assets/build-meta.json +5 -5
- package/assets/feature-matrix.json +129 -129
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/codex-marketplace.json +20 -20
- package/scripts/mcp-codex-stdio-adapter.js +189 -189
- package/scripts/mcp-trae-windows-launcher.cmd +21 -21
- package/scripts/microi-cli-mcp.js +7 -7
- package/scripts/microi-codex-broker.js +447 -447
- package/scripts/microi-codex-router.js +582 -582
- package/scripts/microi-skills.meta.json +336 -336
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +3566 -3566
- package/skills/README.md +3 -3
- package/skills/ai-engine/SKILL.md +45 -45
- package/skills/ai-platform-governance/SKILL.md +177 -177
- package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
- package/skills/app-store/SKILL.md +177 -177
- package/skills/business-blueprint/SKILL.md +85 -85
- package/skills/datasource-engine/SKILL.md +91 -91
- package/skills/dos-orm/SKILL.md +81 -81
- package/skills/dos-orm/references/api-reference.md +229 -229
- package/skills/email-engine/SKILL.md +80 -80
- package/skills/email-engine/references/v8-email.md +34 -34
- package/skills/job-engine/SKILL.md +154 -154
- package/skills/message-notification/SKILL.md +126 -126
- package/skills/message-notification/agents/openai.yaml +5 -5
- package/skills/message-notification/references/contracts.md +102 -102
- package/skills/microi-ai-app-auth.js +652 -652
- package/skills/microi-ai-application/SKILL.md +102 -102
- package/skills/microi-ai-application/agents/openai.yaml +4 -4
- package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
- package/skills/microi-client-frontend/SKILL.md +43 -43
- 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 +2 -2
- 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 +28 -28
- 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 +56 -56
- package/skills/microi-codex/SKILL.md +46 -46
- package/skills/microi-codex-installer/SKILL.md +216 -216
- package/skills/microi-codex-installer/agents/openai.yaml +7 -7
- package/skills/microi-datasource-mapping/SKILL.md +67 -67
- package/skills/microi-db-schema/SKILL.md +6 -6
- package/skills/microi-db-schema/references/core-tables.md +18 -18
- package/skills/microi-db-schema/references/form-component-options.md +256 -256
- package/skills/microi-db-schema/references/schema-overview.md +11 -11
- package/skills/microi-db-schema/references/schema.md +46 -46
- package/skills/microi-db-schema/references/table-catalog.md +57 -57
- package/skills/microi-deployment/SKILL.md +18 -1
- package/skills/microi-deployment/references/deployment-matrix.md +101 -101
- package/skills/microi-docs-coverage/SKILL.md +123 -123
- package/skills/microi-docs-coverage/references/capability-map.md +1 -0
- package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
- package/skills/microi-form-engine/SKILL.md +50 -50
- package/skills/microi-form-engine/references/component-catalog.md +218 -218
- package/skills/microi-form-engine/references/data-source-events.md +124 -124
- package/skills/microi-form-layout/SKILL.md +13 -13
- package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +235 -235
- package/skills/microi-frontend-sdk/SKILL.md +4 -4
- 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 +175 -175
- package/skills/microi-left-right-layout/SKILL.md +141 -141
- package/skills/microi-microservice/SKILL.md +15 -15
- package/skills/microi-microservice/references/runtime-delivery.md +278 -278
- 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 +213 -213
- package/skills/microi-solution-quotation/SKILL.md +78 -78
- package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
- package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
- package/skills/microi-sso/SKILL.md +85 -85
- package/skills/microi-sso/references/acceptance.md +49 -49
- package/skills/microi-sso/references/configuration-and-security.md +53 -53
- package/skills/microi-sso/references/inbound.md +53 -53
- package/skills/microi-sso/references/outbound.md +39 -39
- 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 +20 -20
- package/skills/microi-ui/SKILL.md +7 -2
- package/skills/microi-uniapp-frontend/SKILL.md +134 -134
- 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 +136 -136
- 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 +124 -124
- package/skills/module-engine/SKILL.md +16 -16
- package/skills/ocr-engine/SKILL.md +2 -2
- package/skills/ocr-engine/agents/openai.yaml +1 -1
- package/skills/page-engine/SKILL.md +28 -28
- 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 +126 -126
- 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 +42 -42
- package/skills/performance-testing/SKILL.md +120 -120
- package/skills/playwright-e2e/SKILL.md +84 -84
- 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 +68 -68
- 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 +64 -64
- package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +20 -20
- package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -69
- package/skills/print-engine/SKILL.md +36 -36
- package/skills/production-readonly-audit/SKILL.md +41 -41
- package/skills/report-engine/SKILL.md +71 -71
- package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
- package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
- package/skills/scripts/validate-progressive-disclosure.mjs +52 -52
- package/skills/search-engine/SKILL.md +75 -75
- package/skills/spider-engine/SKILL.md +190 -190
- package/skills/system-observability/SKILL.md +162 -162
- package/skills/system-observability/references/memory-incident-triage.md +73 -73
- package/skills/translate-engine/SKILL.md +1 -1
- package/skills/ui-design/SKILL.md +3 -1
- package/skills/uniapp-mall-assets/SKILL.md +170 -170
- package/skills/unity-integration/SKILL.md +155 -155
- package/skills/unity-integration/agents/openai.yaml +4 -4
- package/skills/unity-integration/references/ai-app-delivery.md +103 -103
- package/skills/unity-integration/references/sdk-api.md +82 -82
- package/skills/unity-integration/references/toolbox-migration.md +66 -66
- package/skills/unity-integration/references/webgl-hosting.md +57 -57
- package/skills/v8-api-config/SKILL.md +378 -378
- package/skills/v8-cache-pattern/SKILL.md +306 -306
- package/skills/v8-crud-api/SKILL.md +29 -29
- 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 +56 -56
- package/skills/v8-debugging/SKILL.md +143 -143
- package/skills/v8-explorer-tree/SKILL.md +64 -64
- 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 +201 -201
- package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +118 -118
- 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 +32 -32
- package/skills/v8-file-upload/SKILL.md +154 -154
- 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 +133 -133
- 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 +138 -138
- package/skills/v8-formengine-http/SKILL.md +107 -107
- package/skills/v8-frontend-events/SKILL.md +22 -22
- package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
- package/skills/v8-frontend-events/references/bluetooth-print.md +247 -247
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +50 -50
- package/skills/v8-http-integration/SKILL.md +106 -106
- package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +31 -31
- 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 +5 -5
- package/skills/v8-image-processing/SKILL.md +190 -190
- package/skills/v8-image-processing/agents/openai.yaml +4 -4
- package/skills/v8-image-processing/references/api-reference.md +623 -623
- package/skills/v8-menu-buttons/SKILL.md +103 -103
- package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +145 -145
- 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 +228 -228
- 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 +43 -43
- package/skills/v8-mongodb/SKILL.md +65 -65
- package/skills/v8-mq-mqtt/SKILL.md +175 -175
- package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
- package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +137 -137
- package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
- package/skills/v8-saas-multi-tenant/SKILL.md +223 -223
- package/skills/v8-security/SKILL.md +25 -25
- package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +122 -122
- package/skills/v8-sql-query/SKILL.md +127 -127
- package/skills/v8-table-event/SKILL.md +20 -20
- 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 +18 -18
- 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 +15 -15
- package/skills/v8-tcp-integration/SKILL.md +1 -1
- package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
- package/skills/v8-template-engine/SKILL.md +59 -59
- package/skills/v8-utilities/SKILL.md +92 -92
- package/skills/v8-utilities/references/client-api-index.md +143 -143
- package/skills/v8-utilities/references/platform-http-routes.md +83 -83
- package/skills/v8-utilities/references/server-api-index.md +74 -74
- package/skills/v8-workflow/SKILL.md +44 -44
- package/skills/vision-engine/SKILL.md +19 -19
- package/skills/vision-engine/references/architecture-and-acceptance.md +34 -34
- package/skills/workspace-conventions/SKILL.md +236 -236
- package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +208 -208
- 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 +179 -179
- 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 +21 -21
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: v8-table-event
|
|
3
|
-
description: Microi V8 表单事件开发。用于编写 InFormV8、SubmitFormV8、SubmitBeforeServerV8、SubmitAfterServerV8、OutFormV8、DataFilterV8 和事务感知事件。
|
|
3
|
+
description: Microi V8 表单事件开发。用于编写 InFormV8、SubmitFormV8、SubmitBeforeServerV8、SubmitAfterServerV8、OutFormV8、DataFilterV8 和事务感知事件。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
@@ -13,29 +13,29 @@ description: Microi V8 表单事件开发。用于编写 InFormV8、SubmitFormV8
|
|
|
13
13
|
<!-- microi-progressive:chunk id=v8-table-event-000 sha256=dd86294c8cf42f580b2eb806d981c239c0efc2934505c0716e804de2f8a9235c -->
|
|
14
14
|
## 本地优先与版本头(必做)
|
|
15
15
|
|
|
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`。若插件显示“本地和远端不一致”,先读取本地与远端并合并有效差异,不能直接覆盖。
|
|
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`。若插件显示“本地和远端不一致”,先读取本地与远端并合并有效差异,不能直接覆盖。
|
|
17
17
|
|
|
18
18
|
每一次修改、上传、推送 `InFormV8.js`、`SubmitFormV8.js`、`SubmitBeforeServerV8.js`、`SubmitAfterServerV8.js`、`OutFormV8.js`、`DataFilterV8.js` 等事件文件,都必须维护顶部版本区域。版本号从 `v1.0.0` 开始;每次上传/推送/修改递增 1;补丁位和次版本位最大为 9 并向前进位(`v1.0.9 -> v1.1.0`、`v1.9.9 -> v2.0.0`、`v9.9.9 -> v10.0.0`)。代码头只写完整功能说明,不写修改历史、时间戳或 ChangeLog。
|
|
19
19
|
|
|
20
20
|
```javascript
|
|
21
21
|
/*
|
|
22
22
|
* V8 Event
|
|
23
|
-
* TableKey: 示例表Key
|
|
23
|
+
* TableKey: 示例表Key
|
|
24
24
|
* EventType: SubmitBeforeServerV8
|
|
25
25
|
* Version: v1.0.0
|
|
26
|
-
* 功能说明:
|
|
26
|
+
* 功能说明:
|
|
27
27
|
* - 完整说明该事件的触发时机、校验/加工逻辑、读写字段和阻止提交条件。
|
|
28
28
|
*/
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
同步流程:`读取远端 -> 修改本地并递增语义版本头 -> JS 语法检查 -> 保存远端 -> 回读远端确认版本头一致 -> 查询 mic_data_version 确认形成新版本 -> 执行触发该事件的最小表单操作验证`。表单设计器保存和 MCP 保存共用服务端代码版本链路;只有代码真实变化才新增版本,普通布局/字段属性保存不得产生代码版本。修改记录不得写进事件代码头。
|
|
32
|
-
|
|
33
|
-
使用 MCP 时,先调用 `microi_list_events` 发现事件,再用
|
|
34
|
-
`microi_get_event_code` 读取目标源码;修改后通过 `microi_save_event_code`
|
|
35
|
-
保存并回读。不要把接口引擎的保存工具用于表单事件,也不要在未读取远端
|
|
36
|
-
版本时直接覆盖。
|
|
37
|
-
|
|
38
|
-
生成 V8 事件代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;提交前校验、提交后联动、字段显隐、数据脱敏、跨表写入、复杂条件判断等代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。
|
|
31
|
+
同步流程:`读取远端 -> 修改本地并递增语义版本头 -> JS 语法检查 -> 保存远端 -> 回读远端确认版本头一致 -> 查询 mic_data_version 确认形成新版本 -> 执行触发该事件的最小表单操作验证`。表单设计器保存和 MCP 保存共用服务端代码版本链路;只有代码真实变化才新增版本,普通布局/字段属性保存不得产生代码版本。修改记录不得写进事件代码头。
|
|
32
|
+
|
|
33
|
+
使用 MCP 时,先调用 `microi_list_events` 发现事件,再用
|
|
34
|
+
`microi_get_event_code` 读取目标源码;修改后通过 `microi_save_event_code`
|
|
35
|
+
保存并回读。不要把接口引擎的保存工具用于表单事件,也不要在未读取远端
|
|
36
|
+
版本时直接覆盖。
|
|
37
|
+
|
|
38
|
+
生成 V8 事件代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;提交前校验、提交后联动、字段显隐、数据脱敏、跨表写入、复杂条件判断等代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。
|
|
39
39
|
|
|
40
40
|
<!-- /microi-progressive:chunk -->
|
|
41
41
|
<!-- microi-progressive:chunk id=v8-table-event-001 sha256=7bad55ca6781e6ca458a0333a47c71a3bad30334d146e940496c45c4ffa7ddf5 -->
|
|
@@ -57,8 +57,8 @@ AI 本地开发表单 V8 事件时,优先修改 `microi-v8-engine/<租户>/<
|
|
|
57
57
|
- 后端 V8 事件 / 接口引擎中调用 `V8.FormEngine` 增删改 → **不触发**表单 V8 事件
|
|
58
58
|
- 传入 `_InvokeType: 'Client'` → **触发**表单 V8 事件
|
|
59
59
|
- Postman 等直接调用接口 → 前端事件**不执行**,后端事件**仍执行**
|
|
60
|
-
- 服务器端提交前/后 V8 事件在**同一事务**中执行
|
|
61
|
-
- `diy_table.V8Limit` 是表后端提交前、提交后和数据处理 V8 的正向开关:缺失、`null`、`0/false` 均不设置 Jint 单次超时、语句、函数递归和累计分配预算,只有 `1/true` 才启用这些限制。旧 `V8Unlimited` 仅在新字段不存在时反向推断,新的 MCP、Manifest 和应用资源只写 `V8Limit`。进程常驻内存、取消、并发、接口嵌套深度、权限和数据库保护始终生效。
|
|
60
|
+
- 服务器端提交前/后 V8 事件在**同一事务**中执行
|
|
61
|
+
- `diy_table.V8Limit` 是表后端提交前、提交后和数据处理 V8 的正向开关:缺失、`null`、`0/false` 均不设置 Jint 单次超时、语句、函数递归和累计分配预算,只有 `1/true` 才启用这些限制。旧 `V8Unlimited` 仅在新字段不存在时反向推断,新的 MCP、Manifest 和应用资源只写 `V8Limit`。进程常驻内存、取消、并发、接口嵌套深度、权限和数据库保护始终生效。
|
|
62
62
|
|
|
63
63
|
<!-- /microi-progressive:chunk -->
|
|
64
64
|
<!-- microi-progressive:chunk id=v8-table-event-003 sha256=65a1e728982d4e534d06dc2440eac111fe53a08f0a3012c6a9f8b1de45b4b81f -->
|
|
@@ -75,7 +75,7 @@ if (V8.LoadMode === 'Design') return;
|
|
|
75
75
|
|
|
76
76
|
- ❌ **禁止** 在 `SubmitFormV8.js` 中调 `V8.FormSubmit()` —— 无限递归
|
|
77
77
|
- ❌ **禁止** 在 `FieldValueChange` 中 `V8.FormSet(同字段, ...)` —— 循环触发
|
|
78
|
-
- ❌ **禁止** 在后端提交前/后事件中再次写当前表;即使默认 Server 调用不递归,也可能覆盖本次增量数据、引发死锁或重复副作用。确需跨表联动时使用同一 `V8.DbTrans`,且不要传 `_InvokeType:'Client'`
|
|
78
|
+
- ❌ **禁止** 在后端提交前/后事件中再次写当前表;即使默认 Server 调用不递归,也可能覆盖本次增量数据、引发死锁或重复副作用。确需跨表联动时使用同一 `V8.DbTrans`,且不要传 `_InvokeType:'Client'`
|
|
79
79
|
|
|
80
80
|
### 3. 阻止提交(后端)
|
|
81
81
|
|
|
@@ -108,8 +108,8 @@ V8.ApiEngine.Run('other-engine', { Form: V8.Form }, V8.DbTrans);
|
|
|
108
108
|
## 前端事件特有 API
|
|
109
109
|
|
|
110
110
|
```javascript
|
|
111
|
-
// 普通 diy-form 中设置字段值(触发目标字段值变更事件)
|
|
112
|
-
// diy-table 列表上下文只更新当前行和模板,不递归触发目标字段 V8
|
|
111
|
+
// 普通 diy-form 中设置字段值(触发目标字段值变更事件)
|
|
112
|
+
// diy-table 列表上下文只更新当前行和模板,不递归触发目标字段 V8
|
|
113
113
|
V8.FormSet('FieldName', 'value');
|
|
114
114
|
V8.FormSet('DropdownField', { Id: 1, Name: '选项' }); // 下拉框
|
|
115
115
|
|
|
@@ -127,9 +127,9 @@ var isReadonly = V8.Field.UserName.Readonly;
|
|
|
127
127
|
V8.Tips('操作成功', true); // 成功提示(1秒消失)
|
|
128
128
|
V8.Tips('操作失败', false); // 错误提示(5秒消失)
|
|
129
129
|
|
|
130
|
-
// 确认框
|
|
131
|
-
V8.ConfirmTips('确定删除?', function() { /* 确定 */ }, function() { /* 取消 */ });
|
|
132
|
-
// content 使用 HTML 模式渲染;只能传固定文案或已转义内容,复杂交互用 OpenAppDialog
|
|
130
|
+
// 确认框
|
|
131
|
+
V8.ConfirmTips('确定删除?', function() { /* 确定 */ }, function() { /* 取消 */ });
|
|
132
|
+
// content 使用 HTML 模式渲染;只能传固定文案或已转义内容,复杂交互用 OpenAppDialog
|
|
133
133
|
|
|
134
134
|
// 前端 HTTP 请求
|
|
135
135
|
V8.Post('/api/xxx', { key: 'value' }, function(res) { });
|
|
@@ -104,13 +104,13 @@ if (V8.FormSubmitAction === 'Insert' || V8.FormSubmitAction === 'Update') {
|
|
|
104
104
|
// 此时数据已成功写入数据库(仍在事务中)
|
|
105
105
|
// 返回 { Code: 0 } 仍可回滚事务
|
|
106
106
|
|
|
107
|
-
// 新增后:自动创建关联数据。保持默认 Server 调用,不触发目标表事件
|
|
108
|
-
if (V8.FormSubmitAction === 'Insert') {
|
|
109
|
-
V8.FormEngine.AddFormData('UserProfile', {
|
|
110
|
-
UserId: V8.Form.Id,
|
|
111
|
-
NickName: V8.Form.Name
|
|
112
|
-
}, V8.DbTrans);
|
|
113
|
-
}
|
|
107
|
+
// 新增后:自动创建关联数据。保持默认 Server 调用,不触发目标表事件
|
|
108
|
+
if (V8.FormSubmitAction === 'Insert') {
|
|
109
|
+
V8.FormEngine.AddFormData('UserProfile', {
|
|
110
|
+
UserId: V8.Form.Id,
|
|
111
|
+
NickName: V8.Form.Name
|
|
112
|
+
}, V8.DbTrans);
|
|
113
|
+
}
|
|
114
114
|
|
|
115
115
|
// 更新后:同步更新其它表的冗余字段
|
|
116
116
|
if (V8.FormSubmitAction === 'Update') {
|
|
@@ -129,14 +129,14 @@ V8.ApiEngine.Run('send-notification', {
|
|
|
129
129
|
}, V8.DbTrans);
|
|
130
130
|
|
|
131
131
|
// 记录操作日志
|
|
132
|
-
V8.Method.AddSysLog({
|
|
132
|
+
V8.Method.AddSysLog({
|
|
133
133
|
Title: V8.FormSubmitAction + ' ' + V8.TableModel.Name,
|
|
134
134
|
Content: JSON.stringify({ Id: V8.Form.Id }),
|
|
135
135
|
Type: '业务日志'
|
|
136
|
-
});
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
`SubmitAfterServerV8` 的“After”仍是“写入后、提交前”。需要在事务真正提交后才发布的缓存版本、跨节点通知等副作用,不能直接在事件中执行。平台为 `microi_database` 提供专用 `V8.Method.RefreshExtensionDatabases()`:事件调用时只登记提交后回调,提交成功才递增当前租户共享 Redis 版本,回滚时自动丢弃。普通业务的外部消息仍优先使用同事务 outbox,不能把任意不可撤销副作用都塞进内存回调。
|
|
136
|
+
});
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
`SubmitAfterServerV8` 的“After”仍是“写入后、提交前”。需要在事务真正提交后才发布的缓存版本、跨节点通知等副作用,不能直接在事件中执行。平台为 `microi_database` 提供专用 `V8.Method.RefreshExtensionDatabases()`:事件调用时只登记提交后回调,提交成功才递增当前租户共享 Redis 版本,回滚时自动丢弃。普通业务的外部消息仍优先使用同事务 outbox,不能把任意不可撤销副作用都塞进内存回调。
|
|
140
140
|
|
|
141
141
|
<!-- /microi-progressive:chunk -->
|
|
142
142
|
<!-- microi-progressive:chunk id=v8-table-event-009 sha256=d415302a8108d9e11755a046bdbffe0c84a135ec6ed0e6b1dc3fc128a8ef38b6 -->
|
|
@@ -182,20 +182,20 @@ if (V8.Form.Phone) {
|
|
|
182
182
|
| 变量 | 说明 | 可用事件 |
|
|
183
183
|
|------|------|---------|
|
|
184
184
|
| `V8.Form` | 当前表单数据(新增时也有 Id) | 全部 |
|
|
185
|
-
| `V8.OldForm` | 已加载的修改前旧数据 | 普通表单;提交前/后 |
|
|
185
|
+
| `V8.OldForm` | 已加载的修改前旧数据 | 普通表单;提交前/后 |
|
|
186
186
|
| `V8.FormMode` | `'Add'` / `'Edit'` / `'View'` | 全部 |
|
|
187
187
|
| `V8.FormOutAction` | `'Insert'`/`'Update'`/`'Close'`/`'Delete'` | FormOut |
|
|
188
188
|
| `V8.FormSubmitAction` | `'Insert'` / `'Update'` / `'Delete'` | SubmitBefore |
|
|
189
189
|
| `V8.EventName` | 当前事件名 | 全部 |
|
|
190
190
|
| `V8.CurrentUser` | 当前用户 | 全部 |
|
|
191
191
|
| `V8.TableId` / `V8.TableName` | 当前表 Id / Name | 全部 |
|
|
192
|
-
| `V8.SelectedData` / `V8.TableRowSelected` | 选中的行数组 | 列表/批量按钮 |
|
|
192
|
+
| `V8.SelectedData` / `V8.TableRowSelected` | 选中的行数组 | 列表/批量按钮 |
|
|
193
193
|
| `V8.CurrentTableData` | 当前表当页数据 | 全部 |
|
|
194
194
|
| `V8.ClientType` | `'PC'`/`'IOS'`/`'Android'`/`'H5'`/`'WeChat'` | 全部 |
|
|
195
|
-
| `V8.ThisValue` | 当前字段新值:可能是对象、原始值或行内 `{New,Old}` | FieldValueChange |
|
|
196
|
-
| `V8.OldValue` | 当前字段旧值,仅行内编辑可靠 | 表格行内 FieldValueChange |
|
|
197
|
-
| `V8.KeyCode` | 键盘事件的键码 | FieldOnKeyup |
|
|
198
|
-
| `V8.Event` | 原生事件;键盘事件目前不提供 | FieldSlotButtonClick 等显式事件 |
|
|
195
|
+
| `V8.ThisValue` | 当前字段新值:可能是对象、原始值或行内 `{New,Old}` | FieldValueChange |
|
|
196
|
+
| `V8.OldValue` | 当前字段旧值,仅行内编辑可靠 | 表格行内 FieldValueChange |
|
|
197
|
+
| `V8.KeyCode` | 键盘事件的键码 | FieldOnKeyup |
|
|
198
|
+
| `V8.Event` | 原生事件;键盘事件目前不提供 | FieldSlotButtonClick 等显式事件 |
|
|
199
199
|
| `V8.ParentV8` | 子表中访问父表 V8 对象 | 子表事件 |
|
|
200
200
|
|
|
201
201
|
### 后端事件
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
| `FormSubmitBefore` | 提交前事件 |
|
|
12
12
|
| `FormOut` | 离开表单事件 |
|
|
13
13
|
| `FieldValueChange` | 字段值变更事件 |
|
|
14
|
-
| `FieldOnKeyup` | 文本框键盘事件 |
|
|
15
|
-
| `TableFieldOnKeyup` | 表格行内文本框键盘事件 |
|
|
16
|
-
| `FieldSlotButtonClick` | 单行文本插槽按钮点击事件 |
|
|
14
|
+
| `FieldOnKeyup` | 文本框键盘事件 |
|
|
15
|
+
| `TableFieldOnKeyup` | 表格行内文本框键盘事件 |
|
|
16
|
+
| `FieldSlotButtonClick` | 单行文本插槽按钮点击事件 |
|
|
17
17
|
| `V8BtnRun` | V8 按钮执行事件 |
|
|
18
18
|
| `V8BtnLimit` | V8 按钮是否显示事件 |
|
|
19
19
|
| `BtnFormDetailRun` | 详情按钮 V8 按钮 |
|
|
@@ -26,21 +26,21 @@
|
|
|
26
26
|
|
|
27
27
|
<!-- /microi-progressive:chunk -->
|
|
28
28
|
<!-- microi-progressive:chunk id=v8-table-event-012 sha256=db5bf410bc6babf14d3d91cc61b9875c81bc1be24b2c1b7c62334bc6819e4e55 -->
|
|
29
|
-
## 注意事项
|
|
29
|
+
## 注意事项
|
|
30
30
|
|
|
31
31
|
- 前端事件可使用 `window` 对象和 `async/await`,后端事件不可以
|
|
32
32
|
- 后端提交前/后事件返回 `{ Code: 0, Msg: '...' }` 可阻止数据写入并回滚事务
|
|
33
33
|
- 直接修改 `V8.Form` 的字段值即可改变最终写入的数据
|
|
34
|
-
- 后端事件中使用 `V8.FormEngine` 默认是 Server 调用,不触发目标表事件;`_InvokeType:'Client'` 恰好会触发目标表事件,不能用于“避免递归”
|
|
35
|
-
- `_InvokeType:'Server'` 只表达事件调用语义,不是客户端授权开关;浏览器伪造它不会获得受信任权限
|
|
34
|
+
- 后端事件中使用 `V8.FormEngine` 默认是 Server 调用,不触发目标表事件;`_InvokeType:'Client'` 恰好会触发目标表事件,不能用于“避免递归”
|
|
35
|
+
- `_InvokeType:'Server'` 只表达事件调用语义,不是客户端授权开关;浏览器伪造它不会获得受信任权限
|
|
36
36
|
- `V8.FormSubmitAction` 的值是 `'Insert'`/`'Update'`/`'Delete'`(非 Add/Upt/Del)
|
|
37
|
-
- 在 DataFilterV8 中使用 `V8.CacheData` 缓存查询结果,避免每行执行 N+1 查询
|
|
38
|
-
- 表事件调用下游接口时,表级正向 `diy_table.V8Limit` 不会改变下游接口;下游接口独立读取正向 `sys_apiengine.V8Limit`(两者均默认 0 表示不限 Jint 单次预算,1 表示启用限制)
|
|
39
|
-
|
|
40
|
-
### 复盘:提交后事件误把增量表单当作完整记录
|
|
41
|
-
|
|
42
|
-
- 触发场景:插件、MCP 或后端只更新代码等少数字段时,`SubmitAfterServerV8` 直接对 `V8.Form.Id`、业务 Key 调用 `toLowerCase()`,保存动作因字段未出现在增量参数中而异常。
|
|
43
|
-
- 根因:事件假设 `V8.Form` 始终包含整行数据,没有兼容稀疏更新(sparse patch)。
|
|
44
|
-
- 通用规则:提交后事件使用非本次必传字段前,必须从 `V8.OldForm` 合并兜底,或凭已有 `Id` 回查当前记录;调用字符串方法前先显式 `String(...)` 并校验空值。写缓存时应缓存合并后的完整模型,不能用稀疏对象覆盖整行缓存。
|
|
45
|
-
- 自动化检查:分别只更新一个普通字段、只更新大文本代码字段并执行一次完整表单保存;事件均不得报错,按 Id、唯一 Key 和可选地址回读缓存都应得到完整记录。
|
|
37
|
+
- 在 DataFilterV8 中使用 `V8.CacheData` 缓存查询结果,避免每行执行 N+1 查询
|
|
38
|
+
- 表事件调用下游接口时,表级正向 `diy_table.V8Limit` 不会改变下游接口;下游接口独立读取正向 `sys_apiengine.V8Limit`(两者均默认 0 表示不限 Jint 单次预算,1 表示启用限制)
|
|
39
|
+
|
|
40
|
+
### 复盘:提交后事件误把增量表单当作完整记录
|
|
41
|
+
|
|
42
|
+
- 触发场景:插件、MCP 或后端只更新代码等少数字段时,`SubmitAfterServerV8` 直接对 `V8.Form.Id`、业务 Key 调用 `toLowerCase()`,保存动作因字段未出现在增量参数中而异常。
|
|
43
|
+
- 根因:事件假设 `V8.Form` 始终包含整行数据,没有兼容稀疏更新(sparse patch)。
|
|
44
|
+
- 通用规则:提交后事件使用非本次必传字段前,必须从 `V8.OldForm` 合并兜底,或凭已有 `Id` 回查当前记录;调用字符串方法前先显式 `String(...)` 并校验空值。写缓存时应缓存合并后的完整模型,不能用稀疏对象覆盖整行缓存。
|
|
45
|
+
- 自动化检查:分别只更新一个普通字段、只更新大文本代码字段并执行一次完整表单保存;事件均不得报错,按 Id、唯一 Key 和可选地址回读缓存都应得到完整记录。
|
|
46
46
|
<!-- /microi-progressive:chunk -->
|
|
@@ -144,4 +144,4 @@ var hex = result.Data.Hex;
|
|
|
144
144
|
- 测试:真实 Jint 注入、Byte/Base64/Hex/Text、回环收发、超时/上限/非法参数。
|
|
145
145
|
- 编辑器:`Microi.Client/.../v8-api-server-definitions.js` 与 `Microi.VSCode/src/editor/typingsManager.ts`。
|
|
146
146
|
- 文档与知识:官网中文后端 V8 页面、`microi.skills/README.md`、`v8-utilities` 索引、`Microi.AI/Resource` 镜像和向量资源列表。
|
|
147
|
-
- 验收:目标测试、后端构建、精确重启与健康检查、独立 TCP 回环;真实打印机出纸必须单独报告,不能用回环测试替代。
|
|
147
|
+
- 验收:目标测试、后端构建、精确重启与健康检查、独立 TCP 回环;真实打印机出纸必须单独报告,不能用回环测试替代。
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
interface:
|
|
2
|
-
display_name: "V8 TCP 原始字节"
|
|
3
|
-
short_description: "通过后端 V8 安全发送和接收 TCP 原始字节数据"
|
|
4
|
-
default_prompt: "使用 $v8-tcp-integration 编写一个安全、可验证的 Microi 后端 V8 TCP 设备集成。"
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "V8 TCP 原始字节"
|
|
3
|
+
short_description: "通过后端 V8 安全发送和接收 TCP 原始字节数据"
|
|
4
|
+
default_prompt: "使用 $v8-tcp-integration 编写一个安全、可验证的 Microi 后端 V8 TCP 设备集成。"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: v8-template-engine
|
|
3
|
-
description: Microi V8 模板引擎指南。用于编写表格/表单模板渲染、V8.Result HTML/text 输出、行格式化、徽章、图片和自定义显示逻辑。
|
|
3
|
+
description: Microi V8 模板引擎指南。用于编写表格/表单模板渲染、V8.Result HTML/text 输出、行格式化、徽章、图片和自定义显示逻辑。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
@@ -12,27 +12,27 @@ description: Microi V8 模板引擎指南。用于编写表格/表单模板渲
|
|
|
12
12
|
## 核心规则
|
|
13
13
|
|
|
14
14
|
- 模板引擎绑定在【表单属性】的【表格 V8 模板引擎】或【表单 V8 模板引擎】
|
|
15
|
-
- 通过给 `V8.Result` 赋值字符串(HTML 或纯文本)来控制最终渲染结果
|
|
16
|
-
- 在 **表格模板** 中:每行数据都会执行一次,`V8.Form` 是当前行数据
|
|
17
|
-
- 注意:`V8.Form` 此时只能访问到【模块引擎】配置的【查询列】字段;若查询列为空则可访问全部字段
|
|
18
|
-
- 支持 `bootstrap`、`element-ui` 样式类名
|
|
19
|
-
- `V8.EventName` 可能为 `TableTemplateEngine` 或 `FormTemplateEngine`
|
|
20
|
-
- 表格模板同步执行,输出优先级是 `V8.Result` → JavaScript `return` → 原字段值;表单模板异步执行并以 `V8.Result` 为输出
|
|
21
|
-
- 模板结果通过 `v-safe-html`/DOMPurify 净化。`script`、`iframe`、`on*` 事件属性、`javascript:` 等危险内容会被剥离,禁止依赖内联点击事件
|
|
22
|
-
- 业务文本必须 HTML 转义后再拼接;权限、校验、状态写入等业务逻辑必须放后端
|
|
23
|
-
|
|
24
|
-
模板中需要拼 HTML 时,先定义安全转义函数:
|
|
25
|
-
|
|
26
|
-
```javascript
|
|
27
|
-
var escapeHtml = function (value) {
|
|
28
|
-
return String(value == null ? '' : value)
|
|
29
|
-
.replace(/&/g, '&')
|
|
30
|
-
.replace(/</g, '<')
|
|
31
|
-
.replace(/>/g, '>')
|
|
32
|
-
.replace(/"/g, '"')
|
|
33
|
-
.replace(/'/g, ''');
|
|
34
|
-
};
|
|
35
|
-
```
|
|
15
|
+
- 通过给 `V8.Result` 赋值字符串(HTML 或纯文本)来控制最终渲染结果
|
|
16
|
+
- 在 **表格模板** 中:每行数据都会执行一次,`V8.Form` 是当前行数据
|
|
17
|
+
- 注意:`V8.Form` 此时只能访问到【模块引擎】配置的【查询列】字段;若查询列为空则可访问全部字段
|
|
18
|
+
- 支持 `bootstrap`、`element-ui` 样式类名
|
|
19
|
+
- `V8.EventName` 可能为 `TableTemplateEngine` 或 `FormTemplateEngine`
|
|
20
|
+
- 表格模板同步执行,输出优先级是 `V8.Result` → JavaScript `return` → 原字段值;表单模板异步执行并以 `V8.Result` 为输出
|
|
21
|
+
- 模板结果通过 `v-safe-html`/DOMPurify 净化。`script`、`iframe`、`on*` 事件属性、`javascript:` 等危险内容会被剥离,禁止依赖内联点击事件
|
|
22
|
+
- 业务文本必须 HTML 转义后再拼接;权限、校验、状态写入等业务逻辑必须放后端
|
|
23
|
+
|
|
24
|
+
模板中需要拼 HTML 时,先定义安全转义函数:
|
|
25
|
+
|
|
26
|
+
```javascript
|
|
27
|
+
var escapeHtml = function (value) {
|
|
28
|
+
return String(value == null ? '' : value)
|
|
29
|
+
.replace(/&/g, '&')
|
|
30
|
+
.replace(/</g, '<')
|
|
31
|
+
.replace(/>/g, '>')
|
|
32
|
+
.replace(/"/g, '"')
|
|
33
|
+
.replace(/'/g, ''');
|
|
34
|
+
};
|
|
35
|
+
```
|
|
36
36
|
|
|
37
37
|
## 状态徽章(Bootstrap 样式)
|
|
38
38
|
|
|
@@ -46,7 +46,7 @@ if (V8.IsNull(value)) {
|
|
|
46
46
|
else if (value === '未通过') classStr = 'badge-warning';
|
|
47
47
|
else if (value === '待审核') classStr = 'badge-info';
|
|
48
48
|
else if (value === '通过') classStr = 'badge-success';
|
|
49
|
-
V8.Result = '<span class="badge badge-pill ' + classStr + '">' + escapeHtml(value) + '</span>';
|
|
49
|
+
V8.Result = '<span class="badge badge-pill ' + classStr + '">' + escapeHtml(value) + '</span>';
|
|
50
50
|
}
|
|
51
51
|
```
|
|
52
52
|
|
|
@@ -57,12 +57,12 @@ if (V8.IsNull(value)) {
|
|
|
57
57
|
```javascript
|
|
58
58
|
// 不同业务状态显示不同字体颜色
|
|
59
59
|
if (V8.Form.XuqiuLX === '合并') {
|
|
60
|
-
V8.Result = '<span style="color:blue;">' + escapeHtml(V8.Form.XuqiuDDH) + '</span>';
|
|
61
|
-
} else if (V8.Form.HebingID) {
|
|
62
|
-
V8.Result = '<span style="color:#999;">' + escapeHtml(V8.Form.XuqiuDDH) + '</span>';
|
|
63
|
-
} else {
|
|
64
|
-
V8.Result = escapeHtml(V8.Form.XuqiuDDH);
|
|
65
|
-
}
|
|
60
|
+
V8.Result = '<span style="color:blue;">' + escapeHtml(V8.Form.XuqiuDDH) + '</span>';
|
|
61
|
+
} else if (V8.Form.HebingID) {
|
|
62
|
+
V8.Result = '<span style="color:#999;">' + escapeHtml(V8.Form.XuqiuDDH) + '</span>';
|
|
63
|
+
} else {
|
|
64
|
+
V8.Result = escapeHtml(V8.Form.XuqiuDDH);
|
|
65
|
+
}
|
|
66
66
|
```
|
|
67
67
|
|
|
68
68
|
## 单图列渲染
|
|
@@ -70,11 +70,11 @@ if (V8.Form.XuqiuLX === '合并') {
|
|
|
70
70
|
```javascript
|
|
71
71
|
var html = '';
|
|
72
72
|
var fileServer = V8.SysConfig.FileServer;
|
|
73
|
-
if (!V8.IsNull(V8.Form.GongsiLOGO)) {
|
|
74
|
-
html = '<img src="' + escapeHtml(fileServer + V8.Form.GongsiLOGO) + '" '
|
|
75
|
-
+ 'alt="公司Logo" '
|
|
76
|
-
+ 'style="height:40px;width:40px;object-fit:cover;margin:5px 0;" />';
|
|
77
|
-
}
|
|
73
|
+
if (!V8.IsNull(V8.Form.GongsiLOGO)) {
|
|
74
|
+
html = '<img src="' + escapeHtml(fileServer + V8.Form.GongsiLOGO) + '" '
|
|
75
|
+
+ 'alt="公司Logo" '
|
|
76
|
+
+ 'style="height:40px;width:40px;object-fit:cover;margin:5px 0;" />';
|
|
77
|
+
}
|
|
78
78
|
V8.Result = html;
|
|
79
79
|
```
|
|
80
80
|
|
|
@@ -84,15 +84,15 @@ V8.Result = html;
|
|
|
84
84
|
var html = '';
|
|
85
85
|
var fileServer = V8.SysConfig.FileServer;
|
|
86
86
|
if (!V8.IsNull(V8.Form.TupianMS) && V8.Form.TupianMS.indexOf('[') !== -1) {
|
|
87
|
-
var imgs = JSON.parse(V8.Form.TupianMS);
|
|
88
|
-
imgs.forEach(function(item) {
|
|
89
|
-
var url = escapeHtml(fileServer + item.Path);
|
|
90
|
-
html += '<a href="' + url + '" target="_blank" rel="noopener noreferrer">'
|
|
91
|
-
+ '<img src="' + url + '" alt="图片" '
|
|
92
|
-
+ 'style="width:40px;height:40px;object-fit:cover;margin:5px 5px 5px 0;" />'
|
|
93
|
-
+ '</a>';
|
|
94
|
-
});
|
|
95
|
-
}
|
|
87
|
+
var imgs = JSON.parse(V8.Form.TupianMS);
|
|
88
|
+
imgs.forEach(function(item) {
|
|
89
|
+
var url = escapeHtml(fileServer + item.Path);
|
|
90
|
+
html += '<a href="' + url + '" target="_blank" rel="noopener noreferrer">'
|
|
91
|
+
+ '<img src="' + url + '" alt="图片" '
|
|
92
|
+
+ 'style="width:40px;height:40px;object-fit:cover;margin:5px 5px 5px 0;" />'
|
|
93
|
+
+ '</a>';
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
96
|
V8.Result = html;
|
|
97
97
|
```
|
|
98
98
|
|
|
@@ -111,27 +111,27 @@ V8.Result =
|
|
|
111
111
|
+ '</div>';
|
|
112
112
|
```
|
|
113
113
|
|
|
114
|
-
## 多字段合并显示
|
|
114
|
+
## 多字段合并显示
|
|
115
115
|
|
|
116
116
|
```javascript
|
|
117
117
|
// 联系人姓名 + 电话脱敏
|
|
118
118
|
var name = V8.Form.LianxiR || '';
|
|
119
119
|
var phone = V8.Form.LianxiPhone || '';
|
|
120
120
|
if (phone.length === 11) phone = phone.substring(0, 3) + '****' + phone.substring(7);
|
|
121
|
-
V8.Result = '<div><b>' + escapeHtml(name) + '</b><br/><small style="color:#999;">'
|
|
122
|
-
+ escapeHtml(phone) + '</small></div>';
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
模块引擎已有更轻量的声明式方案:`ViewSchema.Layout.List.Columns` 可用 `Field + Lines +
|
|
126
|
-
TrailingFields` 组成多行列,`Layout.Card` 可配置移动端顶部、右侧、正文、元信息和底部字段。
|
|
127
|
-
仅需要多字段排版、图标、`Tone/Color/Prefix/Suffix` 时优先使用声明式配置;需要复杂条件
|
|
128
|
-
HTML 时再给被引用的 `diy_field` 配置 `V8TmpEngineTable`。两种方式都会复用净化后的模板
|
|
129
|
-
结果,且所有引用字段仍必须在模块查询列或 `_SelectFields` 中。
|
|
121
|
+
V8.Result = '<div><b>' + escapeHtml(name) + '</b><br/><small style="color:#999;">'
|
|
122
|
+
+ escapeHtml(phone) + '</small></div>';
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
模块引擎已有更轻量的声明式方案:`ViewSchema.Layout.List.Columns` 可用 `Field + Lines +
|
|
126
|
+
TrailingFields` 组成多行列,`Layout.Card` 可配置移动端顶部、右侧、正文、元信息和底部字段。
|
|
127
|
+
仅需要多字段排版、图标、`Tone/Color/Prefix/Suffix` 时优先使用声明式配置;需要复杂条件
|
|
128
|
+
HTML 时再给被引用的 `diy_field` 配置 `V8TmpEngineTable`。两种方式都会复用净化后的模板
|
|
129
|
+
结果,且所有引用字段仍必须在模块查询列或 `_SelectFields` 中。
|
|
130
130
|
|
|
131
131
|
## 条件性图标
|
|
132
132
|
|
|
133
133
|
```javascript
|
|
134
|
-
var html = escapeHtml(V8.Form.Title || '');
|
|
134
|
+
var html = escapeHtml(V8.Form.Title || '');
|
|
135
135
|
if (V8.Form.IsHot === 1) html += ' <i class="fas fa-fire" style="color:#F56C6C;"></i>';
|
|
136
136
|
if (V8.Form.IsNew === 1) html += ' <span class="badge badge-danger">NEW</span>';
|
|
137
137
|
V8.Result = html;
|
|
@@ -150,11 +150,11 @@ V8.Result = '<span style="color:' + color + ';font-weight:bold;">¥' + total + '
|
|
|
150
150
|
|
|
151
151
|
## 常见错误
|
|
152
152
|
|
|
153
|
-
❌ 不要在模板中调用 `V8.FormEngine`(每行都查 → N+1 性能问题);需要关联数据时在查询列、接口引擎或后端 `DataFilterV8` 预取,只有 `DataFilterV8` 才提供 `V8.CacheData`
|
|
154
|
-
❌ 不要依赖对象/数组的隐式字符串化;`V8.Result` 建议显式输出字符串
|
|
155
|
-
❌ 模板中 `V8.Form` 默认只有【查询列】字段;缺字段就要去模块引擎补查询列
|
|
156
|
-
❌ 不要在模板里写复杂业务逻辑(应放到接口引擎或 DataFilterV8)
|
|
157
|
-
❌ 不要输出 `onclick/onerror`、`script/iframe` 或 `javascript:` URL;DOMPurify 会剥离这些内容
|
|
153
|
+
❌ 不要在模板中调用 `V8.FormEngine`(每行都查 → N+1 性能问题);需要关联数据时在查询列、接口引擎或后端 `DataFilterV8` 预取,只有 `DataFilterV8` 才提供 `V8.CacheData`
|
|
154
|
+
❌ 不要依赖对象/数组的隐式字符串化;`V8.Result` 建议显式输出字符串
|
|
155
|
+
❌ 模板中 `V8.Form` 默认只有【查询列】字段;缺字段就要去模块引擎补查询列
|
|
156
|
+
❌ 不要在模板里写复杂业务逻辑(应放到接口引擎或 DataFilterV8)
|
|
157
|
+
❌ 不要输出 `onclick/onerror`、`script/iframe` 或 `javascript:` URL;DOMPurify 会剥离这些内容
|
|
158
158
|
|
|
159
159
|
## 与 DataFilterV8 的区别
|
|
160
160
|
|
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: v8-utilities
|
|
3
|
-
description: Microi V8 全局对象、上下文变量和通用函数索引。用于查询某个 V8 函数是否存在、区分前端与后端 API,或使用 V8.Method、Base64、EncryptHelper、V8.WeChat、Action、CurrentUser、SysConfig、OsClient、扫码和客户端导航工具。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
7
|
-
|
|
8
|
-
# Microi V8 通用能力与函数索引
|
|
9
|
-
|
|
10
|
-
本 Skill 是 V8 能力的路由入口,不替代 CRUD、HTTP、缓存、文件、图片、Office、
|
|
11
|
-
工作流等专项 Skill。遇到“吾码有没有某个函数”“这个 API 在前端还是后端”
|
|
12
|
-
或官网函数列表同步任务时,先在这里确定运行端和正式名称,再读取专项 Skill。
|
|
13
|
-
|
|
14
|
-
## 先判断运行端
|
|
15
|
-
|
|
16
|
-
| 运行端 | 典型位置 | API 特征 |
|
|
17
|
-
|---|---|---|
|
|
18
|
-
| 前端 | 字段事件、按钮、列表、InFormV8、SubmitFormV8、OutFormV8 | 浏览器 Promise/回调、弹窗、路由、`V8.Print`、扫码 |
|
|
19
|
-
| 后端 | 接口引擎、SubmitBeforeServerV8、SubmitAfterServerV8、DataFilterV8 | `V8.Db`、事务、缓存、Office、加密、服务端 HTTP |
|
|
20
|
-
|
|
21
|
-
同名对象不保证两端方法一致。例如前端 `V8.Base64.encode/decode` 与后端
|
|
22
|
-
`V8.Base64.StringToBase64/Base64ToString` 不同;前端标准运行时没有公开
|
|
23
|
-
`V8.ModuleEngine`,后端才有模块引擎对象。
|
|
24
|
-
|
|
25
|
-
## 必读索引
|
|
26
|
-
|
|
27
|
-
- 前端全部上下文、表单/列表、导航、网络、引擎和工具:
|
|
28
|
-
`references/client-api-index.md`
|
|
29
|
-
- 后端上下文、`V8.Method`、Base64、加密、异步与扩展对象:
|
|
30
|
-
`references/server-api-index.md`
|
|
31
|
-
- 平台 HTTP 路由、动态路由与管理接口边界:
|
|
32
|
-
`references/platform-http-routes.md`
|
|
33
|
-
- 蓝牙标签/小票打印:
|
|
34
|
-
`../v8-frontend-events/references/bluetooth-print.md`
|
|
35
|
-
|
|
36
|
-
若函数未出现在上述索引或当前源码定义中,不得按名字猜测。先搜索
|
|
37
|
-
`Microi.Client/src/views/form-engine/diy-components/v8-api-definitions.js`、
|
|
38
|
-
`v8-api-server-definitions.js`、V8 宿主接口和官网中文函数列表。
|
|
39
|
-
|
|
40
|
-
邮箱相关能力读取 [email-engine](../email-engine/SKILL.md):`V8.Email` 包含
|
|
41
|
-
`ProtectCredential / TestConnection / ListFolders / Fetch / Inspect / GetMessage /
|
|
42
|
-
GetAttachment / SetFlags / Move / Send / StoreSent`。
|
|
43
|
-
业务使用 `mci-email` 接口引擎,MCP 使用 `microi_email_query / microi_email_manage / microi_email_send`。
|
|
44
|
-
|
|
45
|
-
## 常用通用写法
|
|
46
|
-
|
|
47
|
-
```javascript
|
|
48
|
-
// 两端通用的租户/用户上下文,具体字段按当前上下文判空
|
|
49
|
-
var osClient = V8.OsClient;
|
|
50
|
-
var userId = V8.CurrentUser && V8.CurrentUser.Id;
|
|
51
|
-
|
|
52
|
-
// 后端稳定标识与时间
|
|
53
|
-
var id = V8.Method.NewUlid();
|
|
54
|
-
var now = DateNow('yyyy-MM-dd HH:mm:ss');
|
|
55
|
-
var timestamp = V8.Method.GetTimestamp();
|
|
56
|
-
|
|
57
|
-
// 后端 Base64
|
|
58
|
-
var encoded = V8.Base64.StringToBase64('吾码');
|
|
59
|
-
var decoded = V8.Base64.Base64ToString(encoded);
|
|
60
|
-
|
|
61
|
-
// 前端 Base64
|
|
62
|
-
var clientEncoded = V8.Base64.encode('吾码');
|
|
63
|
-
var clientDecoded = V8.Base64.decode(clientEncoded);
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## 能力选择
|
|
67
|
-
|
|
68
|
-
- 日期基础函数由新版后端运行时自举,不能要求租户先配置 DateNow 才能安装应用。全局函数管理使用系统设置子表 `mci_global_function`,按 `SysConfigId + Runtime(Client/Server) + FunctionName` 隔离,一行一个同名 function 声明;用 `V8.Method.ValidateGlobalFunction` 只解析验证,不执行源码。
|
|
69
|
-
- 原有前后端全局 V8 必须保留,合并顺序为内置日期、函数库、租户原有代码;同名原有函数优先。不得用官方全局脚本整段覆盖客户脚本。函数库种子 `InsertIfMissing`,不得升级覆盖客户已改源码。
|
|
70
|
-
- 列表和合并代码走 L1/Redis,表单引擎真实提交后更新租户版本并通知其它节点;回滚不变更版本。禁止通过直接 SQL 修改函数库规避失效。前端已打开页面需要刷新。
|
|
71
|
-
|
|
72
|
-
| 需求 | 专项 Skill |
|
|
73
|
-
|---|---|
|
|
74
|
-
| 表单 CRUD、`_Where` | `v8-crud-api`、`v8-sql-query` |
|
|
75
|
-
| HTTP/第三方接口 | `v8-http-integration` |
|
|
76
|
-
| TCP 原始字节/网络小票机/设备 | `v8-tcp-integration` |
|
|
77
|
-
| Redis/Hash | `v8-cache-pattern` |
|
|
78
|
-
| 文件/HDFS | `v8-file-upload` |
|
|
79
|
-
| 图片 | `v8-image-processing` |
|
|
80
|
-
| Excel/Word/PPT/邮件 | `v8-export-import` |
|
|
81
|
-
| 微信支付签名、授权头、API v3 AES-GCM 解密 | `references/server-api-index.md`;安全边界见 `v8-security` |
|
|
82
|
-
| 前端事件/打印/扫码 | `v8-frontend-events` |
|
|
83
|
-
| 后端表单事件 | `v8-table-event` |
|
|
84
|
-
| 接口配置/流式响应/异步/后台任务 | `v8-api-config` |
|
|
85
|
-
|
|
86
|
-
## 不可越过的边界
|
|
87
|
-
|
|
88
|
-
- 平台能力优先使用 `V8.*`,不要假设全局 `System` 可访问任意 CLR 类型。
|
|
89
|
-
- `V8.SysConfig`、`V8.OsClientModel`、`V8.ClientModel` 可能含连接串、密钥和供应商配置,不直接返回前端或写日志。
|
|
90
|
-
- 摘要算法不是密码存储。新密码不使用 MD5/SHA1/SHA256 直接保存。
|
|
91
|
-
- `setTimeout`、`Task.Run` 不能承担请求返回后的可靠后台执行。
|
|
92
|
-
- 前端值只可用于交互;权限、事务和最终业务校验必须在可信后端执行。
|
|
1
|
+
---
|
|
2
|
+
name: v8-utilities
|
|
3
|
+
description: Microi V8 全局对象、上下文变量和通用函数索引。用于查询某个 V8 函数是否存在、区分前端与后端 API,或使用 V8.Method、Base64、EncryptHelper、V8.WeChat、Action、CurrentUser、SysConfig、OsClient、扫码和客户端导航工具。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
7
|
+
|
|
8
|
+
# Microi V8 通用能力与函数索引
|
|
9
|
+
|
|
10
|
+
本 Skill 是 V8 能力的路由入口,不替代 CRUD、HTTP、缓存、文件、图片、Office、
|
|
11
|
+
工作流等专项 Skill。遇到“吾码有没有某个函数”“这个 API 在前端还是后端”
|
|
12
|
+
或官网函数列表同步任务时,先在这里确定运行端和正式名称,再读取专项 Skill。
|
|
13
|
+
|
|
14
|
+
## 先判断运行端
|
|
15
|
+
|
|
16
|
+
| 运行端 | 典型位置 | API 特征 |
|
|
17
|
+
|---|---|---|
|
|
18
|
+
| 前端 | 字段事件、按钮、列表、InFormV8、SubmitFormV8、OutFormV8 | 浏览器 Promise/回调、弹窗、路由、`V8.Print`、扫码 |
|
|
19
|
+
| 后端 | 接口引擎、SubmitBeforeServerV8、SubmitAfterServerV8、DataFilterV8 | `V8.Db`、事务、缓存、Office、加密、服务端 HTTP |
|
|
20
|
+
|
|
21
|
+
同名对象不保证两端方法一致。例如前端 `V8.Base64.encode/decode` 与后端
|
|
22
|
+
`V8.Base64.StringToBase64/Base64ToString` 不同;前端标准运行时没有公开
|
|
23
|
+
`V8.ModuleEngine`,后端才有模块引擎对象。
|
|
24
|
+
|
|
25
|
+
## 必读索引
|
|
26
|
+
|
|
27
|
+
- 前端全部上下文、表单/列表、导航、网络、引擎和工具:
|
|
28
|
+
`references/client-api-index.md`
|
|
29
|
+
- 后端上下文、`V8.Method`、Base64、加密、异步与扩展对象:
|
|
30
|
+
`references/server-api-index.md`
|
|
31
|
+
- 平台 HTTP 路由、动态路由与管理接口边界:
|
|
32
|
+
`references/platform-http-routes.md`
|
|
33
|
+
- 蓝牙标签/小票打印:
|
|
34
|
+
`../v8-frontend-events/references/bluetooth-print.md`
|
|
35
|
+
|
|
36
|
+
若函数未出现在上述索引或当前源码定义中,不得按名字猜测。先搜索
|
|
37
|
+
`Microi.Client/src/views/form-engine/diy-components/v8-api-definitions.js`、
|
|
38
|
+
`v8-api-server-definitions.js`、V8 宿主接口和官网中文函数列表。
|
|
39
|
+
|
|
40
|
+
邮箱相关能力读取 [email-engine](../email-engine/SKILL.md):`V8.Email` 包含
|
|
41
|
+
`ProtectCredential / TestConnection / ListFolders / Fetch / Inspect / GetMessage /
|
|
42
|
+
GetAttachment / SetFlags / Move / Send / StoreSent`。
|
|
43
|
+
业务使用 `mci-email` 接口引擎,MCP 使用 `microi_email_query / microi_email_manage / microi_email_send`。
|
|
44
|
+
|
|
45
|
+
## 常用通用写法
|
|
46
|
+
|
|
47
|
+
```javascript
|
|
48
|
+
// 两端通用的租户/用户上下文,具体字段按当前上下文判空
|
|
49
|
+
var osClient = V8.OsClient;
|
|
50
|
+
var userId = V8.CurrentUser && V8.CurrentUser.Id;
|
|
51
|
+
|
|
52
|
+
// 后端稳定标识与时间
|
|
53
|
+
var id = V8.Method.NewUlid();
|
|
54
|
+
var now = DateNow('yyyy-MM-dd HH:mm:ss');
|
|
55
|
+
var timestamp = V8.Method.GetTimestamp();
|
|
56
|
+
|
|
57
|
+
// 后端 Base64
|
|
58
|
+
var encoded = V8.Base64.StringToBase64('吾码');
|
|
59
|
+
var decoded = V8.Base64.Base64ToString(encoded);
|
|
60
|
+
|
|
61
|
+
// 前端 Base64
|
|
62
|
+
var clientEncoded = V8.Base64.encode('吾码');
|
|
63
|
+
var clientDecoded = V8.Base64.decode(clientEncoded);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 能力选择
|
|
67
|
+
|
|
68
|
+
- 日期基础函数由新版后端运行时自举,不能要求租户先配置 DateNow 才能安装应用。全局函数管理使用系统设置子表 `mci_global_function`,按 `SysConfigId + Runtime(Client/Server) + FunctionName` 隔离,一行一个同名 function 声明;用 `V8.Method.ValidateGlobalFunction` 只解析验证,不执行源码。
|
|
69
|
+
- 原有前后端全局 V8 必须保留,合并顺序为内置日期、函数库、租户原有代码;同名原有函数优先。不得用官方全局脚本整段覆盖客户脚本。函数库种子 `InsertIfMissing`,不得升级覆盖客户已改源码。
|
|
70
|
+
- 列表和合并代码走 L1/Redis,表单引擎真实提交后更新租户版本并通知其它节点;回滚不变更版本。禁止通过直接 SQL 修改函数库规避失效。前端已打开页面需要刷新。
|
|
71
|
+
|
|
72
|
+
| 需求 | 专项 Skill |
|
|
73
|
+
|---|---|
|
|
74
|
+
| 表单 CRUD、`_Where` | `v8-crud-api`、`v8-sql-query` |
|
|
75
|
+
| HTTP/第三方接口 | `v8-http-integration` |
|
|
76
|
+
| TCP 原始字节/网络小票机/设备 | `v8-tcp-integration` |
|
|
77
|
+
| Redis/Hash | `v8-cache-pattern` |
|
|
78
|
+
| 文件/HDFS | `v8-file-upload` |
|
|
79
|
+
| 图片 | `v8-image-processing` |
|
|
80
|
+
| Excel/Word/PPT/邮件 | `v8-export-import` |
|
|
81
|
+
| 微信支付签名、授权头、API v3 AES-GCM 解密 | `references/server-api-index.md`;安全边界见 `v8-security` |
|
|
82
|
+
| 前端事件/打印/扫码 | `v8-frontend-events` |
|
|
83
|
+
| 后端表单事件 | `v8-table-event` |
|
|
84
|
+
| 接口配置/流式响应/异步/后台任务 | `v8-api-config` |
|
|
85
|
+
|
|
86
|
+
## 不可越过的边界
|
|
87
|
+
|
|
88
|
+
- 平台能力优先使用 `V8.*`,不要假设全局 `System` 可访问任意 CLR 类型。
|
|
89
|
+
- `V8.SysConfig`、`V8.OsClientModel`、`V8.ClientModel` 可能含连接串、密钥和供应商配置,不直接返回前端或写日志。
|
|
90
|
+
- 摘要算法不是密码存储。新密码不使用 MD5/SHA1/SHA256 直接保存。
|
|
91
|
+
- `setTimeout`、`Task.Run` 不能承担请求返回后的可靠后台执行。
|
|
92
|
+
- 前端值只可用于交互;权限、事务和最终业务校验必须在可信后端执行。
|