@microi.net/cli 5.2.7 → 5.2.9

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 (32) 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/microi-cli.js +37 -29
  10. package/scripts/microi-skills.meta.json +204 -204
  11. package/skills/.microi-skills-version.json +2 -2
  12. package/skills/.progressive-disclosure-manifest.json +15 -15
  13. package/skills/ai-engine/SKILL.md +11 -3
  14. package/skills/app-store/SKILL.md +29 -12
  15. package/skills/message-notification/SKILL.md +12 -1
  16. package/skills/message-notification/references/contracts.md +1 -0
  17. package/skills/microi-ai-app-auth.js +4 -3
  18. 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 +1 -1
  19. 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 +1 -1
  20. package/skills/microi-frontend-sdk/SKILL.md +1 -1
  21. package/skills/microi-mobile-app-quality/SKILL.md +1 -1
  22. 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 +1 -1
  23. package/skills/microi-uniapp-frontend/SKILL.md +1 -1
  24. package/skills/microi.v8.js +75 -21
  25. package/skills/v8-file-upload/SKILL.md +10 -7
  26. 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 +1 -1
  27. 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 +1 -1
  28. package/skills/v8-mongodb/SKILL.md +58 -18
  29. package/skills/v8-saas-multi-tenant/SKILL.md +3 -0
  30. package/skills/v8-security/SKILL.md +3 -1
  31. package/skills/v8-utilities/references/platform-http-routes.md +1 -1
  32. package/skills/v8-utilities/references/server-api-index.md +25 -7
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: v8-mongodb
3
- description: Microi V8 MongoDB 指南。用于使用 V8.MongoDb AddFormData、UptFormData、DelFormData、GetFormData、GetTableData、对象过滤和文档 Id。
3
+ description: Microi V8 MongoDB 指南。用于使用 V8.MongoDb AddFormData、UptFormData、UptFormDataByWhere、DelFormData、DelFormDataByWhere、GetFormData、GetTableData、对象过滤和文档 Id。
4
4
  ---
5
5
 
6
6
  > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
@@ -14,8 +14,10 @@ description: Microi V8 MongoDB 指南。用于使用 V8.MongoDb AddFormData、Up
14
14
  | 方法 | 说明 |
15
15
  |------|------|
16
16
  | `V8.MongoDb.AddFormData({...})` | 新增文档 |
17
- | `V8.MongoDb.UptFormData({...})` | 修改文档(按 Id) |
18
- | `V8.MongoDb.DelFormData({...})` | 删除文档(按 Id) |
17
+ | `V8.MongoDb.UptFormData({...})` | 修改文档(按 Id) |
18
+ | `V8.MongoDb.UptFormDataByWhere({...})` | 按非空 `_Where` 批量修改,禁止修改 `_id` |
19
+ | `V8.MongoDb.DelFormData({...})` | 删除文档(按 Id) |
20
+ | `V8.MongoDb.DelFormDataByWhere({...})` | 按非空 `_Where` 批量删除 |
19
21
  | `V8.MongoDb.GetFormData({...})` | 查询单个文档(按 Id) |
20
22
  | `V8.MongoDb.GetTableData({...})` | 查询文档列表 |
21
23
  | `V8.MongoDb.NewId()` | 生成 MongoDB Id |
