@microi.net/cli 6.1.0 → 6.1.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 (39) 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 +4 -4
  7. package/cordis.patch.yml +1 -1
  8. package/package.json +1 -1
  9. package/scripts/mcp-server.js +78 -78
  10. package/scripts/microi-skills.meta.json +230 -230
  11. package/skills/.microi-skills-version.json +2 -2
  12. package/skills/.progressive-disclosure-manifest.json +39 -39
  13. package/skills/README.md +287 -287
  14. package/skills/ai-engine/SKILL.md +273 -273
  15. package/skills/app-store/SKILL.md +531 -531
  16. package/skills/message-notification/SKILL.md +1 -1
  17. package/skills/microi-client-frontend/SKILL.md +19 -19
  18. package/skills/microi-codex-installer/SKILL.md +233 -233
  19. package/skills/microi-datasource-mapping/SKILL.md +9 -0
  20. package/skills/microi-deployment/SKILL.md +1 -1
  21. package/skills/microi-microservice/SKILL.md +353 -353
  22. package/skills/microi-sso/references/acceptance.md +51 -51
  23. package/skills/microi-system-delivery/SKILL.md +115 -115
  24. package/skills/microi-system-delivery/references/context-quality.md +54 -54
  25. package/skills/microi-system-delivery/references/progressive-03-/345/256/211/345/205/250/344/270/216/350/267/250/347/253/257/351/252/214/346/224/266.md +65 -65
  26. package/skills/page-engine/SKILL.md +24 -24
  27. package/skills/playwright-e2e/SKILL.md +2 -0
  28. package/skills/unity-integration/references/ai-app-delivery.md +119 -119
  29. package/skills/v8-api-config/SKILL.md +400 -400
  30. package/skills/v8-formengine-http/SKILL.md +238 -238
  31. package/skills/v8-saas-multi-tenant/SKILL.md +309 -305
  32. package/skills/v8-security/SKILL.md +2 -0
  33. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +9 -3
  34. package/skills/v8-tcp-integration/SKILL.md +225 -158
  35. package/skills/v8-utilities/SKILL.md +105 -104
  36. package/skills/v8-utilities/references/server-api-index.md +189 -188
  37. package/skills/workspace-conventions/SKILL.md +168 -168
  38. 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 +32 -32
  39. package/skills/workspace-conventions/references/progressive-04-/345/267/245/344/275/234/345/214/272/344/270/216/345/271/263/345/217/260/344/270/223/351/241/271/344/277/235/351/232/234.md +188 -188
