@microi.net/cli 5.8.4 → 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.
Files changed (212) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.mcp.json +1 -1
  5. package/.workbuddy-plugin/marketplace.json +2 -2
  6. package/.workbuddy-plugin/plugin.json +1 -1
  7. package/LICENSE +21 -21
  8. package/README.md +71 -71
  9. package/assets/build-meta.json +7 -7
  10. package/assets/feature-matrix.json +138 -138
  11. package/assets/logo.svg +4 -4
  12. package/cordis.patch.yml +1 -1
  13. package/package.json +1 -1
  14. package/scripts/codex-marketplace.json +20 -20
  15. package/scripts/mcp-codex-stdio-adapter.js +189 -189
  16. package/scripts/mcp-server.js +5 -0
  17. package/scripts/mcp-trae-windows-launcher.cmd +21 -21
  18. package/scripts/microi-cli-mcp.js +7 -7
  19. package/scripts/microi-cli.js +67 -66
  20. package/scripts/microi-codex-broker.js +450 -450
  21. package/scripts/microi-codex-router.js +618 -582
  22. package/scripts/microi-skills.meta.json +384 -384
  23. package/skills/.microi-skills-version.json +2 -2
  24. package/skills/.progressive-disclosure-manifest.json +3566 -3566
  25. package/skills/README.md +287 -287
  26. package/skills/ai-engine/SKILL.md +269 -265
  27. package/skills/ai-engine/agents/openai.yaml +4 -4
  28. package/skills/ai-engine/references/ai-employees.md +48 -48
  29. package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
  30. package/skills/ai-platform-governance/SKILL.md +177 -177
  31. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  32. package/skills/app-store/SKILL.md +525 -525
  33. package/skills/app-store/agents/openai.yaml +4 -4
  34. package/skills/business-blueprint/SKILL.md +193 -193
  35. package/skills/datasource-engine/SKILL.md +93 -93
  36. package/skills/datasource-engine/agents/openai.yaml +4 -4
  37. package/skills/dos-orm/SKILL.md +97 -97
  38. package/skills/dos-orm/references/api-reference.md +229 -229
  39. package/skills/email-engine/SKILL.md +81 -81
  40. package/skills/email-engine/references/v8-email.md +34 -34
  41. package/skills/job-engine/SKILL.md +176 -176
  42. package/skills/job-engine/agents/openai.yaml +4 -4
  43. package/skills/message-notification/SKILL.md +156 -156
  44. package/skills/message-notification/agents/openai.yaml +5 -5
  45. package/skills/message-notification/references/contracts.md +102 -102
  46. package/skills/microi/SKILL.md +14 -14
  47. package/skills/microi-ai-app-auth.js +652 -652
  48. package/skills/microi-ai-application/SKILL.md +115 -115
  49. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  50. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  51. package/skills/microi-client-frontend/SKILL.md +244 -244
  52. 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
  53. 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
  54. 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
  55. package/skills/microi-codex/SKILL.md +102 -100
  56. package/skills/microi-codex-installer/SKILL.md +231 -227
  57. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  58. package/skills/microi-datasource-mapping/SKILL.md +122 -122
  59. package/skills/microi-db-schema/SKILL.md +175 -175
  60. package/skills/microi-db-schema/agents/openai.yaml +4 -4
  61. package/skills/microi-db-schema/references/core-tables.md +695 -695
  62. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  63. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  64. package/skills/microi-db-schema/references/schema.md +646 -646
  65. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  66. package/skills/microi-deployment/SKILL.md +221 -221
  67. package/skills/microi-deployment/references/deployment-matrix.md +109 -109
  68. package/skills/microi-docs-coverage/SKILL.md +133 -133
  69. package/skills/microi-docs-coverage/references/capability-map.md +91 -91
  70. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  71. package/skills/microi-form-engine/SKILL.md +333 -333
  72. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  73. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  74. package/skills/microi-form-layout/SKILL.md +205 -205
  75. 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
  76. package/skills/microi-frontend-sdk/SKILL.md +194 -194
  77. 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
  78. package/skills/microi-left-right-layout/SKILL.md +141 -141
  79. package/skills/microi-microservice/SKILL.md +326 -324
  80. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  81. package/skills/microi-mobile-app-quality/SKILL.md +185 -185
  82. 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
  83. 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
  84. package/skills/microi-solution-quotation/SKILL.md +78 -78
  85. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  86. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  87. package/skills/microi-sso/SKILL.md +92 -92
  88. package/skills/microi-sso/references/acceptance.md +49 -49
  89. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  90. package/skills/microi-sso/references/inbound.md +53 -53
  91. package/skills/microi-sso/references/outbound.md +39 -39
  92. package/skills/microi-system-delivery/SKILL.md +137 -137
  93. 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
  94. 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
  95. package/skills/microi-ui/SKILL.md +192 -192
  96. 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
  97. package/skills/microi-uniapp-frontend/SKILL.md +193 -193
  98. 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
  99. 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
  100. package/skills/microi.v8.js +1921 -1921
  101. package/skills/module-engine/SKILL.md +255 -255
  102. package/skills/module-engine/references/module-config.md +204 -204
  103. package/skills/ocr-engine/SKILL.md +113 -113
  104. package/skills/ocr-engine/agents/openai.yaml +4 -4
  105. package/skills/page-engine/SKILL.md +206 -206
  106. package/skills/page-engine/examples/compact-dashboard.json +1444 -1444
  107. 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
  108. 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
  109. package/skills/performance-testing/SKILL.md +221 -221
  110. package/skills/playwright-e2e/SKILL.md +196 -196
  111. 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
  112. 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
  113. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
  114. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
  115. package/skills/print-engine/SKILL.md +259 -259
  116. package/skills/production-readonly-audit/SKILL.md +41 -41
  117. package/skills/report-engine/SKILL.md +71 -71
  118. package/skills/report-engine/agents/openai.yaml +4 -4
  119. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  120. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  121. package/skills/scripts/sync-embedded-skills.mjs +46 -46
  122. package/skills/scripts/validate-progressive-disclosure.mjs +57 -57
  123. package/skills/search-engine/SKILL.md +75 -75
  124. package/skills/search-engine/agents/openai.yaml +4 -4
  125. package/skills/spider-engine/SKILL.md +190 -190
  126. package/skills/system-observability/SKILL.md +248 -248
  127. package/skills/system-observability/references/memory-incident-triage.md +77 -77
  128. package/skills/translate-engine/SKILL.md +140 -140
  129. package/skills/translate-engine/agents/openai.yaml +4 -4
  130. package/skills/ui-design/SKILL.md +223 -223
  131. package/skills/ui-design/assets/pattern-showcase/app.js +54 -54
  132. package/skills/ui-design/assets/pattern-showcase/index.html +163 -163
  133. package/skills/ui-design/assets/pattern-showcase/styles.css +311 -311
  134. package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
  135. package/skills/ui-design/references/design-pattern-library.md +184 -184
  136. package/skills/ui-design/references/mci-design-contract.md +163 -163
  137. package/skills/ui-design/references/motion-and-media.md +78 -78
  138. package/skills/ui-design/references/product-flow-recipes.md +94 -94
  139. 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
  140. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +164 -164
  141. 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
  142. 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
  143. 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
  144. 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
  145. 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
  146. 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
  147. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  148. package/skills/unity-integration/SKILL.md +171 -171
  149. package/skills/unity-integration/agents/openai.yaml +4 -4
  150. package/skills/unity-integration/references/ai-app-delivery.md +119 -119
  151. package/skills/unity-integration/references/sdk-api.md +82 -82
  152. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  153. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  154. package/skills/v8-api-config/SKILL.md +388 -388
  155. package/skills/v8-cache-pattern/SKILL.md +312 -312
  156. package/skills/v8-crud-api/SKILL.md +178 -178
  157. 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
  158. 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
  159. package/skills/v8-debugging/SKILL.md +284 -284
  160. package/skills/v8-explorer-tree/SKILL.md +228 -228
  161. package/skills/v8-export-import/SKILL.md +219 -219
  162. 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
  163. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
  164. 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
  165. package/skills/v8-file-upload/SKILL.md +284 -284
  166. 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
  167. 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
  168. package/skills/v8-formengine-http/SKILL.md +238 -238
  169. package/skills/v8-frontend-events/SKILL.md +180 -180
  170. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  171. package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
  172. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
  173. package/skills/v8-http-integration/SKILL.md +182 -182
  174. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
  175. 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
  176. package/skills/v8-image-processing/SKILL.md +190 -190
  177. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  178. package/skills/v8-image-processing/references/api-reference.md +623 -623
  179. package/skills/v8-menu-buttons/SKILL.md +186 -186
  180. 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
  181. 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
  182. 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
  183. package/skills/v8-mongodb/SKILL.md +200 -200
  184. package/skills/v8-mq-mqtt/SKILL.md +176 -176
  185. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  186. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
  187. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  188. package/skills/v8-saas-multi-tenant/SKILL.md +305 -305
  189. package/skills/v8-security/SKILL.md +210 -210
  190. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +200 -200
  191. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +160 -160
  192. package/skills/v8-sql-query/SKILL.md +302 -302
  193. package/skills/v8-table-event/SKILL.md +176 -176
  194. 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
  195. 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
  196. package/skills/v8-tcp-integration/SKILL.md +147 -147
  197. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  198. package/skills/v8-template-engine/SKILL.md +167 -167
  199. package/skills/v8-utilities/SKILL.md +104 -104
  200. package/skills/v8-utilities/references/client-api-index.md +143 -143
  201. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  202. package/skills/v8-utilities/references/server-api-index.md +188 -188
  203. package/skills/v8-workflow/SKILL.md +252 -252
  204. 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
  205. package/skills/v8-workflow/references/workflow-configuration.md +49 -49
  206. package/skills/vision-engine/SKILL.md +160 -160
  207. package/skills/vision-engine/agents/openai.yaml +4 -4
  208. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  209. package/skills/workspace-conventions/SKILL.md +273 -270
  210. 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
  211. 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
  212. 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,104 +1,104 @@
1
- # v8-menu-buttons 详细参考 3
2
-
3
- > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
-
5
- <!-- microi-progressive:chunk id=v8-menu-buttons-013 sha256=30fe801c52356f945f9adabbd5d947d251211d9f3f63f24ca596c1aed6594440 -->
6
- ## 10. 反模式(避免)
7
-
8
- ❌ 把所有业务逻辑塞进 `V8Code`,不创建接口引擎
9
- ✅ 前端 `V8Code` 只负责弹窗/确认/刷新;业务逻辑写在接口引擎
10
-
11
- ❌ 依赖非布尔返回值隐藏按钮
12
- ✅ 需要隐藏时显式 `return false;` 或 `V8.Result = false;`;未返回布尔值默认显示
13
-
14
- ❌ `MoreBtns` 不写 `ShowRow:true`,按钮看不见
15
- ✅ 行内必须 `ShowRow:true`
16
-
17
- ❌ 在 `diy-table.vue` / 卡片模板 / action-width mixin 中按模块、Url 或表名硬编码业务行按钮,或为单个业务面板新增 `V8.Open<业务名>`
18
- ✅ 入口完整保存在 `sys_menu.MoreBtns`;主前端组件用 `V8.OpenDialog`,在线微服务用 `V8.OpenAppDialog`;验收同时回读按钮 JSON、打开模块引擎设计器,并检查运行态
19
-
20
- ❌ 按钮 `Id` 重复或省略
21
- ✅ 用 ULID/GUID 保证唯一
22
-
23
- ❌ `BatchSelectMoreBtns` 用 `V8.Form` 取数据
24
- ✅ 必须用 `V8.TableRowSelected`
25
-
26
- ❌ 在 `V8.ConfirmTips` 中拼接复杂 HTML、表单、列表、Tab、代码编辑器或多步骤向导
27
- ✅ 先用 `microi_list_applications` / `microi_get_application_context` 查找现有微服务;优先在已有微服务新增页面,否则通过 MCP 创建微服务,再用 `V8.OpenAppDialog` 打开
28
-
29
- <!-- /microi-progressive:chunk -->
30
- <!-- microi-progressive:chunk id=v8-menu-buttons-014 sha256=ad4cb3a484857342e8e669163655b604a0a88ee4dec359743400a9493ff3c2d9 -->
31
- ## 10.2 复杂定制弹窗必须使用微服务
32
-
33
- `V8.ConfirmTips` 只适合纯文本确认或极少量一次性输入。出现以下任一情况即视为复杂页面:三个以上字段、响应式布局、联动校验、上传、表格、Tab、步骤条、代码编辑器、需要复用、后续会持续迭代。
34
-
35
- 复杂页面标准流程:
36
-
37
- 1. `microi_list_applications({ appType: 'MicroService' })` 获取现有微服务及文件清单。
38
- 2. `microi_get_application_context({ appIdOrKey: '<AppKey>' })` 读取完整源码,判断应新增页面还是新建应用。
39
- 3. 新建时使用 `microi_create_microservice` 注册元数据,`microi_sync_microservice_source` 上传私有源码,`microi_publish_microservice` 上传公有编译产物和页面路由。
40
- 4. 菜单按钮只负责调用 `V8.OpenAppDialog`,把业务数据放入 `Data`,通过 `OnSuccess / OnError / OnClose` 与宿主交互。
41
-
42
- ```js
43
- V8.OpenAppDialog({
44
- AppKey: 'official-admin-app',
45
- RoutePath: '/tenant/create',
46
- Title: '创建租户',
47
- Width: 'min(960px, calc(100vw - 32px))',
48
- Data: { Source: 'SaaSMenu' },
49
- OnSuccess: function (result) {
50
- V8.Tips((result && result.message) || '处理成功', true);
51
- V8.RefreshTable({ _PageIndex: -1 });
52
- },
53
- OnError: function (error) {
54
- V8.Tips((error && error.message) || '页面处理失败', false);
55
- }
56
- });
57
- ```
58
-
59
- ---
60
-
61
- <!-- /microi-progressive:chunk -->
62
- <!-- microi-progressive:chunk id=v8-menu-buttons-015 sha256=a796c29f763905954dbe712f80b5aa3921d57886142542749c1dda79ff6cdc4b -->
63
- ## 11. ⚠️ `V8.CurrentUser` 拿不到的历史陷阱(必看)
64
-
65
- ### 现象
66
- `diy-form-full.vue`(弹窗 / 详情 / 全屏表单)的 `FormBtns` / `PageBtns` / `PageTabs` / `BatchSelectMoreBtns` / `ExportMoreBtns` 中:
67
- - 编写 `V8.CurrentUser._IsAdmin` 总是 `undefined`
68
- - `V8CodeShow` 里靠用户角色判断的隐藏逻辑全部失效
69
- - 但 `diy-table.vue` 的 `MoreBtns` 同样代码却**正常**
70
-
71
- ### 根因(2026-05 已修)
72
- `diy.common.js` 中有一个**进程级单例缓存** `DiyCommon._V8BaseInstance`:
73
- ```js
74
- // 旧 BUG 写法
75
- DiyCommon._V8BaseInstance = {
76
- CurrentUser : store.state.DiyStore.GetCurrentUser, // ← Pinia getter 不在 $state 里,永远 undefined
77
- CurrentToken: DiyCommon.getToken(), // ← 只算了一次,登录态变化后过期
78
- SysConfig : store.state.DiyStore.SysConfig,
79
- ...
80
- }
81
- ```
82
- - `store.state.DiyStore` 是 Pinia 的 `$state` 兼容层,**只有 state 字段**,**不包含 getter**。`GetCurrentUser` 是 getter → 取到 `undefined`。
83
- - `_V8BaseInstance` 是模块级单例,第一次构建后所有 `InitV8Code` 都会 `Object.assign(V8, _V8BaseInstance)`。
84
- - `diy-form-full.vue` 调用顺序是:`SetV8DefaultValue` → `InitV8Code` → `Object.assign` 把 V8.CurrentUser 改回 undefined。
85
- - `diy-table.vue` 调用顺序是:`InitV8Code` → `SetV8DefaultValue`,新鲜值后写胜出,所以没问题。
86
-
87
- ### 正确做法
88
- 1. **不要把会话级 / 用户级状态写进进程级单例缓存**(CurrentUser / Token / SysConfig)。
89
- 2. 在 `InitV8Code` / `InitV8CodeSync` 的 `Object.assign` 之后,调用 `DiyCommon._RefreshV8DynamicContext(V8)`,始终从 `useDiyStore()` 实例(而不是 `$state`)取最新值:
90
- ```js
91
- var diyStore = getDiyStore();
92
- V8.CurrentUser = diyStore.GetCurrentUser; // Pinia getter,必须经 store 实例
93
- V8.SysConfig = diyStore.SysConfig;
94
- V8.CurrentToken= DiyCommon.getToken();
95
- ```
96
- 3. 任何按钮组件(包括将来新增的 `PageBtns`、自定义 Tab 等)都**不需要**再单独 set `CurrentUser`,统一由 `_RefreshV8DynamicContext` 保证。
97
-
98
- ### AI 编写按钮时的检查清单
99
- - [ ] `V8CodeShow` 中读 `V8.CurrentUser.RoleName` / `V8.CurrentUser._IsAdmin` 之前,**不**做 `if (!V8.CurrentUser)` 容错回写——容错会反过来掩盖框架问题。
100
- - [ ] 不要在 `V8Code` 里 `Object.assign(V8, {...})`,避免再次覆盖动态字段。
101
- - [ ] 后端接口引擎/表单事件禁止用 `setTimeout` 把业务工作延伸到请求结束之后;可靠异步任务必须使用后台任务、MQ、定时任务或持久化 outbox,并具备幂等与失败恢复。
102
- - [ ] 前端按钮若确需 `setTimeout`,仅限当前页面生命周期内的短时 UI 延迟/防抖。必须保存定时器句柄,在弹窗关闭、组件卸载或租户切换时清理;回调执行前还要确认页面仍有效且 `OsClient` 未变化。前端定时器不能承担写库、同步、通知或其它可靠业务任务。
103
-
104
- <!-- /microi-progressive:chunk -->
1
+ # v8-menu-buttons 详细参考 3
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=v8-menu-buttons-013 sha256=30fe801c52356f945f9adabbd5d947d251211d9f3f63f24ca596c1aed6594440 -->
6
+ ## 10. 反模式(避免)
7
+
8
+ ❌ 把所有业务逻辑塞进 `V8Code`,不创建接口引擎
9
+ ✅ 前端 `V8Code` 只负责弹窗/确认/刷新;业务逻辑写在接口引擎
10
+
11
+ ❌ 依赖非布尔返回值隐藏按钮
12
+ ✅ 需要隐藏时显式 `return false;` 或 `V8.Result = false;`;未返回布尔值默认显示
13
+
14
+ ❌ `MoreBtns` 不写 `ShowRow:true`,按钮看不见
15
+ ✅ 行内必须 `ShowRow:true`
16
+
17
+ ❌ 在 `diy-table.vue` / 卡片模板 / action-width mixin 中按模块、Url 或表名硬编码业务行按钮,或为单个业务面板新增 `V8.Open<业务名>`
18
+ ✅ 入口完整保存在 `sys_menu.MoreBtns`;主前端组件用 `V8.OpenDialog`,在线微服务用 `V8.OpenAppDialog`;验收同时回读按钮 JSON、打开模块引擎设计器,并检查运行态
19
+
20
+ ❌ 按钮 `Id` 重复或省略
21
+ ✅ 用 ULID/GUID 保证唯一
22
+
23
+ ❌ `BatchSelectMoreBtns` 用 `V8.Form` 取数据
24
+ ✅ 必须用 `V8.TableRowSelected`
25
+
26
+ ❌ 在 `V8.ConfirmTips` 中拼接复杂 HTML、表单、列表、Tab、代码编辑器或多步骤向导
27
+ ✅ 先用 `microi_list_applications` / `microi_get_application_context` 查找现有微服务;优先在已有微服务新增页面,否则通过 MCP 创建微服务,再用 `V8.OpenAppDialog` 打开
28
+
29
+ <!-- /microi-progressive:chunk -->
30
+ <!-- microi-progressive:chunk id=v8-menu-buttons-014 sha256=ad4cb3a484857342e8e669163655b604a0a88ee4dec359743400a9493ff3c2d9 -->
31
+ ## 10.2 复杂定制弹窗必须使用微服务
32
+
33
+ `V8.ConfirmTips` 只适合纯文本确认或极少量一次性输入。出现以下任一情况即视为复杂页面:三个以上字段、响应式布局、联动校验、上传、表格、Tab、步骤条、代码编辑器、需要复用、后续会持续迭代。
34
+
35
+ 复杂页面标准流程:
36
+
37
+ 1. `microi_list_applications({ appType: 'MicroService' })` 获取现有微服务及文件清单。
38
+ 2. `microi_get_application_context({ appIdOrKey: '<AppKey>' })` 读取完整源码,判断应新增页面还是新建应用。
39
+ 3. 新建时使用 `microi_create_microservice` 注册元数据,`microi_sync_microservice_source` 上传私有源码,`microi_publish_microservice` 上传公有编译产物和页面路由。
40
+ 4. 菜单按钮只负责调用 `V8.OpenAppDialog`,把业务数据放入 `Data`,通过 `OnSuccess / OnError / OnClose` 与宿主交互。
41
+
42
+ ```js
43
+ V8.OpenAppDialog({
44
+ AppKey: 'official-admin-app',
45
+ RoutePath: '/tenant/create',
46
+ Title: '创建租户',
47
+ Width: 'min(960px, calc(100vw - 32px))',
48
+ Data: { Source: 'SaaSMenu' },
49
+ OnSuccess: function (result) {
50
+ V8.Tips((result && result.message) || '处理成功', true);
51
+ V8.RefreshTable({ _PageIndex: -1 });
52
+ },
53
+ OnError: function (error) {
54
+ V8.Tips((error && error.message) || '页面处理失败', false);
55
+ }
56
+ });
57
+ ```
58
+
59
+ ---
60
+
61
+ <!-- /microi-progressive:chunk -->
62
+ <!-- microi-progressive:chunk id=v8-menu-buttons-015 sha256=a796c29f763905954dbe712f80b5aa3921d57886142542749c1dda79ff6cdc4b -->
63
+ ## 11. ⚠️ `V8.CurrentUser` 拿不到的历史陷阱(必看)
64
+
65
+ ### 现象
66
+ `diy-form-full.vue`(弹窗 / 详情 / 全屏表单)的 `FormBtns` / `PageBtns` / `PageTabs` / `BatchSelectMoreBtns` / `ExportMoreBtns` 中:
67
+ - 编写 `V8.CurrentUser._IsAdmin` 总是 `undefined`
68
+ - `V8CodeShow` 里靠用户角色判断的隐藏逻辑全部失效
69
+ - 但 `diy-table.vue` 的 `MoreBtns` 同样代码却**正常**
70
+
71
+ ### 根因(2026-05 已修)
72
+ `diy.common.js` 中有一个**进程级单例缓存** `DiyCommon._V8BaseInstance`:
73
+ ```js
74
+ // 旧 BUG 写法
75
+ DiyCommon._V8BaseInstance = {
76
+ CurrentUser : store.state.DiyStore.GetCurrentUser, // ← Pinia getter 不在 $state 里,永远 undefined
77
+ CurrentToken: DiyCommon.getToken(), // ← 只算了一次,登录态变化后过期
78
+ SysConfig : store.state.DiyStore.SysConfig,
79
+ ...
80
+ }
81
+ ```
82
+ - `store.state.DiyStore` 是 Pinia 的 `$state` 兼容层,**只有 state 字段**,**不包含 getter**。`GetCurrentUser` 是 getter → 取到 `undefined`。
83
+ - `_V8BaseInstance` 是模块级单例,第一次构建后所有 `InitV8Code` 都会 `Object.assign(V8, _V8BaseInstance)`。
84
+ - `diy-form-full.vue` 调用顺序是:`SetV8DefaultValue` → `InitV8Code` → `Object.assign` 把 V8.CurrentUser 改回 undefined。
85
+ - `diy-table.vue` 调用顺序是:`InitV8Code` → `SetV8DefaultValue`,新鲜值后写胜出,所以没问题。
86
+
87
+ ### 正确做法
88
+ 1. **不要把会话级 / 用户级状态写进进程级单例缓存**(CurrentUser / Token / SysConfig)。
89
+ 2. 在 `InitV8Code` / `InitV8CodeSync` 的 `Object.assign` 之后,调用 `DiyCommon._RefreshV8DynamicContext(V8)`,始终从 `useDiyStore()` 实例(而不是 `$state`)取最新值:
90
+ ```js
91
+ var diyStore = getDiyStore();
92
+ V8.CurrentUser = diyStore.GetCurrentUser; // Pinia getter,必须经 store 实例
93
+ V8.SysConfig = diyStore.SysConfig;
94
+ V8.CurrentToken= DiyCommon.getToken();
95
+ ```
96
+ 3. 任何按钮组件(包括将来新增的 `PageBtns`、自定义 Tab 等)都**不需要**再单独 set `CurrentUser`,统一由 `_RefreshV8DynamicContext` 保证。
97
+
98
+ ### AI 编写按钮时的检查清单
99
+ - [ ] `V8CodeShow` 中读 `V8.CurrentUser.RoleName` / `V8.CurrentUser._IsAdmin` 之前,**不**做 `if (!V8.CurrentUser)` 容错回写——容错会反过来掩盖框架问题。
100
+ - [ ] 不要在 `V8Code` 里 `Object.assign(V8, {...})`,避免再次覆盖动态字段。
101
+ - [ ] 后端接口引擎/表单事件禁止用 `setTimeout` 把业务工作延伸到请求结束之后;可靠异步任务必须使用后台任务、MQ、定时任务或持久化 outbox,并具备幂等与失败恢复。
102
+ - [ ] 前端按钮若确需 `setTimeout`,仅限当前页面生命周期内的短时 UI 延迟/防抖。必须保存定时器句柄,在弹窗关闭、组件卸载或租户切换时清理;回调执行前还要确认页面仍有效且 `OsClient` 未变化。前端定时器不能承担写库、同步、通知或其它可靠业务任务。
103
+
104
+ <!-- /microi-progressive:chunk -->
@@ -1,200 +1,200 @@
1
- ---
2
- name: v8-mongodb
3
- description: Microi V8 MongoDB 指南。用于使用 V8.MongoDb AddFormData、UptFormData、UptFormDataByWhere、DelFormData、DelFormDataByWhere、GetFormData、GetTableData、对象过滤和文档 Id。
4
- ---
5
-
6
- > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
7
-
8
- # Microi V8 MongoDB 操作
9
-
10
- 你正在开发 Microi 吾码平台的 V8 引擎代码,需要使用 MongoDB 存储非结构化数据(如日志、IoT 数据、大文档等)。
11
-
12
- ## V8.MongoDb API
13
-
14
- ### 存量 MongoDB 兼容诊断
15
-
16
- - `reports wire version 6 ... requires at least 9` 是驱动与服务端不兼容,不是日志为空,也不是 Token 失效。先记录原始错误和服务端真实协议,不能把 wire version 6 推断成 MongoDB 4.2。
17
- - 平台兼容镜像以含安全修复的驱动 3.11.2 构建,恢复平台 CRUD/日志所需的 MongoDB 3.6 协议路径;不是降级至 2.30,也不声明上游继续维护 3.6。来源、单文件补丁和摘要维护在 `Microi.Server/ThirdParty/MongoDB.Driver/`。
18
- - 修改该兼容层必须通过真实 3.6 与当前 7.x 的认证、BSON、读写、索引、幂等重放、游标和租户隔离矩阵。不得只验证编译或 ping,也不得把驱动兼容当作修复旧数据库服务端自身漏洞。
19
- - C# 驱动改动需要更新后端镜像才生效。镜像更新后通过 `microi_query_system_observability` 回读日志、队列持久化和错误状态;查询失败应原样报错,禁止返回成功空表。
20
-
21
- | 方法 | 说明 |
22
- |------|------|
23
- | `V8.MongoDb.AddFormData({...})` | 新增文档 |
24
- | `V8.MongoDb.UptFormData({...})` | 修改文档(按 Id) |
25
- | `V8.MongoDb.UptFormDataByWhere({...})` | 按非空 `_Where` 批量修改,禁止修改 `_id` |
26
- | `V8.MongoDb.DelFormData({...})` | 删除文档(按 Id) |
27
- | `V8.MongoDb.DelFormDataByWhere({...})` | 按非空 `_Where` 批量删除 |
28
- | `V8.MongoDb.GetFormData({...})` | 查询单个文档(按 Id) |
29
- | `V8.MongoDb.GetTableData({...})` | 查询文档列表 |
30
- | `V8.MongoDb.NewId()` | 生成 MongoDB Id |
31
-
32
- ## 新增文档
33
-
34
- ```javascript
35
- var newId = V8.MongoDb.NewId();
36
- V8.MongoDb.AddFormData({
37
- DbName: 'sys_log_2024', // 数据库名
38
- TableName: 'log_2024_12', // 集合(表)名
39
- Id: newId, // 可选,不指定自动生成
40
- _FormData: {
41
- UserId: V8.CurrentUser.Id,
42
- Action: '登录',
43
- IP: '192.168.1.1',
44
- CreateTime: DateNow('yyyy-MM-dd HH:mm:ss')
45
- }
46
- });
47
- ```
48
-
49
- ## 修改文档
50
-
51
- ```javascript
52
- V8.MongoDb.UptFormData({
53
- DbName: 'sys_log_2024',
54
- TableName: 'log_2024_12',
55
- Id: V8.Param.id, // 必传
56
- _FormData: {
57
- Action: '更新操作',
58
- UpdateTime: DateNow('yyyy-MM-dd HH:mm:ss')
59
- }
60
- });
61
- ```
62
-
63
- ### 按条件批量修改
64
-
65
- ```javascript
66
- var result = V8.MongoDb.UptFormDataByWhere({
67
- DbName: 'diy_chat_' + V8.OsClient.toLowerCase(),
68
- TableName: 'chat_' + DateNow('yyyy'),
69
- _Where: [
70
- ['FromUserId', '=', V8.Param.PeerUserId],
71
- ['ToUserId', '=', V8.CurrentUser.Id],
72
- ['IsRead', '=', false]
73
- ],
74
- _FormData: { IsRead: true }
75
- });
76
- ```
77
-
78
- `_Where` 缺失、为空或包含无效条件时必须返回失败,不得执行全集合更新。`_FormData` 禁止设置 `_id` 或 `_id.*`。返回值的 `Data` 包含 `MatchedCount` 和 `ModifiedCount`。
79
-
80
- ## 删除文档
81
-
82
- ```javascript
83
- V8.MongoDb.DelFormData({
84
- DbName: 'sys_log_2024',
85
- TableName: 'log_2024_12',
86
- Id: V8.Param.id // 必传
87
- });
88
- ```
89
-
90
- ### 按条件批量删除
91
-
92
- ```javascript
93
- var result = V8.MongoDb.DelFormDataByWhere({
94
- DbName: 'diy_chat_' + V8.OsClient.toLowerCase(),
95
- TableName: 'chat_last_contact',
96
- _Where: [
97
- ['UserId', '=', V8.CurrentUser.Id],
98
- ['ContactUserId', '=', V8.Param.PeerUserId]
99
- ]
100
- });
101
- ```
102
-
103
- 删除条件必须包含当前权威用户/资源边界,不能只用可伪造的前端参数。返回值的 `Data` 包含 `DeletedCount`。
104
-
105
- ## 查询单个文档
106
-
107
- ```javascript
108
- var result = V8.MongoDb.GetFormData({
109
- DbName: 'sys_log_2024',
110
- TableName: 'log_2024_12',
111
- Id: V8.Param.id // 必传
112
- });
113
- ```
114
-
115
- ## 查询文档列表
116
-
117
- ```javascript
118
- var result = V8.MongoDb.GetTableData({
119
- DbName: 'sys_log_2024',
120
- TableName: 'log_2024_12',
121
- _Where: [
122
- ['Type', '=', '访问菜单'],
123
- ['OR', 'Type', '=', '点击V8按钮']
124
- ],
125
- _OrderBy: 'CreateTime',
126
- _OrderByType: 'DESC',
127
- _PageIndex: 1,
128
- _PageSize: 20
129
- });
130
- ```
131
-
132
- `GetFormData` 和 `GetTableData` 属于 dynamic 无模式读取。服务端会在 MongoDB 投影阶段过滤 BSON 内部 `_t` CLR 类型判别字段,避免存量强类型 C# 写入留下的旧类型名称触发反序列化失败。`_t` 不是 V8 业务契约;业务需要类型标记时应使用自有字段(例如 `DocumentType`),不得读取、筛选或依赖 `_t`。强类型 C# MongoDB 模型仍按自身的多态映射处理。
133
-
134
- ## 实战模式
135
-
136
- ### IoT 设备日志存储
137
-
138
- ```javascript
139
- // 接收 MQTT 消息后存入 MongoDB
140
- var eventName = V8.EventName;
141
- if (eventName === 'MessageReceived') {
142
- V8.MongoDb.AddFormData({
143
- DbName: 'iot_data',
144
- TableName: 'device_log_' + DateNow('yyyy_MM'),
145
- _FormData: {
146
- DeviceId: V8.MQTT.ClientId,
147
- Topic: V8.MQTT.Topic,
148
- Payload: V8.MQTT.Payload,
149
- Timestamp: DateNow('yyyy-MM-dd HH:mm:ss')
150
- }
151
- });
152
- }
153
- ```
154
-
155
- ### 操作审计日志
156
-
157
- ```javascript
158
- // 在 SubmitAfterServerV8.js 中记录审计日志到 MongoDB
159
- V8.MongoDb.AddFormData({
160
- DbName: 'audit_log',
161
- TableName: 'form_audit_' + DateNow('yyyy'),
162
- _FormData: {
163
- TableName: V8.TableModel.Name,
164
- Action: V8.FormSubmitAction,
165
- DataId: V8.Form.Id,
166
- UserId: V8.CurrentUser.Id,
167
- UserName: V8.CurrentUser.Name,
168
- OldData: V8.FormSubmitAction === 'Update' ? JSON.stringify(V8.OldForm) : null,
169
- NewData: JSON.stringify(V8.Form),
170
- CreateTime: DateNow('yyyy-MM-dd HH:mm:ss')
171
- }
172
- });
173
- ```
174
-
175
- ### 按月分表查询
176
-
177
- ```javascript
178
- // 查询指定月份的日志
179
- var month = V8.Param.month || DateNow('yyyy_MM');
180
- var result = V8.MongoDb.GetTableData({
181
- DbName: 'sys_log_2024',
182
- TableName: 'log_' + month,
183
- _Where: [
184
- ['UserId', '=', V8.CurrentUser.Id]
185
- ]
186
- });
187
-
188
- return { Code: 1, Data: result };
189
- ```
190
-
191
- ## 注意事项
192
-
193
- - MongoDB 参数统一使用**对象格式**:`{ DbName, TableName, Id, _FormData, _Where, _OrderBy, _OrderByType }`
194
- - `DbName` 是 MongoDB 数据库名,`TableName` 是集合名
195
- - `_Where` 条件语法与 `V8.FormEngine` 一致
196
- - 批量写入仅接受安全字段名、已知操作符和非空条件;条件中的租户、用户和资源 Id 应来自 `V8.OsClient` / `V8.CurrentUser` / 权威回查,不得信任 `V8.Param` 中的同名身份字段
197
- - 非主库 V8 运行时会把 MongoDB 操作绑定到当前租户;显式传入其它 `OsClient` 不能跨租户
198
- - 适合存储日志、IoT 数据、大文档等非结构化 / 海量数据
199
- - 建议按时间分库分表(如 `log_2024_01`),便于清理历史数据
200
- - MongoDB 操作不参与 `V8.DbTrans` 事务。批量写入 `Code=1` 后即是已提交事实;后续 Hook/投递失败应返回警告或进入补偿,不得返回“未发生”导致盲目重试,重试必须有稳定业务 Id 幂等
1
+ ---
2
+ name: v8-mongodb
3
+ description: Microi V8 MongoDB 指南。用于使用 V8.MongoDb AddFormData、UptFormData、UptFormDataByWhere、DelFormData、DelFormDataByWhere、GetFormData、GetTableData、对象过滤和文档 Id。
4
+ ---
5
+
6
+ > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
+
8
+ # Microi V8 MongoDB 操作
9
+
10
+ 你正在开发 Microi 吾码平台的 V8 引擎代码,需要使用 MongoDB 存储非结构化数据(如日志、IoT 数据、大文档等)。
11
+
12
+ ## V8.MongoDb API
13
+
14
+ ### 存量 MongoDB 兼容诊断
15
+
16
+ - `reports wire version 6 ... requires at least 9` 是驱动与服务端不兼容,不是日志为空,也不是 Token 失效。先记录原始错误和服务端真实协议,不能把 wire version 6 推断成 MongoDB 4.2。
17
+ - 平台兼容镜像以含安全修复的驱动 3.11.2 构建,恢复平台 CRUD/日志所需的 MongoDB 3.6 协议路径;不是降级至 2.30,也不声明上游继续维护 3.6。来源、单文件补丁和摘要维护在 `Microi.Server/ThirdParty/MongoDB.Driver/`。
18
+ - 修改该兼容层必须通过真实 3.6 与当前 7.x 的认证、BSON、读写、索引、幂等重放、游标和租户隔离矩阵。不得只验证编译或 ping,也不得把驱动兼容当作修复旧数据库服务端自身漏洞。
19
+ - C# 驱动改动需要更新后端镜像才生效。镜像更新后通过 `microi_query_system_observability` 回读日志、队列持久化和错误状态;查询失败应原样报错,禁止返回成功空表。
20
+
21
+ | 方法 | 说明 |
22
+ |------|------|
23
+ | `V8.MongoDb.AddFormData({...})` | 新增文档 |
24
+ | `V8.MongoDb.UptFormData({...})` | 修改文档(按 Id) |
25
+ | `V8.MongoDb.UptFormDataByWhere({...})` | 按非空 `_Where` 批量修改,禁止修改 `_id` |
26
+ | `V8.MongoDb.DelFormData({...})` | 删除文档(按 Id) |
27
+ | `V8.MongoDb.DelFormDataByWhere({...})` | 按非空 `_Where` 批量删除 |
28
+ | `V8.MongoDb.GetFormData({...})` | 查询单个文档(按 Id) |
29
+ | `V8.MongoDb.GetTableData({...})` | 查询文档列表 |
30
+ | `V8.MongoDb.NewId()` | 生成 MongoDB Id |
31
+
32
+ ## 新增文档
33
+
34
+ ```javascript
35
+ var newId = V8.MongoDb.NewId();
36
+ V8.MongoDb.AddFormData({
37
+ DbName: 'sys_log_2024', // 数据库名
38
+ TableName: 'log_2024_12', // 集合(表)名
39
+ Id: newId, // 可选,不指定自动生成
40
+ _FormData: {
41
+ UserId: V8.CurrentUser.Id,
42
+ Action: '登录',
43
+ IP: '192.168.1.1',
44
+ CreateTime: DateNow('yyyy-MM-dd HH:mm:ss')
45
+ }
46
+ });
47
+ ```
48
+
49
+ ## 修改文档
50
+
51
+ ```javascript
52
+ V8.MongoDb.UptFormData({
53
+ DbName: 'sys_log_2024',
54
+ TableName: 'log_2024_12',
55
+ Id: V8.Param.id, // 必传
56
+ _FormData: {
57
+ Action: '更新操作',
58
+ UpdateTime: DateNow('yyyy-MM-dd HH:mm:ss')
59
+ }
60
+ });
61
+ ```
62
+
63
+ ### 按条件批量修改
64
+
65
+ ```javascript
66
+ var result = V8.MongoDb.UptFormDataByWhere({
67
+ DbName: 'diy_chat_' + V8.OsClient.toLowerCase(),
68
+ TableName: 'chat_' + DateNow('yyyy'),
69
+ _Where: [
70
+ ['FromUserId', '=', V8.Param.PeerUserId],
71
+ ['ToUserId', '=', V8.CurrentUser.Id],
72
+ ['IsRead', '=', false]
73
+ ],
74
+ _FormData: { IsRead: true }
75
+ });
76
+ ```
77
+
78
+ `_Where` 缺失、为空或包含无效条件时必须返回失败,不得执行全集合更新。`_FormData` 禁止设置 `_id` 或 `_id.*`。返回值的 `Data` 包含 `MatchedCount` 和 `ModifiedCount`。
79
+
80
+ ## 删除文档
81
+
82
+ ```javascript
83
+ V8.MongoDb.DelFormData({
84
+ DbName: 'sys_log_2024',
85
+ TableName: 'log_2024_12',
86
+ Id: V8.Param.id // 必传
87
+ });
88
+ ```
89
+
90
+ ### 按条件批量删除
91
+
92
+ ```javascript
93
+ var result = V8.MongoDb.DelFormDataByWhere({
94
+ DbName: 'diy_chat_' + V8.OsClient.toLowerCase(),
95
+ TableName: 'chat_last_contact',
96
+ _Where: [
97
+ ['UserId', '=', V8.CurrentUser.Id],
98
+ ['ContactUserId', '=', V8.Param.PeerUserId]
99
+ ]
100
+ });
101
+ ```
102
+
103
+ 删除条件必须包含当前权威用户/资源边界,不能只用可伪造的前端参数。返回值的 `Data` 包含 `DeletedCount`。
104
+
105
+ ## 查询单个文档
106
+
107
+ ```javascript
108
+ var result = V8.MongoDb.GetFormData({
109
+ DbName: 'sys_log_2024',
110
+ TableName: 'log_2024_12',
111
+ Id: V8.Param.id // 必传
112
+ });
113
+ ```
114
+
115
+ ## 查询文档列表
116
+
117
+ ```javascript
118
+ var result = V8.MongoDb.GetTableData({
119
+ DbName: 'sys_log_2024',
120
+ TableName: 'log_2024_12',
121
+ _Where: [
122
+ ['Type', '=', '访问菜单'],
123
+ ['OR', 'Type', '=', '点击V8按钮']
124
+ ],
125
+ _OrderBy: 'CreateTime',
126
+ _OrderByType: 'DESC',
127
+ _PageIndex: 1,
128
+ _PageSize: 20
129
+ });
130
+ ```
131
+
132
+ `GetFormData` 和 `GetTableData` 属于 dynamic 无模式读取。服务端会在 MongoDB 投影阶段过滤 BSON 内部 `_t` CLR 类型判别字段,避免存量强类型 C# 写入留下的旧类型名称触发反序列化失败。`_t` 不是 V8 业务契约;业务需要类型标记时应使用自有字段(例如 `DocumentType`),不得读取、筛选或依赖 `_t`。强类型 C# MongoDB 模型仍按自身的多态映射处理。
133
+
134
+ ## 实战模式
135
+
136
+ ### IoT 设备日志存储
137
+
138
+ ```javascript
139
+ // 接收 MQTT 消息后存入 MongoDB
140
+ var eventName = V8.EventName;
141
+ if (eventName === 'MessageReceived') {
142
+ V8.MongoDb.AddFormData({
143
+ DbName: 'iot_data',
144
+ TableName: 'device_log_' + DateNow('yyyy_MM'),
145
+ _FormData: {
146
+ DeviceId: V8.MQTT.ClientId,
147
+ Topic: V8.MQTT.Topic,
148
+ Payload: V8.MQTT.Payload,
149
+ Timestamp: DateNow('yyyy-MM-dd HH:mm:ss')
150
+ }
151
+ });
152
+ }
153
+ ```
154
+
155
+ ### 操作审计日志
156
+
157
+ ```javascript
158
+ // 在 SubmitAfterServerV8.js 中记录审计日志到 MongoDB
159
+ V8.MongoDb.AddFormData({
160
+ DbName: 'audit_log',
161
+ TableName: 'form_audit_' + DateNow('yyyy'),
162
+ _FormData: {
163
+ TableName: V8.TableModel.Name,
164
+ Action: V8.FormSubmitAction,
165
+ DataId: V8.Form.Id,
166
+ UserId: V8.CurrentUser.Id,
167
+ UserName: V8.CurrentUser.Name,
168
+ OldData: V8.FormSubmitAction === 'Update' ? JSON.stringify(V8.OldForm) : null,
169
+ NewData: JSON.stringify(V8.Form),
170
+ CreateTime: DateNow('yyyy-MM-dd HH:mm:ss')
171
+ }
172
+ });
173
+ ```
174
+
175
+ ### 按月分表查询
176
+
177
+ ```javascript
178
+ // 查询指定月份的日志
179
+ var month = V8.Param.month || DateNow('yyyy_MM');
180
+ var result = V8.MongoDb.GetTableData({
181
+ DbName: 'sys_log_2024',
182
+ TableName: 'log_' + month,
183
+ _Where: [
184
+ ['UserId', '=', V8.CurrentUser.Id]
185
+ ]
186
+ });
187
+
188
+ return { Code: 1, Data: result };
189
+ ```
190
+
191
+ ## 注意事项
192
+
193
+ - MongoDB 参数统一使用**对象格式**:`{ DbName, TableName, Id, _FormData, _Where, _OrderBy, _OrderByType }`
194
+ - `DbName` 是 MongoDB 数据库名,`TableName` 是集合名
195
+ - `_Where` 条件语法与 `V8.FormEngine` 一致
196
+ - 批量写入仅接受安全字段名、已知操作符和非空条件;条件中的租户、用户和资源 Id 应来自 `V8.OsClient` / `V8.CurrentUser` / 权威回查,不得信任 `V8.Param` 中的同名身份字段
197
+ - 非主库 V8 运行时会把 MongoDB 操作绑定到当前租户;显式传入其它 `OsClient` 不能跨租户
198
+ - 适合存储日志、IoT 数据、大文档等非结构化 / 海量数据
199
+ - 建议按时间分库分表(如 `log_2024_01`),便于清理历史数据
200
+ - MongoDB 操作不参与 `V8.DbTrans` 事务。批量写入 `Code=1` 后即是已提交事实;后续 Hook/投递失败应返回警告或进入补偿,不得返回“未发生”导致盲目重试,重试必须有稳定业务 Id 幂等