@@ -40,7 +42,7 @@ V8.MongoDb.AddFormData({
40
42
  ## 修改文档
41
43
 
42
44
  ```javascript
43
- V8.MongoDb.UptFormData({
45
+ V8.MongoDb.UptFormData({
44
46
  DbName: 'sys_log_2024',
45
47
  TableName: 'log_2024_12',
46
48
  Id: V8.Param.id, // 必传
@@ -48,18 +50,50 @@ V8.MongoDb.UptFormData({
48
50
  Action: '更新操作',
49
51
  UpdateTime: DateNow('yyyy-MM-dd HH:mm:ss')
50
52
  }
51
- });
52
- ```
53
+ });
54
+ ```
55
+
56
+ ### 按条件批量修改
57
+
58
+ ```javascript
59
+ var result = V8.MongoDb.UptFormDataByWhere({
60
+ DbName: 'diy_chat_' + V8.OsClient.toLowerCase(),
61
+ TableName: 'chat_' + DateNow('yyyy'),
62
+ _Where: [
63
+ ['FromUserId', '=', V8.Param.PeerUserId],
64
+ ['ToUserId', '=', V8.CurrentUser.Id],
65
+ ['IsRead', '=', false]
66
+ ],
67
+ _FormData: { IsRead: true }
68
+ });
69
+ ```
70
+
71
+ `_Where` 缺失、为空或包含无效条件时必须返回失败,不得执行全集合更新。`_FormData` 禁止设置 `_id` 或 `_id.*`。返回值的 `Data` 包含 `MatchedCount` 和 `ModifiedCount`。
53
72
 
54
73
  ## 删除文档
55
74
 
56
75
  ```javascript
