diff --git a/docs/panel_service.md b/docs/panel_service.md new file mode 100644 index 0000000..04348e8 --- /dev/null +++ b/docs/panel_service.md @@ -0,0 +1,254 @@ +# 面板微服务(panel)开发文档 + +> 状态:设计稿 v0.1(开发前评审) +> 关联:[gateway/README.md](../gateway/README.md)、[docs/dnfs_custom_themes.md](dnfs_custom_themes.md)、[core/services.yaml](../core/services.yaml)、[libhttp/README.md](../libhttp/README.md) + +## 1. 背景与目标 + +### 1.1 问题 + +现有前端页面(fsys 托管的 `index.html` / `dnfs.html` 等)都是"整页应用":每个页面由单个服务完整提供。当多个服务都想在首页/工作台展示自己的能力时,只能互相改动前端代码或各自开新页面,服务间耦合、发布相互牵连。 + +### 1.2 目标 + +新增**面板微服务**(panel),提供一张**背景视图**(工作台/仪表盘)。视图内的元素与控件**不由面板自己实现**,而是由各业务微服务以**前端代码片段**的形式提供,面板负责聚合、渲染与托管: + +- 各服务**自持控件代码**(代码维护在各自模块),通过约定协议暴露片段 +- 面板**拉取并聚合**片段,以 iframe 沙箱插入背景视图 +- 面板只提供统一外壳(布局 / 主题 / 通信 / 身份透传),**不感知控件业务** + +### 1.3 非目标(v1) + +- 不做控件可视化拖拽编排(v2 候选) +- 不做用户自定义控件 / 第三方插件市场(控件仅来自内部服务,白名单) +- 不做控件代码的 AI 内容审核——控件是内部服务代码而非用户输入,信任边界与 dnfs2 用户样式节点不同(见 5.3) + +## 2. 架构设计 + +### 2.1 拓扑 + +``` +浏览器 + │ https + q4_token Cookie / Authorization + ▼ +waf:443 ──► ca:8443(验签,注入 X-Auth-User / X-Auth-Admin) + │ Target-Url: http://127.0.0.1:9201 + ▼ + gateway:8445 ──► panel:9201(Proxy.opened 白名单) + │ + ┌────────────────┼──────────────────────┐ + │ 内部 HTTP(--providers 白名单) │ BFF 转发 + ▼ ▼ ▼ + dnfs2:8006 fsys:9200 其他 provider 服务 + /panel-widget/x /panel-widget/y +``` + +- 面板对浏览器只暴露**一个 origin**(面板自己);控件 iframe 由面板端点在**同一 origin** 下渲染,不存在跨域、自定义头问题(浏览器无法设置 `Target-Url`,因此控件回源统一走面板 BFF,对齐 fsys→dnfs2 的服务端代理先例)。 +- 面板加入 `Proxy.opened` 白名单后走 ca 受保护链路:只有登录用户能打开面板;BFF 转发时透传身份头。 + +### 2.2 核心概念 + +| 概念 | 说明 | +|---|---| +| Panel | 面板服务本身:背景视图 + 聚合 / 渲染 / 托管 | +| Widget(控件) | 一个可独立渲染的前端单元,由某微服务提供 | +| Provider(提供方) | 拥有控件代码的微服务,实现 `/panel-widget/` 协议 | +| Manifest | 控件描述:元数据 + html/css/js 片段 + 布局 / 主题声明 | + +### 2.3 控件生命周期 + +1. **声明**:服务在自身实现 `GET /panel-widget/`(内部 HTTP) +2. **拉取**:面板按 `--widgets` 清单拉取各 manifest(缓存 + TTL) +3. **聚合**:面板把 manifest 渲染为独立子页面 `/widget/`(内联片段 + 白名单 CSP) +4. **插入**:面板页用 `