@microi.net/cli 5.8.0 → 5.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) 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 +64 -64
  10. package/scripts/microi-skills.meta.json +284 -281
  11. package/skills/.microi-skills-version.json +2 -2
  12. package/skills/.progressive-disclosure-manifest.json +432 -432
  13. package/skills/README.md +2 -1
  14. package/skills/ai-engine/references/ai-employees.md +4 -0
  15. package/skills/ai-platform-governance/SKILL.md +8 -8
  16. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +9 -9
  17. package/skills/app-store/SKILL.md +53 -3
  18. package/skills/microi/SKILL.md +14 -0
  19. package/skills/microi-ai-application/SKILL.md +9 -0
  20. package/skills/microi-client-frontend/SKILL.md +5 -5
  21. package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +3 -3
  22. package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +4 -4
  23. package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +3 -3
  24. package/skills/microi-codex/SKILL.md +9 -0
  25. package/skills/microi-deployment/SKILL.md +7 -0
  26. package/skills/microi-deployment/references/deployment-matrix.md +8 -0
  27. package/skills/microi-form-layout/SKILL.md +6 -6
  28. package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +3 -3
  29. package/skills/microi-frontend-sdk/SKILL.md +6 -6
  30. package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +7 -7
  31. package/skills/microi-mobile-app-quality/SKILL.md +12 -8
  32. package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +10 -10
  33. package/skills/microi-mobile-app-quality/references/progressive-02-9-/344/270/273/351/242/230/345/210/207/346/215/242/345/277/205/351/241/273/347/234/237/345/256/236/344/270/224/345/205/250/345/261/200/347/224/237/346/225/210.md +4 -4
  34. package/skills/microi-system-delivery/SKILL.md +5 -5
  35. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +1 -1
  36. package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +6 -4
  37. package/skills/microi-ui/SKILL.md +6 -6
  38. package/skills/microi-ui/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/234/272/346/231/257/350/223/235/345/233/276.md +5 -5
  39. package/skills/microi-uniapp-frontend/SKILL.md +10 -10
  40. package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +7 -7
  41. package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +10 -10
  42. package/skills/page-engine/SKILL.md +8 -8
  43. package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +3 -3
  44. package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +4 -4
  45. package/skills/playwright-e2e/SKILL.md +8 -8
  46. package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +5 -5
  47. package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +3 -3
  48. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +7 -7
  49. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +4 -4
  50. package/skills/system-observability/SKILL.md +3 -0
  51. package/skills/ui-design/SKILL.md +7 -7
  52. package/skills/ui-design/references/progressive-01-/351/242/234/350/211/262/344/275/223/347/263/273-css-variables-/346/224/257/346/214/201/344/270/273/351/242/230/345/210/207/346/215/242.md +2 -2
  53. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +3 -3
  54. package/skills/ui-design/references/progressive-03-/345/212/250/346/225/210/350/247/204/350/214/203-/344/270/260/345/257/214/344/275/206/344/270/215/345/215/241.md +2 -2
  55. package/skills/ui-design/references/progressive-04-/347/273/204/344/273/266/351/243/216/346/240/274/351/200/237/346/237/245.md +1 -1
  56. package/skills/ui-design/references/progressive-05-/347/247/273/345/212/250/347/253/257/344/270/223/347/224/250/350/247/204/350/214/203.md +3 -3
  57. package/skills/ui-design/references/progressive-06-/344/270/273/351/242/230/345/210/207/346/215/242/345/256/236/347/216/260.md +2 -2
  58. package/skills/ui-design/references/progressive-07-/351/200/237/346/237/245-/344/273/216/345/244/264/346/220/255/345/273/272/344/270/200/344/270/252/347/247/273/345/212/250/347/253/257/351/241/265/351/235/242.md +4 -4
  59. package/skills/ui-design/references/progressive-08-/350/241/250/345/215/225/345/210/206/347/273/204/350/247/204/350/214/203-tabs-vs-collapsegroup-/345/274/272/345/210/266.md +5 -5
  60. package/skills/unity-integration/references/ai-app-delivery.md +16 -0
  61. package/skills/v8-api-config/SKILL.md +6 -0
  62. package/skills/v8-crud-api/SKILL.md +9 -7
  63. package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +8 -8
  64. package/skills/v8-crud-api/references/progressive-02-where-/346/235/241/344/273/266/350/257/255/346/263/225/351/200/237/346/237/245.md +2 -2
  65. package/skills/v8-export-import/SKILL.md +4 -4
  66. package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +3 -3
  67. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +4 -4
  68. package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +1 -1
  69. package/skills/v8-file-upload/SKILL.md +25 -4
  70. package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +3 -3
  71. package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +3 -3
  72. package/skills/v8-frontend-events/SKILL.md +6 -6
  73. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +5 -5
  74. package/skills/v8-http-integration/SKILL.md +4 -4
  75. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +7 -7
  76. package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +2 -2
  77. package/skills/v8-image-processing/SKILL.md +1 -1
  78. package/skills/v8-menu-buttons/SKILL.md +4 -4
  79. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +4 -4
  80. package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +5 -5
  81. package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +3 -3
  82. package/skills/v8-mq-mqtt/SKILL.md +2 -2
  83. package/skills/v8-mq-mqtt/references/mqtt-production.md +1 -1
  84. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +1 -1
  85. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +1 -1
  86. package/skills/v8-security/SKILL.md +15 -5
  87. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +3 -3
  88. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +8 -6
  89. package/skills/v8-table-event/SKILL.md +5 -5
  90. package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +6 -6
  91. package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +2 -2
  92. package/skills/v8-workflow/SKILL.md +15 -7
  93. package/skills/v8-workflow/references/progressive-01-/350/212/202/347/202/271/345/274/200/345/247/213-v8-/344/272/213/344/273/266.md +7 -7
  94. package/skills/workspace-conventions/SKILL.md +16 -7
  95. 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 +5 -4
  96. 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 +14 -14
  97. package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +1 -1
@@ -11,6 +11,18 @@ description: Microi V8 与 MCP 文件上传下载指南。用于处理流式 AI
11
11
 
12
12
  公开入口覆盖 `V8.uploadFile`、多文件 `V8.uploadFiles` 与 MCP `microi_upload_file_base64`。多文件上传必须限制并发、逐文件返回结果;Base64 工具只接受明确文件名、大小和租户内目标范围,写后回读路径、大小与哈希。
13
13
 
14
+ ## MCP stdio 与完整包的传输边界
15
+
16
+ - 标准 MCP 服务的 stdio 使用固定 `128 MiB`(`134217728` 字节)未解析 JSON-RPC 缓冲,超过边界立即拒绝并关闭连接;不读取动态环境变量放大。SDK 调用端若仍使用
17
+ 默认 `10 MiB` 缓冲,大响应仍可能关闭客户端,必须核对调用端支持的真实边界。
18
+ - 该限制计算 UTF-8 wire 字节,包含完整 JSON 信封、Base64 和重复 `Data/Result` 正文。单个 Base64 字段的理论原始字节上限约 `96 MiB` 减信封,不能据此保证
19
+ 任意 `64 MiB` 包响应都通过,也不能把它当成 HDFS `256 MiB` 应用包能力的新上限。
20
+ - 已存在的正规完整包协议仍可使用 `PreparedPersistPackageByteBase64`;先按精确正文计算编码和整个请求/响应字节数,保留版本、CAS、哈希、HDFS 回读及快照 finalize。
21
+ 连接关闭属于结果未知,先回读同版本、同请求身份,不能换请求键盲重传。
22
+ - 超过 wire 能力的源码、运行资产优先使用已有目录/文件 stream 或分片协议及其
23
+ 小型指针/回执,不把私有源码、超大资产常态化塞入 JSON/Jint;支持更大正文的其它
24
+ 连接也须有明确边界。不能用增大stdio缓冲绕过能力鉴权、业务配额或包完整性检查。
25
+
14
26
  ## 表单字段的公有桶与私有桶(强制)
15
27
 
16
28
  - `Config.FileUpload.EnableRolePermission=true` 的字段强制私有上传,优先级高于字段和请求 `Limit`。
