@microi.net/cli 5.5.9 → 5.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) 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/.workbuddy-plugin/marketplace.json +2 -2
  5. package/.workbuddy-plugin/plugin.json +1 -1
  6. package/assets/build-meta.json +5 -5
  7. package/cordis.patch.yml +1 -1
  8. package/package.json +1 -1
  9. package/scripts/mcp-server.js +99 -99
  10. package/scripts/microi-cli.js +39 -36
  11. package/scripts/microi-skills.meta.json +341 -338
  12. package/skills/.microi-skills-version.json +2 -2
  13. package/skills/.progressive-disclosure-manifest.json +3566 -3566
  14. package/skills/README.md +4 -4
  15. package/skills/ai-engine/SKILL.md +45 -45
  16. package/skills/ai-platform-governance/SKILL.md +177 -177
  17. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  18. package/skills/app-store/SKILL.md +21 -4
  19. package/skills/business-blueprint/SKILL.md +85 -85
  20. package/skills/datasource-engine/SKILL.md +91 -91
  21. package/skills/dos-orm/SKILL.md +15 -0
  22. package/skills/dos-orm/references/api-reference.md +229 -229
  23. package/skills/email-engine/SKILL.md +80 -80
  24. package/skills/email-engine/references/v8-email.md +34 -34
  25. package/skills/job-engine/SKILL.md +154 -154
  26. package/skills/message-notification/SKILL.md +27 -1
  27. package/skills/message-notification/agents/openai.yaml +5 -5
  28. package/skills/message-notification/references/contracts.md +102 -102
  29. package/skills/microi-ai-app-auth.js +652 -652
  30. package/skills/microi-ai-application/SKILL.md +102 -102
  31. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  32. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  33. package/skills/microi-client-frontend/SKILL.md +47 -41
  34. 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 +4 -4
  35. 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 +30 -30
  36. 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 +58 -58
  37. package/skills/microi-codex/SKILL.md +2 -0
  38. package/skills/microi-codex-installer/SKILL.md +216 -216
  39. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  40. package/skills/microi-datasource-mapping/SKILL.md +67 -67
  41. package/skills/microi-db-schema/SKILL.md +6 -6
  42. package/skills/microi-db-schema/references/core-tables.md +18 -18
  43. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  44. package/skills/microi-db-schema/references/schema-overview.md +11 -11
  45. package/skills/microi-db-schema/references/schema.md +46 -46
  46. package/skills/microi-db-schema/references/table-catalog.md +57 -57
  47. package/skills/microi-deployment/SKILL.md +18 -1
  48. package/skills/microi-deployment/references/deployment-matrix.md +101 -101
  49. package/skills/microi-docs-coverage/SKILL.md +10 -0
  50. package/skills/microi-docs-coverage/references/capability-map.md +3 -2
  51. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  52. package/skills/microi-form-engine/SKILL.md +27 -3
  53. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  54. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  55. package/skills/microi-form-layout/SKILL.md +13 -13
  56. 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
  57. package/skills/microi-frontend-sdk/SKILL.md +4 -4
  58. 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
  59. package/skills/microi-left-right-layout/SKILL.md +141 -141
  60. package/skills/microi-microservice/SKILL.md +2 -1
  61. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  62. 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
  63. package/skills/microi-solution-quotation/SKILL.md +78 -78
  64. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  65. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  66. package/skills/microi-sso/SKILL.md +6 -0
  67. package/skills/microi-sso/references/acceptance.md +49 -49
  68. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  69. package/skills/microi-sso/references/inbound.md +53 -53
  70. package/skills/microi-sso/references/outbound.md +39 -39
  71. package/skills/microi-system-delivery/SKILL.md +5 -4
  72. 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 +7 -2
  73. package/skills/microi-ui/SKILL.md +7 -2
  74. package/skills/microi-uniapp-frontend/SKILL.md +134 -134
  75. 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
  76. 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
  77. package/skills/module-engine/SKILL.md +30 -14
  78. package/skills/ocr-engine/SKILL.md +2 -2
  79. package/skills/ocr-engine/agents/openai.yaml +1 -1
  80. package/skills/page-engine/SKILL.md +28 -28
  81. 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
  82. 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
  83. package/skills/performance-testing/SKILL.md +120 -120
  84. package/skills/playwright-e2e/SKILL.md +84 -84
  85. 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
  86. 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
  87. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +20 -20
  88. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -69
  89. package/skills/print-engine/SKILL.md +11 -3
  90. package/skills/production-readonly-audit/SKILL.md +41 -41
  91. package/skills/report-engine/SKILL.md +71 -71
  92. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  93. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  94. package/skills/scripts/sync-embedded-skills.mjs +46 -0
  95. package/skills/scripts/validate-progressive-disclosure.mjs +8 -3
  96. package/skills/search-engine/SKILL.md +75 -75
  97. package/skills/spider-engine/SKILL.md +190 -190
  98. package/skills/system-observability/SKILL.md +169 -157
  99. package/skills/system-observability/references/memory-incident-triage.md +73 -73
  100. package/skills/translate-engine/SKILL.md +1 -1
  101. package/skills/ui-design/SKILL.md +3 -1
  102. package/skills/uniapp-mall-assets/SKILL.md +170 -170
  103. package/skills/unity-integration/SKILL.md +155 -155
  104. package/skills/unity-integration/agents/openai.yaml +4 -4
  105. package/skills/unity-integration/references/ai-app-delivery.md +103 -103
  106. package/skills/unity-integration/references/sdk-api.md +82 -82
  107. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  108. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  109. package/skills/v8-api-config/SKILL.md +4 -0
  110. package/skills/v8-cache-pattern/SKILL.md +306 -306
  111. package/skills/v8-crud-api/SKILL.md +29 -29
  112. 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
  113. package/skills/v8-debugging/SKILL.md +143 -143
  114. package/skills/v8-explorer-tree/SKILL.md +64 -64
  115. 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
  116. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +118 -118
  117. 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
  118. package/skills/v8-file-upload/SKILL.md +5 -2
  119. 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 +2 -2
  120. 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
  121. package/skills/v8-formengine-http/SKILL.md +126 -108
  122. package/skills/v8-frontend-events/SKILL.md +22 -22
  123. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  124. package/skills/v8-frontend-events/references/bluetooth-print.md +247 -247
  125. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +50 -50
  126. package/skills/v8-http-integration/SKILL.md +106 -106
  127. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +31 -31
  128. 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
  129. package/skills/v8-image-processing/SKILL.md +190 -190
  130. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  131. package/skills/v8-image-processing/references/api-reference.md +623 -623
  132. package/skills/v8-menu-buttons/SKILL.md +103 -103
  133. 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
  134. 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
  135. 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
  136. package/skills/v8-mongodb/SKILL.md +65 -65
  137. package/skills/v8-mq-mqtt/SKILL.md +175 -175
  138. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  139. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +137 -137
  140. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  141. package/skills/v8-saas-multi-tenant/SKILL.md +223 -223
  142. package/skills/v8-security/SKILL.md +1 -1
  143. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +122 -122
  144. package/skills/v8-sql-query/SKILL.md +7 -5
  145. package/skills/v8-table-event/SKILL.md +9 -2
  146. package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +1 -1
  147. 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
  148. package/skills/v8-tcp-integration/SKILL.md +1 -1
  149. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  150. package/skills/v8-template-engine/SKILL.md +59 -59
  151. package/skills/v8-utilities/SKILL.md +92 -92
  152. package/skills/v8-utilities/references/client-api-index.md +143 -143
  153. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  154. package/skills/v8-utilities/references/server-api-index.md +74 -74
  155. package/skills/v8-workflow/SKILL.md +13 -4
  156. package/skills/vision-engine/SKILL.md +19 -19
  157. package/skills/vision-engine/references/architecture-and-acceptance.md +34 -34
  158. package/skills/workspace-conventions/SKILL.md +35 -12
  159. 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 +2 -2
  160. 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
  161. 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