@@ -1,104 +1,105 @@
1
- ---
2
- name: v8-utilities
3
- description: Microi V8 全局对象、上下文变量和通用函数索引。用于查询某个 V8 函数是否存在、区分前端与后端 API,或使用 V8.Method、Base64、EncryptHelper、V8.WeChat、Action、CurrentUser、SysConfig、OsClient、扫码和客户端导航工具。
4
- ---
5
-
6
- > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
-
8
- # Microi V8 通用能力与函数索引
9
-
10
- 本 Skill 是 V8 能力的路由入口,不替代 CRUD、HTTP、缓存、文件、图片、Office、
11
- 工作流等专项 Skill。遇到“吾码有没有某个函数”“这个 API 在前端还是后端”
12
- 或官网函数列表同步任务时,先在这里确定运行端和正式名称,再读取专项 Skill。
13
-
14
- ## 先判断运行端
15
-
16
- | 运行端 | 典型位置 | API 特征 |
17
- |---|---|---|
18
- | 前端 | 字段事件、按钮、列表、InFormV8、SubmitFormV8、OutFormV8 | 浏览器 Promise/回调、弹窗、路由、`V8.Print`、扫码 |
19
- | 后端 | 接口引擎、SubmitBeforeServerV8、SubmitAfterServerV8、DataFilterV8 | `V8.Db`、事务、缓存、Office、加密、服务端 HTTP |
20
-
21
- 同名对象不保证两端方法一致。例如前端 `V8.Base64.encode/decode` 与后端
22
- `V8.Base64.StringToBase64/Base64ToString` 不同;前端标准运行时没有公开
23
- `V8.ModuleEngine`,后端才有模块引擎对象。
24
-
25
- ## 必读索引
26
-
27
- - 前端全部上下文、表单/列表、导航、网络、引擎和工具:
28
- `references/client-api-index.md`
29
- - 后端上下文、`V8.Method`、Base64、加密、异步与扩展对象:
30
- `references/server-api-index.md`
31
- - 平台 HTTP 路由、动态路由与管理接口边界:
32
- `references/platform-http-routes.md`
33
- - 蓝牙标签/小票打印:
34
- `../v8-frontend-events/references/bluetooth-print.md`
35
-
36
- 若函数未出现在上述索引或当前源码定义中,不得按名字猜测。先搜索
37
- `Microi.Client/src/views/form-engine/diy-components/v8-api-definitions.js`、
38
- `v8-api-server-definitions.js`、V8 宿主接口和官网中文函数列表。
39
-
40
- 邮箱相关能力读取 [email-engine](../email-engine/SKILL.md):`V8.Email` 包含
41
- `ProtectCredential / TestConnection / ListFolders / Fetch / Inspect / GetMessage /
42
- GetAttachment / SetFlags / Move / Send / StoreSent`。
43
- 业务使用 `mci-email` 接口引擎,MCP 使用 `microi_email_query / microi_email_manage / microi_email_send`。
44
-
45
- ## 常用通用写法
46
-
47
- ```javascript
48
- // 两端通用的租户/用户上下文,具体字段按当前上下文判空
49
- var osClient = V8.OsClient;
50
- var userId = V8.CurrentUser && V8.CurrentUser.Id;
51
-
52
- // 后端稳定标识与时间
53
- var id = V8.Method.NewUlid();
54
- var now = DateNow('yyyy-MM-dd HH:mm:ss');
55
- var timestamp = V8.Method.GetTimestamp();
56
-
57
- // 后端 Base64
58
- var encoded = V8.Base64.StringToBase64('吾码');
59
- var decoded = V8.Base64.Base64ToString(encoded);
60
-
61
- // 前端 Base64
62
- var clientEncoded = V8.Base64.encode('吾码');
63
- var clientDecoded = V8.Base64.decode(clientEncoded);
64
- ```
65
-
66
- ## 能力选择
67
-
68
- - 日期基础函数由新版后端运行时自举,不能要求租户先配置 DateNow 才能安装应用。全局函数管理使用系统设置子表 `mci_global_function`,按 `SysConfigId + Runtime(Client/Server) + FunctionName` 隔离,一行一个同名 function 声明;用 `V8.Method.ValidateGlobalFunction` 只解析验证,不执行源码。
69
- - 原有前后端全局 V8 必须保留,合并顺序为内置日期、函数库、租户原有代码;同名原有函数优先。不得用官方全局脚本整段覆盖客户脚本。函数库种子 `InsertIfMissing`,不得升级覆盖客户已改源码。
70
- - 列表和合并代码走 L1/Redis,表单引擎真实提交后更新租户版本并通知其它节点;回滚不变更版本。禁止通过直接 SQL 修改函数库规避失效。前端已打开页面需要刷新。
71
-
72
- ## 受信固定步长运行时发现
73
-
74
- `V8.Method.RunPlatformApiRuntime({RuntimeKey:'fixed-step-simulation',Action,Param})` 属于需后端正式安装的通用原子。动作是 DescribeInvocation/CreateInitialState/AdvanceBatch/Project/ObserveOwnedRoom/StopOwnedRoom/DrainOwnedRoom;精确引擎Key由后台已审批目录限制,不能用通用private转发接口原样接受玩家信封。Param只能承载经接口引擎授权后的数据,不能指定Tenant/EngineKey/NodeId/客户端时钟作为真实上下文。Observe是提交前有界调度提示,后续须重新核DB,不是提交回执;终局用Drain保留当前请求提交机会,Stop则立即取消。规则程序集入口与hash须由私有后端发行组合固定,V8/MCP不提供上传即执行的注册能力。详细边界见unity-integration及后端V8主文档;线上缺原子时明确未安装,不能用Job/SignalR冒充。
75
-
76
- 固定步运行时的临时拒绝仅使用 `DataAppend.ErrorCode` 六码白名单:KernelBusy/HostMemoryPressure/RoomStillDraining/CoordinatorStopping/StaleLease/ComputeBudgetExceeded,并要求 `Retryable===true`。Managed须显式catch-return稳定Code0并回滚,客户端有界同键重试;禁止按中文Msg或带行号异常猜测重试,更不能把授权/来源/未知失败当临时成功。此兼容扩展不增加审批表/配置或MCP任意注册入口。
77
-
78
- 普通租户的编译证明默认 `TenantInstallation`,保留真实 Installed 回执及旧摘要。官方同租户发布源禁止安装自己,只能由后端发行组合明确固定 `OfficialPublishedSnapshot`:`InstallRecordId` 绑定 `mic_data_version.Id`,原始 `Data` 的UTF-8 SHA-256另固定于编译回执并参与独立审批摘要。该类别与快照摘要不从Param或自由表字段选择、不新增表字段、不伪造Installed。受信官方身份、当前Published/审批有效指针、Verified包hash/size/HDFS、不可变快照、V3 Completed源码hash及实际DLL依赖须全部匹配;当前状态变化、软删或主库不可用下次调用立即拒绝,旧历史存在不足以授权。跨租户仍拒绝,结构发布不等于后端安装或代码审批。审批表纳入通用强制管理员清单,普通用户即使误授表/菜单权限仍不得改授权状态;V8Limit和ReadPrimary不是写权限。
79
-
80
- ## 平台兼容入口索引
81
-
82
- 下列旧 HTTP 地址仍由受控兼容链路识别,不能据此绕过 DiyToken、租户或权限校验:`/api/FormEngine/GetSysConfig`、`/api/Os/GetDateTimeNow`、`/api/SysLog/AddSysLog`、`/api/SysUser/`。畅捷通 V2 回调在接口引擎中编排,可信后端只提供当前租户绑定的 `V8.Method.DecodeChanjetCallbackV2` 原子。
83
-
84
- | 需求 | 专项 Skill |
85
- |---|---|
86
- | 表单 CRUD、`_Where` | `v8-crud-api`、`v8-sql-query` |
87
- | HTTP/第三方接口 | `v8-http-integration` |
88
- | TCP 原始字节/网络小票机/设备 | `v8-tcp-integration` |
89
- | Redis/Hash | `v8-cache-pattern` |
90
- | 文件/HDFS | `v8-file-upload` |
91
- | 图片 | `v8-image-processing` |
92
- | Excel/Word/PPT/邮件 | `v8-export-import` |
93
- | 微信支付签名、授权头、API v3 AES-GCM 解密 | `references/server-api-index.md`;安全边界见 `v8-security` |
94
- | 前端事件/打印/扫码 | `v8-frontend-events` |
95
- | 后端表单事件 | `v8-table-event` |
96
- | 接口配置/流式响应/异步/后台任务 | `v8-api-config` |
97
-
98
- ## 不可越过的边界
99
-
100
- - 平台能力优先使用 `V8.*`,不要假设全局 `System` 可访问任意 CLR 类型。
101
- - `V8.SysConfig`、`V8.OsClientModel`、`V8.ClientModel` 可能含连接串、密钥和供应商配置,不直接返回前端或写日志。
102
- - 摘要算法不是密码存储。新密码不使用 MD5/SHA1/SHA256 直接保存。
103
- - `setTimeout`、`Task.Run` 不能承担请求返回后的可靠后台执行。
104
- - 前端值只可用于交互;权限、事务和最终业务校验必须在可信后端执行。
1
+ ---
2
+ name: v8-utilities
3
+ description: Microi V8 全局对象、上下文变量和通用函数索引。用于查询某个 V8 函数是否存在、区分前端与后端 API,或使用 V8.Method、Base64、EncryptHelper、V8.WeChat、Action、CurrentUser、SysConfig、OsClient、扫码和客户端导航工具。
4
+ ---
5
+
6
+ > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
+
8
+ # Microi V8 通用能力与函数索引
9
+
10
+ 本 Skill 是 V8 能力的路由入口,不替代 CRUD、HTTP、缓存、文件、图片、Office、
11
+ 工作流等专项 Skill。遇到“吾码有没有某个函数”“这个 API 在前端还是后端”
12
+ 或官网函数列表同步任务时,先在这里确定运行端和正式名称,再读取专项 Skill。
13
+
14
+ ## 先判断运行端
15
+
16
+ | 运行端 | 典型位置 | API 特征 |
17
+ |---|---|---|
18
+ | 前端 | 字段事件、按钮、列表、InFormV8、SubmitFormV8、OutFormV8 | 浏览器 Promise/回调、弹窗、路由、`V8.Print`、扫码 |
19
+ | 后端 | 接口引擎、SubmitBeforeServerV8、SubmitAfterServerV8、DataFilterV8 | `V8.Db`、事务、缓存、Office、加密、服务端 HTTP |
20
+
21
+ 同名对象不保证两端方法一致。例如前端 `V8.Base64.encode/decode` 与后端
22
+ `V8.Base64.StringToBase64/Base64ToString` 不同;前端标准运行时没有公开
23
+ `V8.ModuleEngine`,后端才有模块引擎对象。
24
+
25
+ ## 必读索引
26
+
27
+ - 前端全部上下文、表单/列表、导航、网络、引擎和工具:
28
+ `references/client-api-index.md`
29
+ - 后端上下文、`V8.Method`、Base64、加密、异步与扩展对象:
30
+ `references/server-api-index.md`
31
+ - 平台 HTTP 路由、动态路由与管理接口边界:
32
+ `references/platform-http-routes.md`
33
+ - 蓝牙标签/小票打印:
34
+ `../v8-frontend-events/references/bluetooth-print.md`
35
+
36
+ 若函数未出现在上述索引或当前源码定义中,不得按名字猜测。先搜索
37
+ `Microi.Client/src/views/form-engine/diy-components/v8-api-definitions.js`、
38
+ `v8-api-server-definitions.js`、V8 宿主接口和官网中文函数列表。
39
+
40
+ 邮箱相关能力读取 [email-engine](../email-engine/SKILL.md):`V8.Email` 包含
41
+ `ProtectCredential / TestConnection / ListFolders / Fetch / Inspect / GetMessage /
42
+ GetAttachment / SetFlags / Move / Send / StoreSent`。
43
+ 业务使用 `mci-email` 接口引擎,MCP 使用 `microi_email_query / microi_email_manage / microi_email_send`。
44
+
45
+ ## 常用通用写法
46
+
47
+ ```javascript
48
+ // 两端通用的租户/用户上下文,具体字段按当前上下文判空
49
+ var osClient = V8.OsClient;
50
+ var userId = V8.CurrentUser && V8.CurrentUser.Id;
51
+
52
+ // 后端稳定标识与时间
53
+ var id = V8.Method.NewUlid();
54
+ var now = DateNow('yyyy-MM-dd HH:mm:ss');
55
+ var timestamp = V8.Method.GetTimestamp();
56
+
57
+ // 后端 Base64
58
+ var encoded = V8.Base64.StringToBase64('吾码');
59
+ var decoded = V8.Base64.Base64ToString(encoded);
60
+
61
+ // 前端 Base64
62
+ var clientEncoded = V8.Base64.encode('吾码');
63
+ var clientDecoded = V8.Base64.decode(clientEncoded);
64
+ ```
65
+
66
+ ## 能力选择
67
+
68
+ - 日期基础函数由新版后端运行时自举,不能要求租户先配置 DateNow 才能安装应用。全局函数管理使用系统设置子表 `mci_global_function`,按 `SysConfigId + Runtime(Client/Server) + FunctionName` 隔离,一行一个同名 function 声明;用 `V8.Method.ValidateGlobalFunction` 只解析验证,不执行源码。
69
+ - 原有前后端全局 V8 必须保留,合并顺序为内置日期、函数库、租户原有代码;同名原有函数优先。不得用官方全局脚本整段覆盖客户脚本。函数库种子 `InsertIfMissing`,不得升级覆盖客户已改源码。
70
+ - 列表和合并代码走 L1/Redis,表单引擎真实提交后更新租户版本并通知其它节点;回滚不变更版本。禁止通过直接 SQL 修改函数库规避失效。前端已打开页面需要刷新。
71
+
72
+ ## 受信固定步长运行时发现
73
+
74
+ `V8.Method.RunPlatformApiRuntime({RuntimeKey:'fixed-step-simulation',Action,Param})` 属于需后端正式安装的通用原子。动作是 DescribeInvocation/CreateInitialState/AdvanceBatch/Project/ObserveOwnedRoom/StopOwnedRoom/DrainOwnedRoom;精确引擎Key由后台已审批目录限制,不能用通用private转发接口原样接受玩家信封。Param只能承载经接口引擎授权后的数据,不能指定Tenant/EngineKey/NodeId/客户端时钟作为真实上下文。Observe是提交前有界调度提示,后续须重新核DB,不是提交回执;终局用Drain保留当前请求提交机会,Stop则立即取消。规则程序集入口与hash须由私有后端发行组合固定,V8/MCP不提供上传即执行的注册能力。详细边界见unity-integration及后端V8主文档;线上缺原子时明确未安装,不能用Job/SignalR冒充。
75
+
76
+ 固定步运行时的临时拒绝仅使用 `DataAppend.ErrorCode` 六码白名单:KernelBusy/HostMemoryPressure/RoomStillDraining/CoordinatorStopping/StaleLease/ComputeBudgetExceeded,并要求 `Retryable===true`。Managed须显式catch-return稳定Code0并回滚,客户端有界同键重试;禁止按中文Msg或带行号异常猜测重试,更不能把授权/来源/未知失败当临时成功。此兼容扩展不增加审批表/配置或MCP任意注册入口。
77
+
78
+ 普通租户的编译证明默认 `TenantInstallation`,保留真实 Installed 回执及旧摘要。官方同租户发布源禁止安装自己,只能由后端发行组合明确固定 `OfficialPublishedSnapshot`:`InstallRecordId` 绑定 `mic_data_version.Id`,原始 `Data` 的UTF-8 SHA-256另固定于编译回执并参与独立审批摘要。该类别与快照摘要不从Param或自由表字段选择、不新增表字段、不伪造Installed。受信官方身份、当前Published/审批有效指针、Verified包hash/size/HDFS、不可变快照、V3 Completed源码hash及实际DLL依赖须全部匹配;当前状态变化、软删或主库不可用下次调用立即拒绝,旧历史存在不足以授权。跨租户仍拒绝,结构发布不等于后端安装或代码审批。审批表纳入通用强制管理员清单,普通用户即使误授表/菜单权限仍不得改授权状态;V8Limit和ReadPrimary不是写权限。
79
+
80
+ ## 平台兼容入口索引
81
+
82
+ 下列旧 HTTP 地址仍由受控兼容链路识别,不能据此绕过 DiyToken、租户或权限校验:`/api/FormEngine/GetSysConfig`、`/api/Os/GetDateTimeNow`、`/api/SysLog/AddSysLog`、`/api/SysUser/`。畅捷通 V2 回调在接口引擎中编排,可信后端只提供当前租户绑定的 `V8.Method.DecodeChanjetCallbackV2` 原子。
83
+
84
+ | 需求 | 专项 Skill |
85
+ |---|---|
86
+ | 表单 CRUD、`_Where` | `v8-crud-api`、`v8-sql-query` |
87
+ | HTTP/第三方接口 | `v8-http-integration` |
88
+ | TCP 原始字节/网络小票机/设备 | `v8-tcp-integration` |
89
+ | 通用 IoT 设备原连接控制、`V8.IoT.Send`、协议拆帧与跨节点去重 | `v8-tcp-integration`;MQTT 设备使用 `v8-mq-mqtt` |
90
+ | Redis/Hash | `v8-cache-pattern` |
91
+ | 文件/HDFS | `v8-file-upload` |
92
+ | 图片 | `v8-image-processing` |
93
+ | Excel/Word/PPT/邮件 | `v8-export-import` |
94
+ | 微信支付签名、授权头、API v3 AES-GCM 解密 | `references/server-api-index.md`;安全边界见 `v8-security` |
95
+ | 前端事件/打印/扫码 | `v8-frontend-events` |
96
+ | 后端表单事件 | `v8-table-event` |
97
+ | 接口配置/流式响应/异步/后台任务 | `v8-api-config` |
98
+
99
+ ## 不可越过的边界
100
+
101
+ - 平台能力优先使用 `V8.*`,不要假设全局 `System` 可访问任意 CLR 类型。
102
+ - `V8.SysConfig`、`V8.OsClientModel`、`V8.ClientModel` 可能含连接串、密钥和供应商配置,不直接返回前端或写日志。
103
+ - 摘要算法不是密码存储。新密码不使用 MD5/SHA1/SHA256 直接保存。
104
+ - `setTimeout`、`Task.Run` 不能承担请求返回后的可靠后台执行。
105
+ - 前端值只可用于交互;权限、事务和最终业务校验必须在可信后端执行。
@@ -1,188 +1,189 @@
1
- # 后端 V8 API 索引
2
-
3
- 本索引对应接口引擎和后端表单事件。专项 API 的完整模板仍以相应 Skill 为准。
4
-
5
- ## 请求与执行上下文
6
-
7
- | API/变量 | 说明 |
8
- |---|---|
9
- | `V8.Param`、`V8.Header` | URL、Form、JSON 参数与请求头 |
10
- | `V8.CurrentUser` | 当前可信用户;匿名接口可能为空 |
11
- | `V8.OsClient` | 当前租户 |
12
- | `V8.SysConfig` | 系统配置;可能含敏感项,不直接返回 |
13
- | `V8.OsClientModel`、`V8.ClientModel` | 租户配置兼容别名;严禁泄露连接串/密钥 |
14
- | `V8.Form`、`V8.OldForm` | 后端表单事件的新旧数据 |
15
- | `V8.FormSubmitAction` | `Add/Upt/Del` |
16
- | `V8.EventName`、`V8.InvokeType` | 事件名与 Server/Client 调用来源 |
17
- | `V8.TableModel`、`V8.TableData` | 当前表模型/行数据 |
18
- | `V8.RowIndex`、`V8.CacheData`、`V8.NotSaveField` | DataFilter 等事件上下文 |
19
- | `V8.LineValue`、`V8.NextNodeId`、`V8.WF` | 工作流路线与节点上下文 |
20
- | `V8.FilesByteBase64` | 上传文件 Base64 字典 |
21
- | `V8.Limits` | 当前 Jint 资源预算与调用深度 |
22
- | `V8.Stream` | 仅 `ResponseType=Stream` 的接口引擎可用;SSE/NDJSON 暂态分片写入器 |
23
- | `V8.Action` | 服务器全局 V8 自定义方法 |
24
-
25
- ## 调用、数据与异步
26
-
27
- | API | 说明 |
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` |
33
- | `V8.FormEngine.*` | 表单 CRUD,见 `v8-crud-api` |
34
- | `await V8.FormEngine.GetTableDataAsync(...)` | 请求内异步查列表 |
35
- | `V8.Db`、`V8.DbRead`、`V8.DbTrans` | 主库、只读库、共享事务 |
36
- | `V8.DbTrans.FromSql(sql)` | 在平台提供的共享事务内执行参数化 SQL |
37
- | `V8.Dbs`、`V8.Dbs.Open(...)` | 已配置的扩展数据库 |
38
- | `V8.MongoDb.*` | MongoDB CRUD;`UptFormDataByWhere` / `DelFormDataByWhere` 强制参数化非空 `_Where`,禁止更新 `_id`,绑定当前 V8 租户,且不参与 `V8.DbTrans` |
39
- | `V8.DataSourceEngine` | 当前租户数据源引擎对象 |
40
- | `V8.DataSourceEngine.Run(...)`、`V8.DataSourceEngine.RunAsync(...)` | 同步/请求内异步运行数据源 |
41
- | `V8.ModuleEngine` | 后端模块模型能力;不能绕过用户模块权限 |
42
- | `V8.ModuleEngine.GetTableData(...)` | 按 `ModuleEngineKey` 应用模块关联表配置查询 |
43
-
44
- 接口引擎返回后宿主上下文会释放。只在真实 `*Async` 方法上使用 `await`;
45
- 脱离请求的工作使用后台任务、Job、MQ 或 outbox。
46
-
47
- ## V8.Method
48
-
49
- | API | 说明 |
50
- |---|---|
51
- | `V8.Method.NewGuid()`、`V8.Method.NewUlid()` | 生成标识 |
52
- | `V8.Method.GetTimestamp()` | Unix 秒时间戳 |
53
- | `V8.Method.GetBackendVersion()` | 当前 Microi.Core 运行程序集的公开发行版本,格式 `vX.Y.Z`;固定匿名健康接口使用,不返回路径或主机信息 |
54
- | `V8.Method.GetCurrentToken(token,osClient)` | 读取当前 Token 对象;不透传前端 |
55
- | `V8.Method.RefreshLoginUser(userId,osClient?,token?)` | 刷新登录投影;租户取当前 V8/已认证 DiyToken(可信宿主须建立用户+租户作用域),显式 OsClient 仅作一致性断言;普通用户仅本人,同租户超级管理员主库复核后可跨用户。第三参仅兼容历史 `microi-init` 的原始 Token,宿主重新验证且只允许 Token 本人;返回对象、访问密钥、空身份和跨租户均拒绝 |
56
- | `V8.Method.ClearUserLoginInfo(userId,osClient)` | 管理员吊销用户全部终端 Token |
57
- | `V8.Method.GetDirectTableGrantPolicies()` | 读取平台表直连授权策略;仅供可信角色表单事件做最终校验 |
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)` | 结构化系统日志 |
77
- | `V8.Method.ParseWhere(where)` | 兼容旧 Where 转换 |
78
- | `V8.Method.UpdateBackgroundTask(options)` | 上报已提交单位的后台任务进度 |
79
- | `V8.Method.RefreshExtensionDatabases(osClient?)` | 配置表提交后刷新全节点 `V8.Dbs` |
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 作为业务事实源。
87
-
88
- ## Base64 与加密
89
-
90
- ```javascript
91
- var encoded = V8.Base64.StringToBase64('吾码');
92
- var decoded = V8.Base64.Base64ToString(encoded);
93
-
94
- var des = V8.EncryptHelper.DESEncode('legacy-value');
95
- var plain = V8.EncryptHelper.DESDecode(des);
96
- var sha1 = V8.EncryptHelper.SHA1('legacy-value');
97
- var sha256 = V8.EncryptHelper.SHA256('text');
98
- var sha512 = V8.EncryptHelper.SHA512('text');
99
- var hex = V8.EncryptHelper.Sha256Hex('text');
100
- var signature = V8.EncryptHelper.HmacSha256(secretFromConfig, payload);
101
- ```
102
-
103
- `V8.EncryptHelper` 是后端加密/摘要帮助对象。完整入口:
104
- `V8.EncryptHelper.MD5Encrypt`、`V8.EncryptHelper.SHA1`、
105
- `V8.EncryptHelper.SHA256`、`V8.EncryptHelper.SHA512`、
106
- `V8.EncryptHelper.Sha256Hex`、`V8.EncryptHelper.HmacSha256`、
107
- `V8.EncryptHelper.AESEncrypt`、`V8.EncryptHelper.AESDecrypt`、
108
- `V8.EncryptHelper.DESEncode`、`V8.EncryptHelper.DESDecode`。
109
-
110
- DES 只用于明确要求取回原文的兼容业务秘密;保存和显示都在可信后端完成,列表掩码、独立授权、`no-store` 且审计不含明文。登录密码不使用摘要或可逆加密的新设计,完整分级见 `v8-security/SKILL.md`。
111
-
112
- MD5/SHA1 仅为兼容摘要;任何摘要都不能直接作为新密码存储方案。AES/DES/HMAC
113
- 密钥从受控配置读取,不硬编码、不写日志、不返回客户端。
114
-
115
- ## 内置与自定义扩展
116
-
117
- `V8.Alipay`、`V8.AlipayV3`、`V8.WeChat`、`V8.Alidns`、`V8.System`、
118
- `V8.Image` 和 `V8.Tcp` 由当前 `Microi.V8Engine/V8Extend.cs` 注册。扩展可被裁剪或二次
119
- 开发,调用前以目标部署源码和编辑器定义为准。
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
- ## 其它后端扩展
161
-
162
- | 能力 | API |
163
- |---|---|
164
- | 缓存 | `V8.Cache.Set/Get/Remove/Exists/KeyExist/HashSet/HashGet/HashGetAll/HashDelete/HashIncrement` |
165
- | HTTP | `V8.Http.Get/Post/Patch`、`GetResponse/PostResponse/PatchResponse` 及真实 `*Async` 版本 |
166
- | TCP | `V8.Tcp.Send/SendAsync/SendAndReceive/SendAndReceiveAsync`;原始字节与出站安全见 `v8-tcp-integration` |
167
- | 图片 | `V8.Image.Create/Merge/Overlay/Watermark/Resize/Crop/Rotate/Flip/Draw/Convert/GetInfo/CreateQRCode` |
168
- | Office | `V8.Office.ExportExcel/ExcelToList/ExportWord/ExportPowerPoint/SendEmail` |
169
- | OCR | `await V8.OCR.Recognize({...})`;服务端租户配置与调用参数隔离,详见 `ocr-engine` |
170
- | 文件 | `V8.HDFS`、`V8.Method.Upload/GetPrivateFileUrl` |
171
- | MQ | `V8.MQ.SendMsg` |
172
- | 短信 | `V8.Sms.Send` |
173
- | 翻译 | `V8.TranslateEngine.Translate` 与语言缓存方法 |
174
- | 爬虫 | `V8.Spider` |
175
- | 主机监控 | `V8.System`,仅管理员/运维 |
176
- | 工作流 | `V8.WFEngine`、事件中的 `V8.WF` |
177
-
178
- ## 全局函数与 CLR 边界
179
-
180
- | 函数 | 说明 |
181
- |---|---|
182
- | `DateNow(format)` | 当前时间字符串 |
183
- | `DateFormat(value,format)` | 格式化日期 |
184
- | `DateAdd(value,unit,amount,format)` | 日期加减 |
185
- | `console.log/error/warn/info` | 服务端日志,必须脱敏限长 |
186
-
187
- 平台能力优先使用 `V8.*`。不要依赖任意全局 `System` CLR 访问;平台还存在
188
- `V8.System` 主机监控对象,两者不是一回事。
1
+ # 后端 V8 API 索引
2
+
3
+ 本索引对应接口引擎和后端表单事件。专项 API 的完整模板仍以相应 Skill 为准。
4
+
5
+ ## 请求与执行上下文
6
+
7
+ | API/变量 | 说明 |
8
+ |---|---|
9
+ | `V8.Param`、`V8.Header` | URL、Form、JSON 参数与请求头 |
10
+ | `V8.CurrentUser` | 当前可信用户;匿名接口可能为空 |
11
+ | `V8.OsClient` | 当前租户 |
12
+ | `V8.SysConfig` | 系统配置;可能含敏感项,不直接返回 |
13
+ | `V8.OsClientModel`、`V8.ClientModel` | 租户配置兼容别名;严禁泄露连接串/密钥 |
14
+ | `V8.Form`、`V8.OldForm` | 后端表单事件的新旧数据 |
15
+ | `V8.FormSubmitAction` | `Add/Upt/Del` |
16
+ | `V8.EventName`、`V8.InvokeType` | 事件名与 Server/Client 调用来源 |
17
+ | `V8.TableModel`、`V8.TableData` | 当前表模型/行数据 |
18
+ | `V8.RowIndex`、`V8.CacheData`、`V8.NotSaveField` | DataFilter 等事件上下文 |
19
+ | `V8.LineValue`、`V8.NextNodeId`、`V8.WF` | 工作流路线与节点上下文 |
20
+ | `V8.FilesByteBase64` | 上传文件 Base64 字典 |
21
+ | `V8.Limits` | 当前 Jint 资源预算与调用深度 |
22
+ | `V8.Stream` | 仅 `ResponseType=Stream` 的接口引擎可用;SSE/NDJSON 暂态分片写入器 |
23
+ | `V8.Action` | 服务器全局 V8 自定义方法 |
24
+
25
+ ## 调用、数据与异步
26
+
27
+ | API | 说明 |
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` |
33
+ | `V8.FormEngine.*` | 表单 CRUD,见 `v8-crud-api` |
34
+ | `await V8.FormEngine.GetTableDataAsync(...)` | 请求内异步查列表 |
35
+ | `V8.Db`、`V8.DbRead`、`V8.DbTrans` | 主库、只读库、共享事务 |
36
+ | `V8.DbTrans.FromSql(sql)` | 在平台提供的共享事务内执行参数化 SQL |
37
+ | `V8.Dbs`、`V8.Dbs.Open(...)` | 已配置的扩展数据库 |
38
+ | `V8.MongoDb.*` | MongoDB CRUD;`UptFormDataByWhere` / `DelFormDataByWhere` 强制参数化非空 `_Where`,禁止更新 `_id`,绑定当前 V8 租户,且不参与 `V8.DbTrans` |
39
+ | `V8.DataSourceEngine` | 当前租户数据源引擎对象 |
40
+ | `V8.DataSourceEngine.Run(...)`、`V8.DataSourceEngine.RunAsync(...)` | 同步/请求内异步运行数据源 |
41
+ | `V8.ModuleEngine` | 后端模块模型能力;不能绕过用户模块权限 |
42
+ | `V8.ModuleEngine.GetTableData(...)` | 按 `ModuleEngineKey` 应用模块关联表配置查询 |
43
+
44
+ 接口引擎返回后宿主上下文会释放。只在真实 `*Async` 方法上使用 `await`;
45
+ 脱离请求的工作使用后台任务、Job、MQ 或 outbox。
46
+
47
+ ## V8.Method
48
+
49
+ | API | 说明 |
50
+ |---|---|
51
+ | `V8.Method.NewGuid()`、`V8.Method.NewUlid()` | 生成标识 |
52
+ | `V8.Method.GetTimestamp()` | Unix 秒时间戳 |
53
+ | `V8.Method.GetBackendVersion()` | 当前 Microi.Core 运行程序集的公开发行版本,格式 `vX.Y.Z`;固定匿名健康接口使用,不返回路径或主机信息 |
54
+ | `V8.Method.GetCurrentToken(token,osClient)` | 读取当前 Token 对象;不透传前端 |
55
+ | `V8.Method.RefreshLoginUser(userId,osClient?,token?)` | 刷新登录投影;租户取当前 V8/已认证 DiyToken(可信宿主须建立用户+租户作用域),显式 OsClient 仅作一致性断言;普通用户仅本人,同租户超级管理员主库复核后可跨用户。第三参仅兼容历史 `microi-init` 的原始 Token,宿主重新验证且只允许 Token 本人;返回对象、访问密钥、空身份和跨租户均拒绝 |
56
+ | `V8.Method.ClearUserLoginInfo(userId,osClient)` | 管理员吊销用户全部终端 Token |
57
+ | `V8.Method.GetDirectTableGrantPolicies()` | 读取平台表直连授权策略;仅供可信角色表单事件做最终校验 |
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)` | 结构化系统日志 |
77
+ | `V8.Method.ParseWhere(where)` | 兼容旧 Where 转换 |
78
+ | `V8.Method.UpdateBackgroundTask(options)` | 上报已提交单位的后台任务进度 |
79
+ | `V8.Method.RefreshExtensionDatabases(osClient?)` | 配置表提交后刷新全节点 `V8.Dbs` |
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 作为业务事实源。
87
+
88
+ ## Base64 与加密
89
+
90
+ ```javascript
91
+ var encoded = V8.Base64.StringToBase64('吾码');
92
+ var decoded = V8.Base64.Base64ToString(encoded);
93
+
94
+ var des = V8.EncryptHelper.DESEncode('legacy-value');
95
+ var plain = V8.EncryptHelper.DESDecode(des);
96
+ var sha1 = V8.EncryptHelper.SHA1('legacy-value');
97
+ var sha256 = V8.EncryptHelper.SHA256('text');
98
+ var sha512 = V8.EncryptHelper.SHA512('text');
99
+ var hex = V8.EncryptHelper.Sha256Hex('text');
100
+ var signature = V8.EncryptHelper.HmacSha256(secretFromConfig, payload);
101
+ ```
102
+
103
+ `V8.EncryptHelper` 是后端加密/摘要帮助对象。完整入口:
104
+ `V8.EncryptHelper.MD5Encrypt`、`V8.EncryptHelper.SHA1`、
105
+ `V8.EncryptHelper.SHA256`、`V8.EncryptHelper.SHA512`、
106
+ `V8.EncryptHelper.Sha256Hex`、`V8.EncryptHelper.HmacSha256`、
107
+ `V8.EncryptHelper.AESEncrypt`、`V8.EncryptHelper.AESDecrypt`、
108
+ `V8.EncryptHelper.DESEncode`、`V8.EncryptHelper.DESDecode`。
109
+
110
+ DES 只用于明确要求取回原文的兼容业务秘密;保存和显示都在可信后端完成,列表掩码、独立授权、`no-store` 且审计不含明文。登录密码不使用摘要或可逆加密的新设计,完整分级见 `v8-security/SKILL.md`。
111
+
112
+ MD5/SHA1 仅为兼容摘要;任何摘要都不能直接作为新密码存储方案。AES/DES/HMAC
113
+ 密钥从受控配置读取,不硬编码、不写日志、不返回客户端。
114
+
115
+ ## 内置与自定义扩展
116
+
117
+ `V8.Alipay`、`V8.AlipayV3`、`V8.WeChat`、`V8.Alidns`、`V8.System`、
118
+ `V8.Image`、`V8.Tcp` 和 `V8.IoT` 由当前 `Microi.V8Engine/V8Extend.cs` 注册。扩展可被裁剪或二次
119
+ 开发,调用前以目标部署源码和编辑器定义为准。
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
+ ## 其它后端扩展
161
+
162
+ | 能力 | API |
163
+ |---|---|
164
+ | 缓存 | `V8.Cache.Set/Get/Remove/Exists/KeyExist/HashSet/HashGet/HashGetAll/HashDelete/HashIncrement` |
165
+ | HTTP | `V8.Http.Get/Post/Patch`、`GetResponse/PostResponse/PatchResponse` 及真实 `*Async` 版本 |
166
+ | TCP | `V8.Tcp.Send/SendAsync/SendAndReceive/SendAndReceiveAsync`;原始字节与出站安全见 `v8-tcp-integration` |
167
+ | IoT 设备原连接下行 | `V8.IoT.Send({DeviceId,CommandId,FrameHex,ExpireSeconds})`;可信接口 Key、协议配置、Redis 路由及执行回执边界见 `v8-tcp-integration`,不包含厂家业务操作 |
168
+ | 图片 | `V8.Image.Create/Merge/Overlay/Watermark/Resize/Crop/Rotate/Flip/Draw/Convert/GetInfo/CreateQRCode` |
169
+ | Office | `V8.Office.ExportExcel/ExcelToList/ExportWord/ExportPowerPoint/SendEmail` |
170
+ | OCR | `await V8.OCR.Recognize({...})`;服务端租户配置与调用参数隔离,详见 `ocr-engine` |
171
+ | 文件 | `V8.HDFS`、`V8.Method.Upload/GetPrivateFileUrl` |
172
+ | MQ | `V8.MQ.SendMsg` |
173
+ | 短信 | `V8.Sms.Send` |
174
+ | 翻译 | `V8.TranslateEngine.Translate` 与语言缓存方法 |
175
+ | 爬虫 | `V8.Spider` |
176
+ | 主机监控 | `V8.System`,仅管理员/运维 |
177
+ | 工作流 | `V8.WFEngine`、事件中的 `V8.WF` |
178
+
179
+ ## 全局函数与 CLR 边界
180
+
181
+ | 函数 | 说明 |
182
+ |---|---|
183
+ | `DateNow(format)` | 当前时间字符串 |
184
+ | `DateFormat(value,format)` | 格式化日期 |
185
+ | `DateAdd(value,unit,amount,format)` | 日期加减 |
186
+ | `console.log/error/warn/info` | 服务端日志,必须脱敏限长 |
187
+
188
+ 平台能力优先使用 `V8.*`。不要依赖任意全局 `System` CLR 访问;平台还存在
189
+ `V8.System` 主机监控对象,两者不是一回事。