@@ -71,11 +83,13 @@ description: Microi V8 与 MCP 文件上传下载指南。用于处理流式 AI
71
83
  - 私有正文持久化 `/__microi_richtext_private__/...` 稳定对象标识,严禁保存对象存储签名 URL、`OpenPrivateFile` Ticket、DiyToken 或其它会过期的凭据。每次打开记录时携带 `FormEngineKey/FormDataId/FieldId/SysMenuId` 批量换取短效审计代理地址。
72
84
  - 私有文件后端授权必须重新校验当前租户、菜单、表、行和 RichText 字段,并确认所请求路径精确存在于 `img/video/source.src` 或 `a.href`;普通上传字段的对象/数组只认 `Path/FilePath/FilePathName`,不得递归把 `Name/Size/Metadata` 等任意标量当作路径。未经当前租户 FileServer 主机权威校验的绝对 HTTP(S) URL 不得等价为本地对象 Key;正文文字、`data-src/data-href`、脚本标签和前缀相似路径都必须失败关闭。
73
85
  - 外部匿名页面没有后台记录权限上下文,不能解析私有标识。公开文章应由设计者把 RichText 字段配置为 `Limit=false`,有该表单新增/编辑权限的用户即可按权威配置发布;不得通过延长私有 URL 有效期模拟公开资源。
86
+ - 若业务明确要求撤稿后旧媒体地址立即停止返回字节,使用私有对象和专用批准引用代理:只接受固定业务标识,权威校验当前租户、不可变批准版本与精确媒体引用,读取前后复核发布/许可/撤回状态,限制 MIME/体积并返回 `no-store`;不开放裸路径,不返回签名 URL 或重定向。普通文件短链接口不能代替这种业务撤权能力。
87
+ - 撤回授权与稳定请求键待办先在共享数据库事务提交,再执行 HDFS 删除。未知结果沿用原请求键探查重放,原上传请求摘要保持。删除源对象不等于删除 CDN 缓存;历史公开链接必须有官方失效任务和独立缓存字节读回证据,否则保留未确认状态,不把 `Offline`、隐藏前台或源站 `404` 记作完整撤回。
74
88
 
75
89
  官网客户端读取私有文件统一调用 `/apiengine/platform-private-file-url`,提交 `FilePathName` 或有界 `FilePathNames`,并按资源类型提供权威定位参数:普通表单字段使用 `FormEngineKey + FormDataId + FieldId + SysMenuId`;用户头像使用 `ResourceKind=UserAvatar + ResourceId=用户Id`;菜单/部门导入模板分别使用 `MenuImportTemplate`、`DeptImportTemplate` 与对应记录 Id。CAD 私有派生预览使用 `ResourceKind=FormFieldDerivedPreview`,除表单四元组外必须同时提交字段中保存的 `OriginalFilePathName` 和单个派生 `FilePathName`;后端只接受同目录同 basename 的 DWG→`_preview.dxf`、STEP/STP→`_preview.stl` 唯一映射,并在对象存在后签名。文件柜对象使用 `ResourceKind=FileManagerObject`,`ResourceId` 必须与单个 `FilePathName` 大小写精确相同,并提交能力探针返回的当前租户权威 `SysMenuId`;此类签名只允许平台超级管理员 DiyToken 会话,访问密钥和普通菜单用户一律拒绝。后端会从权威字段或对象存储重新读取并精确匹配路径;管理员也不能只传裸路径绕过对象引用,普通客户端禁止换取私有文件原始 Byte/Stream。旧 `/api/HDFS/GetPrivateFileUrl` 与 `/api/HDFS/MallFileUrl` 只保留令牌格式兼容并转发同一 Managed 接口,新代码不得继续引用。
76
90
 
77
91
  <!-- microi-progressive:begin -->
78
- <!-- microi-progressive:chunk id=v8-file-upload-000 sha256=841bb634227ea21cf97abcbee5dc6220042e73139170e6a6c304bfce83274e7a -->
92
+ <!-- microi-progressive:chunk id=v8-file-upload-000 sha256=6155d8bbc643dc0034c66190ab5b4173ef56eba1d99a994bfce7d12ec70f52ee -->
79
93
  ## 核心 API
80
94
 
81
95
  | API | 说明 |
@@ -94,7 +108,7 @@ description: Microi V8 与 MCP 文件上传下载指南。用于处理流式 AI
94
108
  固定 CDN 应用回填优先使用服务端 `CopyObject`,公有桶复制编译资产、私有桶复制源码;`Limit` 在源与目标间保持一致,`Path` 和 `FilePathName` 均由后端收敛到当前租户。大对象用 `GetObjectSha256` 流式核对原对象和复制目标,公有体验路径仍须从 CDN 独立回读。历史版本目标已存在时须核对字节哈希,发现不同内容立即停止;固定根可在新版本验证后覆盖。`ListObjects` 必须分页并限制到单个应用前缀,不得把这些存储管理原子直接开放为匿名业务接口。
95
109
 
96
110
  <!-- /microi-progressive:chunk -->
97
- <!-- microi-progressive:chunk id=v8-file-upload-001 sha256=bacff382201c915334757946ee60d4a65db4e9663dd9e1f86bb68c1c16589321 -->
111
+ <!-- microi-progressive:chunk id=v8-file-upload-001 sha256=d535a333639a9005f5d20f25e36e2753a11835380713c1bb063ae618e6cea4af -->
98
112
  ## 第三方数据库附件迁移
99
113
 
100
114
  当第三方表只保存附件路径时,先用 `microi_inspect_external_database` / `microi_query_external_database` 或 `V8.Dbs.<DbKey>` 查询记录。`microi_import_external_attachment` 允许后端已确认的 `Level >= 9999` 当前用户直接提供 HTTP/HTTPS URL、API 节点可读的本机绝对路径或 UNC 路径。
@@ -111,7 +125,7 @@ description: Microi V8 与 MCP 文件上传下载指南。用于处理流式 AI
111
125
  可信后端 V8 可用 `V8.Http.GetResponse({ Url: url }).RawBytes` 下载,再用 `System.Convert.ToBase64String` 和 `V8.Method.Upload` 上传。该路径同样必须校验域名、大小、Content-Type、后缀和最终重定向目标。
112
126
 
113
127
  <!-- /microi-progressive:chunk -->
114
- <!-- microi-progressive:chunk id=v8-file-upload-002 sha256=d55c1a7fce715bf15224a74a2ae3006f38bab04bfe876ad88d9cc064fbe7cb9a -->
128
+ <!-- microi-progressive:chunk id=v8-file-upload-002 sha256=176e9f91705f20416e177d7dbdbd32fb8f81dff6ba0da1a45b533795d187f0e0 -->
115
129
  ## 接收前端上传的文件
116
130
 
117
131
  前端发起文件上传时,平台自动把文件以 base64 形式注入到 `V8.FilesByteBase64`:
@@ -227,7 +241,14 @@ Unity `Data`、WASM、Windows 安装包、视频模型等发布资产不得进
227
241
  - 验收至少覆盖:登录成功显示身份、退出后 Token 清空、历史连接一键重连、删除连接、密文落库、服务重启后仍可解密、目标平台缺少能力接口时的升级提示。
228
242
 
229
243
  <!-- /microi-progressive:chunk -->
230
- <!-- microi-progressive:chunk id=v8-file-upload-004 sha256=176fe6d254d2cff9d3dcb4b8620888243d3881704ca1432bbff023c9c553cb74 -->
244
+ <!-- microi-progressive:chunk id=v8-file-upload-004 sha256=8393c7b2b7ce36e563843f43f42e9a06a8cb69fc7b792930912353d846ee769f -->
245
+ ## 空目录标记的受控恢复
246
+
247
+ - 只需移除一个目录占位对象时,使用 `V8.HDFS.DeleteObject({FilePathName:'当前租户目录/', Limit:true/false, EmptyDirectoryOnly:true})` 并等待异步结果。必须是当前租户实际有效超级管理员的可信 V8/DiyToken 会话;不能使用参数中的 `_CurrentUser`、访问密钥或临时维护引擎代替授权。
248
+ - HTTP/MCP 必须使用专用 `/api/HDFS/DeleteEmptyDirectoryMarker` / `microi_delete_empty_directory_marker`,显式选择桶并保留末尾 `/`。旧后端缺路由、非标准结果或成功缺少 `DeletionMode=EmptyDirectoryMarkerOnly` / `VerifiedAbsent=true` 均停止,绝不回退普通递归删除。
249
+ - MCP 默认 dry run;执行 `confirmExecution` 精确等于 `filePathName`。旧 `/api/HDFS/DeleteObject` 不能作为缺少专用路由时的回退。路径拒绝租户根、跨租户、未知绝对前缀、URL、通配符与穿越。原始列表必须完整、大小明确为零,供应商只删精确标记 key,再完整回读;不允许前缀批量删除、忽略续页或把缺失 Size 默认成零。
250
+ - 这不是零字节对象 CAS,也不证明历史 NoPUT。同 key 版本替换没有跨供应商统一条件 DELETE;执行前必须隔离原请求并排除活跃写入。保留历史/当前证据的区别;未知结果先只读回查,不换请求键、不清其它对象、不自动再次 PUT。
251
+
231
252
  ## 下载远程文件并存到 HDFS