@@ -3,69 +3,69 @@
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
5
  <!-- microi-progressive:chunk id=v8-export-import-007 sha256=d2958751b32d5143693cbdb6fb72aeca97f450c80c360aa7d826d4f6595c0ab1 -->
6
- ## PowerPoint 导出
7
-
8
- PowerPoint 的幻灯片尺寸、图片/表格位置与宽高单位均为英寸,默认画布为 16:9(13.333 × 7.5)。
9
-
10
- ```javascript
11
- var pptResult = V8.Office.ExportPowerPoint({
12
- Title: '季度经营汇报',
13
- Author: V8.CurrentUser.Name,
14
- Subject: '季度复盘',
15
- Company: '吾码',
16
- SlideWidth: 13.333,
17
- SlideHeight: 7.5,
18
- FontFamily: 'Microsoft YaHei',
19
- BackgroundColor: 'FFFFFF',
20
- TitleColor: '17365D',
21
- TextColor: '222222',
22
- TitleFontSize: 28,
23
- BodyFontSize: 18,
24
- ShowSlideNumber: true,
25
- Slides: [
26
- {
27
- Layout: 'TitleSlide',
28
- Title: '季度经营汇报',
29
- Subtitle: DateNow('yyyy-MM-dd')
30
- },
31
- {
32
- Layout: 'TitleAndContent',
33
- Title: '核心结论',
34
- Bullets: ['收入保持增长', '重点客户续约稳定'],
35
- TextItems: [
36
- { Text: '风险:回款周期延长', Bullet: true, Level: 0, Bold: true, FontColor: 'C00000' }
37
- ],
38
- Tables: [{
39
- Headers: ['指标', '本期', '目标'],
40
- Rows: [['销售额', '128万', '120万']],
41
- X: 0.7, Y: 4.0, Width: 11.9, Height: 2.2,
42
- HeaderBackgroundColor: '17365D'
43
- }]
44
- },
45
- {
46
- Title: '趋势图',
47
- Images: [{
48
- FileByteBase64: chartBase64,
49
- FileName: 'trend.png',
50
- ContentType: 'image/png',
51
- X: 1.2, Y: 1.5, Width: 10.9, Height: 5.2
52
- }]
53
- }
54
- ]
55
- });
56
- if (pptResult.Code !== 1) return pptResult;
57
- return {
58
- Code: 1,
59
- Data: {
60
- FileName: '季度经营汇报.pptx',
61
- ContentType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
62
- FileByteBase64: System.Convert.ToBase64String(pptResult.Data)
63
- }
64
- };
65
- ```
66
-
67
- `Layout` 支持 `TitleSlide`、`TitleAndContent`。单页支持独立覆盖 `BackgroundColor/TitleColor/TextColor/TitleFontSize/BodyFontSize`。`TextItems` 支持 `Text/Level/Bullet/Bold/Italic/FontSize/FontColor/Alignment`;表格支持位置、尺寸、列宽、表头/单元格颜色;图片支持 Base64/data URI、位置和尺寸。
68
-
6
+ ## PowerPoint 导出
7
+
8
+ PowerPoint 的幻灯片尺寸、图片/表格位置与宽高单位均为英寸,默认画布为 16:9(13.333 × 7.5)。
9
+
10
+ ```javascript
11
+ var pptResult = V8.Office.ExportPowerPoint({
12
+ Title: '季度经营汇报',
13
+ Author: V8.CurrentUser.Name,
14
+ Subject: '季度复盘',
15
+ Company: '吾码',
16
+ SlideWidth: 13.333,
17
+ SlideHeight: 7.5,
18
+ FontFamily: 'Microsoft YaHei',
19
+ BackgroundColor: 'FFFFFF',
20
+ TitleColor: '17365D',
21
+ TextColor: '222222',
22
+ TitleFontSize: 28,
23
+ BodyFontSize: 18,
24
+ ShowSlideNumber: true,
25
+ Slides: [
26
+ {
27
+ Layout: 'TitleSlide',
28
+ Title: '季度经营汇报',
29
+ Subtitle: DateNow('yyyy-MM-dd')
30
+ },
31
+ {
32
+ Layout: 'TitleAndContent',
33
+ Title: '核心结论',
34
+ Bullets: ['收入保持增长', '重点客户续约稳定'],
35
+ TextItems: [
36
+ { Text: '风险:回款周期延长', Bullet: true, Level: 0, Bold: true, FontColor: 'C00000' }
37
+ ],
38
+ Tables: [{
39
+ Headers: ['指标', '本期', '目标'],
40
+ Rows: [['销售额', '128万', '120万']],
41
+ X: 0.7, Y: 4.0, Width: 11.9, Height: 2.2,
42
+ HeaderBackgroundColor: '17365D'
43
+ }]
44
+ },
45
+ {
46
+ Title: '趋势图',
47
+ Images: [{
48
+ FileByteBase64: chartBase64,
49
+ FileName: 'trend.png',
50
+ ContentType: 'image/png',
51
+ X: 1.2, Y: 1.5, Width: 10.9, Height: 5.2
52
+ }]
53
+ }
54
+ ]
55
+ });
56
+ if (pptResult.Code !== 1) return pptResult;
57
+ return {
58
+ Code: 1,
59
+ Data: {
60
+ FileName: '季度经营汇报.pptx',
61
+ ContentType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
62
+ FileByteBase64: System.Convert.ToBase64String(pptResult.Data)
63
+ }
64
+ };
65
+ ```
66
+
67
+ `Layout` 支持 `TitleSlide`、`TitleAndContent`。单页支持独立覆盖 `BackgroundColor/TitleColor/TextColor/TitleFontSize/BodyFontSize`。`TextItems` 支持 `Text/Level/Bullet/Bold/Italic/FontSize/FontColor/Alignment`;表格支持位置、尺寸、列宽、表头/单元格颜色;图片支持 Base64/data URI、位置和尺寸。
68
+
69
69
  <!-- /microi-progressive:chunk -->
