@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.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/assets/build-meta.json +5 -5
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-server.js +99 -99
- package/scripts/microi-cli.js +39 -36
- package/scripts/microi-skills.meta.json +341 -338
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +3566 -3566
- package/skills/README.md +4 -4
- package/skills/ai-engine/SKILL.md +45 -45
- package/skills/ai-platform-governance/SKILL.md +177 -177
- package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
- package/skills/app-store/SKILL.md +21 -4
- package/skills/business-blueprint/SKILL.md +85 -85
- package/skills/datasource-engine/SKILL.md +91 -91
- package/skills/dos-orm/SKILL.md +15 -0
- package/skills/dos-orm/references/api-reference.md +229 -229
- package/skills/email-engine/SKILL.md +80 -80
- package/skills/email-engine/references/v8-email.md +34 -34
- package/skills/job-engine/SKILL.md +154 -154
- package/skills/message-notification/SKILL.md +27 -1
- package/skills/message-notification/agents/openai.yaml +5 -5
- package/skills/message-notification/references/contracts.md +102 -102
- package/skills/microi-ai-app-auth.js +652 -652
- package/skills/microi-ai-application/SKILL.md +102 -102
- package/skills/microi-ai-application/agents/openai.yaml +4 -4
- package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
- package/skills/microi-client-frontend/SKILL.md +47 -41
- 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
- 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
- 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
- package/skills/microi-codex/SKILL.md +2 -0
- package/skills/microi-codex-installer/SKILL.md +216 -216
- package/skills/microi-codex-installer/agents/openai.yaml +7 -7
- package/skills/microi-datasource-mapping/SKILL.md +67 -67
- package/skills/microi-db-schema/SKILL.md +6 -6
- package/skills/microi-db-schema/references/core-tables.md +18 -18
- package/skills/microi-db-schema/references/form-component-options.md +256 -256
- package/skills/microi-db-schema/references/schema-overview.md +11 -11
- package/skills/microi-db-schema/references/schema.md +46 -46
- package/skills/microi-db-schema/references/table-catalog.md +57 -57
- package/skills/microi-deployment/SKILL.md +18 -1
- package/skills/microi-deployment/references/deployment-matrix.md +101 -101
- package/skills/microi-docs-coverage/SKILL.md +10 -0
- package/skills/microi-docs-coverage/references/capability-map.md +3 -2
- package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
- package/skills/microi-form-engine/SKILL.md +27 -3
- package/skills/microi-form-engine/references/component-catalog.md +218 -218
- package/skills/microi-form-engine/references/data-source-events.md +124 -124
- package/skills/microi-form-layout/SKILL.md +13 -13
- package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +235 -235
- package/skills/microi-frontend-sdk/SKILL.md +4 -4
- package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +175 -175
- package/skills/microi-left-right-layout/SKILL.md +141 -141
- package/skills/microi-microservice/SKILL.md +2 -1
- package/skills/microi-microservice/references/runtime-delivery.md +278 -278
- package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +213 -213
- package/skills/microi-solution-quotation/SKILL.md +78 -78
- package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
- package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
- package/skills/microi-sso/SKILL.md +6 -0
- package/skills/microi-sso/references/acceptance.md +49 -49
- package/skills/microi-sso/references/configuration-and-security.md +53 -53
- package/skills/microi-sso/references/inbound.md +53 -53
- package/skills/microi-sso/references/outbound.md +39 -39
- package/skills/microi-system-delivery/SKILL.md +5 -4
- 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
- package/skills/microi-ui/SKILL.md +7 -2
- package/skills/microi-uniapp-frontend/SKILL.md +134 -134
- package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +136 -136
- package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +124 -124
- package/skills/module-engine/SKILL.md +30 -14
- package/skills/ocr-engine/SKILL.md +2 -2
- package/skills/ocr-engine/agents/openai.yaml +1 -1
- package/skills/page-engine/SKILL.md +28 -28
- package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +126 -126
- package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +42 -42
- package/skills/performance-testing/SKILL.md +120 -120
- package/skills/playwright-e2e/SKILL.md +84 -84
- package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +68 -68
- package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +64 -64
- package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +20 -20
- package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -69
- package/skills/print-engine/SKILL.md +11 -3
- package/skills/production-readonly-audit/SKILL.md +41 -41
- package/skills/report-engine/SKILL.md +71 -71
- package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
- package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
- package/skills/scripts/sync-embedded-skills.mjs +46 -0
- package/skills/scripts/validate-progressive-disclosure.mjs +8 -3
- package/skills/search-engine/SKILL.md +75 -75
- package/skills/spider-engine/SKILL.md +190 -190
- package/skills/system-observability/SKILL.md +169 -157
- package/skills/system-observability/references/memory-incident-triage.md +73 -73
- package/skills/translate-engine/SKILL.md +1 -1
- package/skills/ui-design/SKILL.md +3 -1
- package/skills/uniapp-mall-assets/SKILL.md +170 -170
- package/skills/unity-integration/SKILL.md +155 -155
- package/skills/unity-integration/agents/openai.yaml +4 -4
- package/skills/unity-integration/references/ai-app-delivery.md +103 -103
- package/skills/unity-integration/references/sdk-api.md +82 -82
- package/skills/unity-integration/references/toolbox-migration.md +66 -66
- package/skills/unity-integration/references/webgl-hosting.md +57 -57
- package/skills/v8-api-config/SKILL.md +4 -0
- package/skills/v8-cache-pattern/SKILL.md +306 -306
- package/skills/v8-crud-api/SKILL.md +29 -29
- package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +56 -56
- package/skills/v8-debugging/SKILL.md +143 -143
- package/skills/v8-explorer-tree/SKILL.md +64 -64
- package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +201 -201
- package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +118 -118
- package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +32 -32
- package/skills/v8-file-upload/SKILL.md +5 -2
- 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
- package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +138 -138
- package/skills/v8-formengine-http/SKILL.md +126 -108
- package/skills/v8-frontend-events/SKILL.md +22 -22
- package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
- package/skills/v8-frontend-events/references/bluetooth-print.md +247 -247
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +50 -50
- package/skills/v8-http-integration/SKILL.md +106 -106
- package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +31 -31
- package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +5 -5
- package/skills/v8-image-processing/SKILL.md +190 -190
- package/skills/v8-image-processing/agents/openai.yaml +4 -4
- package/skills/v8-image-processing/references/api-reference.md +623 -623
- package/skills/v8-menu-buttons/SKILL.md +103 -103
- package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +145 -145
- package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +228 -228
- package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +43 -43
- package/skills/v8-mongodb/SKILL.md +65 -65
- package/skills/v8-mq-mqtt/SKILL.md +175 -175
- package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
- package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +137 -137
- package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
- package/skills/v8-saas-multi-tenant/SKILL.md +223 -223
- package/skills/v8-security/SKILL.md +1 -1
- package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +122 -122
- package/skills/v8-sql-query/SKILL.md +7 -5
- package/skills/v8-table-event/SKILL.md +9 -2
- 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
- package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +15 -15
- package/skills/v8-tcp-integration/SKILL.md +1 -1
- package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
- package/skills/v8-template-engine/SKILL.md +59 -59
- package/skills/v8-utilities/SKILL.md +92 -92
- package/skills/v8-utilities/references/client-api-index.md +143 -143
- package/skills/v8-utilities/references/platform-http-routes.md +83 -83
- package/skills/v8-utilities/references/server-api-index.md +74 -74
- package/skills/v8-workflow/SKILL.md +13 -4
- package/skills/vision-engine/SKILL.md +19 -19
- package/skills/vision-engine/references/architecture-and-acceptance.md +34 -34
- package/skills/workspace-conventions/SKILL.md +35 -12
- 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
- package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +179 -179
- package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +21 -21
|
@@ -1,83 +1,83 @@
|
|
|
1
|
-
# Microi 平台 HTTP 路由索引
|
|
2
|
-
|
|
3
|
-
本索引用于识别中文官网示例中的平台路由。路由可用不等于当前用户有权限;始终
|
|
4
|
-
传当前租户 `OsClient`,使用受支持的 Token/访问密钥,并让服务端重新做菜单、
|
|
5
|
-
表单、字段和数据范围校验。
|
|
6
|
-
|
|
7
|
-
## 接口引擎
|
|
8
|
-
|
|
9
|
-
| 路由 | 用途 |
|
|
10
|
-
|---|---|
|
|
11
|
-
| `POST /apiengine/{ApiEngineKey}` | 推荐的稳定接口引擎入口 |
|
|
12
|
-
| `POST /api/ApiEngine/Run` | 仅旧客户端兼容,Body 传 `ApiEngineKey`;新增固定业务禁止使用 |
|
|
13
|
-
| `/apiengine/{ApiEngineKey}--OsClient--{OsClient}--` | 仅用于确实无法设置 Header/Form/Query 的 GET/HEAD 场景 |
|
|
14
|
-
|
|
15
|
-
普通请求优先在唯一 `osclient` Header 传租户,也可在 Query/Form/JSON 中冗余;
|
|
16
|
-
固定业务必须使用真实引擎动态地址或唯一 `ApiAddress`,使日志、流量、审计和限流
|
|
17
|
-
直接按引擎归因;旧通用入口只能由显式 `RunLegacy` 调用。
|
|
18
|
-
不要无脑把特殊租户后缀加到每条 URL。官网中的
|
|
19
|
-
`/apiengine/test1`、`/apiengine/get-product-list`、打印、支付和 Excel demo
|
|
20
|
-
都是业务 `ApiEngineKey` 示例,不是固定平台接口。
|
|
21
|
-
|
|
22
|
-
## FormEngine
|
|
23
|
-
|
|
24
|
-
标准 Controller 路由:
|
|
25
|
-
|
|
26
|
-
| 路由 | 用途 |
|
|
27
|
-
|---|---|
|
|
28
|
-
| `POST /api/formengine/GetTableData` | 查询列表 |
|
|
29
|
-
| `POST /api/formengine/GetFormData` | 查询单条 |
|
|
30
|
-
| `POST /api/formengine/AddFormData` | 新增 |
|
|
31
|
-
| `POST /api/formengine/UptFormData` | 更新 |
|
|
32
|
-
| `POST /api/formengine/DelFormData` | 删除 |
|
|
33
|
-
| `POST /api/formengine/UptFormDataByWhere` | 按条件更新 |
|
|
34
|
-
| `POST /api/formengine/DelFormDataByWhere` | 按条件删除 |
|
|
35
|
-
| `POST /api/formengine/GetTableDataAnonymous` | 表配置允许时匿名查列表 |
|
|
36
|
-
| `POST /api/formengine/GetFormDataAnonymous` | 表配置允许时匿名查单条 |
|
|
37
|
-
| `POST /api/formengine/AddFormDataAnonymous` | 表配置允许时匿名新增 |
|
|
38
|
-
|
|
39
|
-
动态路由还支持
|
|
40
|
-
`/api/formengine/{operation}-{FormEngineKey}`(兼容无连字符操作名与连字符操作名)。
|
|
41
|
-
访问密钥只需获得相应表/页面和 `form:read` 等作用域,不应把每个动态 URL 加入
|
|
42
|
-
无条件白名单。完整调用模型见 `v8-formengine-http`。
|
|
43
|
-
|
|
44
|
-
## 文件、消息、验证码与诊断
|
|
45
|
-
|
|
46
|
-
| 路由 | 用途与边界 |
|
|
47
|
-
|---|---|
|
|
48
|
-
| `GET /api/Captcha/getCaptcha` | 获取验证码图片;同时保存响应 `captchaid` |
|
|
49
|
-
| `POST /api/Captcha/Recognize` | 受控验证码识别,主要供采集引擎 |
|
|
50
|
-
| `POST /api/HDFS/Upload` | 受限文件上传;优先用平台 SDK/V8 Upload |
|
|
51
|
-
| `POST /apiengine/platform-private-file-url` | 获取当前租户短期私有文件地址;必须携带权威资源上下文 |
|
|
52
|
-
| `GET /api/HDFS/OpenPrivateFile` | 受权打开私有文件/Office 代理 |
|
|
53
|
-
| `POST /api/DiyChat/SendSystemMessage` | 发送站内消息;前端优先 `V8.SendSystemMessage` |
|
|
54
|
-
| `POST /apiengine/platform-mq` | MQ 管理入口;Body 使用 `Action=Send`,仅当前租户超级管理员 |
|
|
55
|
-
| `GET /apiengine/platform-service-health?OsClient={OsClient}` | 新版客户端固定匿名健康契约;返回 `Data.Status=Healthy`,新二进制同时返回真实后端版本;应用包先发布时版本可暂时为空,但健康结论不失败;不查询业务表 |
|
|
56
|
-
| `GET /api/Diagnostics/health` | 旧节点滚动升级兼容健康路由;新版客户端不以它作为主要契约 |
|
|
57
|
-
| `GET /api/Diagnostics/liveness` | 进程存活检查,不代表已就绪接流量 |
|
|
58
|
-
|
|
59
|
-
`/api/example`、`/api/example/1` 仅用于说明 `V8.Http` 的普通 Controller 地址,
|
|
60
|
-
不属于 Microi 固定接口。
|
|
61
|
-
|
|
62
|
-
## 管理与内部交付接口
|
|
63
|
-
|
|
64
|
-
下列路由不是普通业务 SDK:
|
|
65
|
-
|
|
66
|
-
| 路由 | 限制 |
|
|
67
|
-
|---|---|
|
|
68
|
-
| `POST /api/DiyField/UptDiyFieldList` | 开发设计字段批量保存;需设计权限 |
|
|
69
|
-
| `POST /api/FormEngine/ImportDiyTableRow` | 表格/子表导入;后端复核字段、外键和权限 |
|
|
70
|
-
| `POST /api/SysUser/GetSysUserPassword` | 仅存量 DES 密码的超级管理员兼容查看;必须审计,访问密钥/普通角色拒绝 |
|
|
71
|
-
| `POST /api/V8Engine/UploadApplicationAssetStream` | 管理员应用文件分片流式上传 |
|
|
72
|
-
| `POST /api/V8Engine/FinalizeApplicationStreamPublish` | 校验清单并原子切换应用版本 |
|
|
73
|
-
|
|
74
|
-
应用流式发布必须使用 MCP/平台发布流程:文件逐个校验 SHA-256,版本目录不可变,
|
|
75
|
-
同一应用用跨节点锁串行,入口文件最后切换。不得把这两个内部路由包装成匿名上传。
|
|
76
|
-
|
|
77
|
-
## 安全检查
|
|
78
|
-
|
|
79
|
-
- URL 不携带长期 Token、密码、连接串、私钥或 Redis 凭据。
|
|
80
|
-
- 动态表名、ApiEngineKey、文件路径和 redirect 都先走白名单/授权。
|
|
81
|
-
- 匿名路由只对明确开启的表或接口生效,仍要限流、限大小并做业务校验。
|
|
82
|
-
- 管理接口必须核验当前租户与管理员身份,写后回读;超时先回读,不能盲目重试。
|
|
83
|
-
- 示例 URL 中的租户、表 Key、接口 Key 和 Id 都是占位值,不复制为生产常量。
|
|
1
|
+
# Microi 平台 HTTP 路由索引
|
|
2
|
+
|
|
3
|
+
本索引用于识别中文官网示例中的平台路由。路由可用不等于当前用户有权限;始终
|
|
4
|
+
传当前租户 `OsClient`,使用受支持的 Token/访问密钥,并让服务端重新做菜单、
|
|
5
|
+
表单、字段和数据范围校验。
|
|
6
|
+
|
|
7
|
+
## 接口引擎
|
|
8
|
+
|
|
9
|
+
| 路由 | 用途 |
|
|
10
|
+
|---|---|
|
|
11
|
+
| `POST /apiengine/{ApiEngineKey}` | 推荐的稳定接口引擎入口 |
|
|
12
|
+
| `POST /api/ApiEngine/Run` | 仅旧客户端兼容,Body 传 `ApiEngineKey`;新增固定业务禁止使用 |
|
|
13
|
+
| `/apiengine/{ApiEngineKey}--OsClient--{OsClient}--` | 仅用于确实无法设置 Header/Form/Query 的 GET/HEAD 场景 |
|
|
14
|
+
|
|
15
|
+
普通请求优先在唯一 `osclient` Header 传租户,也可在 Query/Form/JSON 中冗余;
|
|
16
|
+
固定业务必须使用真实引擎动态地址或唯一 `ApiAddress`,使日志、流量、审计和限流
|
|
17
|
+
直接按引擎归因;旧通用入口只能由显式 `RunLegacy` 调用。
|
|
18
|
+
不要无脑把特殊租户后缀加到每条 URL。官网中的
|
|
19
|
+
`/apiengine/test1`、`/apiengine/get-product-list`、打印、支付和 Excel demo
|
|
20
|
+
都是业务 `ApiEngineKey` 示例,不是固定平台接口。
|
|
21
|
+
|
|
22
|
+
## FormEngine
|
|
23
|
+
|
|
24
|
+
标准 Controller 路由:
|
|
25
|
+
|
|
26
|
+
| 路由 | 用途 |
|
|
27
|
+
|---|---|
|
|
28
|
+
| `POST /api/formengine/GetTableData` | 查询列表 |
|
|
29
|
+
| `POST /api/formengine/GetFormData` | 查询单条 |
|
|
30
|
+
| `POST /api/formengine/AddFormData` | 新增 |
|
|
31
|
+
| `POST /api/formengine/UptFormData` | 更新 |
|
|
32
|
+
| `POST /api/formengine/DelFormData` | 删除 |
|
|
33
|
+
| `POST /api/formengine/UptFormDataByWhere` | 按条件更新 |
|
|
34
|
+
| `POST /api/formengine/DelFormDataByWhere` | 按条件删除 |
|
|
35
|
+
| `POST /api/formengine/GetTableDataAnonymous` | 表配置允许时匿名查列表 |
|
|
36
|
+
| `POST /api/formengine/GetFormDataAnonymous` | 表配置允许时匿名查单条 |
|
|
37
|
+
| `POST /api/formengine/AddFormDataAnonymous` | 表配置允许时匿名新增 |
|
|
38
|
+
|
|
39
|
+
动态路由还支持
|
|
40
|
+
`/api/formengine/{operation}-{FormEngineKey}`(兼容无连字符操作名与连字符操作名)。
|
|
41
|
+
访问密钥只需获得相应表/页面和 `form:read` 等作用域,不应把每个动态 URL 加入
|
|
42
|
+
无条件白名单。完整调用模型见 `v8-formengine-http`。
|
|
43
|
+
|
|
44
|
+
## 文件、消息、验证码与诊断
|
|
45
|
+
|
|
46
|
+
| 路由 | 用途与边界 |
|
|
47
|
+
|---|---|
|
|
48
|
+
| `GET /api/Captcha/getCaptcha` | 获取验证码图片;同时保存响应 `captchaid` |
|
|
49
|
+
| `POST /api/Captcha/Recognize` | 受控验证码识别,主要供采集引擎 |
|
|
50
|
+
| `POST /api/HDFS/Upload` | 受限文件上传;优先用平台 SDK/V8 Upload |
|
|
51
|
+
| `POST /apiengine/platform-private-file-url` | 获取当前租户短期私有文件地址;必须携带权威资源上下文 |
|
|
52
|
+
| `GET /api/HDFS/OpenPrivateFile` | 受权打开私有文件/Office 代理 |
|
|
53
|
+
| `POST /api/DiyChat/SendSystemMessage` | 发送站内消息;前端优先 `V8.SendSystemMessage` |
|
|
54
|
+
| `POST /apiengine/platform-mq` | MQ 管理入口;Body 使用 `Action=Send`,仅当前租户超级管理员 |
|
|
55
|
+
| `GET /apiengine/platform-service-health?OsClient={OsClient}` | 新版客户端固定匿名健康契约;返回 `Data.Status=Healthy`,新二进制同时返回真实后端版本;应用包先发布时版本可暂时为空,但健康结论不失败;不查询业务表 |
|
|
56
|
+
| `GET /api/Diagnostics/health` | 旧节点滚动升级兼容健康路由;新版客户端不以它作为主要契约 |
|
|
57
|
+
| `GET /api/Diagnostics/liveness` | 进程存活检查,不代表已就绪接流量 |
|
|
58
|
+
|
|
59
|
+
`/api/example`、`/api/example/1` 仅用于说明 `V8.Http` 的普通 Controller 地址,
|
|
60
|
+
不属于 Microi 固定接口。
|
|
61
|
+
|
|
62
|
+
## 管理与内部交付接口
|
|
63
|
+
|
|
64
|
+
下列路由不是普通业务 SDK:
|
|
65
|
+
|
|
66
|
+
| 路由 | 限制 |
|
|
67
|
+
|---|---|
|
|
68
|
+
| `POST /api/DiyField/UptDiyFieldList` | 开发设计字段批量保存;需设计权限 |
|
|
69
|
+
| `POST /api/FormEngine/ImportDiyTableRow` | 表格/子表导入;后端复核字段、外键和权限 |
|
|
70
|
+
| `POST /api/SysUser/GetSysUserPassword` | 仅存量 DES 密码的超级管理员兼容查看;必须审计,访问密钥/普通角色拒绝 |
|
|
71
|
+
| `POST /api/V8Engine/UploadApplicationAssetStream` | 管理员应用文件分片流式上传 |
|
|
72
|
+
| `POST /api/V8Engine/FinalizeApplicationStreamPublish` | 校验清单并原子切换应用版本 |
|
|
73
|
+
|
|
74
|
+
应用流式发布必须使用 MCP/平台发布流程:文件逐个校验 SHA-256,版本目录不可变,
|
|
75
|
+
同一应用用跨节点锁串行,入口文件最后切换。不得把这两个内部路由包装成匿名上传。
|
|
76
|
+
|
|
77
|
+
## 安全检查
|
|
78
|
+
|
|
79
|
+
- URL 不携带长期 Token、密码、连接串、私钥或 Redis 凭据。
|
|
80
|
+
- 动态表名、ApiEngineKey、文件路径和 redirect 都先走白名单/授权。
|
|
81
|
+
- 匿名路由只对明确开启的表或接口生效,仍要限流、限大小并做业务校验。
|
|
82
|
+
- 管理接口必须核验当前租户与管理员身份,写后回读;超时先回读,不能盲目重试。
|
|
83
|
+
- 示例 URL 中的租户、表 Key、接口 Key 和 Id 都是占位值,不复制为生产常量。
|
|
@@ -18,24 +18,24 @@
|
|
|
18
18
|
| `V8.RowIndex`、`V8.CacheData`、`V8.NotSaveField` | DataFilter 等事件上下文 |
|
|
19
19
|
| `V8.LineValue`、`V8.NextNodeId`、`V8.WF` | 工作流路线与节点上下文 |
|
|
20
20
|
| `V8.FilesByteBase64` | 上传文件 Base64 字典 |
|
|
21
|
-
| `V8.Limits` | 当前 Jint 资源预算与调用深度 |
|
|
22
|
-
| `V8.Stream` | 仅 `ResponseType=Stream` 的接口引擎可用;SSE/NDJSON 暂态分片写入器 |
|
|
21
|
+
| `V8.Limits` | 当前 Jint 资源预算与调用深度 |
|
|
22
|
+
| `V8.Stream` | 仅 `ResponseType=Stream` 的接口引擎可用;SSE/NDJSON 暂态分片写入器 |
|
|
23
23
|
| `V8.Action` | 服务器全局 V8 自定义方法 |
|
|
24
24
|
|
|
25
25
|
## 调用、数据与异步
|
|
26
26
|
|
|
27
27
|
| API | 说明 |
|
|
28
28
|
|---|---|
|
|
29
|
-
| `V8.ApiEngine.Run(...)` | 同步调用接口引擎 |
|
|
30
|
-
| `await V8.ApiEngine.RunAsync(...)` | 请求内异步调用接口引擎 |
|
|
31
|
-
| `V8.Stream.Write(data,eventName?,id?)` | 同步写一个受大小限制的暂态流式分片 |
|
|
32
|
-
| `await V8.Stream.WriteAsync(data,eventName?,id?)` | 等待网络背压后写暂态分片;每次检查返回 `Code` |
|
|
29
|
+
| `V8.ApiEngine.Run(...)` | 同步调用接口引擎 |
|
|
30
|
+
| `await V8.ApiEngine.RunAsync(...)` | 请求内异步调用接口引擎 |
|
|
31
|
+
| `V8.Stream.Write(data,eventName?,id?)` | 同步写一个受大小限制的暂态流式分片 |
|
|
32
|
+
| `await V8.Stream.WriteAsync(data,eventName?,id?)` | 等待网络背压后写暂态分片;每次检查返回 `Code` |
|
|
33
33
|
| `V8.FormEngine.*` | 表单 CRUD,见 `v8-crud-api` |
|
|
34
34
|
| `await V8.FormEngine.GetTableDataAsync(...)` | 请求内异步查列表 |
|
|
35
35
|
| `V8.Db`、`V8.DbRead`、`V8.DbTrans` | 主库、只读库、共享事务 |
|
|
36
36
|
| `V8.DbTrans.FromSql(sql)` | 在平台提供的共享事务内执行参数化 SQL |
|
|
37
37
|
| `V8.Dbs`、`V8.Dbs.Open(...)` | 已配置的扩展数据库 |
|
|
38
|
-
| `V8.MongoDb.*` | MongoDB CRUD;`UptFormDataByWhere` / `DelFormDataByWhere` 强制参数化非空 `_Where`,禁止更新 `_id`,绑定当前 V8 租户,且不参与 `V8.DbTrans` |
|
|
38
|
+
| `V8.MongoDb.*` | MongoDB CRUD;`UptFormDataByWhere` / `DelFormDataByWhere` 强制参数化非空 `_Where`,禁止更新 `_id`,绑定当前 V8 租户,且不参与 `V8.DbTrans` |
|
|
39
39
|
| `V8.DataSourceEngine` | 当前租户数据源引擎对象 |
|
|
40
40
|
| `V8.DataSourceEngine.Run(...)`、`V8.DataSourceEngine.RunAsync(...)` | 同步/请求内异步运行数据源 |
|
|
41
41
|
| `V8.ModuleEngine` | 后端模块模型能力;不能绕过用户模块权限 |
|
|
@@ -49,41 +49,41 @@
|
|
|
49
49
|
| API | 说明 |
|
|
50
50
|
|---|---|
|
|
51
51
|
| `V8.Method.NewGuid()`、`V8.Method.NewUlid()` | 生成标识 |
|
|
52
|
-
| `V8.Method.GetTimestamp()` | Unix 秒时间戳 |
|
|
53
|
-
| `V8.Method.GetBackendVersion()` | 当前 Microi.Core 运行程序集的公开发行版本,格式 `vX.Y.Z`;固定匿名健康接口使用,不返回路径或主机信息 |
|
|
52
|
+
| `V8.Method.GetTimestamp()` | Unix 秒时间戳 |
|
|
53
|
+
| `V8.Method.GetBackendVersion()` | 当前 Microi.Core 运行程序集的公开发行版本,格式 `vX.Y.Z`;固定匿名健康接口使用,不返回路径或主机信息 |
|
|
54
54
|
| `V8.Method.GetCurrentToken(token,osClient)` | 读取当前 Token 对象;不透传前端 |
|
|
55
|
-
| `V8.Method.RefreshLoginUser(userId,osClient?,token?)` | 刷新登录投影;租户取当前 V8/已认证 DiyToken(可信宿主须建立用户+租户作用域),显式 OsClient 仅作一致性断言;普通用户仅本人,同租户超级管理员主库复核后可跨用户。第三参仅兼容历史 `microi-init` 的原始 Token,宿主重新验证且只允许 Token 本人;返回对象、访问密钥、空身份和跨租户均拒绝 |
|
|
55
|
+
| `V8.Method.RefreshLoginUser(userId,osClient?,token?)` | 刷新登录投影;租户取当前 V8/已认证 DiyToken(可信宿主须建立用户+租户作用域),显式 OsClient 仅作一致性断言;普通用户仅本人,同租户超级管理员主库复核后可跨用户。第三参仅兼容历史 `microi-init` 的原始 Token,宿主重新验证且只允许 Token 本人;返回对象、访问密钥、空身份和跨租户均拒绝 |
|
|
56
56
|
| `V8.Method.ClearUserLoginInfo(userId,osClient)` | 管理员吊销用户全部终端 Token |
|
|
57
57
|
| `V8.Method.GetDirectTableGrantPolicies()` | 读取平台表直连授权策略;仅供可信角色表单事件做最终校验 |
|
|
58
58
|
| `V8.Method.ConsumeIdentityVerificationTicket({Ticket,Purpose,ActionHash})` | 按当前 DiyToken 用户、租户、用途和操作摘要原子消费一次性 Passkey/TOTP/人脸票据 |
|
|
59
|
-
| `V8.Method.GetPrivateFileUrl({FilePathName})` | 签发当前租户短期私有文件代理地址 |
|
|
60
|
-
| `V8.Method.ResolveOsClientByDomain(domain)` | 仅允许官方 `platform-os-client-by-domain` 调用;返回最小 OsClient 投影 |
|
|
61
|
-
| `V8.Method.GetPublicSysConfig(lang?)` | 仅允许官方 `platform-sys-config` 调用;返回浏览器安全系统设置投影 |
|
|
62
|
-
| `V8.Method.GetLangBundle(lang?,prefix?)` | 仅允许官方 `platform-lang-bundle` 调用;读取当前租户词条包 |
|
|
63
|
-
| `V8.Method.GetLoginWallpapers()` | 仅允许官方 `platform-login-wallpapers` 调用;固定读取当前租户最多 200 条启用壁纸的 `Id/Name/Category/ImgUrl`,不开放通用匿名表权限 |
|
|
64
|
-
| `V8.Method.GetLegacyInitMenuTree(rawToken, osClient?)` | 仅允许官方 `microi-init` 调用;重新验证请求体原始 DiyToken、拒绝访问密钥与跨租户请求,并按当前角色返回权威菜单树 |
|
|
65
|
-
| `V8.Method.GetAuthorizedPrivateFileUrl(options)` | 仅允许官方 `platform-private-file-url` 调用;重算菜单、行、字段与文件引用授权 |
|
|
66
|
-
| `V8.Method.AuthorizeCurrentUserTenantProvisioning()` | 仅允许官方 `platform-create-tenant` 在 Before Hook 前校验主租户普通登录会话 |
|
|
67
|
-
| `V8.Method.ProvisionCurrentUserTenant(options)` | 仅允许官方 `platform-create-tenant` 调用;所有者、手机号、姓名和密码材料从可信当前用户派生 |
|
|
68
|
-
| `V8.Method.PrepareCurrentUserProfileUpdate(options)` | 仅允许官方 `platform-user-update-profile` 调用;固定当前用户并规范当前租户头像路径 |
|
|
69
|
-
| `V8.Method.ManageSysUserAdmin(options)` | 仅允许官方 `platform-sys-user-admin` 调用;固定身份与租户并执行表权限、角色层级、改密 step-up、内容安全及会话安全边界;授权预检返回规范化 `DataAppend.ChangesPassword` |
|
|
70
|
-
| `V8.Method.AuthorizeOfficialResourcePublish()` | 仅允许官方 `get-microi-upgrade-resource` 的发布分支调用;固定 `iTdos`、拒绝访问密钥并从主库复核平台管理员;不是通用授权 API |
|
|
71
|
-
| `V8.Method.SendWeChatTemplateMessage(options)` | 仅允许消息通知官方 Managed 接口 `wechat_send_tpl_msg` 调用;公众号 AppId/AppSecret 固定从当前租户 `wx_mp` 读取且不进入 V8,脚本只编排接收人、模板、受限模板字段和跳转地址 |
|
|
72
|
-
| `V8.Method.ValidateTenantSystemSettingsOperation(options)` | 仅允许官方 `platform-tenant-system-settings` 调用;拒绝访问密钥、非管理员、Secret/Sensitive Key 和已迁移公开 Key |
|
|
73
|
-
| `V8.Method.GetTenantSystemSettingsSecurityProjection()` | 仅允许官方 `platform-tenant-system-settings` 调用;只返回 Secret 是否已配置与迁移 Key,不返回值或密文 |
|
|
74
|
-
| `V8.Method.Upload(options)` | 受配额限制的上传 |
|
|
75
|
-
| `V8.Method.UploadText(options)` | 直接上传当前租户 UTF-8 文本,避免 Base64 膨胀;仍执行安全文件名、扩展名、HDFS、配额与 256 MB 文本上限 |
|
|
76
|
-
| `V8.Method.AddSysLog(options)` | 结构化系统日志 |
|
|
59
|
+
| `V8.Method.GetPrivateFileUrl({FilePathName})` | 签发当前租户短期私有文件代理地址 |
|
|
60
|
+
| `V8.Method.ResolveOsClientByDomain(domain)` | 仅允许官方 `platform-os-client-by-domain` 调用;返回最小 OsClient 投影 |
|
|
61
|
+
| `V8.Method.GetPublicSysConfig(lang?)` | 仅允许官方 `platform-sys-config` 调用;返回浏览器安全系统设置投影 |
|
|
62
|
+
| `V8.Method.GetLangBundle(lang?,prefix?)` | 仅允许官方 `platform-lang-bundle` 调用;读取当前租户词条包 |
|
|
63
|
+
| `V8.Method.GetLoginWallpapers()` | 仅允许官方 `platform-login-wallpapers` 调用;固定读取当前租户最多 200 条启用壁纸的 `Id/Name/Category/ImgUrl`,不开放通用匿名表权限 |
|
|
64
|
+
| `V8.Method.GetLegacyInitMenuTree(rawToken, osClient?)` | 仅允许官方 `microi-init` 调用;重新验证请求体原始 DiyToken、拒绝访问密钥与跨租户请求,并按当前角色返回权威菜单树 |
|
|
65
|
+
| `V8.Method.GetAuthorizedPrivateFileUrl(options)` | 仅允许官方 `platform-private-file-url` 调用;重算菜单、行、字段与文件引用授权 |
|
|
66
|
+
| `V8.Method.AuthorizeCurrentUserTenantProvisioning()` | 仅允许官方 `platform-create-tenant` 在 Before Hook 前校验主租户普通登录会话 |
|
|
67
|
+
| `V8.Method.ProvisionCurrentUserTenant(options)` | 仅允许官方 `platform-create-tenant` 调用;所有者、手机号、姓名和密码材料从可信当前用户派生 |
|
|
68
|
+
| `V8.Method.PrepareCurrentUserProfileUpdate(options)` | 仅允许官方 `platform-user-update-profile` 调用;固定当前用户并规范当前租户头像路径 |
|
|
69
|
+
| `V8.Method.ManageSysUserAdmin(options)` | 仅允许官方 `platform-sys-user-admin` 调用;固定身份与租户并执行表权限、角色层级、改密 step-up、内容安全及会话安全边界;授权预检返回规范化 `DataAppend.ChangesPassword` |
|
|
70
|
+
| `V8.Method.AuthorizeOfficialResourcePublish()` | 仅允许官方 `get-microi-upgrade-resource` 的发布分支调用;固定 `iTdos`、拒绝访问密钥并从主库复核平台管理员;不是通用授权 API |
|
|
71
|
+
| `V8.Method.SendWeChatTemplateMessage(options)` | 仅允许消息通知官方 Managed 接口 `wechat_send_tpl_msg` 调用;公众号 AppId/AppSecret 固定从当前租户 `wx_mp` 读取且不进入 V8,脚本只编排接收人、模板、受限模板字段和跳转地址 |
|
|
72
|
+
| `V8.Method.ValidateTenantSystemSettingsOperation(options)` | 仅允许官方 `platform-tenant-system-settings` 调用;拒绝访问密钥、非管理员、Secret/Sensitive Key 和已迁移公开 Key |
|
|
73
|
+
| `V8.Method.GetTenantSystemSettingsSecurityProjection()` | 仅允许官方 `platform-tenant-system-settings` 调用;只返回 Secret 是否已配置与迁移 Key,不返回值或密文 |
|
|
74
|
+
| `V8.Method.Upload(options)` | 受配额限制的上传 |
|
|
75
|
+
| `V8.Method.UploadText(options)` | 直接上传当前租户 UTF-8 文本,避免 Base64 膨胀;仍执行安全文件名、扩展名、HDFS、配额与 256 MB 文本上限 |
|
|
76
|
+
| `V8.Method.AddSysLog(options)` | 结构化系统日志 |
|
|
77
77
|
| `V8.Method.ParseWhere(where)` | 兼容旧 Where 转换 |
|
|
78
78
|
| `V8.Method.UpdateBackgroundTask(options)` | 上报已提交单位的后台任务进度 |
|
|
79
79
|
| `V8.Method.RefreshExtensionDatabases(osClient?)` | 配置表提交后刷新全节点 `V8.Dbs` |
|
|
80
80
|
|
|
81
|
-
管理员维护、备份、清库、缓存连接管理等低层方法即使可见,也不能暴露为普通
|
|
82
|
-
或匿名业务 API。
|
|
83
|
-
|
|
84
|
-
以上启动、文件、系统账号和租户设置 `platform-*` 原子都是固定 Managed 接口的可信宿主边界,不是普通业务脚本可复用的快捷方法。官网客户端调用对应 `/apiengine/platform-*` 路由;旧 Controller 只保留旧版本兼容。登录壁纸原子不要求 `diy_wallpaper.IsAnonymousRead=1`,也不允许租户 Hook 参与匿名请求。租户个性化逻辑写入应用声明的 `CreateIfMissing` Hook,禁止直接修改会被官方安装或更新恢复的 Managed 接口。密码、DiyToken、Secret 保存和 Reveal 仍属于 C# 可信边界。
|
|
85
|
-
|
|
86
|
-
旧客户端兼容路由 `/api/SysUser/UpdateMyDefaultIndexUrl`、`/api/SysUser/UpdateCurrentProfile` 和 `/api/TenantSystemSettings/List` 只固定转发上述 Managed 接口;新客户端不得继续以 Controller 作为业务事实源。
|
|
81
|
+
管理员维护、备份、清库、缓存连接管理等低层方法即使可见,也不能暴露为普通
|
|
82
|
+
或匿名业务 API。
|
|
83
|
+
|
|
84
|
+
以上启动、文件、系统账号和租户设置 `platform-*` 原子都是固定 Managed 接口的可信宿主边界,不是普通业务脚本可复用的快捷方法。官网客户端调用对应 `/apiengine/platform-*` 路由;旧 Controller 只保留旧版本兼容。登录壁纸原子不要求 `diy_wallpaper.IsAnonymousRead=1`,也不允许租户 Hook 参与匿名请求。租户个性化逻辑写入应用声明的 `CreateIfMissing` Hook,禁止直接修改会被官方安装或更新恢复的 Managed 接口。密码、DiyToken、Secret 保存和 Reveal 仍属于 C# 可信边界。
|
|
85
|
+
|
|
86
|
+
旧客户端兼容路由 `/api/SysUser/UpdateMyDefaultIndexUrl`、`/api/SysUser/UpdateCurrentProfile` 和 `/api/TenantSystemSettings/List` 只固定转发上述 Managed 接口;新客户端不得继续以 Controller 作为业务事实源。
|
|
87
87
|
|
|
88
88
|
## Base64 与加密
|
|
89
89
|
|
|
@@ -118,46 +118,46 @@ MD5/SHA1 仅为兼容摘要;任何摘要都不能直接作为新密码存储
|
|
|
118
118
|
`V8.Image` 和 `V8.Tcp` 由当前 `Microi.V8Engine/V8Extend.cs` 注册。扩展可被裁剪或二次
|
|
119
119
|
开发,调用前以目标部署源码和编辑器定义为准。
|
|
120
120
|
|
|
121
|
-
- `V8.Alipay.CreatePay(...)` 创建支付宝支付参数;
|
|
122
|
-
`V8.Alipay.Test22(...)` 是历史诊断方法,不能作为生产业务接口。
|
|
123
|
-
- `V8.WeChat` 当前包含签名、授权头与 AES-GCM 解密等微信支付协议原子,
|
|
124
|
-
精确边界见下节。
|
|
125
|
-
- 自定义扩展通过 `V8ExtensionRegistry.Register(name,factory)` 注册为
|
|
126
|
-
`V8.<name>`;不要把某个客户的扩展名写成全平台标准能力。
|
|
127
|
-
|
|
128
|
-
支付/微信/DNS 扩展必须只读取当前租户受控凭据,调用前校验权限、金额、订单状态、
|
|
129
|
-
幂等键和回调签名;私钥、Secret 和原始签名材料不得进入日志或响应。
|
|
130
|
-
|
|
131
|
-
### V8.WeChat 微信支付最小协议原子
|
|
132
|
-
|
|
133
|
-
| API | 说明 |
|
|
134
|
-
|---|---|
|
|
135
|
-
| `V8.WeChat.AesGcmDecrypt(associatedData, nonce, ciphertext, apiV3Key)` | 解密微信支付 API v3 `resource`,同时认证密文尾部 GCM 标签 |
|
|
136
|
-
| `V8.WeChat.GetWeChatSign(privateKeyPem, paramList)` | 按参数顺序和换行规则生成 SHA256-RSA2048 Base64 签名 |
|
|
137
|
-
| `V8.WeChat.GetWeChatAuthorization(mchid, serialNo, privateKeyPem, wxApiAddress, body)` | 为 `POST` 请求生成 `WECHATPAY2-SHA256-RSA2048` Authorization 值;路径和 Query 必须与真实请求一致 |
|
|
138
|
-
|
|
139
|
-
`AesGcmDecrypt` 的四个参数具有不同编码,不能统一按 Base64 处理:
|
|
140
|
-
|
|
141
|
-
| 参数 | 必须采用的编码 |
|
|
142
|
-
|---|---|
|
|
143
|
-
| `apiV3Key` | 商户 APIv3 密钥原文的 UTF-8 字节,必须恰好 32 字节 |
|
|
144
|
-
| `nonce` | `resource.nonce` 原文的 UTF-8 字节,必须恰好 12 字节;**不是 Base64** |
|
|
145
|
-
| `associatedData` | `resource.associated_data` 原文的 UTF-8 字节;缺省时使用空字节串 |
|
|
146
|
-
| `ciphertext` | 唯一需要 Base64 解码的参数;解码结果是“密文 + 尾部 16 字节 GCM 标签”,必须完整交给解密器 |
|
|
147
|
-
|
|
148
|
-
禁止把 `nonce` 改为 Base64 解码,也不要增加“UTF-8/Base64 两种 nonce 都接受”的
|
|
149
|
-
模糊兼容分支。`AesGcmDecrypt` 只完成资源解密与 GCM 完整性认证,不等于微信支付
|
|
150
|
-
HTTP 回调签名验证;必须先使用原始请求体和 `Wechatpay-*` 请求头完成平台签名验证。
|
|
151
|
-
|
|
152
|
-
该对象保持最小协议原子:C# 只承担路由、原始报文、可信验签、租户恢复和密钥隔离等
|
|
153
|
-
V8 无法安全表达的边界;订单/退款状态、商户与金额复核、幂等、事务、日志、通知和
|
|
154
|
-
outbox 编排放在接口引擎。密钥从当前租户 `V8.SysConfig.ServerPrivateSettings` 等受控
|
|
155
|
-
私密配置读取,不写进 V8 源码、请求参数、日志或响应。
|
|
156
|
-
|
|
157
|
-
回归测试至少覆盖:微信支付官方固定向量可解密、篡改密文或标签必然认证失败,以及
|
|
158
|
-
真实 Jint 表达式 `V8.WeChat.AesGcmDecrypt(...)` 可调用;只直接测试 C# 方法不算完成。
|
|
159
|
-
|
|
160
|
-
## 其它后端扩展
|
|
121
|
+
- `V8.Alipay.CreatePay(...)` 创建支付宝支付参数;
|
|
122
|
+
`V8.Alipay.Test22(...)` 是历史诊断方法,不能作为生产业务接口。
|
|
123
|
+
- `V8.WeChat` 当前包含签名、授权头与 AES-GCM 解密等微信支付协议原子,
|
|
124
|
+
精确边界见下节。
|
|
125
|
+
- 自定义扩展通过 `V8ExtensionRegistry.Register(name,factory)` 注册为
|
|
126
|
+
`V8.<name>`;不要把某个客户的扩展名写成全平台标准能力。
|
|
127
|
+
|
|
128
|
+
支付/微信/DNS 扩展必须只读取当前租户受控凭据,调用前校验权限、金额、订单状态、
|
|
129
|
+
幂等键和回调签名;私钥、Secret 和原始签名材料不得进入日志或响应。
|
|
130
|
+
|
|
131
|
+
### V8.WeChat 微信支付最小协议原子
|
|
132
|
+
|
|
133
|
+
| API | 说明 |
|
|
134
|
+
|---|---|
|
|
135
|
+
| `V8.WeChat.AesGcmDecrypt(associatedData, nonce, ciphertext, apiV3Key)` | 解密微信支付 API v3 `resource`,同时认证密文尾部 GCM 标签 |
|
|
136
|
+
| `V8.WeChat.GetWeChatSign(privateKeyPem, paramList)` | 按参数顺序和换行规则生成 SHA256-RSA2048 Base64 签名 |
|
|
137
|
+
| `V8.WeChat.GetWeChatAuthorization(mchid, serialNo, privateKeyPem, wxApiAddress, body)` | 为 `POST` 请求生成 `WECHATPAY2-SHA256-RSA2048` Authorization 值;路径和 Query 必须与真实请求一致 |
|
|
138
|
+
|
|
139
|
+
`AesGcmDecrypt` 的四个参数具有不同编码,不能统一按 Base64 处理:
|
|
140
|
+
|
|
141
|
+
| 参数 | 必须采用的编码 |
|
|
142
|
+
|---|---|
|
|
143
|
+
| `apiV3Key` | 商户 APIv3 密钥原文的 UTF-8 字节,必须恰好 32 字节 |
|
|
144
|
+
| `nonce` | `resource.nonce` 原文的 UTF-8 字节,必须恰好 12 字节;**不是 Base64** |
|
|
145
|
+
| `associatedData` | `resource.associated_data` 原文的 UTF-8 字节;缺省时使用空字节串 |
|
|
146
|
+
| `ciphertext` | 唯一需要 Base64 解码的参数;解码结果是“密文 + 尾部 16 字节 GCM 标签”,必须完整交给解密器 |
|
|
147
|
+
|
|
148
|
+
禁止把 `nonce` 改为 Base64 解码,也不要增加“UTF-8/Base64 两种 nonce 都接受”的
|
|
149
|
+
模糊兼容分支。`AesGcmDecrypt` 只完成资源解密与 GCM 完整性认证,不等于微信支付
|
|
150
|
+
HTTP 回调签名验证;必须先使用原始请求体和 `Wechatpay-*` 请求头完成平台签名验证。
|
|
151
|
+
|
|
152
|
+
该对象保持最小协议原子:C# 只承担路由、原始报文、可信验签、租户恢复和密钥隔离等
|
|
153
|
+
V8 无法安全表达的边界;订单/退款状态、商户与金额复核、幂等、事务、日志、通知和
|
|
154
|
+
outbox 编排放在接口引擎。密钥从当前租户 `V8.SysConfig.ServerPrivateSettings` 等受控
|
|
155
|
+
私密配置读取,不写进 V8 源码、请求参数、日志或响应。
|
|
156
|
+
|
|
157
|
+
回归测试至少覆盖:微信支付官方固定向量可解密、篡改密文或标签必然认证失败,以及
|
|
158
|
+
真实 Jint 表达式 `V8.WeChat.AesGcmDecrypt(...)` 可调用;只直接测试 C# 方法不算完成。
|
|
159
|
+
|
|
160
|
+
## 其它后端扩展
|
|
161
161
|
|
|
162
162
|
| 能力 | API |
|
|
163
163
|
|---|---|
|
|
@@ -58,14 +58,14 @@ description: Microi V8 工作流事件指南。用于编写审批流条件、节
|
|
|
58
58
|
```javascript
|
|
59
59
|
// 我的待办
|
|
60
60
|
var todo = V8.Db.FromSql(
|
|
61
|
-
'SELECT
|
|
61
|
+
'SELECT Id, FlowId, NodeId, FlowTitle, WorkState, ReceiverId, TableRowId FROM wf_work WHERE ReceiverId = @p0 AND WorkState = @p1 ORDER BY CreateTime DESC'
|
|
62
62
|
).AddInParameter("@p0", V8.CurrentUser.Id)
|
|
63
|
-
.AddInParameter("@p1", '
|
|
63
|
+
.AddInParameter("@p1", 'Todo')
|
|
64
64
|
.ToArray();
|
|
65
65
|
|
|
66
66
|
// 我发起的
|
|
67
67
|
var mine = V8.Db.FromSql(
|
|
68
|
-
'SELECT
|
|
68
|
+
'SELECT Id, FlowTitle, FlowState, SenderId, TableRowId FROM wf_flow WHERE SenderId = @p0 ORDER BY CreateTime DESC'
|
|
69
69
|
).AddInParameter("@p0", V8.CurrentUser.Id)
|
|
70
70
|
.ToArray();
|
|
71
71
|
|
|
@@ -78,7 +78,16 @@ var history = V8.Db.FromSql(
|
|
|
78
78
|
|
|
79
79
|
<!-- /microi-progressive:chunk -->
|
|
80
80
|
<!-- microi-progressive:chunk id=v8-workflow-002 sha256=1f94d40c041929aafc45ec975f42bcbbc50c3ba424ed499c7bdf65fa73a41041 -->
|
|
81
|
-
## 流程 V8 事件执行顺序
|
|
81
|
+
## 流程 V8 事件执行顺序
|
|
82
|
+
|
|
83
|
+
工作流合并提交请求的 `_FormSubmitAction` 可使用 `Add/Edit`;表单后端事件中的
|
|
84
|
+
`V8.FormSubmitAction` 实际为 `Insert/Update/Delete`,两者不能混淆。删除事件把服务端
|
|
85
|
+
读取的待删除行放在 `V8.Form`,`V8.OldForm` 为空;校验删除归属、状态或引用时应以
|
|
86
|
+
`V8.Form.Id` 在共享事务中重新读取并锁定原行,不应假定 `OldForm` 与修改事件相同。
|
|
87
|
+
|
|
88
|
+
节点开始事件成功继续流转时保持 `V8.Result` 为空或设为布尔 `true`;不要用
|
|
89
|
+
`V8.Result={Code:1}`,非布尔结果会提前结束当前流转。节点校验失败应抛出异常,
|
|
90
|
+
尤其节点结束事件不可依赖 `return {Code:0}` 阻止事务提交。
|
|
82
91
|
|
|
83
92
|
1. 用户点击发起流程或处理工作
|
|
84
93
|
2. **表单进入 V8 事件(前端 FormIn)**
|
|
@@ -36,12 +36,12 @@ Microi.Vision 是可信 .NET 宿主中的最小视觉原子层,只负责:
|
|
|
36
36
|
|
|
37
37
|
| 组件 | 策略 | 职责 |
|
|
38
38
|
|---|---|---|
|
|
39
|
-
| `platform-vision-runtime` | `Managed` | Recognize/Enroll/Result/Recent/Correct/Bootstrap/Capabilities |
|
|
39
|
+
| `platform-vision-runtime` | `Managed` | Recognize/Enroll/Result/Recent/Correct/Bootstrap/Capabilities |
|
|
40
40
|
| `platform-vision-ai-worker` | `Managed` | 持久任务消费、Microi.AI 视觉调用、回写与敏感图片清理 |
|
|
41
41
|
| `platform-vision-category-options` | `Managed` | 当前租户启用分类选项 |
|
|
42
42
|
| `platform-vision-subject-options` | `Managed` | 当前租户启用对象选项 |
|
|
43
43
|
| `platform-vision-custom-hook` | `CreateIfMissing` | 租户自己的低敏业务扩展,官方升级永不覆盖 |
|
|
44
|
-
| `microi-vision/workbench` | MicroService | 图片、摄像头帧、连续模式、来源阶段、最近记录、纠错与样本录入 |
|
|
44
|
+
| `microi-vision/workbench` | MicroService | 图片、摄像头帧、连续模式、来源阶段、最近记录、纠错与样本录入 |
|
|
45
45
|
|
|
46
46
|
详细数据、状态、协议和验收规范见 [architecture-and-acceptance.md](references/architecture-and-acceptance.md)。
|
|
47
47
|
|
|
@@ -58,9 +58,9 @@ Microi.Vision 是可信 .NET 宿主中的最小视觉原子层,只负责:
|
|
|
58
58
|
7. AI 开启时先保存私有输入并创建共享后台任务,立即返回 `Status=AiPending`;
|
|
59
59
|
8. Worker 收敛到 `AiMatched` 或 `Failed`,前端用同一 `RequestNo` 轮询。
|
|
60
60
|
|
|
61
|
-
不得同步阻塞前端等待大模型,不得把 AI 结果自动写入可信对象主数据,也不得把本地相似度与 AI 置信度混成一个分数。生鲜的冰冻状态、新鲜度、预估价格/单位/币种也必须按字段保存 `Database/AI/Manual` 来源:样本或对象主数据优先,只有数据库未命中后才允许 AI 推断;AI 价格只是非约束估计,不能直接覆盖门店售价。
|
|
62
|
-
|
|
63
|
-
历史记录纠错使用 `Correct` 动作:只允许绑定当前租户中启用且模式兼容的对象,记录原标签、原来源、修正人、时间和原因;选择 `SaveAsSample` 时通过来源 `RequestNo` 做幂等录入。AI 结果不得自动加入 `Ready` 样本,必须由有权限的用户明确确认。`Recent/Result` 只返回 `HasImage` 与后端生成的短期授权 URL,禁止把 `InputFilePath`、图片 Base64 或永久公开地址交给浏览器。
|
|
61
|
+
不得同步阻塞前端等待大模型,不得把 AI 结果自动写入可信对象主数据,也不得把本地相似度与 AI 置信度混成一个分数。生鲜的冰冻状态、新鲜度、预估价格/单位/币种也必须按字段保存 `Database/AI/Manual` 来源:样本或对象主数据优先,只有数据库未命中后才允许 AI 推断;AI 价格只是非约束估计,不能直接覆盖门店售价。
|
|
62
|
+
|
|
63
|
+
历史记录纠错使用 `Correct` 动作:只允许绑定当前租户中启用且模式兼容的对象,记录原标签、原来源、修正人、时间和原因;选择 `SaveAsSample` 时通过来源 `RequestNo` 做幂等录入。AI 结果不得自动加入 `Ready` 样本,必须由有权限的用户明确确认。`Recent/Result` 只返回 `HasImage` 与后端生成的短期授权 URL,禁止把 `InputFilePath`、图片 Base64 或永久公开地址交给浏览器。
|
|
64
64
|
|
|
65
65
|
## V8 原子函数
|
|
66
66
|
|
|
@@ -118,17 +118,17 @@ var voted = await V8.Vision.Stabilize({
|
|
|
118
118
|
|
|
119
119
|
## 视频入口
|
|
120
120
|
|
|
121
|
-
前端使用 `getUserMedia` 并按 `FrameIntervalMs` 取帧,必须提供开启、暂停、继续、立即识别当前帧和关闭操作;每次打开摄像头生成新的 `StreamSessionId`,每帧递增 `FrameSequence`。自动连续模式允许跳过相同画面,人工主按钮必须显式绕过前端去重以提交当前帧。可信边缘宿主将 RTSP/WebRTC 解码为 `IAsyncEnumerable<MicroiVisionExtractParam>` 后调用 `RecognizeFramesAsync`。Microi.Vision 不直接连接调用方提交的 RTSP URL,不保存摄像头账号,不承担流媒体服务器职责。
|
|
122
|
-
|
|
123
|
-
打开摄像头、`getUserMedia`、`video.play()`、关闭和组件卸载之间必须使用递增操作令牌或等价取消机制。关闭时先同步写入关闭态并使旧操作失效,再停止轨道和清空 `srcObject`;不能等待媒体清理完成后才改 UI,否则快速关闭会被较早的异步打开流程反向覆盖。移动控件或条件渲染按钮可在 `pointerdown` 立即执行停止语义,并对随后 `click` 做短时去重,防止 DOM 重排吞掉关闭操作。
|
|
121
|
+
前端使用 `getUserMedia` 并按 `FrameIntervalMs` 取帧,必须提供开启、暂停、继续、立即识别当前帧和关闭操作;每次打开摄像头生成新的 `StreamSessionId`,每帧递增 `FrameSequence`。自动连续模式允许跳过相同画面,人工主按钮必须显式绕过前端去重以提交当前帧。可信边缘宿主将 RTSP/WebRTC 解码为 `IAsyncEnumerable<MicroiVisionExtractParam>` 后调用 `RecognizeFramesAsync`。Microi.Vision 不直接连接调用方提交的 RTSP URL,不保存摄像头账号,不承担流媒体服务器职责。
|
|
122
|
+
|
|
123
|
+
打开摄像头、`getUserMedia`、`video.play()`、关闭和组件卸载之间必须使用递增操作令牌或等价取消机制。关闭时先同步写入关闭态并使旧操作失效,再停止轨道和清空 `srcObject`;不能等待媒体清理完成后才改 UI,否则快速关闭会被较早的异步打开流程反向覆盖。移动控件或条件渲染按钮可在 `pointerdown` 立即执行停止语义,并对随后 `click` 做短时去重,防止 DOM 重排吞掉关闭操作。
|
|
124
|
+
|
|
125
|
+
连续帧必须有:最大图片大小、最小间隔、单客户端串行、取消/停止、RequestId 幂等、网络退避和后台任务去重。不能每个视频帧都无界调用大模型。接口返回 `AiPending` 后,前端必须进入 single-flight 状态:暂停提交新帧,只轮询当前 `RequestId`,直到 `AiMatched/AiFailed/Unmatched`、超时或用户取消后才允许下一帧;禁止并行创建多个 AI 任务。
|
|
126
|
+
|
|
127
|
+
跨版本接口字段必须在协议边界归一化。连续稳定结果至少兼容 `.NET` 原子常用的 `VoteCount/WindowCount/AverageConfidence` 与历史接口的 `Votes/WindowSize/Confidence`,前端只读取归一化 DTO,任何真实响应都不得展示 `undefined/undefined`。
|
|
128
|
+
|
|
129
|
+
手机收银/巡检工作台属于高频全屏操作面:在宿主提供的可用高度内同时露出取景区、主要识别按钮、当前状态、核心结果和“最近识别”入口,不依赖页面纵向滚动才能完成一次识别;竖屏按采集/结果/最近记录三段紧凑分配,短横屏改为三列,且不得改变已验收的桌面布局。历史列表可以成为卡片内部的唯一滚动区。相机权限拒绝、数据库匹配中、数据库未命中、AI 等待、终态结果和恢复操作都要在当前视口可见,平台底部菜单和安全区不得遮挡按钮。
|
|
124
130
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
跨版本接口字段必须在协议边界归一化。连续稳定结果至少兼容 `.NET` 原子常用的 `VoteCount/WindowCount/AverageConfidence` 与历史接口的 `Votes/WindowSize/Confidence`,前端只读取归一化 DTO,任何真实响应都不得展示 `undefined/undefined`。
|
|
128
|
-
|
|
129
|
-
手机收银/巡检工作台属于高频全屏操作面:在宿主提供的可用高度内同时露出取景区、主要识别按钮、当前状态、核心结果和“最近识别”入口,不依赖页面纵向滚动才能完成一次识别;竖屏按采集/结果/最近记录三段紧凑分配,短横屏改为三列,且不得改变已验收的桌面布局。历史列表可以成为卡片内部的唯一滚动区。相机权限拒绝、数据库匹配中、数据库未命中、AI 等待、终态结果和恢复操作都要在当前视口可见,平台底部菜单和安全区不得遮挡按钮。
|
|
130
|
-
|
|
131
|
-
桌面工作台使用宿主可用宽度,不再用固定窄版 `max-width`;采集、结果、最近记录同屏三栏。预览使用有界容器和 `object-fit: contain`,上传竖图或打开摄像头不能撑高整个页面。不要同时提供语义重复的底部“再次识别当前画面”和主操作按钮;保留一个清晰的“立即识别”,连续模式另提供暂停/继续。
|
|
131
|
+
桌面工作台使用宿主可用宽度,不再用固定窄版 `max-width`;采集、结果、最近记录同屏三栏。预览使用有界容器和 `object-fit: contain`,上传竖图或打开摄像头不能撑高整个页面。不要同时提供语义重复的底部“再次识别当前画面”和主操作按钮;保留一个清晰的“立即识别”,连续模式另提供暂停/继续。
|
|
132
132
|
|
|
133
133
|
## 交付顺序
|
|
134
134
|
|
|
@@ -146,9 +146,9 @@ var voted = await V8.Vision.Stabilize({
|
|
|
146
146
|
## 禁止事项
|
|
147
147
|
|
|
148
148
|
- 禁止用 HTTP 200、构建成功、Mock UI、同一图片命中代替真实商品/人脸准确率。
|
|
149
|
-
- 禁止把大模型标签伪装成数据库命中或权威身份。
|
|
150
|
-
- 禁止把 AI 新鲜度、冰冻状态或估价伪装成传感器、检疫、食品安全结论或正式售价。
|
|
151
|
-
- 禁止把历史识别的原始私有文件路径或永久公开 URL 返回前端,也禁止未经人工确认把 AI 结果自动沉淀为可信样本。
|
|
149
|
+
- 禁止把大模型标签伪装成数据库命中或权威身份。
|
|
150
|
+
- 禁止把 AI 新鲜度、冰冻状态或估价伪装成传感器、检疫、食品安全结论或正式售价。
|
|
151
|
+
- 禁止把历史识别的原始私有文件路径或永久公开 URL 返回前端,也禁止未经人工确认把 AI 结果自动沉淀为可信样本。
|
|
152
152
|
- 禁止在接口参数中接受模型目录、任意本地路径、任意网络地址或执行提供程序。
|
|
153
153
|
- 禁止把图片 Base64、原始人脸、向量、提示词、AI Key 写入 Hook 或普通日志。
|
|
154
154
|
- 禁止用进程内队列、`static` 字典或本地文件作为 AI 任务完成事实源。
|
|
@@ -157,4 +157,4 @@ var voted = await V8.Vision.Stabilize({
|
|
|
157
157
|
|
|
158
158
|
## 验收输出
|
|
159
159
|
|
|
160
|
-
最终报告至少分开列出:源码测试、5 表/字段/索引、7 菜单、5 引擎/4 事件、微服务源码与构建哈希、商城包与版本、框架制品、目标节点版本、真实浏览器、PC/手机横竖屏布局、历史图片与纠错、真实图片素材来源、数据库命中、AI 回退、生鲜属性/价格来源、人脸同意、模型准确率和未执行的物理设备测试。
|
|
160
|
+
最终报告至少分开列出:源码测试、5 表/字段/索引、7 菜单、5 引擎/4 事件、微服务源码与构建哈希、商城包与版本、框架制品、目标节点版本、真实浏览器、PC/手机横竖屏布局、历史图片与纠错、真实图片素材来源、数据库命中、AI 回退、生鲜属性/价格来源、人脸同意、模型准确率和未执行的物理设备测试。
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
| 表 | 主业务键 | 关键字段 |
|
|
6
6
|
|---|---|---|
|
|
7
7
|
| `mci_vision_category` | `CategoryNo` | Name、Scope、ParentId、Sort、Enabled |
|
|
8
|
-
| `mci_vision_subject` | `ObjectNo` | Name、CategoryId、ObjectType、RecognitionMode、ThresholdOverride、ReviewRequired、默认价格/单位/币种 |
|
|
9
|
-
| `mci_vision_sample` | `SampleNo` | SubjectId、Mode、ImagePath、EmbeddingBase64、ModelKey、QualityScore、Status、冰冻/新鲜度/价格及来源请求 |
|
|
10
|
-
| `mci_vision_request` | `RequestNo` | Mode、Status、MatchSource、StreamSessionId、FrameSequence、DetectionsJson、StabilityJson、AI 字段、冰冻/新鲜度/价格及各自来源、纠错审计、耗时 |
|
|
8
|
+
| `mci_vision_subject` | `ObjectNo` | Name、CategoryId、ObjectType、RecognitionMode、ThresholdOverride、ReviewRequired、默认价格/单位/币种 |
|
|
9
|
+
| `mci_vision_sample` | `SampleNo` | SubjectId、Mode、ImagePath、EmbeddingBase64、ModelKey、QualityScore、Status、冰冻/新鲜度/价格及来源请求 |
|
|
10
|
+
| `mci_vision_request` | `RequestNo` | Mode、Status、MatchSource、StreamSessionId、FrameSequence、DetectionsJson、StabilityJson、AI 字段、冰冻/新鲜度/价格及各自来源、纠错审计、耗时 |
|
|
11
11
|
| `mci_vision_profile` | `ProfileKey` | 两类 ModelKey/Threshold、TopK、CandidateLimit、HnswEfSearch、连续投票、AI 开关、取帧间隔、保留策略 |
|
|
12
12
|
|
|
13
13
|
数据库隔离租户的业务表物理层可能没有 `OsClient` 列;建索引前必须以 `microi_get_db_schema` 和物理索引回读为准。若当前部署是共享表租户模型,才把真实租户字段放到唯一索引前缀,不能机械套用。
|
|
@@ -30,15 +30,15 @@
|
|
|
30
30
|
| `LocalMatched` | `Database` | 是 | 当前模型版本样本达到阈值 |
|
|
31
31
|
| `AiPending` | `None` | 否 | 后台任务已接受 |
|
|
32
32
|
| `Unmatched` | `None` | 是 | 未命中且 AI 关闭 |
|
|
33
|
-
| `AiMatched` | `AI` | 是 | AI 标签已回写 |
|
|
34
|
-
| `Corrected` | `Manual` | 是 | 用户已把结果修正为当前租户的可信对象 |
|
|
33
|
+
| `AiMatched` | `AI` | 是 | AI 标签已回写 |
|
|
34
|
+
| `Corrected` | `Manual` | 是 | 用户已把结果修正为当前租户的可信对象 |
|
|
35
35
|
| `Failed` | `None` | 是 | 本地流水线或 Worker 最终失败 |
|
|
36
36
|
| `ManualReview` | `None` | 是 | 高风险场景需要人工复核 |
|
|
37
37
|
| `LowQuality` | `None` | 是 | 低于质量阈值 |
|
|
38
38
|
|
|
39
|
-
`Status` 与 `MatchSource` 必须一起返回。AI 成功不应填充 `SubjectId`,除非后续人工确认并通过正常业务接口绑定。
|
|
40
|
-
|
|
41
|
-
生鲜字段同样保留独立来源:`FrozenStateSource`、`FreshnessSource`、`PriceSource` 只能是 `Database/AI/Manual/None`。数据库命中时样本字段优先、对象默认价格次之;未命中后 AI 才能补充。价格是区间与单位估计,不是订单或称重结算事实。
|
|
39
|
+
`Status` 与 `MatchSource` 必须一起返回。AI 成功不应填充 `SubjectId`,除非后续人工确认并通过正常业务接口绑定。
|
|
40
|
+
|
|
41
|
+
生鲜字段同样保留独立来源:`FrozenStateSource`、`FreshnessSource`、`PriceSource` 只能是 `Database/AI/Manual/None`。数据库命中时样本字段优先、对象默认价格次之;未命中后 AI 才能补充。价格是区间与单位估计,不是订单或称重结算事实。
|
|
42
42
|
|
|
43
43
|
## Runtime 请求
|
|
44
44
|
|
|
@@ -71,7 +71,7 @@ Face 模式必须 `ConsentConfirmed=true`;服务端不能只信任前端 check
|
|
|
71
71
|
|
|
72
72
|
轮询应在终态停止,并使用指数或有界间隔;页面卸载、取消或新帧覆盖旧帧时应中止旧轮询。
|
|
73
73
|
|
|
74
|
-
### Enroll
|
|
74
|
+
### Enroll
|
|
75
75
|
|
|
76
76
|
```json
|
|
77
77
|
{
|
|
@@ -83,25 +83,25 @@ Face 模式必须 `ConsentConfirmed=true`;服务端不能只信任前端 check
|
|
|
83
83
|
}
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
服务端读取对象的 Category/Mode,不能信任调用方自行提交 SubjectName、CategoryName 或 ModelKey。
|
|
87
|
-
|
|
88
|
-
### Correct
|
|
89
|
-
|
|
90
|
-
```json
|
|
91
|
-
{
|
|
92
|
-
"Action": "Correct",
|
|
93
|
-
"RequestNo": "待修正识别记录",
|
|
94
|
-
"SubjectId": "当前租户正确对象Id",
|
|
95
|
-
"CorrectionReason": "人工复核原因",
|
|
96
|
-
"SaveAsSample": true
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
服务端必须重新读取请求和对象,校验租户、权限、启用状态与识别模式;保存原结果、修正人、时间和原因。`SaveAsSample=true` 时按来源请求幂等录入,不能因重试重复生成样本,也不能绕过正常 `Enroll` 的图片、质量、模型和人脸同意门禁。
|
|
86
|
+
服务端读取对象的 Category/Mode,不能信任调用方自行提交 SubjectName、CategoryName 或 ModelKey。
|
|
87
|
+
|
|
88
|
+
### Correct
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"Action": "Correct",
|
|
93
|
+
"RequestNo": "待修正识别记录",
|
|
94
|
+
"SubjectId": "当前租户正确对象Id",
|
|
95
|
+
"CorrectionReason": "人工复核原因",
|
|
96
|
+
"SaveAsSample": true
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
服务端必须重新读取请求和对象,校验租户、权限、启用状态与识别模式;保存原结果、修正人、时间和原因。`SaveAsSample=true` 时按来源请求幂等录入,不能因重试重复生成样本,也不能绕过正常 `Enroll` 的图片、质量、模型和人脸同意门禁。
|
|
101
101
|
|
|
102
102
|
## 公开结果最小字段
|
|
103
103
|
|
|
104
|
-
允许返回:RequestNo、FrameId、StreamSessionId、FrameSequence、Mode、Status、MatchSource、SubjectId/Name、CategoryId/Name、LocalSimilarity、Confidence、对象框/TrackId、Stability、AiLabel/Category/Description/Candidates、FrozenState/Freshness/EstimatedPrice/Unit/Currency 及各自来源、ModelKey/Version、ImageWidth/Height、QualityScore、HasImage、短期授权 ImageUrl、RequestedAt、CompletedAt、ElapsedMs、ErrorMessage 和不含秘密的纠错审计摘要。
|
|
104
|
+
允许返回:RequestNo、FrameId、StreamSessionId、FrameSequence、Mode、Status、MatchSource、SubjectId/Name、CategoryId/Name、LocalSimilarity、Confidence、对象框/TrackId、Stability、AiLabel/Category/Description/Candidates、FrozenState/Freshness/EstimatedPrice/Unit/Currency 及各自来源、ModelKey/Version、ImageWidth/Height、QualityScore、HasImage、短期授权 ImageUrl、RequestedAt、CompletedAt、ElapsedMs、ErrorMessage 和不含秘密的纠错审计摘要。
|
|
105
105
|
|
|
106
106
|
禁止返回:EmbeddingBase64、InputFilePath、图片 Base64、模型磁盘路径、AI Provider Key、系统提示词、后台任务内部载荷。
|
|
107
107
|
|
|
@@ -153,11 +153,11 @@ Face 模式必须 `ConsentConfirmed=true`;服务端不能只信任前端 check
|
|
|
153
153
|
- 数据库优先且 AI 不入队;
|
|
154
154
|
- 未命中 + AI 开启立即返回 AiPending;
|
|
155
155
|
- Worker 成功/失败/重复消费收敛;
|
|
156
|
-
- AI 关闭直接 Unmatched;
|
|
157
|
-
- 低质量不进入匹配;
|
|
158
|
-
- 生鲜字段数据库优先、AI 只在未命中后补充,字段来源不会串改;
|
|
159
|
-
- Correct 校验对象与模式、保存原结果和审计,SaveAsSample 按 RequestNo 幂等;
|
|
160
|
-
- Recent/Result 的历史图片只返回授权 URL,不返回原始私有路径;
|
|
156
|
+
- AI 关闭直接 Unmatched;
|
|
157
|
+
- 低质量不进入匹配;
|
|
158
|
+
- 生鲜字段数据库优先、AI 只在未命中后补充,字段来源不会串改;
|
|
159
|
+
- Correct 校验对象与模式、保存原结果和审计,SaveAsSample 按 RequestNo 幂等;
|
|
160
|
+
- Recent/Result 的历史图片只返回授权 URL,不返回原始私有路径;
|
|
161
161
|
- 受保护向量只能在同租户同核心引擎解开;
|
|
162
162
|
- Hook 不接收敏感载荷且 CreateIfMissing 不被升级覆盖。
|
|
163
163
|
|
|
@@ -166,10 +166,10 @@ Face 模式必须 `ConsentConfirmed=true`;服务端不能只信任前端 check
|
|
|
166
166
|
- 已登录真实菜单打开 MicroService,不是独立 Mock 页面;
|
|
167
167
|
- 桌面、窄屏、暗色、键盘焦点和文字对比度;
|
|
168
168
|
- 上传预览、清除、重复选择、错误格式/超限;
|
|
169
|
-
- 摄像头授权拒绝、成功、暂停、继续、强制当前帧、快速关闭与卸载清理;覆盖 getUserMedia/video.play 与关闭竞态;
|
|
170
|
-
- Database/AiPending/AI/Manual/Unmatched/LowQuality/AiFailed 状态和数据库→AI 两段进度;
|
|
171
|
-
- 桌面全宽三栏;390×844 竖屏和短横屏中采集、结果、最近记录同屏,页面级无纵向滚动且不被宿主底栏遮挡;
|
|
172
|
-
- 历史缩略图授权加载、原画弹窗、纠错和可选存样本;
|
|
169
|
+
- 摄像头授权拒绝、成功、暂停、继续、强制当前帧、快速关闭与卸载清理;覆盖 getUserMedia/video.play 与关闭竞态;
|
|
170
|
+
- Database/AiPending/AI/Manual/Unmatched/LowQuality/AiFailed 状态和数据库→AI 两段进度;
|
|
171
|
+
- 桌面全宽三栏;390×844 竖屏和短横屏中采集、结果、最近记录同屏,页面级无纵向滚动且不被宿主底栏遮挡;
|
|
172
|
+
- 历史缩略图授权加载、原画弹窗、纠错和可选存样本;
|
|
173
173
|
- FaceConsent 默认未勾选,未同意按钮禁用且后端拒绝;
|
|
174
174
|
- Console/PageError/失败请求为 0 或逐项解释。
|
|
175
175
|
|