# Business Plugin V1 实现边界与验收 状态:控制面入口已实现;业务插件按包独立接入 ## 1. 唯一入口 `plugins/plugin-admin` 是通用 Business Plugin V1 控制面。它的首页和默认菜单只能表达“插件管理”,不表达任何具体业务域,也不默认打开订阅、支付或其他业务页面。 控制面负责: - 展示已登记、已安装和可升级的插件包; - 校验清单、签名、文件哈希和 Core 兼容性; - 安装、启用、停用、升级、回滚、卸载和配置; - 显示运行状态、健康检查结果和操作审计; - 对插件声明的管理员菜单执行预览和应用。 控制面不负责: - 订阅商品、余额、订单、支付、配额或请求计费; - 任何业务插件自己的页面和领域数据; - Core 数据库、Core 用户表或 `.s2plugin` transport ABI。 ## 2. 安装后注入流程 ```text 管理员登录 plugin-admin | v 插件目录 -> 上传/选择业务插件包 | v 清单 + 签名 + 哈希 + Core 兼容性校验 | v 安装到独立 revision,初始为 disabled | v 启用 -> 启动独立服务端口 -> healthz/readyz/版本检查 | v 菜单预览 -> 管理员确认 -> 应用 custom_menu_items | v Core 管理员菜单出现该插件自己的入口 ``` 每个插件使用自己的 `plugin_id`、版本、端口、服务进程、UI 和菜单 ID。停用或卸载插件时,只移除该插件自己声明的菜单项,不触碰其他插件或 Core 数据。 ## 3. 订阅插件的位置 `plugins/subscription-admin` 是第一个业务插件样例,而不是控制面。它只有在管理员通过 `plugin-admin` 安装、启用并应用菜单后才出现。卸载订阅插件只删除插件资源和自身投影,不删除 Core 的套餐、订阅、余额、订单、用量或审计。 订阅插件的 V1 只读取 Core 现有管理员 API;余额购买、续费、撤销和退款写操作必须等待版本化 Core 原子接口,不得把多个 Admin API 拼成一次购买。 ## 4. 登录与安全边界 - 控制面和业务插件均复用 Core 管理员登录及 2FA,不创建插件用户表;普通 Core 用户统一拒绝。 - 浏览器只持有插件自己的 HttpOnly 会话和 CSRF token;Core access/refresh token、Admin Key 只存在插件服务端。 - 插件后端通过精确 allowlist 调用 Core API,不提供任意 URL 代理,不连接 Core PostgreSQL/Redis。 - 插件包必须签名;未签名包仅限开发环境 loopback 测试。 ## 5. 功能验收最小条件 1. 打开 `plugin-admin` 首屏看到插件目录,而不是订阅页面。 2. 未安装订阅包时,目录可以为空,左侧不会出现订阅菜单。 3. 安装并启用一个包后,详情页显示该包的状态、版本和健康结果。 4. 菜单预览只新增该包自己的菜单项;应用后 Core 管理员菜单才出现该入口。 5. 停用或卸载后入口消失,其他菜单保持不变。 6. 425px、900px、1440px 三种视口均无横向溢出、遮挡或凭据泄漏。 ## 6. 后续插件模板 新增业务插件只需提供独立清单、服务、UI、Core API allowlist 和菜单声明,并遵守本文件的安装生命周期。插件管理控制面不因新增业务域而增加订阅、支付或其他领域分支。