70
70
  <!-- microi-progressive:chunk id=v8-export-import-008 sha256=4dcd566dd9c5b38703831c67cc5cc2f2a99b0e7121fe2d2be2c068cfc8f739c3 -->
71
71
  ## 完整导入模式(含进度跟踪)
@@ -140,63 +140,63 @@ return { Code: 1, Data: stepStr ? JSON.parse(stepStr) : [] };
140
140
 
141
141
  <!-- /microi-progressive:chunk -->
142
142
  <!-- microi-progressive:chunk id=v8-export-import-009 sha256=76d08b493419719094a95a5b760a83ae09b136bd54d66d2362efd428dea03ff8 -->
143
- ## 接收并下载文件(HTTP 链接转 Excel)
144
-
145
- ```javascript
146
- // 从 URL 下载图片插入 Excel 等场景
147
- var resp = V8.Http.GetResponse({
143
+ ## 接收并下载文件(HTTP 链接转 Excel)
144
+
145
+ ```javascript
146
+ // 从 URL 下载图片插入 Excel 等场景
147
+ var resp = V8.Http.GetResponse({
148
148
  Url: 'https://static.itdos.com/path/file.png'
149
149
  });
150
- var bytes = resp.RawBytes; // .NET byte[]
151
- var base64 = System.Convert.ToBase64String(bytes);
152
- ```
153
-
150
+ var bytes = resp.RawBytes; // .NET byte[]
151
+ var base64 = System.Convert.ToBase64String(bytes);
152
+ ```
153
+
154
154
  <!-- /microi-progressive:chunk -->
155
155
  <!-- microi-progressive:chunk id=v8-export-import-010 sha256=0df463f76ba60100c087364b48dab1886d1315b093577ea9485471b34a7a3f6c -->