232
253
 
233
254
  ```javascript
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-file-upload-005 sha256=9efd186d8af26854bbed4d675b31fff57202a0139094798d9a41c3e4769fd092 -->
5
+ <!-- microi-progressive:chunk id=v8-file-upload-005 sha256=45f848d78235d8a315663fc77a2d9565b1a22791917591704040712fb56d1bee -->
6
6
  ## 公有桶 vs 私有桶
7
7
 
8
8
  ### 应用商城 ZIP
@@ -153,7 +153,7 @@ var url = V8.Method.GetPrivateFileUrl({
153
153
  - `Limit:false` 的公有文件允许通过 CDN/公有桶直接访问,不要求记录用户行为日志,也不要为了审计强制改走私有代理。
154
154
 
155
155
  <!-- /microi-progressive:chunk -->
156
- <!-- microi-progressive:chunk id=v8-file-upload-006 sha256=8d4fedab2418c7df7973b78d4b9d6c5fa77907929d401800689cd1b5b468f32f -->
156
+ <!-- microi-progressive:chunk id=v8-file-upload-006 sha256=2dcf2dd7a571cc4757e9015cf213191be2dc3f041d91b0de51ed8ee00b0b86e7 -->
157
157
  ## 接口直接响应文件(下载/导出)
158
158
 
159
159
  接口引擎需要在配置中开启【**响应文件**】选项,然后返回特殊结构:
@@ -204,7 +204,7 @@ return {
204
204
  注意:如果远程系统返回的是错误页、登录页、业务容器格式(例如金蝶 PLM 电子仓 `KD_C_PLM`、或其它文件头不是 `%PDF-` 的伪 PDF),不要在 V8 里伪装成 PDF。后端会返回 JSON 错误,包含 `ExpectedFirstAscii`、`ActualFirstAscii`、`ActualFirstHex`、`Length`,按这些信息排查上游下载接口。
205
205
 
206
206
  <!-- /microi-progressive:chunk -->
207
- <!-- microi-progressive:chunk id=v8-file-upload-007 sha256=59ebcaa605d26def44cd027c0975a01fffee8670a890b4ed18b4138527be8a1b -->
207
+ <!-- microi-progressive:chunk id=v8-file-upload-007 sha256=710eb73f616aff2ebce65a82568abe8208b701c1211a7e95ce500b1ce20b363f -->
208
208
  ## 通过 URL 列表批量下载并入库
209
209
 
210
210
  ```javascript
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-file-upload-008 sha256=b7b809862a9d82f0270ae99486acb5fe23185b9d5efad073ae39b282724e2e32 -->
5
+ <!-- microi-progressive:chunk id=v8-file-upload-008 sha256=5dacdb706cc408a76a576da55c497756cd974819863162c6a50ad36504738051 -->
6
6
  ## Office 文件在线编辑版本号规则
7
7
 
8
8
  ### 文件柜 Office 版本
@@ -49,7 +49,7 @@ OnlyOffice 前端组件 npm 包不能替代 Docs 文档服务。`DocsAPI.DocEdit
49
49
  ```
50
50
 
51
51
  <!-- /microi-progressive:chunk -->
52
- <!-- microi-progressive:chunk id=v8-file-upload-009 sha256=1cc3ff1b6a5c756d957819f198c13ea181143db484527d1931aefc8e0d52993c -->
52
+ <!-- microi-progressive:chunk id=v8-file-upload-009 sha256=fa3e980be41d5e1030b516f91ddaf5505917073936f08f919f34cad979b9b054 -->
53
53
  ## ImgUpload / FileUpload 字段值兼容规则
54
54
 
55
55
  `ImgUpload` 不能假设只是一种值结构。PC 表单、移动端、旧数据、单图/多图、公开/私有桶会混合出现以下格式:
