@microi.net/cli 5.8.5 → 5.8.6
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/LICENSE +21 -21
- package/README.md +71 -71
- package/assets/build-meta.json +6 -6
- package/assets/feature-matrix.json +138 -138
- package/assets/logo.svg +4 -4
- 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-cli.js +66 -65
- package/scripts/microi-codex-broker.js +450 -450
- package/scripts/microi-codex-router.js +618 -618
- package/scripts/microi-skills.meta.json +384 -384
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +3566 -3566
- package/skills/README.md +287 -287
- package/skills/ai-engine/SKILL.md +269 -265
- package/skills/ai-engine/agents/openai.yaml +4 -4
- package/skills/ai-engine/references/ai-employees.md +48 -48
- package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
- 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 +525 -525
- package/skills/app-store/agents/openai.yaml +4 -4
- package/skills/business-blueprint/SKILL.md +193 -193
- package/skills/datasource-engine/SKILL.md +93 -93
- package/skills/datasource-engine/agents/openai.yaml +4 -4
- package/skills/dos-orm/SKILL.md +97 -97
- package/skills/dos-orm/references/api-reference.md +229 -229
- package/skills/email-engine/SKILL.md +81 -81
- package/skills/email-engine/references/v8-email.md +34 -34
- package/skills/job-engine/SKILL.md +176 -176
- package/skills/job-engine/agents/openai.yaml +4 -4
- package/skills/message-notification/SKILL.md +156 -156
- package/skills/message-notification/agents/openai.yaml +5 -5
- package/skills/message-notification/references/contracts.md +102 -102
- package/skills/microi/SKILL.md +14 -14
- package/skills/microi-ai-app-auth.js +652 -652
- package/skills/microi-ai-application/SKILL.md +115 -115
- 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 +244 -244
- package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +144 -144
- 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 +196 -196
- 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 +167 -167
- package/skills/microi-codex/SKILL.md +102 -102
- package/skills/microi-codex-installer/SKILL.md +231 -231
- package/skills/microi-codex-installer/agents/openai.yaml +7 -7
- package/skills/microi-datasource-mapping/SKILL.md +122 -122
- package/skills/microi-db-schema/SKILL.md +175 -175
- package/skills/microi-db-schema/agents/openai.yaml +4 -4
- package/skills/microi-db-schema/references/core-tables.md +695 -695
- package/skills/microi-db-schema/references/form-component-options.md +256 -256
- package/skills/microi-db-schema/references/schema-overview.md +202 -202
- package/skills/microi-db-schema/references/schema.md +646 -646
- package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
- package/skills/microi-deployment/SKILL.md +221 -221
- package/skills/microi-deployment/references/deployment-matrix.md +109 -109
- package/skills/microi-docs-coverage/SKILL.md +133 -133
- package/skills/microi-docs-coverage/references/capability-map.md +91 -91
- package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
- package/skills/microi-form-engine/SKILL.md +333 -333
- 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 +205 -205
- 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 +194 -194
- 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 +176 -176
- package/skills/microi-left-right-layout/SKILL.md +141 -141
- package/skills/microi-microservice/SKILL.md +326 -324
- package/skills/microi-microservice/references/runtime-delivery.md +278 -278
- package/skills/microi-mobile-app-quality/SKILL.md +185 -185
- 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-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 +128 -128
- 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 +92 -92
- 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/SKILL.md +137 -137
- package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +193 -193
- 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 +217 -217
- package/skills/microi-ui/SKILL.md +192 -192
- package/skills/microi-ui/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/234/272/346/231/257/350/223/235/345/233/276.md +183 -183
- package/skills/microi-uniapp-frontend/SKILL.md +193 -193
- package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +225 -225
- package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +154 -154
- package/skills/microi.v8.js +1921 -1921
- package/skills/module-engine/SKILL.md +255 -255
- package/skills/module-engine/references/module-config.md +204 -204
- package/skills/ocr-engine/SKILL.md +113 -113
- package/skills/ocr-engine/agents/openai.yaml +4 -4
- package/skills/page-engine/SKILL.md +206 -206
- package/skills/page-engine/examples/compact-dashboard.json +1444 -1444
- package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +234 -234
- package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +60 -60
- package/skills/performance-testing/SKILL.md +221 -221
- package/skills/playwright-e2e/SKILL.md +196 -196
- package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +173 -173
- package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +183 -183
- package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
- package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
- package/skills/print-engine/SKILL.md +259 -259
- package/skills/production-readonly-audit/SKILL.md +41 -41
- package/skills/report-engine/SKILL.md +71 -71
- package/skills/report-engine/agents/openai.yaml +4 -4
- package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
- package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
- package/skills/scripts/sync-embedded-skills.mjs +46 -46
- package/skills/scripts/validate-progressive-disclosure.mjs +57 -57
- package/skills/search-engine/SKILL.md +75 -75
- package/skills/search-engine/agents/openai.yaml +4 -4
- package/skills/spider-engine/SKILL.md +190 -190
- package/skills/system-observability/SKILL.md +248 -248
- package/skills/system-observability/references/memory-incident-triage.md +77 -77
- package/skills/translate-engine/SKILL.md +140 -140
- package/skills/translate-engine/agents/openai.yaml +4 -4
- package/skills/ui-design/SKILL.md +223 -223
- package/skills/ui-design/assets/pattern-showcase/app.js +54 -54
- package/skills/ui-design/assets/pattern-showcase/index.html +163 -163
- package/skills/ui-design/assets/pattern-showcase/styles.css +311 -311
- package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
- package/skills/ui-design/references/design-pattern-library.md +184 -184
- package/skills/ui-design/references/mci-design-contract.md +163 -163
- package/skills/ui-design/references/motion-and-media.md +78 -78
- package/skills/ui-design/references/product-flow-recipes.md +94 -94
- package/skills/ui-design/references/progressive-01-/351/242/234/350/211/262/344/275/223/347/263/273-css-variables-/346/224/257/346/214/201/344/270/273/351/242/230/345/210/207/346/215/242.md +218 -218
- package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +164 -164
- package/skills/ui-design/references/progressive-03-/345/212/250/346/225/210/350/247/204/350/214/203-/344/270/260/345/257/214/344/275/206/344/270/215/345/215/241.md +235 -235
- package/skills/ui-design/references/progressive-04-/347/273/204/344/273/266/351/243/216/346/240/274/351/200/237/346/237/245.md +152 -152
- package/skills/ui-design/references/progressive-05-/347/247/273/345/212/250/347/253/257/344/270/223/347/224/250/350/247/204/350/214/203.md +238 -238
- package/skills/ui-design/references/progressive-06-/344/270/273/351/242/230/345/210/207/346/215/242/345/256/236/347/216/260.md +194 -194
- package/skills/ui-design/references/progressive-07-/351/200/237/346/237/245-/344/273/216/345/244/264/346/220/255/345/273/272/344/270/200/344/270/252/347/247/273/345/212/250/347/253/257/351/241/265/351/235/242.md +207 -207
- package/skills/ui-design/references/progressive-08-/350/241/250/345/215/225/345/210/206/347/273/204/350/247/204/350/214/203-tabs-vs-collapsegroup-/345/274/272/345/210/266.md +142 -142
- package/skills/uniapp-mall-assets/SKILL.md +176 -176
- package/skills/unity-integration/SKILL.md +171 -171
- package/skills/unity-integration/agents/openai.yaml +4 -4
- package/skills/unity-integration/references/ai-app-delivery.md +119 -119
- 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 +388 -388
- package/skills/v8-cache-pattern/SKILL.md +312 -312
- package/skills/v8-crud-api/SKILL.md +178 -178
- package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +226 -226
- package/skills/v8-crud-api/references/progressive-02-where-/346/235/241/344/273/266/350/257/255/346/263/225/351/200/237/346/237/245.md +49 -49
- package/skills/v8-debugging/SKILL.md +284 -284
- package/skills/v8-explorer-tree/SKILL.md +228 -228
- package/skills/v8-export-import/SKILL.md +219 -219
- package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +211 -211
- package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
- package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +42 -42
- package/skills/v8-file-upload/SKILL.md +284 -284
- 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 +263 -263
- 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 +161 -161
- package/skills/v8-formengine-http/SKILL.md +238 -238
- package/skills/v8-frontend-events/SKILL.md +180 -180
- package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
- package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
- package/skills/v8-http-integration/SKILL.md +182 -182
- package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
- package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +44 -44
- 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 +186 -186
- package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +222 -222
- 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 +104 -104
- package/skills/v8-mongodb/SKILL.md +200 -200
- package/skills/v8-mq-mqtt/SKILL.md +176 -176
- 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 +181 -181
- package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
- package/skills/v8-saas-multi-tenant/SKILL.md +305 -305
- package/skills/v8-security/SKILL.md +210 -210
- package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +200 -200
- package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +160 -160
- package/skills/v8-sql-query/SKILL.md +302 -302
- package/skills/v8-table-event/SKILL.md +176 -176
- package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +216 -216
- package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +46 -46
- package/skills/v8-tcp-integration/SKILL.md +147 -147
- package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
- package/skills/v8-template-engine/SKILL.md +167 -167
- package/skills/v8-utilities/SKILL.md +104 -104
- 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 +188 -188
- package/skills/v8-workflow/SKILL.md +252 -252
- package/skills/v8-workflow/references/progressive-01-/350/212/202/347/202/271/345/274/200/345/247/213-v8-/344/272/213/344/273/266.md +180 -180
- package/skills/v8-workflow/references/workflow-configuration.md +49 -49
- package/skills/vision-engine/SKILL.md +160 -160
- package/skills/vision-engine/agents/openai.yaml +4 -4
- package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
- package/skills/workspace-conventions/SKILL.md +273 -273
- 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 +209 -209
- 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 +217 -217
- package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +27 -27
|
@@ -1,178 +1,178 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: v8-crud-api
|
|
3
|
-
description: Microi V8 CRUD 接口引擎开发。用于编写服务端 JavaScript,涉及 V8.FormEngine Add/Upt/Del/GetTableData、DosResult 返回、事务和校验。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
> **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
|
|
7
|
-
|
|
8
|
-
# Microi V8 CRUD API 接口引擎开发
|
|
9
|
-
|
|
10
|
-
你正在开发 Microi 吾码平台的 V8 接口引擎。接口引擎是运行在服务端的 JavaScript 函数,通过 `V8.FormEngine` 操作数据库,通过 `V8.Result` 或 `return` 返回结果。
|
|
11
|
-
|
|
12
|
-
<!-- microi-progressive:begin -->
|
|
13
|
-
<!-- microi-progressive:chunk id=v8-crud-api-000 sha256=522eba2beee1f0b0df087fe86f1ff70bc74b8e9f68a844a5bea1471389a0df22 -->
|
|
14
|
-
## 本地优先与版本头(必做)
|
|
15
|
-
|
|
16
|
-
AI 本地开发接口引擎时,优先修改 `microi-v8-engine/<租户>/<项目>/接口引擎/.../*.js` 本地文件,再通过 MCP 或 VS Code 插件同步到数据库。插件提示“本地和远端不一致”时,必须先读取本地与远端代码并合并有效差异,不能盲目用任一侧覆盖另一侧。
|
|
17
|
-
|
|
18
|
-
每一次修改、上传、推送接口引擎代码,都必须维护文件顶部版本区域。版本号从 `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
|
-
|
|
20
|
-
```javascript
|
|
21
|
-
/*
|
|
22
|
-
* V8 ApiEngine
|
|
23
|
-
* ApiEngineKey: 示例接口引擎Key
|
|
24
|
-
* Version: v1.0.0
|
|
25
|
-
* 功能说明:
|
|
26
|
-
* - 完整说明该接口引擎负责的业务功能、输入参数、关键返回字段和重要副作用。
|
|
27
|
-
*/
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
同步流程:`确认后端可达(不可达则自动启动 Microi.Server/Microi.net.Api/Microi.net.Api.csproj) -> 读取远端 -> 修改本地并递增语义版本头 -> JS 语法检查 -> 保存远端 -> 回读远端确认代码头 Version 与 sys_apiengine.Version 一致 -> 用 HTTP /apiengine/{key} + osclient Header 复测`。只用 MCP 保存成功不算完成,必须至少做回读或 HTTP 验证。普通 POST/PUT/PATCH/DELETE 禁止无脑追加 `--OsClient--...--`;该特殊路径仅保留给确实无法传 Header/Form/Query 的 GET/HEAD 或第三方回调场景。
|
|
31
|
-
|
|
32
|
-
如果保存或回读时出现 `fetch failed`、`ECONNREFUSED`、`000 Failed to connect`、端口无人监听等服务不可达问题,不能提前中止。需要启动或重启本地 API 时,必须在 `Microi.Server/Microi.net.Api` 目录通过 VS Code 可见终端执行 `dotnet run --launch-profile Microi.net.Api`,让开发者能肉眼看到并手动停止;不要用隐藏后台 shell 启动长期占用端口的 API 进程。若工具当前无法打开可见终端,应先说明限制并让用户启动/重启后继续验证。涉及 PC 页面联调或 Playwright 时,`Microi.Client` 也必须使用可见终端执行:`npm run dev -- --host 0.0.0.0 --port 1988`。只有启动失败、依赖缺失、数据库连接失败或端口冲突无法处理时才报告阻塞。
|
|
33
|
-
|
|
34
|
-
Microi.net.Api 普通本地启动不要额外设置 `ASPNETCORE_ENVIRONMENT` / `DOTNET_ENVIRONMENT`,让 `Program.cs` 读取 `Microi.Server/Microi.net.Api/.microi-local` 并加载对应的 `appsettings.{Env}.json`。
|
|
35
|
-
|
|
36
|
-
版本与历史同步规则:通过 MCP 或 VS Code 插件保存接口引擎时,必须同步写入 `sys_apiengine.Version`;新版平台把每次修改说明作为独立记录写入 `mci_apiengine_change_history`,表单中的“修改历史”使用 `TableChild` 展示,不再让客户端拼接或覆盖 `sys_apiengine.ChangeHistory` 多行文本。写入必须携带版本号与简明说明,并使用幂等 `EntryKey` 防止网络重试产生重复记录。安装/升级表单引擎官方应用时,旧 `ChangeHistory` 按非空行迁入子表并保留旧物理列作滚动兼容;尚未安装该子表、旧库缺字段或迁移期间,后端应自动回退旧字段或仅更新 `ApiV8Code` 与 `UpdateTime`,不得因此阻断代码同步。
|
|
37
|
-
|
|
38
|
-
生成接口引擎代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;跨表事务、权限校验、状态机、金额/库存计算、复杂 `_Where` 条件等代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。
|
|
39
|
-
|
|
40
|
-
<!-- /microi-progressive:chunk -->
|
|
41
|
-
<!-- microi-progressive:chunk id=v8-crud-api-001 sha256=d0bed55dcaa08fd84319107269643dd5aba5aadecf4f394c8ac55d80ab959677 -->
|
|
42
|
-
## 核心规则
|
|
43
|
-
|
|
44
|
-
- 接口引擎文件是纯 JavaScript(Jint 引擎,非 Node.js)
|
|
45
|
-
- 全局对象 `V8` 是所有后端能力的入口
|
|
46
|
-
- 通过 `V8.Param` 获取前端传入的参数(URL参数 / form-data / payload-json)
|
|
47
|
-
- 严格业务字段白名单先逐项排除本入口支持的宿主传输字段:固定 `ApiEngineKey / ApiAddress`、调用类型、设备和 HTTP 请求元数据;不得把整个下划线前缀视为安全字段,不解析 `_RawBody` 重写动作,也不从传输字段取授权。历史调试器的 `TestParam1` 仅兼容 null/undefined、最多 200 字符的字符串、有限数字或布尔值并立即丢弃;对象、数组、超长值和其它未知字段继续拒绝。真实 HTTP 与内部调用都须验收,普通岗位无初始化配置副作用,权限继续读取权威当前用户与目标租户。
|
|
48
|
-
- `V8.Param` 中嵌套 JSON 的 `JObject/JArray` 可能是 Jint 宿主对象,`Array.isArray` 不一定成立。需要严格数组、布尔或结构校验时,在业务入口对有界业务参数使用 `JSON.parse(JSON.stringify(V8.Param || {}))` 转为纯 JSON,再执行原字段白名单、类型、大小与权限校验;不能把只有 `length` 的对象当数组。只规范化业务参数,不复制或信任客户端身份、`V8.CurrentUser`、`V8.DbTrans` 或 `V8.WF`;大文件继续使用专用文件通道。验收须同时覆盖真实 HTTP 宿主集合和离线 JavaScript 数组。
|
|
49
|
-
- 通过 `V8.CurrentUser` 获取当前登录用户信息
|
|
50
|
-
- 高精度 `decimal(p,s)` / 带小数位 `number(p,s)` 的金额、数量、换算率使用无分组、英文小数点的十进制字符串,避免先 `Number()` / `parseFloat()` 或浮点运算丢位。后端使用固定文化解析,拒绝逗号分组、本地化逗号小数、指数、非数字和越界;业务层仍须按字段约束精度、小数位、范围和权限。空值兼容不变,不能从舍入后的历史值重建精度或擅自回填。用真实 HTTP、数据库写后读与目标租户验收,不能把 CLR 参数绑定冒充数据库成功。
|
|
51
|
-
- 返回结果统一格式:`{ Code: 1, Data: any, Msg: '成功' }`
|
|
52
|
-
- 所有 FormEngine 方法在服务器端支持第三个参数传入 `V8.DbTrans`(事务对象)
|
|
53
|
-
- 服务端调用 FormEngine 默认**不触发**表单 V8 事件,加 `_InvokeType: 'Client'` 才触发
|
|
54
|
-
- 接口内 `return Code=1` 自动提交事务、`Code≠1` 自动回滚事务,**禁止**手动 Commit/Rollback
|
|
55
|
-
|
|
56
|
-
<!-- /microi-progressive:chunk -->
|
|
57
|
-
<!-- microi-progressive:chunk id=v8-crud-api-002 sha256=8a2aee7581fd589e15b219f2f79fdb442cb29adba667fc76e1e2e7a1f3bb1b43 -->
|
|
58
|
-
## 性能底线(必须自检)
|
|
59
|
-
|
|
60
|
-
- 写接口引擎前必须先做数据访问计划:需要哪些表、哪些字段、预计数据量、是否分页、是否需要缓存。
|
|
61
|
-
- 禁止在 `for` / `while` / `forEach` / 嵌套循环中反复调用 `GetFormData`、`GetTableData`、`FromSql`、`ApiEngine.Run` 或外部 HTTP。先收集 Id/Key,用一次 `In` 查询或一条 JOIN/聚合 SQL 批量取回,再用对象字典映射。
|
|
62
|
-
- 禁止用双重循环匹配两组列表。先把小表或关联表整理成 `{ id: row }`、`{ parentId: [] }` 这类 Map,再单循环组装结果。
|
|
63
|
-
- 所有列表查询必须设置 `_SelectFields`,只取业务需要的字段;面向前端的列表必须分页或显式限制 `_PageSize`,不能一次拉全表。
|
|
64
|
-
- 报表、统计、跨表汇总优先使用数据库聚合(`COUNT/SUM/GROUP BY/JOIN`)或一次批量查询后内存聚合,不能逐行查明细再累加。
|
|
65
|
-
- 高频读取的系统配置、字典、菜单、字段、角色权限等静态数据要优先使用 `V8.Cache` 或平台已有缓存;写入后必须清理相关缓存。
|
|
66
|
-
- 外部 HTTP、短信、翻译、文件处理等慢操作不要放在数据库事务内循环执行;能批量就批量,不能批量就拆成异步任务/队列。
|
|
67
|
-
- 返回前做一次性能复核:数据库访问次数是否与数据量无关、是否避免 N+1 查询、是否有索引友好的 `_Where` 条件、是否不会因空参数导致全表扫描。
|
|
68
|
-
|
|
69
|
-
### 计量流水与分页审计
|
|
70
|
-
|
|
71
|
-
- Token、积分、余额等计量必须由服务端在真实成功结果后记录,失败请求不得扣减;能够取得供应商 `usage` 时禁止用完整 JSON 字符数代替真实输入/输出 Token。
|
|
72
|
-
- 余额扣减与流水新增必须在同一事务内完成,并锁定当前账户行,避免并发请求透支或出现“余额已扣但流水未写”。
|
|
73
|
-
- 面向个人中心的流水接口必须按 `V8.CurrentUser.Id` 强制隔离,并返回 `PageIndex`、`PageSize`、`TotalCount`;列表只取页面需要的审计字段。
|
|
74
|
-
- 为便于用户核对,可以保存经过空白归一化的用户输入短摘要;摘要按 Unicode 文本元素截取,不能截断 emoji 或代理对,也不要把完整请求 JSON 当摘要。
|
|
75
|
-
|
|
76
|
-
<!-- /microi-progressive:chunk -->
|
|
77
|
-
<!-- microi-progressive:chunk id=v8-crud-api-003 sha256=a60257da3c153170b731b125c9b58614fe84030645c343688f70c9d060b0e0eb -->
|
|
78
|
-
## DosResult 状态码
|
|
79
|
-
|
|
80
|
-
| Code | 含义 |
|
|
81
|
-
|------|------|
|
|
82
|
-
| `1` | 成功 |
|
|
83
|
-
| `0` | 业务失败(自动回滚) |
|
|
84
|
-
| `2` | `GetFormData` 数据不存在(特殊值,仍属正常查询)|
|
|
85
|
-
| `1001` | Token 失效 |
|
|
86
|
-
| `1002` | 身份验证失败 |
|
|
87
|
-
|
|
88
|
-
```javascript
|
|
89
|
-
// GetFormData Code=2 的处理
|
|
90
|
-
var r = V8.FormEngine.GetFormData('Order', { Id: V8.Param.id });
|
|
91
|
-
if (r.Code === 2) return { Code: 0, Msg: '订单不存在' };
|
|
92
|
-
if (r.Code !== 1) return r;
|
|
93
|
-
// r.Data 才是真实数据
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
<!-- /microi-progressive:chunk -->
|
|
97
|
-
<!-- microi-progressive:chunk id=v8-crud-api-004 sha256=4efce43d196d67f3b6125747c645477442235b39ecf0ddfca325fb3bd1f444ae -->
|
|
98
|
-
## 全局日期函数
|
|
99
|
-
|
|
100
|
-
```javascript
|
|
101
|
-
DateNow('yyyy-MM-dd HH:mm:ss') // 当前时间字符串
|
|
102
|
-
DateFormat(new Date(), 'yyyy-MM-dd') // 格式化
|
|
103
|
-
DateAdd(new Date(), 'd', 7, 'yyyy-MM-dd') // 加减(s/m/h/d/w/q/M/y)
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
<!-- /microi-progressive:chunk -->
|
|
107
|
-
<!-- microi-progressive:chunk id=v8-crud-api-005 sha256=f3d8f0628ddd51845fc700fe63bfa037480f131484c8238874d380cb05a89a92 -->
|
|
108
|
-
## 查询单条
|
|
109
|
-
|
|
110
|
-
```javascript
|
|
111
|
-
if (!V8.Param.id) {
|
|
112
|
-
return { Code: 0, Msg: 'id 不能为空' };
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
var result = V8.FormEngine.GetFormData('SysUser', {
|
|
116
|
-
_Where: [['Id', '=', V8.Param.id]],
|
|
117
|
-
_SelectFields: ['Id', 'Account', 'Name', 'Phone']
|
|
118
|
-
});
|
|
119
|
-
// 也可以用 Id 直接查:{ Id: 'xxx' }
|
|
120
|
-
|
|
121
|
-
if (result.Code !== 1 || !result.Data) {
|
|
122
|
-
return { Code: 0, Msg: '数据不存在' };
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return { Code: 1, Data: result.Data };
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
<!-- /microi-progressive:chunk -->
|
|
129
|
-
<!-- microi-progressive:chunk id=v8-crud-api-006 sha256=b8ae0ea6ccd746994ea5fa74f4ae4e6163c1ffd09eb141d6fd5863d77d36f35b -->
|
|
130
|
-
## 新增
|
|
131
|
-
|
|
132
|
-
```javascript
|
|
133
|
-
if (!V8.Param.Account || !V8.Param.Name) {
|
|
134
|
-
return { Code: 0, Msg: '账号和姓名不能为空' };
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// 检查唯一性
|
|
138
|
-
var exist = V8.FormEngine.GetFormData('SysUser', {
|
|
139
|
-
_Where: [['Account', '=', V8.Param.Account]]
|
|
140
|
-
});
|
|
141
|
-
if (exist.Code === 1 && exist.Data) {
|
|
142
|
-
return { Code: 0, Msg: '账号已存在' };
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
var result = V8.FormEngine.AddFormData('SysUser', {
|
|
146
|
-
// Id 不传会自动生成 GUID
|
|
147
|
-
Account: V8.Param.Account,
|
|
148
|
-
Name: V8.Param.Name,
|
|
149
|
-
Phone: V8.Param.Phone || '',
|
|
150
|
-
Status: 1
|
|
151
|
-
});
|
|
152
|
-
// result.Data 包含 Id, CreateTime, UserId 等自动生成字段
|
|
153
|
-
|
|
154
|
-
return { Code: result.Code, Data: result.Data, Msg: result.Code === 1 ? '新增成功' : result.Msg };
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### 批量新增
|
|
158
|
-
|
|
159
|
-
```javascript
|
|
160
|
-
var addList = [];
|
|
161
|
-
for (var i = 0; i < V8.Param.items.length; i++) {
|
|
162
|
-
addList.push({
|
|
163
|
-
FormEngineKey: 'SysUser', // 支持不同表混合批量
|
|
164
|
-
Account: V8.Param.items[i].Account,
|
|
165
|
-
Name: V8.Param.items[i].Name
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
var result = V8.FormEngine.AddTableData(addList);
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
<!-- /microi-progressive:chunk -->
|
|
172
|
-
## 详细参考路由(渐进披露)
|
|
173
|
-
|
|
174
|
-
仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
|
|
175
|
-
|
|
176
|
-
- [references/progressive-01-查询列表-分页.md](references/progressive-01-查询列表-分页.md):查询列表(分页);更新;删除;按条件批量操作;事务处理;请求内异步与后台处理;动态加字段(运行时改表结构);旧版 _Where 兼容
|
|
177
|
-
- [references/progressive-02-where-条件语法速查.md](references/progressive-02-where-条件语法速查.md):_Where 条件语法速查;注意事项
|
|
178
|
-
<!-- microi-progressive:end -->
|
|
1
|
+
---
|
|
2
|
+
name: v8-crud-api
|
|
3
|
+
description: Microi V8 CRUD 接口引擎开发。用于编写服务端 JavaScript,涉及 V8.FormEngine Add/Upt/Del/GetTableData、DosResult 返回、事务和校验。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
|
|
7
|
+
|
|
8
|
+
# Microi V8 CRUD API 接口引擎开发
|
|
9
|
+
|
|
10
|
+
你正在开发 Microi 吾码平台的 V8 接口引擎。接口引擎是运行在服务端的 JavaScript 函数,通过 `V8.FormEngine` 操作数据库,通过 `V8.Result` 或 `return` 返回结果。
|
|
11
|
+
|
|
12
|
+
<!-- microi-progressive:begin -->
|
|
13
|
+
<!-- microi-progressive:chunk id=v8-crud-api-000 sha256=522eba2beee1f0b0df087fe86f1ff70bc74b8e9f68a844a5bea1471389a0df22 -->
|
|
14
|
+
## 本地优先与版本头(必做)
|
|
15
|
+
|
|
16
|
+
AI 本地开发接口引擎时,优先修改 `microi-v8-engine/<租户>/<项目>/接口引擎/.../*.js` 本地文件,再通过 MCP 或 VS Code 插件同步到数据库。插件提示“本地和远端不一致”时,必须先读取本地与远端代码并合并有效差异,不能盲目用任一侧覆盖另一侧。
|
|
17
|
+
|
|
18
|
+
每一次修改、上传、推送接口引擎代码,都必须维护文件顶部版本区域。版本号从 `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
|
+
|
|
20
|
+
```javascript
|
|
21
|
+
/*
|
|
22
|
+
* V8 ApiEngine
|
|
23
|
+
* ApiEngineKey: 示例接口引擎Key
|
|
24
|
+
* Version: v1.0.0
|
|
25
|
+
* 功能说明:
|
|
26
|
+
* - 完整说明该接口引擎负责的业务功能、输入参数、关键返回字段和重要副作用。
|
|
27
|
+
*/
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
同步流程:`确认后端可达(不可达则自动启动 Microi.Server/Microi.net.Api/Microi.net.Api.csproj) -> 读取远端 -> 修改本地并递增语义版本头 -> JS 语法检查 -> 保存远端 -> 回读远端确认代码头 Version 与 sys_apiengine.Version 一致 -> 用 HTTP /apiengine/{key} + osclient Header 复测`。只用 MCP 保存成功不算完成,必须至少做回读或 HTTP 验证。普通 POST/PUT/PATCH/DELETE 禁止无脑追加 `--OsClient--...--`;该特殊路径仅保留给确实无法传 Header/Form/Query 的 GET/HEAD 或第三方回调场景。
|
|
31
|
+
|
|
32
|
+
如果保存或回读时出现 `fetch failed`、`ECONNREFUSED`、`000 Failed to connect`、端口无人监听等服务不可达问题,不能提前中止。需要启动或重启本地 API 时,必须在 `Microi.Server/Microi.net.Api` 目录通过 VS Code 可见终端执行 `dotnet run --launch-profile Microi.net.Api`,让开发者能肉眼看到并手动停止;不要用隐藏后台 shell 启动长期占用端口的 API 进程。若工具当前无法打开可见终端,应先说明限制并让用户启动/重启后继续验证。涉及 PC 页面联调或 Playwright 时,`Microi.Client` 也必须使用可见终端执行:`npm run dev -- --host 0.0.0.0 --port 1988`。只有启动失败、依赖缺失、数据库连接失败或端口冲突无法处理时才报告阻塞。
|
|
33
|
+
|
|
34
|
+
Microi.net.Api 普通本地启动不要额外设置 `ASPNETCORE_ENVIRONMENT` / `DOTNET_ENVIRONMENT`,让 `Program.cs` 读取 `Microi.Server/Microi.net.Api/.microi-local` 并加载对应的 `appsettings.{Env}.json`。
|
|
35
|
+
|
|
36
|
+
版本与历史同步规则:通过 MCP 或 VS Code 插件保存接口引擎时,必须同步写入 `sys_apiengine.Version`;新版平台把每次修改说明作为独立记录写入 `mci_apiengine_change_history`,表单中的“修改历史”使用 `TableChild` 展示,不再让客户端拼接或覆盖 `sys_apiengine.ChangeHistory` 多行文本。写入必须携带版本号与简明说明,并使用幂等 `EntryKey` 防止网络重试产生重复记录。安装/升级表单引擎官方应用时,旧 `ChangeHistory` 按非空行迁入子表并保留旧物理列作滚动兼容;尚未安装该子表、旧库缺字段或迁移期间,后端应自动回退旧字段或仅更新 `ApiV8Code` 与 `UpdateTime`,不得因此阻断代码同步。
|
|
37
|
+
|
|
38
|
+
生成接口引擎代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;跨表事务、权限校验、状态机、金额/库存计算、复杂 `_Where` 条件等代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。
|
|
39
|
+
|
|
40
|
+
<!-- /microi-progressive:chunk -->
|
|
41
|
+
<!-- microi-progressive:chunk id=v8-crud-api-001 sha256=d0bed55dcaa08fd84319107269643dd5aba5aadecf4f394c8ac55d80ab959677 -->
|
|
42
|
+
## 核心规则
|
|
43
|
+
|
|
44
|
+
- 接口引擎文件是纯 JavaScript(Jint 引擎,非 Node.js)
|
|
45
|
+
- 全局对象 `V8` 是所有后端能力的入口
|
|
46
|
+
- 通过 `V8.Param` 获取前端传入的参数(URL参数 / form-data / payload-json)
|
|
47
|
+
- 严格业务字段白名单先逐项排除本入口支持的宿主传输字段:固定 `ApiEngineKey / ApiAddress`、调用类型、设备和 HTTP 请求元数据;不得把整个下划线前缀视为安全字段,不解析 `_RawBody` 重写动作,也不从传输字段取授权。历史调试器的 `TestParam1` 仅兼容 null/undefined、最多 200 字符的字符串、有限数字或布尔值并立即丢弃;对象、数组、超长值和其它未知字段继续拒绝。真实 HTTP 与内部调用都须验收,普通岗位无初始化配置副作用,权限继续读取权威当前用户与目标租户。
|
|
48
|
+
- `V8.Param` 中嵌套 JSON 的 `JObject/JArray` 可能是 Jint 宿主对象,`Array.isArray` 不一定成立。需要严格数组、布尔或结构校验时,在业务入口对有界业务参数使用 `JSON.parse(JSON.stringify(V8.Param || {}))` 转为纯 JSON,再执行原字段白名单、类型、大小与权限校验;不能把只有 `length` 的对象当数组。只规范化业务参数,不复制或信任客户端身份、`V8.CurrentUser`、`V8.DbTrans` 或 `V8.WF`;大文件继续使用专用文件通道。验收须同时覆盖真实 HTTP 宿主集合和离线 JavaScript 数组。
|
|
49
|
+
- 通过 `V8.CurrentUser` 获取当前登录用户信息
|
|
50
|
+
- 高精度 `decimal(p,s)` / 带小数位 `number(p,s)` 的金额、数量、换算率使用无分组、英文小数点的十进制字符串,避免先 `Number()` / `parseFloat()` 或浮点运算丢位。后端使用固定文化解析,拒绝逗号分组、本地化逗号小数、指数、非数字和越界;业务层仍须按字段约束精度、小数位、范围和权限。空值兼容不变,不能从舍入后的历史值重建精度或擅自回填。用真实 HTTP、数据库写后读与目标租户验收,不能把 CLR 参数绑定冒充数据库成功。
|
|
51
|
+
- 返回结果统一格式:`{ Code: 1, Data: any, Msg: '成功' }`
|
|
52
|
+
- 所有 FormEngine 方法在服务器端支持第三个参数传入 `V8.DbTrans`(事务对象)
|
|
53
|
+
- 服务端调用 FormEngine 默认**不触发**表单 V8 事件,加 `_InvokeType: 'Client'` 才触发
|
|
54
|
+
- 接口内 `return Code=1` 自动提交事务、`Code≠1` 自动回滚事务,**禁止**手动 Commit/Rollback
|
|
55
|
+
|
|
56
|
+
<!-- /microi-progressive:chunk -->
|
|
57
|
+
<!-- microi-progressive:chunk id=v8-crud-api-002 sha256=8a2aee7581fd589e15b219f2f79fdb442cb29adba667fc76e1e2e7a1f3bb1b43 -->
|
|
58
|
+
## 性能底线(必须自检)
|
|
59
|
+
|
|
60
|
+
- 写接口引擎前必须先做数据访问计划:需要哪些表、哪些字段、预计数据量、是否分页、是否需要缓存。
|
|
61
|
+
- 禁止在 `for` / `while` / `forEach` / 嵌套循环中反复调用 `GetFormData`、`GetTableData`、`FromSql`、`ApiEngine.Run` 或外部 HTTP。先收集 Id/Key,用一次 `In` 查询或一条 JOIN/聚合 SQL 批量取回,再用对象字典映射。
|
|
62
|
+
- 禁止用双重循环匹配两组列表。先把小表或关联表整理成 `{ id: row }`、`{ parentId: [] }` 这类 Map,再单循环组装结果。
|
|
63
|
+
- 所有列表查询必须设置 `_SelectFields`,只取业务需要的字段;面向前端的列表必须分页或显式限制 `_PageSize`,不能一次拉全表。
|
|
64
|
+
- 报表、统计、跨表汇总优先使用数据库聚合(`COUNT/SUM/GROUP BY/JOIN`)或一次批量查询后内存聚合,不能逐行查明细再累加。
|
|
65
|
+
- 高频读取的系统配置、字典、菜单、字段、角色权限等静态数据要优先使用 `V8.Cache` 或平台已有缓存;写入后必须清理相关缓存。
|
|
66
|
+
- 外部 HTTP、短信、翻译、文件处理等慢操作不要放在数据库事务内循环执行;能批量就批量,不能批量就拆成异步任务/队列。
|
|
67
|
+
- 返回前做一次性能复核:数据库访问次数是否与数据量无关、是否避免 N+1 查询、是否有索引友好的 `_Where` 条件、是否不会因空参数导致全表扫描。
|
|
68
|
+
|
|
69
|
+
### 计量流水与分页审计
|
|
70
|
+
|
|
71
|
+
- Token、积分、余额等计量必须由服务端在真实成功结果后记录,失败请求不得扣减;能够取得供应商 `usage` 时禁止用完整 JSON 字符数代替真实输入/输出 Token。
|
|
72
|
+
- 余额扣减与流水新增必须在同一事务内完成,并锁定当前账户行,避免并发请求透支或出现“余额已扣但流水未写”。
|
|
73
|
+
- 面向个人中心的流水接口必须按 `V8.CurrentUser.Id` 强制隔离,并返回 `PageIndex`、`PageSize`、`TotalCount`;列表只取页面需要的审计字段。
|
|
74
|
+
- 为便于用户核对,可以保存经过空白归一化的用户输入短摘要;摘要按 Unicode 文本元素截取,不能截断 emoji 或代理对,也不要把完整请求 JSON 当摘要。
|
|
75
|
+
|
|
76
|
+
<!-- /microi-progressive:chunk -->
|
|
77
|
+
<!-- microi-progressive:chunk id=v8-crud-api-003 sha256=a60257da3c153170b731b125c9b58614fe84030645c343688f70c9d060b0e0eb -->
|
|
78
|
+
## DosResult 状态码
|
|
79
|
+
|
|
80
|
+
| Code | 含义 |
|
|
81
|
+
|------|------|
|
|
82
|
+
| `1` | 成功 |
|
|
83
|
+
| `0` | 业务失败(自动回滚) |
|
|
84
|
+
| `2` | `GetFormData` 数据不存在(特殊值,仍属正常查询)|
|
|
85
|
+
| `1001` | Token 失效 |
|
|
86
|
+
| `1002` | 身份验证失败 |
|
|
87
|
+
|
|
88
|
+
```javascript
|
|
89
|
+
// GetFormData Code=2 的处理
|
|
90
|
+
var r = V8.FormEngine.GetFormData('Order', { Id: V8.Param.id });
|
|
91
|
+
if (r.Code === 2) return { Code: 0, Msg: '订单不存在' };
|
|
92
|
+
if (r.Code !== 1) return r;
|
|
93
|
+
// r.Data 才是真实数据
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
<!-- /microi-progressive:chunk -->
|
|
97
|
+
<!-- microi-progressive:chunk id=v8-crud-api-004 sha256=4efce43d196d67f3b6125747c645477442235b39ecf0ddfca325fb3bd1f444ae -->
|
|
98
|
+
## 全局日期函数
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
DateNow('yyyy-MM-dd HH:mm:ss') // 当前时间字符串
|
|
102
|
+
DateFormat(new Date(), 'yyyy-MM-dd') // 格式化
|
|
103
|
+
DateAdd(new Date(), 'd', 7, 'yyyy-MM-dd') // 加减(s/m/h/d/w/q/M/y)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
<!-- /microi-progressive:chunk -->
|
|
107
|
+
<!-- microi-progressive:chunk id=v8-crud-api-005 sha256=f3d8f0628ddd51845fc700fe63bfa037480f131484c8238874d380cb05a89a92 -->
|
|
108
|
+
## 查询单条
|
|
109
|
+
|
|
110
|
+
```javascript
|
|
111
|
+
if (!V8.Param.id) {
|
|
112
|
+
return { Code: 0, Msg: 'id 不能为空' };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
var result = V8.FormEngine.GetFormData('SysUser', {
|
|
116
|
+
_Where: [['Id', '=', V8.Param.id]],
|
|
117
|
+
_SelectFields: ['Id', 'Account', 'Name', 'Phone']
|
|
118
|
+
});
|
|
119
|
+
// 也可以用 Id 直接查:{ Id: 'xxx' }
|
|
120
|
+
|
|
121
|
+
if (result.Code !== 1 || !result.Data) {
|
|
122
|
+
return { Code: 0, Msg: '数据不存在' };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return { Code: 1, Data: result.Data };
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
<!-- /microi-progressive:chunk -->
|
|
129
|
+
<!-- microi-progressive:chunk id=v8-crud-api-006 sha256=b8ae0ea6ccd746994ea5fa74f4ae4e6163c1ffd09eb141d6fd5863d77d36f35b -->
|
|
130
|
+
## 新增
|
|
131
|
+
|
|
132
|
+
```javascript
|
|
133
|
+
if (!V8.Param.Account || !V8.Param.Name) {
|
|
134
|
+
return { Code: 0, Msg: '账号和姓名不能为空' };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// 检查唯一性
|
|
138
|
+
var exist = V8.FormEngine.GetFormData('SysUser', {
|
|
139
|
+
_Where: [['Account', '=', V8.Param.Account]]
|
|
140
|
+
});
|
|
141
|
+
if (exist.Code === 1 && exist.Data) {
|
|
142
|
+
return { Code: 0, Msg: '账号已存在' };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
var result = V8.FormEngine.AddFormData('SysUser', {
|
|
146
|
+
// Id 不传会自动生成 GUID
|
|
147
|
+
Account: V8.Param.Account,
|
|
148
|
+
Name: V8.Param.Name,
|
|
149
|
+
Phone: V8.Param.Phone || '',
|
|
150
|
+
Status: 1
|
|
151
|
+
});
|
|
152
|
+
// result.Data 包含 Id, CreateTime, UserId 等自动生成字段
|
|
153
|
+
|
|
154
|
+
return { Code: result.Code, Data: result.Data, Msg: result.Code === 1 ? '新增成功' : result.Msg };
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 批量新增
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
160
|
+
var addList = [];
|
|
161
|
+
for (var i = 0; i < V8.Param.items.length; i++) {
|
|
162
|
+
addList.push({
|
|
163
|
+
FormEngineKey: 'SysUser', // 支持不同表混合批量
|
|
164
|
+
Account: V8.Param.items[i].Account,
|
|
165
|
+
Name: V8.Param.items[i].Name
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
var result = V8.FormEngine.AddTableData(addList);
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
<!-- /microi-progressive:chunk -->
|
|
172
|
+
## 详细参考路由(渐进披露)
|
|
173
|
+
|
|
174
|
+
仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
|
|
175
|
+
|
|
176
|
+
- [references/progressive-01-查询列表-分页.md](references/progressive-01-查询列表-分页.md):查询列表(分页);更新;删除;按条件批量操作;事务处理;请求内异步与后台处理;动态加字段(运行时改表结构);旧版 _Where 兼容
|
|
177
|
+
- [references/progressive-02-where-条件语法速查.md](references/progressive-02-where-条件语法速查.md):_Where 条件语法速查;注意事项
|
|
178
|
+
<!-- microi-progressive:end -->
|