156
- ## 子表导入自动关联主表
157
-
158
- 当单独导入 `TableChild` 子表时,Excel 经常没有主表 Id,只带项目编号、客户名称等业务字段。默认导入引擎支持通过子表控件配置批量反查主表,并自动补齐子表外键。
159
-
160
- 本节只适用于“主表 1:N 子表”;单条独立记录关联应使用 `JoinForm`,不能把明细导入模型
161
- 设计成 `JoinForm`。在主表 `TableChild` 字段的 `Config` 中配置,其中子表、菜单和外键
162
- 位于 Config 根节点,导入选项位于 `Config.TableChild`:
163
-
164
- ```json
165
- {
166
- "TableChildTableId": "子表 diy_table.Id",
167
- "TableChildSysMenuId": "子表 sys_menu.Id",
168
- "TableChildSysMenuName": "项目成品清单",
169
- "TableChildFkFieldName": "XiangmuId",
170
- "TableChild": {
171
- "PrimaryTableFieldName": "Id",
172
- "ImportAutoFillFk": true,
173
- "FieldRelations": [
174
- ["Code", "XiangmuBM", true],
175
- ["Name", "XiangmuMC"]
176
- ]
177
- }
178
- }
179
- ```
180
-
181
- 配置含义:
182
-
183
- - 根节点 `TableChildTableId` / `TableChildSysMenuId` / `TableChildFkFieldName` 必须是
184
- 回读后的真实子表、隐藏子菜单和子表物理外键,不能猜 Id,也不能放进内层
185
- `Config.TableChild`。
186
- - `ImportAutoFillFk`:是否在导入子表时自动补齐 Config 根节点指定的
187
- `TableChildFkFieldName`;默认建议开启。
188
- - `FieldRelations`:每项为 `[主表字段, 子表/Excel字段, 是否参与导入匹配]`。全部关系用于新增回写和导入回填;第三位为 `true` 的关系用于反查主表,多项为 `true` 时作为组合条件匹配。
189
- - 不要把所有回填关系都标为 `true`。例如 Excel 只保证有项目编号时,`["Code","XiangmuBM",true]` 负责匹配,`["Name","XiangmuMC"]` 只在找到主表后补名称。
190
- - 后端继续读取旧版 `ImportParentMatchFieldName` / `ImportChildMatchFieldName`、`ImportRelations`、`ImportBackfillFields` 和根节点 `TableChildCallbackField`;新版前端会合并去重为 `FieldRelations`,并在字段下次保存时清除旧键。
191
-
192
- 运行规则:
193
-
194
- - 只有子表外键为空时才补齐;Excel 已传外键时不覆盖。
195
- - `FieldRelations` 回填只有在子表对应字段为空时才写入;Excel 已传该字段值时不覆盖。
196
- - 导入前按业务字段批量查询主表,避免逐行查询。
197
- - 从主表表单内、左右树形页面或 `V8.OpenAnyTable` 带主表条件打开子表后导入时,即使 Excel 没有匹配字段,也可以通过固定主表 Id 查询主表并回填子表外键和全部 `FieldRelations`。
198
- - 如果业务字段为空、主表找不到或匹配到多条主表,当前行不自动补齐,并写入导入进度/后台日志,避免错误关联。
199
- - 示例:项目主表 `xiangmuguanli.Code` 匹配用料清单 `yongliaoqqingdan.XiangmuBM`,自动写入 `yongliaoqqingdan.XiangmuID`。
200
- - 示例:项目主表 `xiangmuguanli.Name` 回填成品清单 `xiangmugoujianqd.XiangmuMC`,保证导入模板缺少项目名称列时列表仍显示正常。
201
-
156
+ ## 子表导入自动关联主表
157
+
158
+ 当单独导入 `TableChild` 子表时,Excel 经常没有主表 Id,只带项目编号、客户名称等业务字段。默认导入引擎支持通过子表控件配置批量反查主表,并自动补齐子表外键。
159
+
160
+ 本节只适用于“主表 1:N 子表”;单条独立记录关联应使用 `JoinForm`,不能把明细导入模型
161
+ 设计成 `JoinForm`。在主表 `TableChild` 字段的 `Config` 中配置,其中子表、菜单和外键
162
+ 位于 Config 根节点,导入选项位于 `Config.TableChild`:
163
+
164
+ ```json
165
+ {
166
+ "TableChildTableId": "子表 diy_table.Id",
167
+ "TableChildSysMenuId": "子表 sys_menu.Id",
168
+ "TableChildSysMenuName": "项目成品清单",
169
+ "TableChildFkFieldName": "XiangmuId",
170
+ "TableChild": {
171
+ "PrimaryTableFieldName": "Id",
172
+ "ImportAutoFillFk": true,
173
+ "FieldRelations": [
174
+ ["Code", "XiangmuBM", true],
175
+ ["Name", "XiangmuMC"]
176
+ ]
177
+ }
178
+ }
179
+ ```
180
+
181
+ 配置含义:
182
+
183
+ - 根节点 `TableChildTableId` / `TableChildSysMenuId` / `TableChildFkFieldName` 必须是
184
+ 回读后的真实子表、隐藏子菜单和子表物理外键,不能猜 Id,也不能放进内层
185
+ `Config.TableChild`。
186
+ - `ImportAutoFillFk`:是否在导入子表时自动补齐 Config 根节点指定的
187
+ `TableChildFkFieldName`;默认建议开启。
188
+ - `FieldRelations`:每项为 `[主表字段, 子表/Excel字段, 是否参与导入匹配]`。全部关系用于新增回写和导入回填;第三位为 `true` 的关系用于反查主表,多项为 `true` 时作为组合条件匹配。
189
+ - 不要把所有回填关系都标为 `true`。例如 Excel 只保证有项目编号时,`["Code","XiangmuBM",true]` 负责匹配,`["Name","XiangmuMC"]` 只在找到主表后补名称。
190
+ - 后端继续读取旧版 `ImportParentMatchFieldName` / `ImportChildMatchFieldName`、`ImportRelations`、`ImportBackfillFields` 和根节点 `TableChildCallbackField`;新版前端会合并去重为 `FieldRelations`,并在字段下次保存时清除旧键。
191
+
192
+ 运行规则:
193
+
194
+ - 只有子表外键为空时才补齐;Excel 已传外键时不覆盖。
195
+ - `FieldRelations` 回填只有在子表对应字段为空时才写入;Excel 已传该字段值时不覆盖。
196
+ - 导入前按业务字段批量查询主表,避免逐行查询。
197
+ - 从主表表单内、左右树形页面或 `V8.OpenAnyTable` 带主表条件打开子表后导入时,即使 Excel 没有匹配字段,也可以通过固定主表 Id 查询主表并回填子表外键和全部 `FieldRelations`。
198
+ - 如果业务字段为空、主表找不到或匹配到多条主表,当前行不自动补齐,并写入导入进度/后台日志,避免错误关联。
199
+ - 示例:项目主表 `xiangmuguanli.Code` 匹配用料清单 `yongliaoqqingdan.XiangmuBM`,自动写入 `yongliaoqqingdan.XiangmuID`。
200
+ - 示例:项目主表 `xiangmuguanli.Name` 回填成品清单 `xiangmugoujianqd.XiangmuMC`,保证导入模板缺少项目名称列时列表仍显示正常。
201
+
202
202
  <!-- /microi-progressive:chunk -->