@@ -132,7 +132,7 @@ function publicUploadUrl(path) {
132
132
  跨端保存时保留上传响应的实际 `Limit`(兼容布尔值、`1/0` 与对应字符串),只删除临时签名地址和本地预览状态。历史对象缺少该标记时按字段配置取址;已有私有标记优先于公有字段缺省值。单图字段兼容历史单元素数组,不应在字段值预处理阶段把数组直接清空。
133
133
 
134
134
  <!-- /microi-progressive:chunk -->
135
- <!-- microi-progressive:chunk id=v8-file-upload-010 sha256=229294a07a8db953219c35292db5558430addb576505695b9ce88a275eb46232 -->
135
+ <!-- microi-progressive:chunk id=v8-file-upload-010 sha256=f34d476435c3a8321df017b481771d757f580c8d75f7648fdd54ee1c624d116c -->
136
136
  ## 安全注意
137
137
 
138
138
  - ❌ 不要让前端任意指定 `Path`(路径穿越风险),只允许后端固定路径
@@ -14,7 +14,7 @@ description: Microi 前端 V8 事件与客户端能力指南。用于编写浏
14
14
  > 本文重点是 **字段事件、按钮事件、列表事件、模板引擎、其它前端钩子**。
15
15
 
16
16
  <!-- microi-progressive:begin -->
17
- <!-- microi-progressive:chunk id=v8-frontend-events-000 sha256=70e28f65232cb781fcf3dadd2e1896bd1534b15876545170e81667aa6322724d -->
17
+ <!-- microi-progressive:chunk id=v8-frontend-events-000 sha256=69ad0ebf0c8aca6edcbc0bbfe7e280986525bf28f68da8cb33c8efbc4509f7da -->
18
18
  ## 能力路由
19
19
 
20
20
  - 查询前端 V8 全部上下文、导航、表单、列表、网络、引擎与工具入口时,读取 `../v8-utilities/references/client-api-index.md`。
@@ -25,7 +25,7 @@ description: Microi 前端 V8 事件与客户端能力指南。用于编写浏
25
25
  - 登录后的敏感操作使用 `V8.Identity.Verify` 完成 Passkey/严格人脸交互;前端只取得一次性 Ticket,后端接口引擎必须重算 `ActionHash` 并原子消费,不能把前端成功当作授权。
26
26
 
27
27
  <!-- /microi-progressive:chunk -->
28
- <!-- microi-progressive:chunk id=v8-frontend-events-001 sha256=a9f8e1aed64db4b57ff762eb557c0d764b5f703a722dc080d273c4111afe234f -->
28
+ <!-- microi-progressive:chunk id=v8-frontend-events-001 sha256=eaab87d01b0fd2b6964326ee11edd7b793899c679930c575a0a2b309d36a367a -->
29
29
  ## 字段事件(在【字段属性】中配置)
30
30
 
31
31
  ### FieldValueChange — 值变更事件(最常用)
@@ -111,7 +111,7 @@ V8.OpenAnyTable({
111
111
  `ReadOnlyButton` 的产品文案是【禁用插槽按钮】:只控制按钮是否可点击,不等同于字段只读,应保留用于权限和状态控制。
112
112
 
113
113
  <!-- /microi-progressive:chunk -->
114
- <!-- microi-progressive:chunk id=v8-frontend-events-002 sha256=332a6ed2c90fe8ff23f04d7fd1c3a24df263b2692f2c292337a468a0423b409f -->
114
+ <!-- microi-progressive:chunk id=v8-frontend-events-002 sha256=faf64dbf6ded2a086c347bea31edecb7d6fc8b765114290d17998b7370d17372 -->
115
115
  ## 按钮事件
116
116
 
117
117
  ### V8BtnRun — 按钮点击执行(菜单按钮、表单按钮)
@@ -151,19 +151,19 @@ return V8.Form.Status === '待审核' && V8.CurrentUser.RoleName.indexOf('审批
151
151
  至少覆盖“主表详情 → 定制子表 → 子记录详情”链路中的含 `await` 显隐代码。
152
152
 
153
153
  <!-- /microi-progressive:chunk -->
154
- <!-- microi-progressive:chunk id=v8-frontend-events-003 sha256=68aab95ab02bfca93b69eaea1c188650cb7ef13f8566bee81a63c660a4437512 -->
154
+ <!-- microi-progressive:chunk id=v8-frontend-events-003 sha256=6c44ac4b3bc74f128b5efb8b7b51851ca28bdfc3e8f8b52a3d50f9fc043d4977 -->
155
155
  ## 模板引擎事件
156
156
 
157
157
  `TableTemplateEngine` / `FormTemplateEngine` — 见 `v8-template-engine/SKILL.md`。
158
158
 
159
159
  <!-- /microi-progressive:chunk -->
160
- <!-- microi-progressive:chunk id=v8-frontend-events-004 sha256=2db34699ad5433a8c8b194c9ce9909ed4d420d257dd8c6532238215402499c82 -->
160
+ <!-- microi-progressive:chunk id=v8-frontend-events-004 sha256=4071ce5e92d2352e455e4dbe5310cc3d8f8c349721ad53f734397d30dc0b2c4e -->
161
161
  ## 工作流事件(前端)
162
162
 
163
163
  `WFNodeEnd` — 流程节点结束后前端通知。详见 `v8-workflow/SKILL.md`。
164
164
 
165
165
  <!-- /microi-progressive:chunk -->
166
- <!-- microi-progressive:chunk id=v8-frontend-events-005 sha256=e7f73123dfc00720f60c49705e91854b6f18cb0506a115a6078481dc37aed41c -->
166
+ <!-- microi-progressive:chunk id=v8-frontend-events-005 sha256=717095c6c96b1895cf607d787854a6f99c9ac90cc9282bdc95b5f9b4cfa4095e -->
167
167
  ## 设计模式保护(CRITICAL)
168
168
 
169
169
  ```javascript
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-frontend-events-006 sha256=7ef892121df52256c6d8c4e9da546c3f60d365f2a3cab0cb315da0b8d1fe68cd -->
5
+ <!-- microi-progressive:chunk id=v8-frontend-events-006 sha256=b5dc7a887237bb719a26a0d56974d3fc99cb051b88223351742204eb7612b2ef -->
6
6
  ## 列表事件
7
7
 
8
8
  ### TableRowClick — 行点击
@@ -40,7 +40,7 @@ V8.RefreshTable({ _PageIndex: 1 });
40
40
  ```
41
41
 
42
42
  <!-- /microi-progressive:chunk -->
43
- <!-- microi-progressive:chunk id=v8-frontend-events-007 sha256=3f634f1942bdd72c87a68a2a6c4883eb2bf1e95b64bc9dc895646484f9d77a9d -->
43
+ <!-- microi-progressive:chunk id=v8-frontend-events-007 sha256=72ebf0b52fe19865043c3315ebaab9009e34db5abaf988c81965fce4fa8ae879 -->
44
44
  ## 常用前端 API
45
45
 
46
46
  | API | 说明 |
@@ -150,7 +150,7 @@ V8.OpenAppDialog({
150
150
  `V8.ConfirmTips` 当前是 callback API,且内容使用 HTML 模式渲染。只传固定文案或经过 HTML 转义的简单展示;严禁直接拼接用户输入、接口消息、数据库富文本和不可信 URL。三个以上字段、上传、表格、Tab、步骤条、代码编辑器或需要复用的页面必须使用 `V8.OpenAppDialog`。
151
151
 
152
152
  <!-- /microi-progressive:chunk -->
153
- <!-- microi-progressive:chunk id=v8-frontend-events-008 sha256=eebeb0230087c0deb368baac02bd39bb4b5aa054ed19d9aa43be9447f8ef1d6d -->
153
+ <!-- microi-progressive:chunk id=v8-frontend-events-008 sha256=6811b564f0992b3251578d40ad30ceda68c3c4d2938f413d76e276de4e1a65db -->
154
154
  ## 前端 FormEngine 菜单上下文与兼容授权
155
155
 
156
156
  前端 V8 不需要为每个历史项目手工补 `_SysMenuId`。新版 PC 表单引擎通过作用域 FormEngine facade 透明处理菜单上下文:
@@ -182,7 +182,7 @@ var products = await V8.FormEngine.GetTableData('Product', {
182
182
  前端没有 `GetTableDataCount`、`GetTableDataTree`(前端名称是 `GetTableTree`)、`AddTableData`、`UptTableData`、`DelTableData`、`AddField`。Import/Export 是独立端点与专项菜单权限,也不是 facade 方法。
183
183
 
184
184
  <!-- /microi-progressive:chunk -->
185
- <!-- microi-progressive:chunk id=v8-frontend-events-009 sha256=5e83f07a0fbcebf1eb02f3af5aa58936b3d1c3d19b0a6a0b1a0f14c66fcd6177 -->
185
+ <!-- microi-progressive:chunk id=v8-frontend-events-009 sha256=d5f628b4cdc5b4cc116f60af04742242f5c0411784593338ea13c89e1e90afe5 -->
186
186
  ## 异步写法(async/await vs 回调)
187
187
 
188
188
  ```javascript
@@ -197,7 +197,7 @@ V8.FormEngine.GetTableData('Product', { _PageSize: 10 }, function(r) {
197
197
  ```
198
198
 
199
199
  <!-- /microi-progressive:chunk -->
200
- <!-- microi-progressive:chunk id=v8-frontend-events-010 sha256=3ca077a857ffc9f58c7290e26c7e106c0e882897b1b9b669c66b4fe7615c3821 -->
200
+ <!-- microi-progressive:chunk id=v8-frontend-events-010 sha256=efea9a8791d11e8d51aa2869c92583a451a5f20d93961faf763945458bca60de -->
201
201
  ## 死循环陷阱
202
202
 
203
203
  ❌ **禁止** 在 `SubmitFormV8.js` 里调用 `V8.FormSubmit()` —— 会无限递归
@@ -14,7 +14,7 @@ description: Microi V8 HTTP 集成指南。用于通过 V8.Http.Get/Post/Patch
14
14
  文档维护时,前端用法更新现有 `microi.doc/docs/doc/v8-engine/v8-client.md`,后端用法更新现有 `microi.doc/docs/doc/v8-engine/v8-server.md`;不要新建重复的 V8.Http 文档页面或路由。只维护中文 `docs/doc/`,英文 `docs/en/` 由官网统一翻译生成。
15
15
 
16
16
  <!-- microi-progressive:begin -->
17
- <!-- microi-progressive:chunk id=v8-http-integration-000 sha256=0a2600eb1fc1308232c8b23aa9e6859a4927df69b20f043537df305628d46c89 -->
17
+ <!-- microi-progressive:chunk id=v8-http-integration-000 sha256=87c42439055059080e765dc466c015267021eb78a7f7c67efd49c00a30fd17af -->
18
18
  ## V8.Http API
19
19
 
20
20
  | 方法 | 说明 | 返回值 |
@@ -71,7 +71,7 @@ if (resp.StatusCode < 200 || resp.StatusCode >= 300) {
71
71
  `GetResponse/PostResponse/PatchResponse` 返回 `Content`、`Headers`、`RawBytes`、`StatusCode`、`ErrorMessage`。后端 `RawBytes` 是 `.NET byte[]`,前端是 `Uint8Array`。
72
72
 
73
73
  <!-- /microi-progressive:chunk -->
74
- <!-- microi-progressive:chunk id=v8-http-integration-001 sha256=3ea3068fc215afae5c0f36ac54f277542a218e7a2aa2a953be8403e77b31f947 -->
74
+ <!-- microi-progressive:chunk id=v8-http-integration-001 sha256=4cbbdd385e24d19413b7534665333c07f2516067e9f34aa40e6adabe9e0506f4 -->
75
75
  ## V8.AI 与底层 HTTP
76
76
 
77
77
  - 前端 V8 的平台 AI 普通调用优先 `await V8.AI.Chat(...)`。它自动使用当前 ApiBase 和平台登录头、接收响应 Token 轮换,并清除调用参数中的租户、身份、Endpoint、ApiKey 和认证头覆盖;只有确认问题适合进入 URL 日志时才用 `V8.AI.ChatGet(...)`。
@@ -94,7 +94,7 @@ else V8.Result = result.Data;
94
94
  完整授权矩阵、SSE、后端安全边界与 MCP 示例维护在官网现有 `system-engine/ai-engine.md`,不要新建重复文档。
95
95
 
96
96
  <!-- /microi-progressive:chunk -->
97
- <!-- microi-progressive:chunk id=v8-http-integration-002 sha256=bf9d4f5162ff81798521f69a82e41db50c95f4a0b3d1338d35983c1b161d6192 -->
97
+ <!-- microi-progressive:chunk id=v8-http-integration-002 sha256=9ac13cff3cf1bef6fb28a3b387aea0353c3e81faf657245cdf30a57af9b8dfa2 -->
98
98
  ## POST 请求(对象参数格式)
99
99
 
100
100
  > V8 接口引擎中必须使用对象参数格式。尤其禁止 `V8.Http.Get(url)`:当前 .NET 同名重载包含 `Task<string> Get(string)`,Jint 可能把字符串调用解析为异步重载,脚本最终拿到 `[object Promise]`。GET 必须写成 `V8.Http.Get({ Url: url })`;第三方登录、微信 `jscode2session`、AccessToken 等链路保存后必须用无效 code 烟测,确认返回的是第三方明确错误而不是 Promise。
@@ -114,7 +114,7 @@ var data = JSON.parse(result);
114
114
  ```
115
115
 
116
116
  <!-- /microi-progressive:chunk -->
117
- <!-- microi-progressive:chunk id=v8-http-integration-003 sha256=4c7e61dfc8a2539f65ea18d068c13d0168f84d0227ea93f17c8073a2a1cc8643 -->
117
+ <!-- microi-progressive:chunk id=v8-http-integration-003 sha256=24ce5ca40f3f55b8f832db9463cc8f683c3a408e0f942490ed29db19c7416cab -->
118
118
  ## PATCH 请求
119
119
 
120
120
  PATCH 与 POST 的参数完全对称,只需把请求体参数改为 `PatchParam` / `PatchParamString`:
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-http-integration-004 sha256=88c4d57c8f52d60f547b92fc14c0552fa9283e857c65fac4ae4b756f39997260 -->
5
+ <!-- microi-progressive:chunk id=v8-http-integration-004 sha256=36b643a5b4f6df39a09673e872d5dd8cefacef2666ca1987636e7dfd0a51bdd3 -->
6
6
  ## GET 请求
7
7
 
8
8
  ```javascript
@@ -17,7 +17,7 @@ var data = JSON.parse(result);
17
17
  ```
18
18
 
19
19
  <!-- /microi-progressive:chunk -->
20
- <!-- microi-progressive:chunk id=v8-http-integration-005 sha256=055100b212469d8ebd7e42fa9220fbb25b89b5ba10413d8867d2ba4f2c014c94 -->
20
+ <!-- microi-progressive:chunk id=v8-http-integration-005 sha256=b3c3761d78bb6a57e850e1e5f23cd8ab2a3e8aa309cf97570fffce8ff04bc5cf -->
21
21
  ## 获取完整响应(含状态码和响应头)
22
22
 
23
23
  ```javascript
@@ -58,7 +58,7 @@ var resp = V8.Http.PatchResponse({
58
58
  - DNS 校验不能代替网络层出站 ACL。生产环境还应在容器、主机或网关阻断云元数据和非必要私网段。
59
59
 
60
60
  <!-- /microi-progressive:chunk -->
61
- <!-- microi-progressive:chunk id=v8-http-integration-006 sha256=6e787d9b46d5ba82ef5d2394525d8a36649b1d722a6a59eacf8dd54884e14b3b -->
61
+ <!-- microi-progressive:chunk id=v8-http-integration-006 sha256=92592fccdf3ae61d101be02400077ca249847df900ccf6a23ad9449186cc23e5 -->
62
62
  ## 前端 V8 行为与兼容性
63
63
 
64
64
  - 前端新代码应优先使用 `await V8.Http.Get/Post/Patch`,参数与后端一致;不要再把 `V8.Post/Get` 作为新功能首选。旧 `V8.Post/Get` 仅作为兼容 API 保留,其回调和 Promise 写法保持不变。
@@ -68,7 +68,7 @@ var resp = V8.Http.PatchResponse({
68
68
  - 浏览器端不支持后端的 `FilesStream`,可使用 `FilesByteBase64`、`FilesByteString` 或 `FilesByte`。
69
69
 
70
70
  <!-- /microi-progressive:chunk -->
71
- <!-- microi-progressive:chunk id=v8-http-integration-007 sha256=92a9eea0bf36292444a9aae6cc73c91eda6e9b5d8d8ce78f6b8ca50cc47c28f8 -->
71
+ <!-- microi-progressive:chunk id=v8-http-integration-007 sha256=8715b52d42f883e2dc45be404325ba45a1969e31f6daae9a0a4fb0396fd902d7 -->
72
72
  ## 下载远程文件(图片、PDF 等二进制)
73
73
 
74
74
  ```javascript
@@ -91,7 +91,7 @@ var up = V8.Method.Upload({
91
91
  > 文件上传/下载完整模式见 `v8-file-upload/SKILL.md`
92
92
 
93
93
  <!-- /microi-progressive:chunk -->
94
- <!-- microi-progressive:chunk id=v8-http-integration-008 sha256=81da35a51dd4d8e43ddc5242045ca0b4590ed140d589b491e45b41231b7c13d2 -->
94
+ <!-- microi-progressive:chunk id=v8-http-integration-008 sha256=6ff1480c66e30451a51586fc2d71984de1c3f3289778937dc2b83bbe24c084f2 -->
95
95
  ## 第三方密钥不要硬编码
96
96
 
97
97
  ```javascript
@@ -113,7 +113,7 @@ var resp = V8.Http.GetResponse({
113
113
  ```
114
114
 
115
115
  <!-- /microi-progressive:chunk -->
116
- <!-- microi-progressive:chunk id=v8-http-integration-009 sha256=a12a323aae2e4bb30c3a998e570b6ed8c7e76641afe0f54dffd7701611ff1c6e -->
116
+ <!-- microi-progressive:chunk id=v8-http-integration-009 sha256=ffa9ee404ccd38850e55144309f6173ce56229dccaa05b8b4ff48e19c78fa620 -->
117
117
  ## 实战模式
118
118
 
119
119
  ### 微信小程序 access_token
@@ -201,7 +201,7 @@ return { Code: 1, Msg: 'ok' };
201
201
  ```
202
202
 
203
203
  <!-- /microi-progressive:chunk -->
204
- <!-- microi-progressive:chunk id=v8-http-integration-010 sha256=34d6d62f7d02a585b17bc93f65c260be7c50529f65b4f9ea4ec12da4285f82da -->
204
+ <!-- microi-progressive:chunk id=v8-http-integration-010 sha256=d38c91b4f643d3bd6c11a474a1f292087db19b78dbe50e9ccd34e8b0dc8ea615 -->
205
205
  ## V8.Office.SendEmail — 发送邮件
206
206
 
207
207
  ```javascript
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-http-integration-011 sha256=b446647747ac6672f011f1cdc9bade6c6af774c7bf737472976f8ac49bbc7709 -->
5
+ <!-- microi-progressive:chunk id=v8-http-integration-011 sha256=035d7ba47caf7a9f885bcb507a5e963811f292f3331a45f9b3f1b97ece6c2edc -->
6
6
  ## 错误处理模式
7
7
 
8
8
  ```javascript
@@ -28,7 +28,7 @@ try {
28
28
  ```
29
29
 
30
30
  <!-- /microi-progressive:chunk -->
31
- <!-- microi-progressive:chunk id=v8-http-integration-012 sha256=321e3eee95847088ca6c48ee0dba2b926e834fa492cfd97d1a347ae6cbb843d5 -->
31
+ <!-- microi-progressive:chunk id=v8-http-integration-012 sha256=3cd56273cd9f23e8edec8849430d7545e9925a766a06a19be8c87ec1ef4ca0c8 -->
32
32
  ## 注意事项
33
33
 
34
34
  - `V8.Http.Post` 的 `PostParam` 不支持多级嵌套对象,嵌套需用 `PostParamString`
@@ -17,7 +17,7 @@ description: Microi V8.Image 服务端图像处理指南。用于在接口引擎
17
17
  4. 合并时显式设置 `Mode`、尺寸、画布和图层顺序;覆盖合并使用 `ZIndex` 表达上下层,不依赖数组顺序猜测。
18
18
  5. 对用户上传、远程下载和批量合并场景先做业务侧数量、类型和权限校验;不要尝试绕过平台内置资源限制。
19
19
  6. 编写具体参数前读取 [完整 API 参考](references/api-reference.md);不要发明未列出的模式、输入来源或输出格式。
20
- 7. `FontFamily` 是首选字体而不是无条件信任值:运行时会逐字符验证字形,依次使用服务器字体和程序集内置 Noto Sans CJK SC 回退;零字体 Linux / 群晖容器也必须能绘制基础拉丁字符、数字和简体中文。只有系统字体与内置字体都缺字时才明确失败,绝不输出“口口”缺字方框。业务字体仍用于固定品牌字形、区域异体字、特殊符号和 Emoji。
20
+ 7. `FontFamily` 是首选字体而不是无条件信任值:运行时会逐字符验证字形,依次使用服务器字体和程序集内置 Noto Sans CJK SC 回退;零字体 Linux / 群晖容器也必须能绘制基础拉丁字符、数字和简体中文。Unicode 非字符(`U+FDD0`–`U+FDEF` 及每个平面的 `FFFE/FFFF`)在字体匹配前明确拒绝,不能因系统占位字体声称支持而绘制缺字方框。只有系统字体与内置字体都缺字时才明确失败,绝不输出“口口”缺字方框。业务字体仍用于固定品牌字形、区域异体字、特殊符号和 Emoji。
21
21
 
22
22
  ## 工作流程
23
23
 
@@ -14,7 +14,7 @@ description: Microi 菜单按钮与 Tab V8 指南。用于配置 sys_menu MoreBt
14
14
  ---
15
15
 
16
16
  <!-- microi-progressive:begin -->
17
- <!-- microi-progressive:chunk id=v8-menu-buttons-000 sha256=9ed7af82b50d25263818ad4b1ec1b5c6290d9d4a5a8cdc7f046440c0e6a0a1ff -->
17
+ <!-- microi-progressive:chunk id=v8-menu-buttons-000 sha256=bb9b02dd84d917e61d6a96b2b0222b31678994c38d1a14ea5cbbad02b5a2ab7d -->
18
18
  ## 1. 字段总览
19
19
 
20
20
  | 字段 | 渲染位置 | 必填项 |
@@ -29,7 +29,7 @@ description: Microi 菜单按钮与 Tab V8 指南。用于配置 sys_menu MoreBt
29
29
  ---
30
30
 
31
31
  <!-- /microi-progressive:chunk -->
32
- <!-- microi-progressive:chunk id=v8-menu-buttons-001 sha256=21a4d64e3ddf27766ecf2325a8af935c3b6e3134c4fa4df484ace9f1f356de6c -->
32
+ <!-- microi-progressive:chunk id=v8-menu-buttons-001 sha256=bc876765afdb17bd70766ab39e26afacb7207702272465abbc88309356357973 -->
33
33
  ## 3. 模式 A:弹窗收集参数 → 调接口引擎(最常用)
34
34
 
35
35
  ```js
@@ -57,7 +57,7 @@ V8.OpenAnyForm({
57
57
  ```
58
58
 
59
59
  <!-- /microi-progressive:chunk -->
60
- <!-- microi-progressive:chunk id=v8-menu-buttons-002 sha256=911b9cddbd448bb27d39d0de93274b0f67622e0b61026267d13300297931f34a -->
60
+ <!-- microi-progressive:chunk id=v8-menu-buttons-002 sha256=9e242daca15f6ccfeed786b7dba77fa4362a4baeca166981bb8e2a15234a28f7 -->
61
61
  ## 4. 模式 B:直接确认 + 接口调用
62
62
 
63
63
  `ConfirmTips` 使用 HTML 模式渲染内容,只传固定文案或经过 HTML 转义的简单文本;不要拼接用户输入、接口消息或数据库富文本。
@@ -76,7 +76,7 @@ V8.ConfirmTips('确认领取该任务?', function () {
76
76
  ```
77
77
 
78
78
  <!-- /microi-progressive:chunk -->
79
- <!-- microi-progressive:chunk id=v8-menu-buttons-003 sha256=b58b1c9990f905a0b65bb72c472461bb46ce22eb1f5c73bec68938a162bdcb55 -->
79
+ <!-- microi-progressive:chunk id=v8-menu-buttons-003 sha256=3b1d5525f9fc40203729f88d7e481b0ae6dc6cc9653f3752b330abbbcf68d4ef -->
80
80
  ## 4.1 模式 B2:在线微服务定制页(OpenAppDialog)
81
81
 
82
82
  当弹窗包含复杂布局、多步骤交互、实时校验或后续需要 AI 在线维护时,优先把页面实现为在线微服务,按钮 V8 代码只负责打开页面、传入上下文和接收结果。不要把长篇 HTML/CSS 写进 `V8Code`。
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-menu-buttons-004 sha256=c936a3246ce8148f77f98dfb5d8d0f0be4b87de63310dfd7ac84c2725707d3ea -->
5
+ <!-- microi-progressive:chunk id=v8-menu-buttons-004 sha256=05163deb173db359dc91703c98f17afd125e4c56491ebdb12ff30ac5b02352b1 -->
6
6
  ## 2. 按钮对象 Schema
7
7
 
8
8
  ```jsonc
@@ -159,7 +159,7 @@ V8.OpenAnyTable({
159
159
  ---
160
160
 
161
161
  <!-- /microi-progressive:chunk -->
162
- <!-- microi-progressive:chunk id=v8-menu-buttons-005 sha256=ca6d6eb9f75e80f2f0a420ed4b959ed2da879d44b8eedb2bc7a013e13561e1a2 -->
162
+ <!-- microi-progressive:chunk id=v8-menu-buttons-005 sha256=55cbeccd0d5cfdb5f2dcb211ec8848a453afc87a4fe9b8e27e3580659bd1328e -->
163
163
  ## 5. 模式 C:状态机推进(无需弹窗)
164
164
 
165
165
  ```js
@@ -182,7 +182,7 @@ if (next) {
182
182
  状态机必须由接口引擎校验当前状态、目标状态、权限和并发版本;不要在前端直接更新状态字段。
183
183
 
184
184
  <!-- /microi-progressive:chunk -->
185
- <!-- microi-progressive:chunk id=v8-menu-buttons-006 sha256=661e9eda504167d3eaca091ae759d49b8ddae64f5b1b3b7aab20ed31da33750a -->
185
+ <!-- microi-progressive:chunk id=v8-menu-buttons-006 sha256=e49f7ad868989d5dd0b25699284d6f19e3f752efa22be7b45fcafa7e95f249bd -->
186
186
  ## 6. 模式 D:批量操作(BatchSelectMoreBtns)
187
187
 
188
188
  ```js
@@ -200,7 +200,7 @@ V8.ConfirmTips('确认删除选中的 ' + ids.length + ' 条?', function () {
200
200
  ```
201
201
 
202
202
  <!-- /microi-progressive:chunk -->
203
- <!-- microi-progressive:chunk id=v8-menu-buttons-007 sha256=03346fa906eccc815f6f5be4ed9c5c0ef8c1cdce22e8aba47576ea258c6113a1 -->
203
+ <!-- microi-progressive:chunk id=v8-menu-buttons-007 sha256=ef40f0fec7fb1257e9cd89f11b0038b7244e57c098cf4c7f251754247a5df5fe -->
204
204
  ## 7. 模式 E:PageTabs 切换筛选
205
205
 
206
206
  ```js
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-menu-buttons-008 sha256=8109ed4c7386f8cd1c89db1a8629962b26a448f68082abbb81c75277d5aa1843 -->
5
+ <!-- microi-progressive:chunk id=v8-menu-buttons-008 sha256=495161c95d321f2937486db3fecc4e27d2e38c6d7a21587b5028d04ea6491b90 -->
6
6
  ## 8. 模式 F:后台任务按钮(长任务)
7
7
 
8
8
  应用安装、初始化多语言、批量导入、批量修复、跨系统同步等可能超过浏览器或网关等待时间的操作,必须优先设计为后台任务。判断阈值:预计超过 2 分钟、500 条以上、1000 个以上扇出子操作、100 次以上外部调用,或总量未知且可能持续运行。前端按钮只负责提交任务,后台任务列表通过 WebSocket/SignalR 推送并以轮询兜底。
@@ -114,7 +114,7 @@ reportProgress(2, 5, '正在写入表结构');
114
114
  ---
115
115
 
116
116
  <!-- /microi-progressive:chunk -->
117
- <!-- microi-progressive:chunk id=v8-menu-buttons-009 sha256=dc4cda219daf751e6943d1bc518776b67c15963cf7a9a5ebdfecaf6884aa89a0 -->
117
+ <!-- microi-progressive:chunk id=v8-menu-buttons-009 sha256=8cb7f4d399068549be662cc47bd4add8b3d3bbdb6e7a74832e4c63b7768e136b -->
118
118
  ## 9. 通过 MCP 创建菜单 + 按钮(一次到位)
119
119
 
120
120
  > AI 在 `microi_create_module` 调用时,把按钮 JSON **作为字符串** 传入对应字段。
@@ -157,7 +157,7 @@ var modulePayload = {
157
157
  ---
158
158
 
159
159
  <!-- /microi-progressive:chunk -->
160
- <!-- microi-progressive:chunk id=v8-menu-buttons-010 sha256=fd43cbb167733a5a722938f7c8c412b52999aa61ffe7b3016efc09a0e383dd41 -->
160
+ <!-- microi-progressive:chunk id=v8-menu-buttons-010 sha256=0398a9fc35520d4b17b990efc565ba1d9f6050303e122dc128207adf08434aee -->
161
161
  ## 前端 FormEngine 权限与兼容
162
162
 
163
163
  - 当前按钮所在菜单绑定表会由 scoped facade 自动补真实 `_SysMenuId`,历史按钮不需要逐个修改。
@@ -171,7 +171,7 @@ var modulePayload = {
171
171
  ---
172
172
 
173
173
  <!-- /microi-progressive:chunk -->
174
- <!-- microi-progressive:chunk id=v8-menu-buttons-011 sha256=3e7e5f9faac605ca1c8e8eeb3d5aa8a2a5aabeb4716179955942bd243302c521 -->
174
+ <!-- microi-progressive:chunk id=v8-menu-buttons-011 sha256=16414969be47116a51bab1c6a7e1482bb987b278430e0fb8daaf7d6ecf41bf94 -->
175
175
  ## 10. 与接口引擎配套的工作流
176
176
 
177
177
  业务按钮通常与接口引擎配套:
@@ -186,7 +186,7 @@ var modulePayload = {
186
186
  ---
187
187
 
188
188
  <!-- /microi-progressive:chunk -->
189
- <!-- microi-progressive:chunk id=v8-menu-buttons-012 sha256=4236db974612bd9eeeb35200c7e583a93e3dd17c72736e1674c9fb757698a550 -->
189
+ <!-- microi-progressive:chunk id=v8-menu-buttons-012 sha256=086e02210a949cc0a2c343e7f50c54c48079667999e9264ea5282c9caa951222 -->
190
190
  ## 10.1 后台直充/调账类行按钮
191
191
 
192
192
  会员积分、余额、库存、额度等会改动资产的后台行按钮,必须采用“前端按钮只收参数,后端接口负责事务”的模式。
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-menu-buttons-013 sha256=52939e7f29d0e3c7a2622c39bfc8484e27830ecb39a4205e57d5bdd437d60629 -->
5
+ <!-- microi-progressive:chunk id=v8-menu-buttons-013 sha256=30fe801c52356f945f9adabbd5d947d251211d9f3f63f24ca596c1aed6594440 -->
6
6
  ## 10. 反模式(避免)
7
7
 
8
8
  ❌ 把所有业务逻辑塞进 `V8Code`,不创建接口引擎
@@ -27,7 +27,7 @@
27
27
  ✅ 先用 `microi_list_applications` / `microi_get_application_context` 查找现有微服务;优先在已有微服务新增页面,否则通过 MCP 创建微服务,再用 `V8.OpenAppDialog` 打开
28
28
 
29
29
  <!-- /microi-progressive:chunk -->
30
- <!-- microi-progressive:chunk id=v8-menu-buttons-014 sha256=2d11f4bb4b670c1051e4495ef1d95758420f520fea7d8c7d1c948f251a2ad4a3 -->
30
+ <!-- microi-progressive:chunk id=v8-menu-buttons-014 sha256=ad4cb3a484857342e8e669163655b604a0a88ee4dec359743400a9493ff3c2d9 -->
31
31
  ## 10.2 复杂定制弹窗必须使用微服务
32
32
 
33
33
  `V8.ConfirmTips` 只适合纯文本确认或极少量一次性输入。出现以下任一情况即视为复杂页面:三个以上字段、响应式布局、联动校验、上传、表格、Tab、步骤条、代码编辑器、需要复用、后续会持续迭代。
@@ -59,7 +59,7 @@ V8.OpenAppDialog({
59
59
  ---
60
60
 
61
61
  <!-- /microi-progressive:chunk -->
62
- <!-- microi-progressive:chunk id=v8-menu-buttons-015 sha256=ab2bb9924c4468c8619237beaf94b86a98f9027649ab5c9e499652ae0068fbd4 -->
62
+ <!-- microi-progressive:chunk id=v8-menu-buttons-015 sha256=a796c29f763905954dbe712f80b5aa3921d57886142542749c1dda79ff6cdc4b -->
63
63
  ## 11. ⚠️ `V8.CurrentUser` 拿不到的历史陷阱(必看)
64
64
 
65
65
  ### 现象
@@ -10,7 +10,7 @@ description: Microi V8 消息队列与 MQTT 生产指南。用于 V8.MQ.SendMsg
10
10
  你正在开发 Microi 吾码平台的 V8 引擎代码,需要使用 RabbitMQ 消息队列或 MQTT 物联网协议。
11
11
 
12
12
  <!-- microi-progressive:begin -->
13
- <!-- microi-progressive:chunk id=v8-mq-mqtt-000 sha256=bc9ac85a8a0b6af88602e0d5419f6d61b192b5262193f6cb8c8ebd26af7bef25 -->
13
+ <!-- microi-progressive:chunk id=v8-mq-mqtt-000 sha256=4a6559aed1af036591a04002c6e3311d9f0957fbbabbcafdc4a6bad95dabd843 -->
14
14
  ## V8.MQ — RabbitMQ 消息队列
15
15
 
16
16
  ### 生产消息(后端)
@@ -151,7 +151,7 @@ try {
151
151
  ---
152
152
 
153
153
  <!-- /microi-progressive:chunk -->
154
- <!-- microi-progressive:chunk id=v8-mq-mqtt-001 sha256=834e8270912c25c900ca046d533f64c104a875acf8865919ffff5dca5442e7e6 -->
154
+ <!-- microi-progressive:chunk id=v8-mq-mqtt-001 sha256=dcf641877c01b65104fbd9b7d5022a9b7b656a6461895d499ab06af9d2bb7d0c -->
155
155
  ## 注意事项
156
156
 
157
157
  - MQ 消费者接口引擎通过 `V8.Param.Message` 获取消息,包含 `EventId`、兼容 `Id`、`OsClient`、`Message`、`CurrentUserId`
@@ -33,7 +33,7 @@
33
33
  4. `Microi.Server/Microi.Core/Interface/IMicroiMQTT.cs`:
34
34
  `IMicroiMQTT.PublishAsync(osClient, ...)` 可信后端发布和节点状态接口。
35
35
  5. `Microi.Server/Microi.Core/V8Engine/Runtime/V8Method.PlatformPluginRuntimes.cs`
36
- 与 `Microi.Server/Microi.Upgrade/Resource/platform-mqtt.js`:平台管理员、当前节点
36
+ 与 `Microi.Server/OfficialApplications/Resource/platform-mqtt.js`:平台管理员、当前节点
37
37
  状态、租户 Topic 边界与接口引擎交付入口。
38
38
  6. `microi.doc/docs/doc/system-engine/mqtt-engine.md`:面向用户的完整能力说明。
39
39
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=v8-mq-mqtt-002 sha256=7f130288432d55ab82bc57b7be6bd6a44c46d12df009a91a50534d5c54ef2ba9 -->
5
+ <!-- microi-progressive:chunk id=v8-mq-mqtt-002 sha256=e3917adda6454dc4d17672df3afc11def6fbd2f7a77f24b3ac821320d6df7907 -->
6
6
  ## V8.MQTT — IoT 物联网
7
7
 
8
8
  先区分两个边界:MQTT 是设备实时双向通道,RabbitMQ 是服务端异步队列;
@@ -15,7 +15,7 @@ const files = {
15
15
  mqttInterface: 'Microi.Server/Microi.Core/Interface/IMicroiMQTT.cs',
16
16
  tenantSecurity: 'Microi.Server/Microi.Core/SaaSEngine/TenantConfigurationSecurity.cs',
17
17
  platformRuntime: 'Microi.Server/Microi.Core/V8Engine/Runtime/V8Method.PlatformPluginRuntimes.cs',
18
- platformApiEngine: 'Microi.Server/Microi.Upgrade/Resource/platform-mqtt.js'
18
+ platformApiEngine: 'Microi.Server/OfficialApplications/Resource/platform-mqtt.js'
19
19
  };
20
20
 
21
21
  const content = {};
@@ -11,10 +11,20 @@ description: Microi V8 安全指南。用于审查 DiyToken 与权限、可逆
11
11
 
12
12
  访问密钥由 `microi_list_my_access_keys`、`microi_create_my_access_key`、`microi_revoke_my_access_key` 管理,只允许当前用户、限期、最小 scope,明文仅创建时返回一次。外部身份回调固定为 `/api/ExternalLogin/Callback`,服务端校验租户、Provider、state、redirect 和回调域名,验证成功后仍签发 DiyToken。
13
13
 
14
+ 微信网站扫码登录先读取当前租户能力、`WeChatLoginEnabled` 和私密设置元信息,
15
+ 再核对开放平台已审核网站应用的微信登录权限与授权回调域名。
16
+ `Login.WeChat.ClientId` 保存 AppID,`Login.WeChat.ClientSecret` 通过专用密钥工具保存,
17
+ 两项必须启用;Scope 使用 `snsapi_login`。微信 `qrconnect` 的应用标识参数必须为
18
+ `appid`,不能套用 Gitee/GitHub 的 `client_id`;Secret 不进入浏览器授权 URL。
19
+ 先由已登录的本人账号在个人中心绑定微信,再验证退出后的扫码登录;不得把昵称或邮箱
20
+ 匹配成管理员、伪造绑定或自动注册高权限账号。本地前端可指向公网 API 联调,
21
+ 本地后端生成的 `localhost` 回调不能替代登记的公网域名。其它租户只接收能力和空配置模板,
22
+ 不能发布源租户 AppID/AppSecret 或用户绑定。自动化协议测试通过与真实微信扫码成功应分开报告。
23
+
14
24
  官方升级资源属于独立控制面。`get-microi-upgrade-resource` 可以匿名读取固定白名单,但 `Publish/PublishBatch` 必须调用仅绑定该 Managed ApiEngineKey 的 `V8.Method.AuthorizeOfficialResourcePublish()`:固定 `iTdos` 官方租户、拒绝访问密钥会话,并从主库复核当前用户、状态和平台管理员角色。禁止只相信 `V8.CurrentUser.Level`,也禁止把这个可信原子复用于普通接口、租户 Hook 或表单事件;资源校验、SHA 乐观锁、事务行锁、写入及回读仍由 Managed V8 编排。
15
25
 
16
26
  <!-- microi-progressive:begin -->
17
- <!-- microi-progressive:chunk id=v8-security-000 sha256=2e81552d91b61d9d7f96cba1502306e186f0a288d5db8d443c4e524fce748bc9 -->
27
+ <!-- microi-progressive:chunk id=v8-security-000 sha256=a6a4311b1a799ea4ed005b22c01cb8230509aaf09aeead5a17c8c46da74772c8 -->
18
28
  ## 0. 租户动态系统设置与密钥边界
19
29
 
20
30
  **AI 默认处理路径:** 用户交付第三方 Secret 并授权配置时,优先调用 `microi_manage_server_private_secret`:List 只确认 Key/HasSecret;Save 使用 `confirmExecution=SAVE:<ConfigKey>`,固定 `IsSecret=true / IsPublic=false` 并自动脱敏回读。例如畅捷通使用 `Integration.Changjet.AppSecret`,后端从 `V8.SysConfig.ServerPrivateSettings` 使用。不要仅拒绝硬编码后停止,也不要因为 `OsClientModel` 不暴露密钥而误判服务端 V8 无法调用第三方。工具不提供原文揭示;更换已有 Key 前回读现状,超时只回读、不盲目重写。
@@ -67,7 +77,7 @@ Secret 只通过租户管理员专用端点写入租户绑定的认证密文。
67
77
  - 多节点保存连接使用按 `OsClient + DbKey` 隔离的分布式锁,并由数据库唯一索引兜底;同步数据和附件仍必须使用业务幂等键,锁不能替代唯一约束、状态机或 inbox/outbox。
68
78
 
69
79
  <!-- /microi-progressive:chunk -->
70
- <!-- microi-progressive:chunk id=v8-security-001 sha256=ccec93b880295123923b2375dbc616c5ab02aaf43af9a79f26b7ac953609866d -->
80
+ <!-- microi-progressive:chunk id=v8-security-001 sha256=51070dc1148f49c796dd605045b7fcb5970290638cf85e844c17d81962afa7aa -->
71
81
  ## 0.5 接口引擎配置安全
72
82
 
73
83
  代码以外,接口本身的配置项也是安全防线(详见 `v8-api-config/SKILL.md`):
@@ -92,7 +102,7 @@ Secret 只通过租户管理员专用端点写入租户绑定的认证密文。
92
102
  - 没有字段上下文的普通上传默认保持私有安全目录;管理员可在普通 `sys_config.HdfsUploadRules` 按可信角色授予业务目录(含有界 glob)与明确公有权限。必须先拒绝实际路径中的通配符、穿越和平台保留目录,再做模式匹配;通配符不是匿名/跨租户/发布授权。微信待审图片、头像、裁剪/压缩原图等更强规则继续优先。测试同时证明公有字段/目录可用、私有请求/伪造上下文/保留目录不可绕过。
93
103
 
94
104
  <!-- /microi-progressive:chunk -->
95
- <!-- microi-progressive:chunk id=v8-security-002 sha256=7229e5f8d200c0dfbab08752405f5e88d7edc80e9e92b6802880c022b09ca893 -->
105
+ <!-- microi-progressive:chunk id=v8-security-002 sha256=fdc1cbd297d141bfef8e9e0ee58a972410ffc9b6b778b217b5610f86139f514c -->
96
106
  ## 1. 防 SQL 注入
97
107
 
98
108
  ### 必须:参数化查询
@@ -121,7 +131,7 @@ V8.Db.FromSql("SELECT * FROM " + V8.Param.table).ToArray();
121
131
  ```
122
132
 
123
133
  <!-- /microi-progressive:chunk -->
124
- <!-- microi-progressive:chunk id=v8-security-003 sha256=8813dffa5c5c4c8816abddf3628579d474fe02137504d6c909f36303d4692560 -->
134
+ <!-- microi-progressive:chunk id=v8-security-003 sha256=4f875f2eaf69716bf7d2b92d42ba079ec952cfcbc3211682b8d73f53ca8fd398 -->
125
135
  ## 3. 输入验证
126
136
 
127
137
  ### 必填校验
@@ -164,7 +174,7 @@ if (isNaN(amount) || amount <= 0 || amount > 999999.99) {
164
174
  ```
165
175
 
166
176
  <!-- /microi-progressive:chunk -->
167
- <!-- microi-progressive:chunk id=v8-security-004 sha256=1703ea824e4807b24d30225d41e16fb36b0fecc21c63a4ab0296106185460a27 -->
177
+ <!-- microi-progressive:chunk id=v8-security-004 sha256=13385475478ef17b58798db43779503a924385e599ad6ed5a8abd396949064aa -->
168
178
  ## 4. 防 XSS
169
179
 
170
180
  四个字符替换不是通用 XSS 防护。必须按输出上下文处理: