@microi.net/cli 5.1.9 → 5.2.0
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 +6 -6
- package/cordis.patch.yml +1 -1
- package/package.json +1 -1
- package/scripts/mcp-server.js +85 -85
- package/scripts/microi-cli.js +2 -2
- package/scripts/microi-skills.meta.json +210 -195
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +3566 -3566
- package/skills/README.md +2 -1
- package/skills/app-store/SKILL.md +3 -3
- package/skills/job-engine/SKILL.md +1 -1
- 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
- package/skills/microi-docs-coverage/references/capability-map.md +1 -0
- package/skills/microi-left-right-layout/SKILL.md +2 -0
- package/skills/microi-sso/SKILL.md +82 -0
- package/skills/microi-sso/references/acceptance.md +49 -0
- package/skills/microi-sso/references/configuration-and-security.md +53 -0
- package/skills/microi-sso/references/inbound.md +53 -0
- package/skills/microi-sso/references/outbound.md +39 -0
- package/skills/microi-ui/SKILL.md +11 -7
- package/skills/module-engine/SKILL.md +1 -1
- package/skills/module-engine/references/module-config.md +1 -1
- package/skills/ui-design/SKILL.md +13 -9
- package/skills/v8-crud-api/SKILL.md +2 -2
- package/skills/v8-debugging/SKILL.md +3 -1
- package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +3 -2
- package/skills/v8-table-event/SKILL.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 +1 -1
package/skills/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
## 包含的 Skills
|
|
10
10
|
|
|
11
|
-
当前仓库包含
|
|
11
|
+
当前仓库包含 64 个 `SKILL.md`。以下清单按任务类型组织;AI 必须先完整读取与当前任务匹配的 Skill,再执行源码、MCP、文档或交付操作。
|
|
12
12
|
|
|
13
13
|
### V8 引擎核心(后端)
|
|
14
14
|
|
|
@@ -66,6 +66,7 @@
|
|
|
66
66
|
| **ai-engine** | 模型代理、NL2SQL/NL2V8、Schema/Skill 关键词检索与可选向量融合 | `ai-engine/SKILL.md` |
|
|
67
67
|
| **ai-platform-governance** | 门户/身份/配置/发布、服务韧性、Trace/日志、资产协作与可恢复导入 | `ai-platform-governance/SKILL.md` |
|
|
68
68
|
| **app-store** | 应用包、Manifest、后台安装、差异升级、回滚和验收 | `app-store/SKILL.md` |
|
|
69
|
+
| **microi-sso** | 双向 OIDC/SAML2/CAS、账号映射、Secret/证书、官方商城发布与伙伴联调 | `microi-sso/SKILL.md` |
|
|
69
70
|
|
|
70
71
|
### 项目交付、前端与移动端
|
|
71
72
|
|
|
@@ -33,10 +33,10 @@ description: Microi 应用商城开发、打包、安装和升级规范。用于
|
|
|
33
33
|
## 接口引擎资源所有权(强制)
|
|
34
34
|
|
|
35
35
|
- 新发布包必须声明 `ResourcePolicies.ApiEngines`,不得再依赖“同 Key 直接覆盖”。官方不可随租户修改的核心使用 `{ Ownership:'Application', UpgradePolicy:'Managed' }`;提供给租户改业务的 Hook 使用 `{ Ownership:'Tenant', UpgradePolicy:'CreateIfMissing' }`。
|
|
36
|
-
- 发布器从上一版 `AppPakcet.SysApiEngines` 计算 `BaseHash`;导入成功后把本版摘要写入 `sys_microistoreversion.InstallResult.ResourceState.ApiEngines
|
|
36
|
+
- 发布器从上一版 `AppPakcet.SysApiEngines` 计算 `BaseHash`;导入成功后把本版摘要写入 `sys_microistoreversion.InstallResult.ResourceState.ApiEngines`。普通/社区应用仍按 Base/Local/Incoming 三方保护:`Local == Base` 才更新,`Local != Base && Local != Incoming` 必须冲突回滚。唯一覆盖例外是从固定 `https://api.itdos.com + iTdos` 实时回读并校验为官方 `ApplicationType=Platform` 的应用:其中 `Ownership=Application + UpgradePolicy=Managed` 属于平台发行物,安装/更新按包覆盖本地差异;离线包、自报官方、非 Platform 来源都不能获得该权限。
|
|
37
37
|
- `CreateIfMissing` 只在目标 Key 不存在时创建,存在时不得对齐 Id、源码、启用状态或其它字段。扩展模板发布后即归租户维护;后续版本禁止把同一 Key 改回 `Managed` 接管,确需新的官方核心时发布新 Key 并显式迁移。
|
|
38
|
-
- 官方功能采用“Managed 核心 + CreateIfMissing Hook
|
|
39
|
-
-
|
|
38
|
+
- 官方功能采用“Managed 核心 + CreateIfMissing Hook”。核心只提供稳定协议和默认行为,并在可信官方 Platform 包更新时覆盖升级;客户日志、写表、通知和业务动作放 Hook,并以稳定 `EventId`、唯一约束或 outbox 幂等。`CreateIfMissing` 一旦交给租户维护,即使后续官方包误改为 Managed 也必须冲突回滚。
|
|
39
|
+
- 历史包未声明策略时只能按旧兼容流程安装;重新发布时发布器必须生成策略。验收至少覆盖首次安装、可信官方 Managed 本地有差异仍覆盖、普通应用核心差异冲突回滚、Hook 被改后保持原样、重复安装、两节点竞态,以及官方发布数据库连 `ValidateOnly` 也禁止执行安装器。
|
|
40
40
|
|
|
41
41
|
## 安装流程
|
|
42
42
|
|
|
@@ -117,7 +117,7 @@ return {
|
|
|
117
117
|
- `V8.ApiEngine.Run` 的多层编排可以保留。新版父子单层分配隔离后,子接口不会被所有祖先重复计费,但根调用树仍有整体预算;循环调用由独立的嵌套深度上限终止。
|
|
118
118
|
- 捕获失败时读取 `DataAppend.V8Limit.Code`。内存/调用树/语句/超时分别缩小批次,递归错误修复函数递归,嵌套深度错误检查循环编排;不要统一归因于服务器资源不足。
|
|
119
119
|
- 可记录 `V8.Limits` 到脱敏诊断日志,但不要在每条业务数据上重复输出。
|
|
120
|
-
-
|
|
120
|
+
- 接口引擎和表后端事件分别使用正向 `sys_apiengine.V8Limit`、`diy_table.V8Limit`;二者默认 `0`,不设置 Jint 单片预算,只有明确需要限制单片时才设为 `1` 并配置超时、语句、分配和递归值。后台任务仍优先 `HasMore + Checkpoint`,因为不限 Jint 预算不等于数据库长事务、进程常驻内存、取消、并发或节点故障风险消失。
|
|
121
121
|
|
|
122
122
|
## MCP 工作流
|
|
123
123
|
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
| `PageTabs` | 列表页 Tab |
|
|
17
17
|
| `ExportMoreBtns` | 导出下拉扩展 |
|
|
18
18
|
|
|
19
|
-
`PageTabs.TargetSysMenuId` 是通用的跨模块页签协议。未配置时继续执行当前模块的页签 V8;配置其它 `sys_menu.Id` 时,`diy-table.vue`
|
|
19
|
+
`PageTabs.TargetSysMenuId` 是通用的跨模块页签协议。未配置时继续执行当前模块的页签 V8;配置其它 `sys_menu.Id` 时,`diy-table.vue` 在同一个组件实例内切换模块上下文,按目标 `sys_menu / diy_table / diy_field` 重载数据,同时保留入口路由、面包屑、顶部访问标签、宿主 Hero 和入口 PageTabs,URL 只更新 `Tab` 查询参数。入口模块是唯一 PageTabs 配置源,隐藏目标模块不得复制 PageTabs。不得为应用商城或其它单一模块在 schema/data mixin 中增加专用数据源分支。
|
|
20
20
|
|
|
21
21
|
按钮显隐链路:
|
|
22
22
|
|
|
@@ -31,6 +31,7 @@ Markdown。第一列是相对 `microi.doc/docs/doc/` 的路径;第二列 Skill
|
|
|
31
31
|
| `more/identity-verification.md` | v8-security, v8-utilities, microi-microservice, app-store, v8-saas-multi-tenant | DiyToken、登录方式气泡、Passkey、Authenticator TOTP、Gitee/微信/GitHub、动态租户设置、严格人脸、一次性步进票据、个人中心和自动升级包 |
|
|
32
32
|
| `more/office.md` | v8-export-import, microi-microservice | Office 导入导出与在线编辑集成 |
|
|
33
33
|
| `more/security.md` | v8-security | 平台安全和兼容基线 |
|
|
34
|
+
| `more/sso.md` | microi-sso, v8-security, app-store | 双向 OIDC/SAML2/CAS、账号映射、协议端点、安全基线、商城发布与验收 |
|
|
34
35
|
| `more/sys-config.md` | v8-utilities, microi-deployment | 系统/租户配置和敏感边界 |
|
|
35
36
|
| `system-engine/ai-engine.md` | ai-engine, v8-http-integration, microi-ai-application | 模型代理、License、V8.AI、MCP 对话、跨端调用和安全 |
|
|
36
37
|
| `system-engine/ai-platform-governance.md` | ai-platform-governance, app-store, business-blueprint, page-engine | 门户、身份、配置、发布、服务韧性、Trace/日志、资产协作与可恢复导入 |
|
|
@@ -54,6 +54,7 @@ description: Microi 吾码模块引擎“树形+表格/表单”左右结构配
|
|
|
54
54
|
| `YincangBSF` | 否 | 节点命中该字段时隐藏右侧区域。 |
|
|
55
55
|
| `TanchuangLX`、`TanchuangDX` | 否 | 树节点维护弹窗类型和尺寸。 |
|
|
56
56
|
| `LanjiaZ`、`LanjiaZDM` | 否 | 懒加载开关和代码;大树优先使用。 |
|
|
57
|
+
| `DefaultExpandLevel` | 否 | 左树默认展开层级。未配置、空值或 `0` 均不展开;`1` 展开一级节点,`2` 再展开二级节点,以此类推。 |
|
|
57
58
|
|
|
58
59
|
## 初始化 V8 与分页契约
|
|
59
60
|
|
|
@@ -132,6 +133,7 @@ V8.Result = {
|
|
|
132
133
|
- 左树标题无 `undefined`、`{}`、空白重复项。
|
|
133
134
|
- 点击“全部”清空右侧外键条件;点击节点只显示该节点数据。
|
|
134
135
|
- 后端 `_HasChild=true` 表示可展开,Element Plus 的 `isLeaf` 必须映射为独立 `_IsLeaf=!_HasChild`,不得把 `_HasChild` 直接当叶子标记。
|
|
136
|
+
- `DefaultExpandLevel` 未配置时必须保持全部折叠;只展开有子节点且深度不超过配置值的节点,不能把平台默认值改成一级展开。
|
|
135
137
|
- 页面初始已处于“全部”时,再次点击“全部”不得先清空已加载列表;只清除树节点外键条件并避免重复请求。
|
|
136
138
|
- 右侧新增数据自动写入正确外键,切换节点后不会串数据。
|
|
137
139
|
- 普通用户不出现仅管理员可用的“页面配置”。
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: microi-sso
|
|
3
|
+
description: 设计、实现、配置、迁移、发布和验收 Microi 吾码双向 SSO 身份联邦。用于外部系统通过 OIDC、SAML2、CAS 登录吾码,或吾码作为 OIDC OP、SAML IdP、CAS Server 集成其它系统,以及 diy_sso、账号/角色映射、Secret/证书、官方应用 app.microi.sso 和真实伙伴联调。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
7
|
+
|
|
8
|
+
# Microi SSO 身份联邦
|
|
9
|
+
|
|
10
|
+
## 何时使用
|
|
11
|
+
|
|
12
|
+
以下任务必须使用本 Skill:
|
|
13
|
+
|
|
14
|
+
- Keycloak、Entra ID、ADFS、CAS Server、企业统一身份中心登录吾码。
|
|
15
|
+
- 吾码账号登录 ERP、OA、BI、门户或其它第三方系统。
|
|
16
|
+
- 修改 `diy_sso`、SSO 登录页、OIDC/SAML/CAS Controller、Claim/角色映射或旧 Token SSO。
|
|
17
|
+
- 发布、安装、升级或验收官方商城应用 `app.microi.sso`。
|
|
18
|
+
|
|
19
|
+
固定 Gitee、微信、GitHub 登录与 Passkey/TOTP 仍以 `v8-security` 为主;当需求是可配置企业身份联邦时转到本 Skill。
|
|
20
|
+
|
|
21
|
+
## 先读取什么
|
|
22
|
+
|
|
23
|
+
按任务读取,不要一次加载全部参考:
|
|
24
|
+
|
|
25
|
+
- 外部身份源登录吾码:读 [references/inbound.md](references/inbound.md)。
|
|
26
|
+
- 吾码给第三方提供登录:读 [references/outbound.md](references/outbound.md)。
|
|
27
|
+
- 表字段、Secret、证书、安全与存量迁移:读 [references/configuration-and-security.md](references/configuration-and-security.md)。
|
|
28
|
+
- 测试、商城发布、目标安装与交付结论:读 [references/acceptance.md](references/acceptance.md)。
|
|
29
|
+
|
|
30
|
+
源码修改前同时完整读取 `workspace-conventions/SKILL.md`;认证、DiyToken、秘密或权限任务再读 `v8-security/SKILL.md`;商城任务再读 `app-store/SKILL.md`。
|
|
31
|
+
|
|
32
|
+
## 不可破坏的事实
|
|
33
|
+
|
|
34
|
+
1. DiyToken 是进入吾码后的唯一平台会话入口。SSO 认证成功后签发 DiyToken,不创建第二套用户/权限 Token。
|
|
35
|
+
2. 吾码向外提供的 OIDC/SAML/CAS 协议票据独立、短期、可撤销,绝不把 DiyToken 给第三方。
|
|
36
|
+
3. `OsClient + ConnectionKey + Subject` 是外部主体隔离边界;所有回调、票据、缓存和审计都绑定租户。
|
|
37
|
+
4. 新连接只用 OIDC、SAML2、CAS;URL Token 是迁移兼容项,不是推荐协议。
|
|
38
|
+
5. Redirect URI、ACS、Destination、Audience 和 CAS service 必须精确匹配;生产端点必须 HTTPS。
|
|
39
|
+
6. Secret/私钥只存 `mci_system_setting` 的受控值;`diy_sso` 只存 Setting Key。匿名接口只返回登录入口白名单投影。
|
|
40
|
+
7. 外部角色、邮箱或昵称不能直接获得管理员权限。默认 `BoundOnly`,JIT 必须显式默认角色、唯一性、回收和审计。
|
|
41
|
+
8. HTTP 200、构建成功、商城任务入队或包可下载都不是完整 SSO 验收。
|
|
42
|
+
9. SSO 业务逻辑必须接口引擎优先:连接投影、绑定/JIT、角色与 Claim 映射、审计、登录完成和租户扩展不得重新写进 Controller。只有协议报文、签名验签、Secret/私钥隔离、一次性票据与 DiyToken 等可信原子可以保留 C#。
|
|
43
|
+
10. 客户端调用应用接口使用稳定 `/api/ApiEngine/Run?OsClient=`;应用未安装时必须得到结构化错误,禁止重新依赖可能由网关缺失而 404 的动态 `/apiengine/*` 或已删除的 `/api/Sso/Capabilities` 等定制路由。
|
|
44
|
+
|
|
45
|
+
## 标准工作流
|
|
46
|
+
|
|
47
|
+
1. 识别方向、协议、租户、身份伙伴、用户生命周期、退出和密钥/证书责任人。
|
|
48
|
+
2. 读取当前 `diy_sso` Schema、菜单、真实连接和已部署 Server/Client 版本;不要从旧截图猜测。
|
|
49
|
+
3. 先选标准协议和安全 profile,再配置字段、Secret/证书 Key、Claim/角色映射。
|
|
50
|
+
4. 先把业务编排写成可随应用发布的接口引擎;仅当现有 V8 无法安全完成底层原子能力时,才扩展最小 `V8.Method`,并把调用权限制到精确官方接口 Key。禁止把整个流程放进新 Controller,也禁止让原子方法接受任意租户、回调地址或 Secret。
|
|
51
|
+
5. 分别验证源码/单测、后端构建、前端构建、运行时端点、浏览器 UI、真实伙伴和多节点。
|
|
52
|
+
6. 平台级资源通过官方应用包发布;官方源用 `microi_itdos` 更新并发布,普通目标租户走商城安装/升级任务。
|
|
53
|
+
7. 最终明确已验证与未验证边界,尤其是“配置包已发布”与“运行时代码已部署”的区别。
|
|
54
|
+
|
|
55
|
+
## 官方应用合同
|
|
56
|
+
|
|
57
|
+
- AppId:`app.microi.sso`
|
|
58
|
+
- 名称:`SSO 身份联邦`
|
|
59
|
+
- 资源:`diy_sso`、`/system/sso`、字段/布局/视图、10 个 Managed 核心接口引擎和 1 个 CreateIfMissing 租户 Hook;不发布用户绑定、连接实例、Secret、证书或示例账号。
|
|
60
|
+
- `ResourcePolicies.ApiEngines` 必须逐 Key 显式声明。核心使用 `Managed/Application`;`sso_event_hook` 使用 `CreateIfMissing/Tenant`,安装后永不被官方覆盖。
|
|
61
|
+
- 官方 `iTdos` 是发布源,保护性拒绝安装属于正确行为;普通租户安装才必须轮询到 `Succeeded`。
|
|
62
|
+
|
|
63
|
+
## C# 与接口引擎责任线
|
|
64
|
+
|
|
65
|
+
接口引擎固定承载:
|
|
66
|
+
|
|
67
|
+
- `sso_capabilities`、`sso_legacy_capabilities` 的匿名白名单投影;
|
|
68
|
+
- `sso_connection_runtime`、`sso_user_runtime` 的内部最小投影;
|
|
69
|
+
- `sso_resolve_federated_identity` 的绑定、JIT 与角色映射;
|
|
70
|
+
- `sso_outbound_claims`、`sso_protocol_event`、`sso_event_hook`;
|
|
71
|
+
- `sso_complete_login`、`sso_rotate_client_secret`、`sso_legacy_token_login` 的业务编排。
|
|
72
|
+
|
|
73
|
+
C# 只保留:
|
|
74
|
+
|
|
75
|
+
- OIDC/SAML/CAS 原始 HTTP/重定向/XML/JWT 报文与签名验签;
|
|
76
|
+
- Secret、私钥、证书和协议 Token 的可信隔离;
|
|
77
|
+
- 高熵一次性 code/ticket、重放保护和 DiyToken 签发;
|
|
78
|
+
- 仅允许精确 Managed Key 调用的 `CreateFederatedUser`、`CreateSsoLoginTicket`、`CompleteSsoLogin`、`RotateSsoClientSecret` 原子。
|
|
79
|
+
|
|
80
|
+
新增 SSO 需求先判断是否只需修改上述接口引擎。只有缺少不可伪造、不可泄露的底层原子时才增加 V8 方法;增加后同时更新应用 `RequiredPlatformCapabilities`、后端文档、测试与最低版本。
|
|
81
|
+
|
|
82
|
+
详细用户文档:`microi.doc/docs/doc/more/sso.md`。
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# 验收、商城发布与交付结论
|
|
2
|
+
|
|
3
|
+
## 分层证据
|
|
4
|
+
|
|
5
|
+
| 层 | 最低证据 |
|
|
6
|
+
|---|---|
|
|
7
|
+
| 源码 | 协议/安全原语测试,静态扫描无 Secret/Token 日志 |
|
|
8
|
+
| 后端构建 | 隔离输出 `dotnet build` 成功,不覆盖共享运行目录 |
|
|
9
|
+
| 前端构建 | 现代包和项目要求的兼容包完成 |
|
|
10
|
+
| 应用包 | 可重复生成;Name/AppId/Version、DDL、字段数、菜单、空数据集、11 个接口引擎源码同源与 ResourcePolicies 校验 |
|
|
11
|
+
| 官方商城 | `microi_itdos` 发布后回读 `sys_microistore` 与官方资源 API;状态、版本、包哈希一致 |
|
|
12
|
+
| 目标租户 | 安装/升级任务终态 `Succeeded`,再读真实表、字段、菜单、安装版本 |
|
|
13
|
+
| 运行时 | Capabilities、Discovery/Metadata/JWKS 和实际使用端点命中已部署程序集 |
|
|
14
|
+
| 浏览器 | 登录入口、弹窗 Origin、URL 清理、管理页 7 Tab、秘密无明文 |
|
|
15
|
+
| 伙伴联调 | 登录/拒绝/过期/重放/退出/停用/角色变化/轮换 |
|
|
16
|
+
| 多节点 | state、code、ticket、session、撤销和缓存跨节点一致 |
|
|
17
|
+
|
|
18
|
+
## 官方应用发布
|
|
19
|
+
|
|
20
|
+
1. 使用官方 `microi_itdos`,核对绑定 `https://api.itdos.com` 与 `OsClient=iTdos`。
|
|
21
|
+
2. 在发布源更新真实 `diy_sso`、字段、表单 Tabs 和菜单视图并回读。
|
|
22
|
+
3. 导出精确菜单/表和 11 个接口引擎,不带连接数据、用户绑定、Secret、证书或示例账号;接口源码必须与 `Microi-V8-Engine/.../SSO身份联邦` 逐字同源。
|
|
23
|
+
4. AppId 固定 `app.microi.sso`,PublisherType 为官方应用;10 个核心 Key 为 `Managed/Application`,`sso_event_hook` 为 `CreateIfMissing/Tenant`。
|
|
24
|
+
5. 发布后从官方资源 API 读取 `app.microi.sso.json`,校验 SHA-256、版本、1 菜单、1 表、64 字段、11 个接口引擎及策略。
|
|
25
|
+
6. 官方 iTdos 是发布源,安装任务被“发布源不允许安装”拒绝是保护性终态;不要绕过或伪装成成功。
|
|
26
|
+
7. 普通目标租户才执行安装/更新,并轮询后台任务到终态。Pending/Running/入队不算成功。
|
|
27
|
+
|
|
28
|
+
## 协议负向用例
|
|
29
|
+
|
|
30
|
+
- OIDC:state/nonce/PKCE 错、code 重放、issuer/audience 错、未知 kid、过期 token、refresh 重放、回调前缀攻击。
|
|
31
|
+
- SAML:签名错、过期、Audience/Destination/InResponseTo 错、Request/Assertion 重放、错误证书、未授权 ACS。
|
|
32
|
+
- CAS:ticket 重放、service 不同、过期 ticket、错误租户、CAS 失败响应。
|
|
33
|
+
- 通用:跨租户连接、停用用户、停用连接、SSRF 私网/回环、访问密钥会话授权、匿名读取 `diy_sso`。
|
|
34
|
+
|
|
35
|
+
## 结论措辞
|
|
36
|
+
|
|
37
|
+
只有真实伙伴和多节点验收也通过,才能说“该协议连接已可生产使用”。
|
|
38
|
+
|
|
39
|
+
- 包已发布但 Server/Client 未部署:写“官方配置包已发布,运行时代码待部署”。
|
|
40
|
+
- 端点冒烟通过但无真实 IdP/SP:写“协议端点已验证,伙伴联调待完成”。
|
|
41
|
+
- 官方源安装被保护性拒绝:写“发布源保护生效,不构成普通租户安装证据”。
|
|
42
|
+
- 因用户未授权输入密码而无法浏览器登录:写明 UI 登录后验收未完成,不用接口/源码代替视觉证据。
|
|
43
|
+
|
|
44
|
+
## 404 与应用缺失回归
|
|
45
|
+
|
|
46
|
+
- 客户端能力发现和登录完成只允许调用 `/api/ApiEngine/Run?OsClient=`,请求体携带精确 `ApiEngineKey`。
|
|
47
|
+
- 在未安装 `app.microi.sso` 的租户调用通用入口,应返回结构化“接口引擎不存在”;不能返回 `/api/Sso/Capabilities` 路由 404。
|
|
48
|
+
- 安装后回读 11 个 `sys_apiengine` 行并刷新缓存,再验证 `sso_capabilities` 为 `Code=1`。
|
|
49
|
+
- `/api/Sso/Capabilities`、`LegacyCapabilities`、`CompleteLogin`、`RotateClientSecret` 与 `/api/SysUser/SsoPengrui` 必须保持删除,防止业务逻辑重新漂回 Controller。
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# 配置、Secret、安全与迁移
|
|
2
|
+
|
|
3
|
+
## diy_sso 分组
|
|
4
|
+
|
|
5
|
+
- `basic`:Key、名称、方向、协议、启用、排序。
|
|
6
|
+
- `oidc`:Issuer/Discovery/端点、Client、Scope、精确 Redirect URI。
|
|
7
|
+
- `saml`:Entity ID、Metadata、SSO/SLO、ACS。
|
|
8
|
+
- `cas`:Server URL、版本。
|
|
9
|
+
- `mapping`:Subject/Account/Name/Email/Role Claim、JSON 映射、JIT。
|
|
10
|
+
- `security`:Secret/证书设置 Key、签名/加密、PKCE/nonce、生命周期、私网开关。
|
|
11
|
+
- `legacy`:旧 Server/Client API、TokenName、GetTokenType。
|
|
12
|
+
|
|
13
|
+
`diy_sso` 是管理员专用平台表。匿名能力接口只投影 ConnectionKey、名称、协议、图标、说明和发起地址;旧兼容投影只允许同源 `/api/` 路径与安全 Token 参数名。
|
|
14
|
+
|
|
15
|
+
匿名投影由 `sso_capabilities` / `sso_legacy_capabilities` 接口引擎提供;Controller 不得直接查询并返回 `diy_sso`。内部协议网关通过 StopHttp 的 `sso_connection_runtime` 取得最小运行投影。客户端统一调用 `/api/ApiEngine/Run?OsClient=`,避免应用尚未安装或网关未注册动态路由时出现 404。
|
|
16
|
+
|
|
17
|
+
## Secret 与证书
|
|
18
|
+
|
|
19
|
+
- `ClientSecretSettingKey` 等字段只存 `mci_system_setting` Key。
|
|
20
|
+
- 第三方 Client Secret 和私钥证书使用后端 Secret 存储,不出现在日志、导出、包、浏览器或 MCP 回读。
|
|
21
|
+
- 吾码对外 OIDC Client Secret 只存专用密码哈希;不能用 AES/DES 代替验证哈希。
|
|
22
|
+
- SAML 验签/加密公开证书与签名/解密私钥严格区分用途。
|
|
23
|
+
- 证书/签名 Key 轮换要有新旧重叠、伙伴确认、撤销和回滚窗口。
|
|
24
|
+
|
|
25
|
+
## 网络和 URL
|
|
26
|
+
|
|
27
|
+
所有外部 Discovery、JWKS、Metadata、Token、UserInfo 地址先过 HTTPS/SSRF 检查。默认拒绝回环、私网、链路本地、带用户信息 URL 和 DNS 重绑定;内网 IdP 只能由管理员显式开启并用网络出口白名单补强。
|
|
28
|
+
|
|
29
|
+
Redirect/Logout/ACS/CAS service 使用规范化后的绝对 URL 精确比较。不要允许通配符、子域后缀、前缀或 fragment。反向代理下使用可信外部 Origin,不能根据任意 Host/Header 构造安全回调。
|
|
30
|
+
|
|
31
|
+
## 账号与角色
|
|
32
|
+
|
|
33
|
+
默认 `BoundOnly`。JIT 需要:
|
|
34
|
+
|
|
35
|
+
- 稳定 Subject 与账号唯一性。
|
|
36
|
+
- 非管理员默认角色。
|
|
37
|
+
- 外部角色到 RoleId 的显式 allowlist。
|
|
38
|
+
- 离职、禁用、角色收回与冲突处理。
|
|
39
|
+
- 创建、匹配、拒绝和变更审计。
|
|
40
|
+
|
|
41
|
+
这些规则由 Managed `sso_resolve_federated_identity` 编排。JIT 创建最终调用精确受限的 `V8.Method.CreateFederatedUser` 原子,并用平台专用带盐密码哈希写入不可登录的随机初始密码;不得回退到 DES,也不得把外部角色名直接写成平台 RoleId。
|
|
42
|
+
|
|
43
|
+
不能把外部 `admin` 字符串、邮箱域或昵称直接解释为平台管理员。
|
|
44
|
+
|
|
45
|
+
## LegacyToken 迁移
|
|
46
|
+
|
|
47
|
+
1. 盘点旧 `ClientSsoApi/ServerSsoApi/TokenName` 和使用系统。
|
|
48
|
+
2. 为每个系统选择 OIDC、SAML2 或 CAS 并建立新连接。
|
|
49
|
+
3. 并行验证登录/退出和账号映射;新入口默认标准协议。
|
|
50
|
+
4. URL 中的旧 Token 读取后立即清理,不写 Referer、日志或分析平台。
|
|
51
|
+
5. 迁移完成后停用旧行;不要继续给新系统复制 LegacyToken。
|
|
52
|
+
|
|
53
|
+
旧兼容只允许调用同源 `/api/`,绝不把 DiyToken POST 到管理员配置的任意绝对 URL。浏览器只处理 `LegacyCapabilities` 已返回连接中明确登记的 `TokenName`;不得恢复“只要 URL 出现 `?token=` 就自动登录”的无配置旁路。
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# 外部身份源登录吾码
|
|
2
|
+
|
|
3
|
+
## 目标流程
|
|
4
|
+
|
|
5
|
+
外部身份源只证明主体身份。回调完成后按当前租户查找绑定/受控 JIT 用户,重新确认 `sys_user` 仍启用,再签发 DiyToken。菜单、表、字段、角色、部门与数据范围不从外部 Token 直接继承。
|
|
6
|
+
|
|
7
|
+
## OIDC RP
|
|
8
|
+
|
|
9
|
+
必须覆盖:
|
|
10
|
+
|
|
11
|
+
- Authorization Code;公共客户端使用 PKCE S256。
|
|
12
|
+
- 随机 state、nonce、短时效、一次性消费和原始 Origin 绑定。
|
|
13
|
+
- Discovery 与 JWKS 的 HTTPS、SSRF、issuer 一致性和缓存更新。
|
|
14
|
+
- id_token 签名、算法、issuer、audience、有效期、nonce;必要时再请求 UserInfo。
|
|
15
|
+
- code 不能写日志、URL 清理、回调错误不泄露 Token/Secret。
|
|
16
|
+
- `client_secret_basic`、`client_secret_post` 或 `none` 与伙伴注册一致。
|
|
17
|
+
|
|
18
|
+
禁止 Implicit、Password Grant、宽松回调前缀、关闭签名或仅解码 JWT 不验签。
|
|
19
|
+
|
|
20
|
+
## SAML SP
|
|
21
|
+
|
|
22
|
+
必须覆盖:
|
|
23
|
+
|
|
24
|
+
- SP Metadata、AuthnRequest、RelayState、ACS 与可选 SLO。
|
|
25
|
+
- 浏览器回调使用 `/api/Sso/SamlCallback`,Assertion Consumer Service 使用 `/api/Sso/SamlAcs`。
|
|
26
|
+
- Response/Assertion 签名、Destination、Issuer、Audience、时间窗口、InResponseTo。
|
|
27
|
+
- Request ID 与 Assertion/Response 重放保护。
|
|
28
|
+
- 加密断言时使用本租户解密私钥;验签只用伙伴公开证书。
|
|
29
|
+
- NameID/Claim 到稳定 Subject 的明确规则。
|
|
30
|
+
|
|
31
|
+
不能因为伙伴证书配置困难而在生产关闭签名校验。
|
|
32
|
+
|
|
33
|
+
## CAS Client
|
|
34
|
+
|
|
35
|
+
- service 必须是精确、受控的吾码回调 URL。
|
|
36
|
+
- CAS 1.0 `/validate`、2.0 `/serviceValidate`、3.0 `/p3/serviceValidate` 按配置解析。
|
|
37
|
+
- Service Ticket 单次使用、短时效、绑定 service;失败响应不能当作用户属性。
|
|
38
|
+
- CAS 根地址生产使用 HTTPS,并经过 SSRF 检查。
|
|
39
|
+
|
|
40
|
+
## 用户解析顺序
|
|
41
|
+
|
|
42
|
+
1. 规范化 `OsClient`、连接方向和协议。
|
|
43
|
+
2. 提取稳定 Subject;拒绝空值、控制字符和不稳定昵称。
|
|
44
|
+
3. 先查 `mci_user_external_identity` 的精确绑定。
|
|
45
|
+
4. `BoundOnly` 未绑定即拒绝;`JitMatch/JitCreate` 仅按已审核映射运行。
|
|
46
|
+
5. 重新读取 `sys_user`,确认未删除、未停用。
|
|
47
|
+
6. 签发 DiyToken,写不含凭据的 SSO 审计。
|
|
48
|
+
|
|
49
|
+
步骤 2–5 固定由 `sso_resolve_federated_identity` 执行;协议 Controller 只把已经验签、归一化且不含原始 Token/断言的 Claim 交给该引擎。步骤 6 由 `sso_complete_login` 编排并调用一次性票据/DiyToken 原子。不要在 OIDC、SAML、CAS 三个 Controller 中各复制一套用户查询、JIT 和角色映射。
|
|
50
|
+
|
|
51
|
+
## 浏览器回调
|
|
52
|
+
|
|
53
|
+
弹窗消息必须同时校验 `event.source`、精确 `event.origin`、消息类型和 ConnectionKey。回调只传 90 秒左右的一次性票据;登录页再用该票据换 DiyToken。不要通过 `postMessage('*')`、URL fragment 或 Query 传 DiyToken。
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# 吾码向第三方提供登录
|
|
2
|
+
|
|
3
|
+
## 共同边界
|
|
4
|
+
|
|
5
|
+
先验证当前交互式 DiyToken,再生成第三方协议票据。访问密钥会话不能替代用户交互授权。外部 Client/SP/service 只能读取按 Scope/映射允许的最小资料,不能获得 DiyToken、菜单权限对象或内部角色策略。
|
|
6
|
+
|
|
7
|
+
## OIDC Provider
|
|
8
|
+
|
|
9
|
+
应提供:
|
|
10
|
+
|
|
11
|
+
- Discovery、JWKS、Authorize、Token、UserInfo。
|
|
12
|
+
- 机密客户端认证与公共客户端 PKCE S256。
|
|
13
|
+
- 一次性授权码,绑定 ClientId、Redirect URI、Scope、PKCE、用户、租户和过期时间。
|
|
14
|
+
- 签名 id_token,校验 nonce;按客户端派生 pairwise subject。
|
|
15
|
+
- 高熵不透明 Access/Refresh Token;仅保存哈希索引。
|
|
16
|
+
- Refresh Token rotation/reuse detection,family 撤销。
|
|
17
|
+
- Introspection、Revocation、RP-Initiated Logout 与精确 post-logout redirect。
|
|
18
|
+
|
|
19
|
+
Client Secret 轮换动作只显示一次明文,持久化 PBKDF2-SHA256 哈希。签名 Key 必须有 `kid`,轮换时保留验证重叠窗口。
|
|
20
|
+
|
|
21
|
+
对外 Claim 固定由 `sso_outbound_claims` 从启用用户与连接白名单生成;OIDC/SAML/CAS 协议网关只负责把同一投影编码成对应协议。Client Secret 轮换由 `sso_rotate_client_secret` 编排,并调用精确受限的可信原子生成一次性明文与持久哈希,不能恢复为 Controller 定制动作。
|
|
22
|
+
|
|
23
|
+
## SAML IdP
|
|
24
|
+
|
|
25
|
+
应提供 IdP Metadata、SSO、签名 Response/Assertion、可选加密和 SLO。必须校验 SP Entity ID、ACS、Destination、AuthnRequest 签名/重放;Attribute 只来自白名单映射。每个伙伴独立证书/配置,不把私钥放进应用包或前端。
|
|
26
|
+
|
|
27
|
+
## CAS Server
|
|
28
|
+
|
|
29
|
+
应提供 `/login`、CAS 1.0 `/validate`、CAS 2.0 `/serviceValidate`、CAS 3.0 `/p3/serviceValidate` 和 `/logout`。Service Ticket 必须:
|
|
30
|
+
|
|
31
|
+
- 随机、短时、单次使用。
|
|
32
|
+
- 绑定当前租户、连接、用户和精确 service。
|
|
33
|
+
- 校验成功才返回用户属性;CAS 1.0 使用协议规定的 yes/no 文本。
|
|
34
|
+
|
|
35
|
+
当前不实现 CAS Proxy Ticket;需要代理链时先评估改用 OIDC。
|
|
36
|
+
|
|
37
|
+
## 授权页面
|
|
38
|
+
|
|
39
|
+
第三方发起 Authorize/SAML/CAS 登录后,若没有有效 Provider Session,先跳到吾码登录页;登录成功回到一次性 handoff。页面必须说明目标系统、请求 Scope 和退出影响。即使后续加入 Consent,仍不能把第三方请求的任意 Scope 自动映射为吾码管理员能力。
|
|
@@ -11,15 +11,19 @@ Microi.UI 是 Microi 产品共享前端设计系统。Vue 3 网站、响应式
|
|
|
11
11
|
|
|
12
12
|
当用户要求制作 Microi 移动端应用、H5、小程序、客户门户、员工端、会员中心、官网、产品站、活动页、仪表盘或报告页,且没有指定其它设计系统时,默认使用 Microi.UI。
|
|
13
13
|
|
|
14
|
-
这是自动规则。不要等用户明确说“遵循 `microi.skills/microi-ui/SKILL.md`”。只要仓库、需求、文件路径或项目上下文属于 Microi 生态,且工作涉及前端界面、网站界面、H5、uni-app、小程序、客户/员工/会员页面、报告、仪表盘或视觉打磨,就默认读取并应用本 skill。
|
|
15
|
-
|
|
16
|
-
<!-- microi-progressive:begin -->
|
|
17
|
-
<!-- microi-progressive:chunk id=microi-ui-000 sha256=
|
|
14
|
+
这是自动规则。不要等用户明确说“遵循 `microi.skills/microi-ui/SKILL.md`”。只要仓库、需求、文件路径或项目上下文属于 Microi 生态,且工作涉及前端界面、网站界面、H5、uni-app、小程序、客户/员工/会员页面、报告、仪表盘或视觉打磨,就默认读取并应用本 skill。
|
|
15
|
+
|
|
16
|
+
<!-- microi-progressive:begin -->
|
|
17
|
+
<!-- microi-progressive:chunk id=microi-ui-000 sha256=1fdfec21b03bf209a64b65bc4c1d22cf443b065125d3fb7700d8e1751694394b -->
|
|
18
18
|
## 核心承诺
|
|
19
19
|
|
|
20
|
-
Microi.UI 不只是组件集合,它是 AI 构建软件的视觉交付标准:
|
|
21
|
-
|
|
22
|
-
-
|
|
20
|
+
Microi.UI 不只是组件集合,它是 AI 构建软件的视觉交付标准:
|
|
21
|
+
|
|
22
|
+
- 首要产品气质是清爽、清新、易读:减少重复标题、说明、统计卡和无业务意义的装饰层,用清晰层级、稳定间距与真实内容建立品质。
|
|
23
|
+
- 清爽不等于大面积空白或固定白底;页面必须在信息密度与可扫读性之间取得平衡,核心任务和主要操作应在首屏内清楚可见。
|
|
24
|
+
- 每个组件和页面都必须消费语义 token,适配任意租户主题色,并同时支持亮色、暗色模式;禁止把某一种主色、白色表面或深色背景写成唯一正确外观。
|
|
25
|
+
- 新增视觉验收至少覆盖一个浅色主题、一个暗色主题和一个非默认租户主题色,并检查文字、边界、状态色及焦点态的可读性。
|
|
26
|
+
- 每个首屏都必须有明确视觉锚点。
|
|
23
27
|
- 每个页面都必须使用有品牌意识的色彩和组件层级。
|
|
24
28
|
- 每个重要操作都必须明显、美观且容易触达。
|
|
25
29
|
- 每个列表、详情、表单都应基于可复用场景模式构建,而不是复制一次性 CSS。
|
|
@@ -121,7 +121,7 @@ Iframe 不把长期 Token、密码或连接串放 URL。第三方单点登录使
|
|
|
121
121
|
|
|
122
122
|
PC 列表的固定结构顺序是“模块 Hero(标题/副标题/动态指标)→ PageTabs → 查询与表格”,Hero 必须渲染在页面多 Tab 上方。头部只使用一次性入场和一次性轻量光效,禁止持续循环动画;`prefers-reduced-motion: reduce` 必须关闭动画和过渡。
|
|
123
123
|
|
|
124
|
-
PageTabs 通过 `TargetSysMenuId` 切换不同模块/表时,入口模块必须作为稳定宿主:客户端在同一个 `diy-table` 实例内加载目标模块的菜单、表、字段与列表数据,只更新当前 URL 的 `Tab` 查询参数,不替换路由、面包屑、顶部访问标签或宿主 Hero。入口模块只配置一组 PageTabs;目标菜单可隐藏导航,但只需保留目标表格设计和角色权限,不得复制同一组 PageTabs。切换时必须中止旧请求并以模块上下文版本丢弃迟到响应,失败时回滚原模块。
|
|
124
|
+
PageTabs 通过 `TargetSysMenuId` 切换不同模块/表时,入口模块必须作为稳定宿主:客户端在同一个 `diy-table` 实例内加载目标模块的菜单、表、字段与列表数据,只更新当前 URL 的 `Tab` 查询参数,不替换路由、面包屑、顶部访问标签或宿主 Hero。入口模块只配置一组 PageTabs;目标菜单可隐藏导航,但只需保留目标表格设计和角色权限,不得复制同一组 PageTabs。隐藏目标菜单统一设置 `ParentId=入口菜单Id、Display=0、AppDisplay=0、HasChild=0、PageTabs=[]`,入口菜单保持 `HasChild=0` 以继续作为可点击业务入口。模块设计器必须用可搜索菜单树显示 `TargetSysMenuId` 的模块名称,不能只在运行时 JSON 中保存不可见 Id。切换时必须中止旧请求并以模块上下文版本丢弃迟到响应,失败时回滚原模块。
|
|
125
125
|
|
|
126
126
|
模块首屏或跨模块切换期间,Hero 标题/指标、PageTabs、工具栏与列表必须显示与最终布局同尺寸的主题化骨架屏;不能先渲染空白旧布局再整体位移。骨架屏同样遵守 `prefers-reduced-motion: reduce`,并在无指标或无 PageTabs 时按元数据提示隐藏对应占位。
|
|
127
127
|
|
|
@@ -191,7 +191,7 @@ PageTabs 可以通过 `BadgeApiEngineKey` 显示数字角标。接口按 `Button
|
|
|
191
191
|
|
|
192
192
|
PageTabs 只表达当前模块的数据类别/状态,不能取代模块 Hero,也不能渲染到 Hero 上方。
|
|
193
193
|
|
|
194
|
-
跨表 Tab 由入口模块统一配置一组 PageTabs,目标菜单只保留各自的模块设计、表绑定和角色权限,不复制 PageTabs
|
|
194
|
+
跨表 Tab 由入口模块统一配置一组 PageTabs,目标菜单只保留各自的模块设计、表绑定和角色权限,不复制 PageTabs。隐藏目标菜单统一设置 `ParentId=入口菜单Id、Display=0、AppDisplay=0、HasChild=0、PageTabs=[]`,入口菜单继续保持 `HasChild=0` 作为可直接点击的业务入口。模块设计器用【关联模块】可搜索菜单树展示名称、保存 `TargetSysMenuId`。切换只更新当前 URL 的 `Tab` 查询参数;路由、面包屑、顶部访问标签和入口模块 Hero 保持稳定,表格上下文在原实例中切换。实现时必须取消旧请求、丢弃迟到响应并在失败时回滚,禁止按菜单名或业务表名写死。
|
|
195
195
|
|
|
196
196
|
首屏和跨模块切换应为 Hero 标题/统计、PageTabs、工具栏和列表提供与最终几何尺寸一致的主题化骨架屏;根据模块元数据判断是否预留指标区和 PageTabs,并支持 `prefers-reduced-motion: reduce`。
|
|
197
197
|
|
|
@@ -9,17 +9,21 @@ description: Microi UI 设计系统指南。用于设计 PC Vue、Element Plus
|
|
|
9
9
|
|
|
10
10
|
你正在为 Microi 吾码平台创建界面。所有页面、组件、弹窗必须遵循本规范,打造高级、克制、具有科技感和品牌识别度的视觉体验。
|
|
11
11
|
|
|
12
|
-
> **适用平台**:PC 端(Vue 3 + Element Plus + SCSS)、移动端 H5/uni-app/原生 WebView(纯 CSS / 无第三方组件库)
|
|
13
|
-
> **核心理念**:高级但不浮夸,动效丰富但可维护,多端统一同时尊重平台差异
|
|
14
|
-
> **变量前缀**:所有 CSS 变量统一使用 `--mci-` 前缀(Microi Interface)
|
|
15
|
-
|
|
16
|
-
---
|
|
12
|
+
> **适用平台**:PC 端(Vue 3 + Element Plus + SCSS)、移动端 H5/uni-app/原生 WebView(纯 CSS / 无第三方组件库)
|
|
13
|
+
> **核心理念**:高级但不浮夸,动效丰富但可维护,多端统一同时尊重平台差异
|
|
14
|
+
> **变量前缀**:所有 CSS 变量统一使用 `--mci-` 前缀(Microi Interface)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
17
|
|
|
18
18
|
<!-- microi-progressive:begin -->
|
|
19
|
-
<!-- microi-progressive:chunk id=ui-design-000 sha256=
|
|
20
|
-
## 整体风格定义
|
|
21
|
-
|
|
22
|
-
-
|
|
19
|
+
<!-- microi-progressive:chunk id=ui-design-000 sha256=205676798890adacffba77fa7ffb48f044b5d4443f11620831f361d2edf97a81 -->
|
|
20
|
+
## 整体风格定义
|
|
21
|
+
|
|
22
|
+
- **默认基线**:优先呈现清爽、清新、易读的界面,减少重复层级、冗长说明、同义统计卡和无业务意义的装饰,把视觉重量留给真实内容与关键操作。
|
|
23
|
+
- **信息密度**:清爽不是空白越多越好;应用应以任务完成效率决定首屏密度,并通过字号、间距、对齐和语义表面建立层次。
|
|
24
|
+
- **主题适配**:所有颜色、表面、边界、阴影和交互状态必须使用语义 token,适配任意租户主题色,并同时覆盖亮色、暗色模式;不得只在默认主题下成立。
|
|
25
|
+
- **视觉验收**:至少选择浅色、暗色及一个非默认租户主题色,检查文本对比度、焦点态、状态色、悬停与禁用状态。
|
|
26
|
+
- **风格关键词**:高级、通透、科技感、品牌化、轻量精致、视觉张力。
|
|
23
27
|
- **质感**:柔和多层阴影、清晰边界、结构化光影、细腻纹理、精致微动效。
|
|
24
28
|
- **氛围**:默认亮色多彩主题(colorful + gradient + soft shadow),暗黑主题作为可选切换;避免廉价装饰,优先用布局、层级、动效和真实内容建立高级感。
|
|
25
29
|
- **参考吸收**:可参考成熟移动端 UI 灵感库的组件完整度、色彩节奏、入场动效和模板化能力,但 Microi 视觉必须通过 `--mci-*` token 与 MCI-UI 组件形成自己的品牌系统,不照搬第三方外观,也不在吾码源码、文档或样式命名中保留外部 UI 品牌痕迹。
|
|
@@ -10,7 +10,7 @@ description: Microi V8 CRUD 接口引擎开发。用于编写服务端 JavaScrip
|
|
|
10
10
|
你正在开发 Microi 吾码平台的 V8 接口引擎。接口引擎是运行在服务端的 JavaScript 函数,通过 `V8.FormEngine` 操作数据库,通过 `V8.Result` 或 `return` 返回结果。
|
|
11
11
|
|
|
12
12
|
<!-- microi-progressive:begin -->
|
|
13
|
-
<!-- microi-progressive:chunk id=v8-crud-api-000 sha256=
|
|
13
|
+
<!-- microi-progressive:chunk id=v8-crud-api-000 sha256=6b43119f4eae78fb6b185d48c5c289878ba86093ae62ce44ad0bdaa48093f605 -->
|
|
14
14
|
## 本地优先与版本头(必做)
|
|
15
15
|
|
|
16
16
|
AI 本地开发接口引擎时,优先修改 `microi-v8-engine/<租户>/<项目>/接口引擎/.../*.js` 本地文件,再通过 MCP 或 VS Code 插件同步到数据库。插件提示“本地和远端不一致”时,必须先读取本地与远端代码并合并有效差异,不能盲目用任一侧覆盖另一侧。
|
|
@@ -33,7 +33,7 @@ AI 本地开发接口引擎时,优先修改 `microi-v8-engine/<租户>/<项目
|
|
|
33
33
|
|
|
34
34
|
Microi.net.Api 普通本地启动不要额外设置 `ASPNETCORE_ENVIRONMENT` / `DOTNET_ENVIRONMENT`,让 `Program.cs` 读取 `Microi.Server/Microi.net.Api/.microi-local` 并加载对应的 `appsettings.{Env}.json`。
|
|
35
35
|
|
|
36
|
-
版本与历史同步规则:通过 MCP 或 VS Code 插件保存接口引擎时,必须同步写入 `sys_apiengine.Version
|
|
36
|
+
版本与历史同步规则:通过 MCP 或 VS Code 插件保存接口引擎时,必须同步写入 `sys_apiengine.Version`;新版平台把每次修改说明作为独立记录写入 `mci_apiengine_change_history`,表单中的“修改历史”使用 `TableChild` 展示,不再让客户端拼接或覆盖 `sys_apiengine.ChangeHistory` 多行文本。写入必须携带版本号与简明说明,并使用幂等 `EntryKey` 防止网络重试产生重复记录。安装/升级表单引擎官方应用时,旧 `ChangeHistory` 按非空行迁入子表并保留旧物理列作滚动兼容;尚未安装该子表、旧库缺字段或迁移期间,后端应自动回退旧字段或仅更新 `ApiV8Code` 与 `UpdateTime`,不得因此阻断代码同步。
|
|
37
37
|
|
|
38
38
|
生成接口引擎代码时,代码内容本身(文件头、普通注释、`console.log`、返回 `Msg` 等)不要包含 `Microi`、`吾码` 等平台品牌文字,除非业务数据或字段值本身必须如此。生成代码要有可维护注释:每个 `function` 前写清用途、关键参数和返回值;跨表事务、权限校验、状态机、金额/库存计算、复杂 `_Where` 条件等代码段前写短注释说明业务原因;避免“给变量赋值”这类无信息量注释。
|
|
39
39
|
|
|
@@ -89,7 +89,9 @@ return {
|
|
|
89
89
|
`HasMore + Checkpoint` 续跑,不要只提高单次超时或内存。
|
|
90
90
|
- 接口引擎的正向开关是 `sys_apiengine.V8Limit`:默认关闭时
|
|
91
91
|
`V8.Limits.UnlimitedRuntime=true`,打开后才应用超时、语句、函数递归、
|
|
92
|
-
累计分配和 Promise
|
|
92
|
+
累计分配和 Promise 等待限制。表后端事件同样使用正向 `diy_table.V8Limit`:
|
|
93
|
+
缺失、`null`、`0/false` 不设置单次预算,只有 `1/true` 才启用限制;旧
|
|
94
|
+
`V8Unlimited` 仅在新字段不存在时反向兼容。
|
|
93
95
|
常驻内存保护、外部取消、并发、接口嵌套深度、权限沙箱与数据库限制始终
|
|
94
96
|
生效;两类开关都只能来自持久化可信元数据,不能从请求参数启用。
|
|
95
97
|
- 服务端另有一个内置受信任特例:主租户中由持久队列恢复的
|
|
@@ -74,9 +74,10 @@ return {
|
|
|
74
74
|
|
|
75
75
|
- 列表页固定顺序为“模块 Hero(标题/副标题/动态指标)→ PageTabs → 查询与表格”;PageTabs 不能渲染到 Hero 上方,也不能重复承担模块标题。
|
|
76
76
|
- `TargetSysMenuId` 为空时,页签仍在当前模块执行 `V8Code` 和重新查询。
|
|
77
|
-
- `TargetSysMenuId`
|
|
77
|
+
- `TargetSysMenuId` 指向其它模块时,点击会在当前 `diy-table` 实例内加载目标模块自己的表单引擎、字段、查询接口替换、按钮和分页配置;入口路由、面包屑、顶部访问标签和宿主 Hero 不变,URL 只更新 `Tab` 查询参数。
|
|
78
78
|
- 目标模块可以设置 `Display=0、AppDisplay=0` 隐藏左侧菜单,但必须给使用角色分配菜单权限,否则动态路由中找不到目标模块。
|
|
79
|
-
-
|
|
79
|
+
- 一组 PageTabs 只保存在入口模块;隐藏目标模块设置 `ParentId=入口菜单Id、HasChild=0、PageTabs=[]`,不得复制同一套 PageTabs。入口菜单保持 `HasChild=0`,仍然直接打开业务页面。
|
|
80
|
+
- 模块设计器的 PageTabs 必须显示【关联模块】可搜索菜单树,展示模块名称并保存 `TargetSysMenuId`,不能让该协议只能手工改 JSON。
|
|
80
81
|
- 禁止在 `diy-table` 或 mixin 中按模块名、Url、表名写死页签数据源。
|
|
81
82
|
|
|
82
83
|
### V8CodeShow(显隐控制)—— 支持 `return` 和 `V8.Result`
|
|
@@ -58,7 +58,7 @@ AI 本地开发表单 V8 事件时,优先修改 `microi-v8-engine/<租户>/<
|
|
|
58
58
|
- 传入 `_InvokeType: 'Client'` → **触发**表单 V8 事件
|
|
59
59
|
- Postman 等直接调用接口 → 前端事件**不执行**,后端事件**仍执行**
|
|
60
60
|
- 服务器端提交前/后 V8 事件在**同一事务**中执行
|
|
61
|
-
- `diy_table.
|
|
61
|
+
- `diy_table.V8Limit` 是表后端提交前、提交后和数据处理 V8 的正向开关:缺失、`null`、`0/false` 均不设置 Jint 单次超时、语句、函数递归和累计分配预算,只有 `1/true` 才启用这些限制。旧 `V8Unlimited` 仅在新字段不存在时反向推断,新的 MCP、Manifest 和应用资源只写 `V8Limit`。进程常驻内存、取消、并发、接口嵌套深度、权限和数据库保护始终生效。
|
|
62
62
|
|
|
63
63
|
<!-- /microi-progressive:chunk -->
|
|
64
64
|
<!-- microi-progressive:chunk id=v8-table-event-003 sha256=65a1e728982d4e534d06dc2440eac111fe53a08f0a3012c6a9f8b1de45b4b81f -->
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
- `_InvokeType:'Server'` 只表达事件调用语义,不是客户端授权开关;浏览器伪造它不会获得受信任权限
|
|
36
36
|
- `V8.FormSubmitAction` 的值是 `'Insert'`/`'Update'`/`'Delete'`(非 Add/Upt/Del)
|
|
37
37
|
- 在 DataFilterV8 中使用 `V8.CacheData` 缓存查询结果,避免每行执行 N+1 查询
|
|
38
|
-
-
|
|
38
|
+
- 表事件调用下游接口时,表级正向 `diy_table.V8Limit` 不会改变下游接口;下游接口独立读取正向 `sys_apiengine.V8Limit`(两者均默认 0 表示不限 Jint 单次预算,1 表示启用限制)
|
|
39
39
|
|
|
40
40
|
### 复盘:提交后事件误把增量表单当作完整记录
|
|
41
41
|
|