@@ -3,40 +3,40 @@
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
5
  <!-- microi-progressive:chunk id=v8-export-import-011 sha256=63cfa4a963d5c37e81c63f5c2b6b47a4709d1a0896d76e9feba4566d118cfe6b -->
6
- ## 安全 / 性能注意
7
-
8
- - ❌ 不要在循环中逐条 `AddFormData` 而不传 `V8.DbTrans`:每条独立事务,性能差且部分失败会留脏数据
6
+ ## 安全 / 性能注意
7
+
8
+ - ❌ 不要在循环中逐条 `AddFormData` 而不传 `V8.DbTrans`:每条独立事务,性能差且部分失败会留脏数据
9
9
  - ✅ 传 `V8.DbTrans` 让所有插入在同一事务,失败自动回滚
10
10
  - ✅ 大文件(>1万行)建议拆批 `AddTableData` 批量插入
11
11
  - ✅ 校验字段长度、类型、必填,防脏数据
12
12
  - ✅ 接口引擎要返回文件,必须在配置中开启【响应文件】
13
- - ✅ 进度 Key 用 `Microi:${V8.OsClient}:Category:Key` 命名,区分租户
14
-
15
- ### 复盘:应用包同步物理字段时直接 ALTER 导致安装异常
16
-
17
- - 触发场景:目标租户安装或升级应用包时,已有长文本配置超过来源包的 `varchar(N)` 长度,或历史数值字段仍以空字符串保存,`MODIFY COLUMN` 分别报 `Data too long`、`Incorrect integer value: ''`。
18
- - 根因:导入器把来源库物理字段定义直接覆盖到目标库,没有判断是否属于缩窄变更,也没有在文本转数值前兼容平台历史空值。
19
- - 通用规则:物理字段同步必须只扩宽、不缩窄;目标库已有更宽文本类型或更大整数类型时保留目标类型。文本转数值前仅可把空字符串规范为 `NULL`,发现非空非数字值必须中止该字段迁移并报告数量,禁止静默转为 `0` 或截断数据。只要导入日志存在异常,就不得写入“安装成功”的应用版本记录。
20
- - 自动化检查:准备“超长 JSON + 空字符串数值 + 非数字脏值”三类旧库样本,重复安装同一应用包;前两类应无异常且数据不丢失,第三类应明确失败且原数据保持不变。
21
-
22
- ### 复盘:重复字段与业务 Key 改名破坏应用包幂等安装
23
-
24
- - 触发场景:应用包中同一张表出现两个同名字段时,第一次 `ADD COLUMN` 成功、第二次报 `Duplicate column name`;在线应用保留原 Id 但修改 `AppKey/MsKey` 后,目标库按新 Key 查不到记录,又用原 Id 执行 INSERT,报主键重复。
25
- - 根因:安装器只在阶段开始时读取一次物理字段快照,新增后没有更新;同时只按业务 Key 判断在线应用是否存在,没有优先按稳定 Id 对齐,也没有迁移旧 Key 关联的微服务和页面。
26
- - 通用规则:包内字段必须按 `TableId + lower(Name)` 去重,新增物理列后立刻更新内存快照;并发或历史残留造成的重复列错误需回查后按幂等跳过。在线应用、微服务及版本数据必须先按 Id、再按业务 Key 查找;Id 命中而 Key 变化时更新原记录并沿用原 Id,把关联页面统一迁移到新 Key,禁止再次 INSERT。
27
- - 自动化检查:构造“同表重复字段”和“固定 AppId、AppKey 从 old-key 改为 new-key”两个包,连续安装至少两次;每次都应 `Code=1`,物理列、应用、微服务均只有一条,所有页面引用新 Key 且保留原关联 Id。
28
-
29
- ### 复盘:租户历史残留绕过 FormEngine 查询后触发主键和重命名冲突
30
-
31
- - 触发场景:同一应用包在平台主租户、平台子租户和客户独立部署中表现不同;字段导入报 `diy_field.PRIMARY` 重复,字段改名报目标物理列已存在,旧版微服务包还可能调用不存在的 ZIP 哈希函数。
32
- - 根因:导入器只用 FormEngine 判断记录是否存在,软删除、空 OsClient 或历史异常记录会被过滤,但物理主键仍在;字段重命名只判断元数据变化,没有在 DDL 前分别检查源列和目标列;修复只写入某个租户接口引擎,没有让全局升级器按导入器能力重新刷新。
33
- - 通用规则:元数据 UPSERT 必须在 FormEngine 未命中时直查物理主键;同一逻辑字段应恢复后更新,真正的 Id 冲突应生成目标 Id 并建立包内引用映射。执行 `CHANGE COLUMN` 前必须检查源列存在且目标列不存在,目标列已存在时按幂等跳过。导入器修复必须同时更新官方资源、目标租户和自动升级能力检测,禁止只依赖全局版本号。
34
- - 自动化检查:准备软删除主键、空租户主键、同表目标列已存在、旧导入器函数缺失四类租户快照;连续安装系统设置、首页数据包和含源码 ZIP 的微服务包两次,均应 `Code=1` 且版本记录只反映无异常安装。再把全局版本号设为高于修复版本、导入器降级,验证启动升级仍会按能力标记自动恢复导入器且不降低全局版本号。
35
-
36
- ### 复盘:数据库空库导出日期区域化且导入器吞错导致延迟误报
37
-
38
- - 触发场景:空库 SQL 把 MySQL `datetime` 导出成 `05/12/2026 12:50:33` 等区域格式;导入器逐句执行时跳过或吞掉失败语句,后续初始化才误报“缺少默认 admin 用户”。
39
- - 根因:导出器只按 CLR 返回类型格式化,没有以 `information_schema.COLUMNS.DATA_TYPE` 为事实源;导入器把局部失败计数后仍返回成功,也没有在导入结束立即校验核心表和模板账号。
40
- - 通用规则:数据库转储必须按真实物理列类型格式化 `date/datetime/timestamp`,统一输出 ISO 日期;完整 SQL 导入任一语句失败必须整体失败并保留原始数据库错误,禁止吞错继续。导入完成后立即校验核心表和模板账号,后端读取最新发布包时优先直读对象存储,避免 CDN 长缓存返回旧包。
41
- - 自动化检查:制作并发布空库后校验 ZIP 哈希、SQL 中区域日期匹配数为 0、核心表和默认 `admin` 存在;再从真实注册页创建新租户,并使用新租户 `admin` 的初始密码登录一次,不能只验证发布任务或租户记录返回成功。
13
+ - ✅ 进度 Key 用 `Microi:${V8.OsClient}:Category:Key` 命名,区分租户
14
+
15
+ ### 复盘:应用包同步物理字段时直接 ALTER 导致安装异常
16
+
17
+ - 触发场景:目标租户安装或升级应用包时,已有长文本配置超过来源包的 `varchar(N)` 长度,或历史数值字段仍以空字符串保存,`MODIFY COLUMN` 分别报 `Data too long`、`Incorrect integer value: ''`。
18
+ - 根因:导入器把来源库物理字段定义直接覆盖到目标库,没有判断是否属于缩窄变更,也没有在文本转数值前兼容平台历史空值。
19
+ - 通用规则:物理字段同步必须只扩宽、不缩窄;目标库已有更宽文本类型或更大整数类型时保留目标类型。文本转数值前仅可把空字符串规范为 `NULL`,发现非空非数字值必须中止该字段迁移并报告数量,禁止静默转为 `0` 或截断数据。只要导入日志存在异常,就不得写入“安装成功”的应用版本记录。
20
+ - 自动化检查:准备“超长 JSON + 空字符串数值 + 非数字脏值”三类旧库样本,重复安装同一应用包;前两类应无异常且数据不丢失,第三类应明确失败且原数据保持不变。
21
+
22
+ ### 复盘:重复字段与业务 Key 改名破坏应用包幂等安装
23
+
24
+ - 触发场景:应用包中同一张表出现两个同名字段时,第一次 `ADD COLUMN` 成功、第二次报 `Duplicate column name`;在线应用保留原 Id 但修改 `AppKey/MsKey` 后,目标库按新 Key 查不到记录,又用原 Id 执行 INSERT,报主键重复。
25
+ - 根因:安装器只在阶段开始时读取一次物理字段快照,新增后没有更新;同时只按业务 Key 判断在线应用是否存在,没有优先按稳定 Id 对齐,也没有迁移旧 Key 关联的微服务和页面。
26
+ - 通用规则:包内字段必须按 `TableId + lower(Name)` 去重,新增物理列后立刻更新内存快照;并发或历史残留造成的重复列错误需回查后按幂等跳过。在线应用、微服务及版本数据必须先按 Id、再按业务 Key 查找;Id 命中而 Key 变化时更新原记录并沿用原 Id,把关联页面统一迁移到新 Key,禁止再次 INSERT。
27
+ - 自动化检查:构造“同表重复字段”和“固定 AppId、AppKey 从 old-key 改为 new-key”两个包,连续安装至少两次;每次都应 `Code=1`,物理列、应用、微服务均只有一条,所有页面引用新 Key 且保留原关联 Id。
28
+
29
+ ### 复盘:租户历史残留绕过 FormEngine 查询后触发主键和重命名冲突
30
+
31
+ - 触发场景:同一应用包在平台主租户、平台子租户和客户独立部署中表现不同;字段导入报 `diy_field.PRIMARY` 重复,字段改名报目标物理列已存在,旧版微服务包还可能调用不存在的 ZIP 哈希函数。
32
+ - 根因:导入器只用 FormEngine 判断记录是否存在,软删除、空 OsClient 或历史异常记录会被过滤,但物理主键仍在;字段重命名只判断元数据变化,没有在 DDL 前分别检查源列和目标列;修复只写入某个租户接口引擎,没有让全局升级器按导入器能力重新刷新。
33
+ - 通用规则:元数据 UPSERT 必须在 FormEngine 未命中时直查物理主键;同一逻辑字段应恢复后更新,真正的 Id 冲突应生成目标 Id 并建立包内引用映射。执行 `CHANGE COLUMN` 前必须检查源列存在且目标列不存在,目标列已存在时按幂等跳过。导入器修复必须同时更新官方资源、目标租户和自动升级能力检测,禁止只依赖全局版本号。
34
+ - 自动化检查:准备软删除主键、空租户主键、同表目标列已存在、旧导入器函数缺失四类租户快照;连续安装系统设置、首页数据包和含源码 ZIP 的微服务包两次,均应 `Code=1` 且版本记录只反映无异常安装。再把全局版本号设为高于修复版本、导入器降级,验证启动升级仍会按能力标记自动恢复导入器且不降低全局版本号。
35
+
36
+ ### 复盘:数据库空库导出日期区域化且导入器吞错导致延迟误报
37
+
38
+ - 触发场景:空库 SQL 把 MySQL `datetime` 导出成 `05/12/2026 12:50:33` 等区域格式;导入器逐句执行时跳过或吞掉失败语句,后续初始化才误报“缺少默认 admin 用户”。
39
+ - 根因:导出器只按 CLR 返回类型格式化,没有以 `information_schema.COLUMNS.DATA_TYPE` 为事实源;导入器把局部失败计数后仍返回成功,也没有在导入结束立即校验核心表和模板账号。
40
+ - 通用规则:数据库转储必须按真实物理列类型格式化 `date/datetime/timestamp`,统一输出 ISO 日期;完整 SQL 导入任一语句失败必须整体失败并保留原始数据库错误,禁止吞错继续。导入完成后立即校验核心表和模板账号,后端读取最新发布包时优先直读对象存储,避免 CDN 长缓存返回旧包。
41
+ - 自动化检查:制作并发布空库后校验 ZIP 哈希、SQL 中区域日期匹配数为 0、核心表和默认 `admin` 存在;再从真实注册页创建新租户,并使用新租户 `admin` 的初始密码登录一次,不能只验证发布任务或租户记录返回成功。
42
42
  <!-- /microi-progressive:chunk -->