57
- V8.MongoDb.DelFormData({
76
+ V8.MongoDb.DelFormData({
58
77
  DbName: 'sys_log_2024',
59
78
  TableName: 'log_2024_12',
60
79
  Id: V8.Param.id // 必传
61
- });
62
- ```
80
+ });
81
+ ```
82
+
83
+ ### 按条件批量删除
84
+
85
+ ```javascript
86
+ var result = V8.MongoDb.DelFormDataByWhere({
87
+ DbName: 'diy_chat_' + V8.OsClient.toLowerCase(),
88
+ TableName: 'chat_last_contact',
89
+ _Where: [
90
+ ['UserId', '=', V8.CurrentUser.Id],
91
+ ['ContactUserId', '=', V8.Param.PeerUserId]
92
+ ]
93
+ });
94
+ ```
95
+
96
+ 删除条件必须包含当前权威用户/资源边界,不能只用可伪造的前端参数。返回值的 `Data` 包含 `DeletedCount`。
63
97
 
64
98
  ## 查询单个文档
65
99
 
@@ -74,14 +108,18 @@ var result = V8.MongoDb.GetFormData({
74
108
  ## 查询文档列表
75
109
 
76
110
  ```javascript
77
- var result = V8.MongoDb.GetTableData({
111
+ var result = V8.MongoDb.GetTableData({
78
112
  DbName: 'sys_log_2024',
79
113
  TableName: 'log_2024_12',
80
114
  _Where: [
81
115
  ['Type', '=', '访问菜单'],
82
116
  ['OR', 'Type', '=', '点击V8按钮']
83
- ]
84
- });
117
+ ],
118
+ _OrderBy: 'CreateTime',
119
+ _OrderByType: 'DESC',
120
+ _PageIndex: 1,
121
+ _PageSize: 20
122
+ });
85
123
  ```
86
124
 
87
125
  ## 实战模式
@@ -143,9 +181,11 @@ return { Code: 1, Data: result };
143
181
 
144
182
  ## 注意事项
145
183
 
146
- - MongoDB 参数统一使用**对象格式**:`{ DbName, TableName, Id, _FormData, _Where }`
147
- - `DbName` 是 MongoDB 数据库名,`TableName` 是集合名
148
- - `_Where` 条件语法与 `V8.FormEngine` 一致
149
- - 适合存储日志、IoT 数据、大文档等非结构化 / 海量数据
150
- - 建议按时间分库分表(如 `log_2024_01`),便于清理历史数据
151
- - MongoDB 操作不参与 `V8.DbTrans` 事务
184
+ - MongoDB 参数统一使用**对象格式**:`{ DbName, TableName, Id, _FormData, _Where, _OrderBy, _OrderByType }`
185
+ - `DbName` 是 MongoDB 数据库名,`TableName` 是集合名
186
+ - `_Where` 条件语法与 `V8.FormEngine` 一致
187
+ - 批量写入仅接受安全字段名、已知操作符和非空条件;条件中的租户、用户和资源 Id 应来自 `V8.OsClient` / `V8.CurrentUser` / 权威回查,不得信任 `V8.Param` 中的同名身份字段
188
+ - 非主库 V8 运行时会把 MongoDB 操作绑定到当前租户;显式传入其它 `OsClient` 不能跨租户
189
+ - 适合存储日志、IoT 数据、大文档等非结构化 / 海量数据
190
+ - 建议按时间分库分表(如 `log_2024_01`),便于清理历史数据
191
+ - MongoDB 操作不参与 `V8.DbTrans` 事务。批量写入 `Code=1` 后即是已提交事实;后续 Hook/投递失败应返回警告或进入补偿,不得返回“未发生”导致盲目重试,重试必须有稳定业务 Id 幂等
@@ -54,8 +54,11 @@ V8.OsClientModel.AliOssPublicDomain // 可公开的文件域名
54
54
  主库 `sys_osclients` 保存租户数据库/Redis/存储路由及影响整个 API 进程的平台级配置;目标租户建立上下文后,`sys_config` 和 `mci_system_setting` 从该租户自己的数据库读取。平台级配置必须遵守“主租户为准、子租户只能降额隔离”的规则:
55
55
 
56
56
  - 所有可变业务逻辑默认必须由接口引擎编排,包括但不限于租户开通、开库、初始化、归属修复、官网个人中心、付费额度等 SaaS 业务流程。C# 后端只暴露原子 V8 能力,例如建库、导入空库模板、复制 `sys_config`、刷新 SaaS 缓存、补偿回滚、字段兜底等;不要把可变业务分支写死到 Controller 或 `TenantProvisioningService` 这类后端定制代码里。接口引擎缺少能力时,优先扩展 `V8.Method`/V8 引擎原子函数,再由接口引擎调用。
57
+ - 官方租户开通固定由 SaaS 包的 `platform-create-tenant` 编排:`platform-runtime-custom-hook` 的 Before 阶段可以阻断,`AuthorizeCurrentUserTenantProvisioning` / `ProvisionCurrentUserTenant` 只从可信主租户 DiyToken 派生所有者与密码材料;创建完成后的 Hook/审计失败只能返回 Warning,不能诱导重复创建。系统账号偏好/资料与租户系统设置分别由 `app.microi.sys_user`、`app.microi.sys-config` 单一拥有,SaaS/Store 不得复制这些 Managed ApiEngineKey。
58
+ - 旧版 UniApp 的 `microi-init` 是 SaaS 包继续托管的 Managed 兼容门面。匿名阶段只组合 `platform-os-client-by-domain` 与 `platform-sys-config` 的公开投影;原始 DiyToken 必须由 `GetCurrentToken` 和 `RefreshLoginUser(..., rawToken)` 在后端重新验证且绑定当前租户,菜单再由只允许该固定 Key 调用的 `GetLegacyInitMenuTree(rawToken, osClient?)` 复用 `SysMenuLogic` 权威角色过滤。禁止在匿名 V8 中直接通过 FormEngine 读取 `sys_menu`;域名解析到其它租户时返回目标 `OsClient` 并要求重试,禁止匿名跨租户读取配置或菜单。
57
59
  - 主租户由运行环境决定:优先读取环境变量 `OsClient`,其次读取 `appsettings.json` 的 `AppSettings:OsClient`。只有这条主租户 `sys_osclients` 数据中的平台级字段会作为全局配置生效。
58
60
  - API 启动配置只有十项白名单:`OsClient`、`OsClientType`、`OsClientNetwork`、`OsClientDbType`、`OsClientDbConn`、`OsClientRedisHost`、`OsClientRedisPort`、`OsClientRedisPwd`、`OsClientRedisDataBase`、`OsClientDbMongoConn`。除这十项外,部署/节点级运行参数与基础设施秘密从主控 `sys_osclients` 读取;允许子租户自行维护且需要浏览器判断的业务开关、入口显示和公开交互配置使用该租户 `sys_config` 实体字段,OAuth/第三方集成的凭据、RP/Origin/Issuer/Scope 与仅后端参数使用 `mci_system_setting`,未配置时使用代码安全默认值。官方 License 恢复次数/间隔与固定私钥挂载 `/app/microi_private.pem` 是信任链例外。禁止再增加 `MICROI_*`、`DOS_ORM_*`、自定义 `AppSettings` 节点或动态名称的环境变量读取。节点身份由平台自动生成。
61
+ - 存量畅捷通/微信 OAuth C# 协议网关有一组已发布到 SaaS 引擎的兼容字段:`OAuthReturnUrlOrigins`、`ChanjetOAuthState`、`ChanjetAesKey`、`ChanjetAppKey`、`WeChatTemplateAppId`、`WeChatTemplateAppSecret`、`WeChatTemplateId`、`WeChatMiniProgramAppId`。只能通过 Core 的租户绑定协议设置原子按请求权威 `OsClient` 读取,禁止使用主租户 `ConfigHelper` RuntimeConfigurationReader;整组字段不得复制给新租户,其中 OAuthState/AES Key/AppKey/AppSecret 不得进入 `V8.OsClientModel` 或前端投影且必须在审计中掩码。新集成不得继续扩展该兼容集合,仍使用当前租户 `mci_system_setting` + Managed ApiEngine。
59
62
  - `ASPNETCORE_*`、`DOTNET_*` 仅用于 .NET 宿主;构建、安装、测试、MCP、发布脚本可使用自身进程变量,但 API 生产代码不得把它们当业务配置。新增 SaaS 运行字段必须配套独立或既有 Tab、幂等升级、缓存刷新、敏感字段脱敏、子租户不继承和源码扫描测试。
60
63
  - 文件上传的租户业务开关与额度按“当前租户 `sys_osclients` → 代码默认值”解析;平台固定灾难保护、HTTP/Multipart/Form 和反向代理上限不可由租户覆盖,也不要求安装者维护额外上传环境变量。
61
64
  - 类似 MQTT 端口、PressureGuard、V8Limits、OrmLimits、StartupLimits、SecurityGuard 这类影响整进程资源的配置,不能让每个子租户各自抬高全局上限。子租户同名隔离字段只能降低自己的并发、等待时间或资源额度,用于隔离弱租户、试用租户或异常租户。
@@ -9,7 +9,9 @@ description: Microi V8 安全指南。用于审查 DiyToken 与权限、可逆
9
9
 
10
10
  你正在开发 Microi 吾码平台的 V8 引擎代码,必须遵守以下安全规范。
11
11
 
12
- 访问密钥由 `microi_list_my_access_keys`、`microi_create_my_access_key`、`microi_revoke_my_access_key` 管理,只允许当前用户、限期、最小 scope,明文仅创建时返回一次。外部身份回调固定为 `/api/ExternalLogin/Callback`,服务端校验租户、Provider、state、redirect 和回调域名,验证成功后仍签发 DiyToken。
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
+
14
+ 官方升级资源属于独立控制面。`get-microi-upgrade-resource` 可以匿名读取固定白名单,但 `Publish/PublishBatch` 必须调用仅绑定该 Managed ApiEngineKey 的 `V8.Method.AuthorizeOfficialResourcePublish()`:固定 `iTdos` 官方租户、拒绝访问密钥会话,并从主库复核当前用户、状态和平台管理员角色。禁止只相信 `V8.CurrentUser.Level`,也禁止把这个可信原子复用于普通接口、租户 Hook 或表单事件;资源校验、SHA 乐观锁、事务行锁、写入及回读仍由 Managed V8 编排。
13
15
 
14
16
  <!-- microi-progressive:begin -->
15
17
  <!-- microi-progressive:chunk id=v8-security-000 sha256=d03ee34e72925db55f9022de26dfc251c0d3d69fac52ae6a910d42ddfc142ae7 -->
@@ -48,7 +48,7 @@
48
48
  | `GET /api/Captcha/getCaptcha` | 获取验证码图片;同时保存响应 `captchaid` |
49
49
  | `POST /api/Captcha/Recognize` | 受控验证码识别,主要供采集引擎 |
50
50
  | `POST /api/HDFS/Upload` | 受限文件上传;优先用平台 SDK/V8 Upload |
51
- | `POST /api/HDFS/GetPrivateFileUrl` | 获取当前租户短期私有文件地址 |
51
+ | `POST /apiengine/platform-private-file-url` | 获取当前租户短期私有文件地址;必须携带权威资源上下文 |
52
52
  | `GET /api/HDFS/OpenPrivateFile` | 受权打开私有文件/Office 代理 |
53
53
  | `POST /api/DiyChat/SendSystemMessage` | 发送站内消息;前端优先 `V8.SendSystemMessage` |
54
54
  | `POST /apiengine/platform-mq` | MQ 管理入口;Body 使用 `Action=Send`,仅当前租户超级管理员 |
@@ -35,7 +35,7 @@
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 |
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` | 后端模块模型能力;不能绕过用户模块权限 |
@@ -51,19 +51,37 @@
51
51
  | `V8.Method.NewGuid()`、`V8.Method.NewUlid()` | 生成标识 |
52
52
  | `V8.Method.GetTimestamp()` | Unix 秒时间戳 |
53
53
  | `V8.Method.GetCurrentToken(token,osClient)` | 读取当前 Token 对象;不透传前端 |
54
- | `V8.Method.RefreshLoginUser(userId,osClient)` | 刷新用户登录缓存 |
54
+ | `V8.Method.RefreshLoginUser(userId,osClient?,token?)` | 刷新登录投影;租户取当前 V8/已认证 DiyToken(可信宿主须建立用户+租户作用域),显式 OsClient 仅作一致性断言;普通用户仅本人,同租户超级管理员主库复核后可跨用户。第三参仅兼容历史 `microi-init` 的原始 Token,宿主重新验证且只允许 Token 本人;返回对象、访问密钥、空身份和跨租户均拒绝 |
55
55
  | `V8.Method.ClearUserLoginInfo(userId,osClient)` | 管理员吊销用户全部终端 Token |
56
56
  | `V8.Method.GetDirectTableGrantPolicies()` | 读取平台表直连授权策略;仅供可信角色表单事件做最终校验 |
57
57
  | `V8.Method.ConsumeIdentityVerificationTicket({Ticket,Purpose,ActionHash})` | 按当前 DiyToken 用户、租户、用途和操作摘要原子消费一次性 Passkey/TOTP/人脸票据 |
58
- | `V8.Method.GetPrivateFileUrl({FilePathName})` | 签发当前租户短期私有文件代理地址 |
59
- | `V8.Method.Upload(options)` | 受配额限制的上传 |
60
- | `V8.Method.AddSysLog(options)` | 结构化系统日志 |
58
+ | `V8.Method.GetPrivateFileUrl({FilePathName})` | 签发当前租户短期私有文件代理地址 |
59
+ | `V8.Method.ResolveOsClientByDomain(domain)` | 仅允许官方 `platform-os-client-by-domain` 调用;返回最小 OsClient 投影 |
60
+ | `V8.Method.GetPublicSysConfig(lang?)` | 仅允许官方 `platform-sys-config` 调用;返回浏览器安全系统设置投影 |
61
+ | `V8.Method.GetLangBundle(lang?,prefix?)` | 仅允许官方 `platform-lang-bundle` 调用;读取当前租户词条包 |
62
+ | `V8.Method.GetLoginWallpapers()` | 仅允许官方 `platform-login-wallpapers` 调用;固定读取当前租户最多 200 条启用壁纸的 `Id/Name/Category/ImgUrl`,不开放通用匿名表权限 |
63
+ | `V8.Method.GetLegacyInitMenuTree(rawToken, osClient?)` | 仅允许官方 `microi-init` 调用;重新验证请求体原始 DiyToken、拒绝访问密钥与跨租户请求,并按当前角色返回权威菜单树 |
64
+ | `V8.Method.GetAuthorizedPrivateFileUrl(options)` | 仅允许官方 `platform-private-file-url` 调用;重算菜单、行、字段与文件引用授权 |
65
+ | `V8.Method.AuthorizeCurrentUserTenantProvisioning()` | 仅允许官方 `platform-create-tenant` 在 Before Hook 前校验主租户普通登录会话 |
66
+ | `V8.Method.ProvisionCurrentUserTenant(options)` | 仅允许官方 `platform-create-tenant` 调用;所有者、手机号、姓名和密码材料从可信当前用户派生 |
67
+ | `V8.Method.PrepareCurrentUserProfileUpdate(options)` | 仅允许官方 `platform-user-update-profile` 调用;固定当前用户并规范当前租户头像路径 |
68
+ | `V8.Method.ManageSysUserAdmin(options)` | 仅允许官方 `platform-sys-user-admin` 调用;固定身份与租户并执行表权限、角色层级、改密 step-up、内容安全及会话安全边界;授权预检返回规范化 `DataAppend.ChangesPassword` |
69
+ | `V8.Method.AuthorizeOfficialResourcePublish()` | 仅允许官方 `get-microi-upgrade-resource` 的发布分支调用;固定 `iTdos`、拒绝访问密钥并从主库复核平台管理员;不是通用授权 API |
70
+ | `V8.Method.ValidateTenantSystemSettingsOperation(options)` | 仅允许官方 `platform-tenant-system-settings` 调用;拒绝访问密钥、非管理员、Secret/Sensitive Key 和已迁移公开 Key |
71
+ | `V8.Method.GetTenantSystemSettingsSecurityProjection()` | 仅允许官方 `platform-tenant-system-settings` 调用;只返回 Secret 是否已配置与迁移 Key,不返回值或密文 |
72
+ | `V8.Method.Upload(options)` | 受配额限制的上传 |
73
+ | `V8.Method.UploadText(options)` | 直接上传当前租户 UTF-8 文本,避免 Base64 膨胀;仍执行安全文件名、扩展名、HDFS、配额与 256 MB 文本上限 |
74
+ | `V8.Method.AddSysLog(options)` | 结构化系统日志 |
61
75
  | `V8.Method.ParseWhere(where)` | 兼容旧 Where 转换 |
62
76
  | `V8.Method.UpdateBackgroundTask(options)` | 上报已提交单位的后台任务进度 |
63
77
  | `V8.Method.RefreshExtensionDatabases(osClient?)` | 配置表提交后刷新全节点 `V8.Dbs` |
64
78
 
65
- 管理员维护、备份、清库、缓存连接管理等低层方法即使可见,也不能暴露为普通
66
- 或匿名业务 API。
79
+ 管理员维护、备份、清库、缓存连接管理等低层方法即使可见,也不能暴露为普通
80
+ 或匿名业务 API。
81
+
82
+ 以上启动、文件、系统账号和租户设置 `platform-*` 原子都是固定 Managed 接口的可信宿主边界,不是普通业务脚本可复用的快捷方法。官网客户端调用对应 `/apiengine/platform-*` 路由;旧 Controller 只保留旧版本兼容。登录壁纸原子不要求 `diy_wallpaper.IsAnonymousRead=1`,也不允许租户 Hook 参与匿名请求。租户个性化逻辑写入应用声明的 `CreateIfMissing` Hook,禁止直接修改会被官方安装或更新恢复的 Managed 接口。密码、DiyToken、Secret 保存和 Reveal 仍属于 C# 可信边界。
83
+
84
+ 旧客户端兼容路由 `/api/SysUser/UpdateMyDefaultIndexUrl`、`/api/SysUser/UpdateCurrentProfile` 和 `/api/TenantSystemSettings/List` 只固定转发上述 Managed 接口;新客户端不得继续以 Controller 作为业务事实源。
67
85
 
68
86
  ## Base64 与加密
69
87