@@ -15,7 +15,10 @@ description: Microi V8 与 MCP 文件上传下载指南。用于处理流式 AI
15
15
 
16
16
  - `ImgUpload`、`FileUpload`、`RichText` 的“禁止匿名访问”是字段权威策略:`Limit=false` 写公有桶,`Limit=true` 写私有桶。普通用户只要通过当前菜单/表的新增或编辑动作授权,也必须按该字段配置执行;不得按用户等级把全部非超级管理员上传统一改成私有桶。
17
17
  - 浏览器上传必须携带 `FormEngineKey + FieldId + SysMenuId`,编辑已有记录再带 `FormDataId`,TableChild 再带父子授权上下文。后端先用 FormEngine 校验动作权限,再从当前租户回读 `diy_field.Component/Config`,用权威 `Limit` 覆盖请求值,并把目录固定为 `ImgUpload→img`、`FileUpload→file`、`RichText→editor`。
18
- - 客户端 `Limit`、`Path`、字段 Id 和菜单 Id 都只是待验证线索。没有可验证字段上下文的普通交互式上传继续强制私有并限制到安全一级目录;不能为了恢复公有字段语义而重新信任裸 `Limit=false`。
18
+ - 客户端 `Limit`、`Path`、字段 Id 和菜单 Id 都只是待验证线索。没有可验证字段上下文的普通交互式上传默认私有并限制到安全一级目录;不能为了恢复公有字段语义而重新信任裸 `Limit=false`。
19
+ - 兼容旧移动端/定制页面时,在普通系统设置 `sys_config.HdfsUploadRules` 配置目录与角色规则,无需逐个改客户端。`Path` 使用区分大小写的租户内相对路径;`RoleIds` 是真实角色 Id 数组,或显式启用 `AllAuthenticated`;`IncludeSubdirectories` 和 `AllowPublic` 默认关闭。只有后端有效角色命中且显式允许公有,才尊重请求 `Limit=false`。规则不是秘密,不必放入后端私有设置,修改权限与服务端判定必须严格受控。
20
+ - 后端 v8.2.9+ 的配置 `Path` 支持 `*`(单层任意字符)、`**`(零到多层目录,须独占层级)、`?`、`[abc]`、`[a-z]`、`[!0-9]`/`[^0-9]`、`{a,b}` 候选及组合;优先 `files/{inspection,quality}/**` 这类最小业务前缀,不能为省事直接向全部用户配置 `** + AllowPublic`。只匹配请求目录,不匹配文件名或服务端追加的年月。实际上传路径不接受通配符;保留目录先于 glob 校验,不能用宽泛规则绕过。最多512字符/规则、4层花括号、32候选、4096令牌;有界动态规划和有界语法缓存不得缓存租户授权结果。先更新全部后端节点再配置新语法,精确旧规则仍兼容。
21
+ - 目录规则只扩展无字段上下文上传,不绕过表/菜单/行权限、租户隔离、保留路径、文件类型、内容检测及配额;不能授予访问密钥会话、私有文件读取或应用发布权限。规则通过系统设置共享缓存读取,保存/删除后失效;应用包只发布字段和可空 DDL,禁止附带会覆盖租户规则的配置数据。验收覆盖授权/未授权角色、路径边界、公私桶、禁用用户、跨租户、规则撤销及缓存生效。
19
22
  - 老 `ImgUpload/FileUpload` 缺失 `Limit` 时兼容为公有;老 `RichText` 缺失上传配置时默认私有。微信待审图片与裁剪/压缩 `_origin` 原图始终私有,字段公有配置不能放宽这些特殊边界。客户端保存与预览必须以上传响应的实际 `Limit` 为准。
20
23
 
21
24
  ## 交互式图片默认压缩(强制)
@@ -144,7 +147,7 @@ Unity `Data`、WASM、Windows 安装包、视频模型等发布资产不得进
144
147
  - 帐号与租户每日额度在共享 Redis 中用单次原子脚本预留,支持多节点;Redis 不可用时失败关闭,不能降级成无限上传。
145
148
  - 额度按 UTC 日期统计。为防并发重试绕过限制,后续对象存储失败也不退还已经预留的额度。
146
149
  - 每日额度只阻断短期滥用;对象存储必须另外配置租户/桶总容量、账单告警、生命周期与实际用量对账。Redis 计数不能作为长期容量事实源。
147
- - 标准表单字段上传按后端回读的 `diy_field.Config` 决定桶,不能按帐号等级覆盖字段策略。没有可验证字段上下文的普通交互式上传无论是否传 `Limit:false` 都强制私有,并只允许平台预定义安全一级目录;非表单公有资产使用受控发布流程或超级管理员入口。
150
+ - 标准表单字段上传按后端回读的 `diy_field.Config` 决定桶,不能按帐号等级覆盖字段策略。无字段上下文的普通上传默认只允许平台预定义私有一级目录;管理员可通过 `sys_config.HdfsUploadRules` 按真实角色明确扩展业务目录和公有权限,不能信任客户端自报角色或裸 `Limit:false`。源码、应用产物等仍使用独立受控发布流程。
148
151
  - 反向代理、Ingress/IIS 的请求体上限应与进程级 HTTP 解析硬顶协调。字段自身的类型、后缀、大小和数量配置只能进一步收紧当前租户有效值,不能替代平台硬顶。
149
152
 
150
153
  ### 复盘:“当前租户已停用文件上传”
@@ -67,7 +67,7 @@ var extractResult = V8.Method.ExtractZip({
67
67
 
68
68
  - 表单设计器的“禁止匿名访问”是服务端权威字段配置,不是管理员等级开关:未勾选即 `Limit=false`,勾选即 `Limit=true`。有当前表单新增/编辑权限的普通用户也可以按公有字段写入公有桶。
69
69
  - PC 图片、文件、富文本上传提交 `FormEngineKey + FieldId + SysMenuId`;编辑记录附加 `FormDataId`,TableChild 附加父子授权链。后端校验动作权限并回读当前租户 `diy_field.Config` 后覆盖客户端 `Limit/Path`。客户端篡改 `Limit=false`、选择其它字段或提交任意目录都不能获得公有写入。
70
- - 无字段上下文的普通上传保持私有;`ImgUpload/FileUpload` 老字段未保存 `Limit` 时兼容公有,`RichText` 缺失配置时默认私有。微信待审图片以及裁剪/压缩原图始终私有。
70
+ - 无字段上下文的普通上传默认保持私有;管理员可通过普通系统设置 `HdfsUploadRules` 按真实角色授权业务目录,并显式允许公有文件。后端 v8.2.9+ 支持 `*`、`**`、`?`、字符集合/范围/排除和花括号候选,实际路径仍先做保留目录与穿越校验。`ImgUpload/FileUpload` 老字段未保存 `Limit` 时兼容公有,`RichText` 缺失配置时默认私有。微信待审图片以及裁剪/压缩原图始终私有。
71
71
  - 验收使用“普通用户 + 超级管理员 × 公有字段 + 私有字段 × 新增 + 编辑”矩阵,同时核对响应 `Limit`、实际对象桶、公有匿名读取与私有签名读取。单独用 HTTP 请求传 `Limit=false` 不能证明字段策略正确。
72
72
 
73
73
  ### 默认 MinIO 桶名与安装验收
@@ -76,7 +76,7 @@ var extractResult = V8.Method.ExtractZip({
76
76
  - `MinIOEndPointInternet` / `MinIOPrivateEndPoint` 同时兼容 `host:port` 与 `http(s)://host:port`。Provider 必须先归一化为 Host、Port、UseSsl,再调用 MinIO SDK 的 host/port 重载;不得把包含协议的整串 URL 直接作为 hostname,否则会出现 `Invalid URI: The hostname could not be parsed.`。显式 URL 的协议优先于历史 SSL 开关;端点禁止携带用户名密码、桶路径、查询或片段。
77
77
  - 安装脚本创建 `mci-public` 后必须设置匿名下载权限,并把 `HDFS=MinIO`、内外网端点、AccessKey/SecretKey、`MinIOPrivateBucketName=mci-private`、`MinIOPublicBucketName=mci-public` 同步写入当前租户的 `sys_osclients`。
78
78
  - 安装脚本还必须同步当前有效 `sys_config`:`ApiBase` 使用对外可访问的 API 端口,`FileServer` 使用 `http://<访问IP>:<MinIO API端口>/mci-public`。`ApiBase` 不能误用 Web 前端端口,因为 V8 代码会直接在其后拼接 `/api/...` 或 `/apiengine/...`。
79
- - 安装验收必须使用真实登录 Token 和两个权威字段分别执行一次公有、私有上传:公有字段的对象匿名访问应返回 `200`,私有字段对象匿名访问应返回 `403`,私有文件通过授权签名 URL 访问应返回 `200`,并核对下载内容与上传内容一致。超级管理员可另用直接上传验证桶初始化;普通用户只传 `Limit=false` 的裸请求应继续落入私有桶。
79
+ - 安装验收必须使用真实登录 Token 和两个权威字段分别执行一次公有、私有上传:公有字段的对象匿名访问应返回 `200`,私有字段对象匿名访问应返回 `403`,私有文件通过授权签名 URL 访问应返回 `200`,并核对下载内容与上传内容一致。超级管理员可另用直接上传验证桶初始化;未命中管理员公有目录授权规则时,普通用户只传 `Limit=false` 的裸请求应继续落入私有桶。
80
80
 
81
81
  ### 复盘:签名 HEAD 被代理转换为 GET 导致上传后回读误报
82
82