Skip to content

Wujie 微前端事件说明

本文档整理 registerWujieEvent() 注册的事件、入参、回调响应和典型调用方式。微应用容器、props 和 token 边界见 microapps.md。源码以当前 w7panel-ui/src 为准。

整体使用方式

Wujie 事件文档用于维护面板和微应用之间的事件协议。开发时先确认事件由谁发起、是否需要回调、回调数据结构是什么,再在面板侧注册事件、在微应用侧按约定触发。

基本流程

  1. 面板容器页面挂载需要的事件注册组件,例如 WujieModals
  2. 面板侧使用 registerWujieEvent(event, handler) 注册事件,并在卸载时清理。
  3. 微应用侧使用 window.$wujie.bus.$emit(event, payload, callback, rejectCallback) 触发事件。
  4. 事件需要响应时,明确 callback 返回字段;需要失败路径时明确 rejectCallback。
  5. 新增或修改事件名、payload、callback 响应时,同步更新本文。

使用边界

  • 事件名要避免过泛,新增通用名称前先搜索现有事件。
  • payload 优先使用对象,便于后续扩展。
  • callback 不是 Promise,调用方必须按回调协议处理成功和失败。
  • 微应用 props 和 token 边界见 microapps.md

基础用法

源文件:w7panel-ui/src/hooks/use-wujie-events.ts

registerWujieEvent(event, handler) 是对 wujiebus.$on(event, handler) 的封装,额外记录已注册事件,组件卸载时可通过 clearAllWujieEvents() 统一注销。

面板侧注册示例:

ts
import { registerWujieEvent, clearAllWujieEvents } from '@/hooks/use-wujie-events';

registerWujieEvent('openPage', this.openPage);

beforeUnmount() {
  clearAllWujieEvents();
}

微应用侧调用示例:

ts
window.$wujie.bus.$emit('openPage', {
  title: '外部页面',
  src: 'https://example.com',
});

微应用侧推荐封装:

ts
export function getWujieBus() {
  return window.$wujie?.bus;
}

export function emitPanelEvent(eventName: string, payload?: unknown) {
  return new Promise((resolve, reject) => {
    const bus = getWujieBus();
    if (!bus) {
      reject(new Error('Wujie bus is not available'));
      return;
    }

    bus.$emit(eventName, payload, resolve, reject);
  });
}

使用方式:

ts
// 无回调事件:打开面板弹窗
window.$wujie?.bus?.$emit('openPage', {
  title: '帮助',
  src: 'https://example.com/help',
});

// 有回调事件:按 Promise 处理成功和失败
await emitPanelEvent('buildImage', buildPayload);

带响应回调的调用示例:

ts
window.$wujie.bus.$emit('checkSession', (token: string) => {
  // token 为空表示刷新失败或未返回
});

注意事项:

  • handler 为空时会跳过注册并输出 warning。
  • clearAllWujieEvents() 清理的是当前 hook 模块记录的全部事件;同一页面嵌套多个注册组件时,要确认清理时机不会误清其它仍在使用的事件。
  • 多参数响应遵循 window.$wujie.bus.$emit(event, data, callback, rejectCallback) 这种约定,回调不是 Promise。
  • 面板传给微应用的 props 由各容器页面 startApp()setupApp() 配置决定,常见字段见 microapps.md
  • 微应用触发事件前要判断 window.$wujie?.bus 是否存在;独立运行调试时可以降级为空实现或提示当前不在面板容器内。
  • 微应用不要假设所有事件都有回调;是否有响应以本文每个事件的“响应”说明为准。
  • payload 优先传对象,不要传位置参数数组,后续扩展字段时更稳定。

通用弹窗和面板能力事件

注册位置:w7panel-ui/src/components/wujie-modals.vue

该组件挂载在微应用容器页面中,提供文件、日志、构建镜像、域名、应用配置等面板能力。

toStoreInstall

功能:跳转到应用商店安装页。

参数:

参数类型必填说明
pathstringzpk 安装路径或应用标识

响应:无。

示例:

ts
window.$wujie.bus.$emit('toStoreInstall', 'https://zpk.w7.cc/zpk/respo/info/demo_app');

openPage

功能:在面板弹窗中打开 iframe 页面。

参数:

字段类型必填说明
srcstringiframe 地址
titlestring弹窗标题

响应:无。

示例:

ts
window.$wujie.bus.$emit('openPage', {
  title: '帮助文档',
  src: 'https://example.com/help',
});

openApp

功能:在面板弹窗中打开应用组微应用页面。

参数:

字段类型必填说明
appgroupstring应用组名称
pathstring微应用内部路径,会写入 path query
titlestring弹窗标题

响应:无。

示例:

ts
window.$wujie.bus.$emit('openApp', {
  appgroup: 'demo',
  path: '/settings',
  title: '应用设置',
});

toFile

功能:跳转到当前应用组下的文件管理页面。

参数:

字段类型必填说明
kindstringWorkload 复数类型,例如 deploymentsstatefulsets
appnamestring应用名称
pathstring初始文件路径

响应:无。

示例:

ts
window.$wujie.bus.$emit('toFile', {
  kind: 'deployments',
  appname: 'nginx',
  path: '/etc/nginx/',
});

openFile

功能:在面板弹窗中打开文件管理组件。

参数同 toFile

响应:无。

示例:

ts
window.$wujie.bus.$emit('openFile', {
  kind: 'statefulsets',
  appname: 'mysql',
  path: '/var/lib/mysql/',
});

buildImage

功能:提交 zpk 镜像构建任务。

参数:直接透传给 POST /panel-api/v1/zpk/buildimage/job

响应:

回调参数说明
callback后端任务创建成功后调用

示例:

ts
window.$wujie.bus.$emit('buildImage', buildPayload, () => {
  // 构建任务已提交
});

buildImageLog

功能:打开构建 Job 日志弹窗。

参数:

字段类型必填说明
buildJobNamestringJob 名称

响应:无。

示例:

ts
window.$wujie.bus.$emit('buildImageLog', { buildJobName: 'build-demo-xxx' });

closeBuildImageLog

功能:关闭构建 Job 日志弹窗。

参数:无。

响应:无。

ts
window.$wujie.bus.$emit('closeBuildImageLog');

zip

功能:压缩容器内文件并生成下载链接。

参数:

字段类型必填说明
pidobject目标容器定位信息
pid.namespacestring命名空间
pid.HostIpstring节点 IP
pid.containerIdstring容器 ID
pid.containerNamestring容器名
pid.podNamestringPod 名称
inputarray待压缩源路径列表,传给 compressFiles()
outputstring压缩包输出路径
callbackfunctiondata 内部回调

响应:

回调参数说明
data.callback{ link }兼容 data 内回调
第二参数 callback{ link }标准事件回调

示例:

ts
window.$wujie.bus.$emit('zip', {
  pid: {
    namespace: 'default',
    podName: 'nginx-xxx',
    containerName: 'nginx',
  },
  input: ['/etc/nginx'],
  output: '/tmp/nginx.tar.gz',
}, ({ link }) => {
  window.open(link);
});

uploadFile

功能:上传文件到容器内指定目录。

参数:

字段类型必填说明
pidobject目标容器定位信息,字段同 zip.pid
pathstring上传目录,代码中会拼接 path + file.name
fileFile浏览器 File 对象

响应:

回调参数说明
无参数上传成功
Error/AxiosError上传失败

示例:

ts
window.$wujie.bus.$emit('uploadFile', {
  pid: {
    namespace: 'default',
    podName: 'nginx-xxx',
    containerName: 'nginx',
  },
  path: '/tmp/',
  file,
}, (err?: unknown) => {
  if (err) return;
  // 上传成功
});

domainCert

功能:打开或更新域名证书相关数据,由 views/topapp/domain-cert.vue 处理展示。

参数:证书组件所需的 domain cert 数据对象。

响应:无。

ts
window.$wujie.bus.$emit('domainCert', certData);

podLog

功能:打开 Pod 日志弹窗。

参数:

字段类型必填说明
namestringPod 名称
namespacestring命名空间
containerstring默认容器名
containerListarray容器列表

响应:无。

ts
window.$wujie.bus.$emit('podLog', {
  name: 'nginx-xxx',
  namespace: 'default',
  container: 'nginx',
});

openAppForm

功能:打开微应用配置表单。

参数:

字段类型必填说明
yamlstringYAML 配置
jsonobjectJSON 配置

响应:

回调参数说明
callbackMicroAppForm 决定表单提交后的结果

示例:

ts
window.$wujie.bus.$emit('openAppForm', {
  yaml: yamlText,
}, (result) => {
  // 处理表单提交结果
});

ingressEdit

功能:打开微应用域名编辑弹窗。

参数:

字段类型必填说明
ingressobjectIngress 数据
appListarray应用列表
appPortsobject/array应用端口数据
callbackfunction提交后的回调

响应:

回调参数说明
data.callbackobject域名编辑提交值
ts
window.$wujie.bus.$emit('ingressEdit', {
  ingress,
  appList,
  appPorts,
  callback: (value) => {},
});

ingressStrategy

功能:打开域名策略配置弹窗。

参数:

字段类型必填说明
ingressobjectIngress 数据,读取 ingress.backend.strategy 回显
callbackfunction策略提交后的回调

响应:

回调参数说明
data.callbackobject策略数据,来自 DomainStrategyv[0].value
ts
window.$wujie.bus.$emit('ingressStrategy', {
  ingress,
  callback: (strategy) => {},
});

checkSession

功能:使用 refresh token 请求新 token。

参数:第一个参数就是回调函数。

响应:

回调参数说明
token刷新成功后的访问 token;失败时当前实现不调用回调
ts
window.$wujie.bus.$emit('checkSession', (token: string) => {
  // 使用新 token
});

containerPlugin

功能:打开容器插件配置抽屉。

参数:

参数类型必填说明
dataobject传给 ContainerPluginpropsData
callbackfunction抽屉确认时传给 ContainerPlugin.submit(callback)

响应:由 ContainerPlugin.submit() 决定。

ts
window.$wujie.bus.$emit('containerPlugin', pluginData, (result) => {
  // 保存插件配置
});

buildContainerImage

功能:打开“从运行中容器构建镜像”的状态弹窗。

参数:

字段类型必填说明
podNamestringPod 名称
containerNamestring容器名称
imageNamestring原镜像名,成功回调会原样带回
cmdstring/array构建命令
pinnedboolean是否固定镜像
updateImageboolean是否更新 workload 镜像

响应:

回调参数说明
callback{ ...result, imageName }构建完成回调,额外补充原始 imageName
rejectCallback由构建组件决定构建失败或取消回调
ts
window.$wujie.bus.$emit('buildContainerImage', {
  podName: 'nginx-xxx',
  containerName: 'nginx',
  imageName: 'registry.local.w7.cc/default/nginx:latest',
  updateImage: true,
}, (result) => {
  // 构建完成
}, (err) => {
  // 构建失败
});

getOidcCode

功能:为微应用获取 OIDC 一次性 code。

参数:

字段类型必填默认值说明
client_idstringdefaultOIDC client id
redirect_uristringhttp://127.0.0.1:3000/callback回调地址
scopestringopenidscope

响应:

回调参数说明
code成功时返回 code,失败时返回空字符串
ts
window.$wujie.bus.$emit('getOidcCode', {
  client_id: 'demo',
  redirect_uri: 'https://demo.example.com/callback',
  scope: 'openid profile',
}, (code: string) => {});

changeLogin

功能:切换面板登录态并跳转首页。

参数:

字段类型必填说明
tokenstring新访问 token
refreshTokenstring新 refresh token

响应:无。

ts
window.$wujie.bus.$emit('changeLogin', {
  token,
  refreshToken,
});

域名缓存微应用事件

注册位置:

  • w7panel-ui/src/components/domain-strategy-filecache.vue
  • w7panel-ui/src/components/domain-strategy-imagecache.vue

这些事件由缓存策略内嵌微应用触发。注意事件名是通用的 submitclose,因此只能在对应缓存组件生命周期内使用。

文件缓存 submit

功能:开启或关闭文件缓存,并向父组件提交 JSON Patch operations。

参数:

形式类型说明
true/falseboolean直接设置文件缓存开关
{ from, open }objectfromfile-cache 时处理,open 表示开关

响应:

父组件事件参数说明
submitoperationsJSON Patch operations,用于更新 Ingress

示例:

ts
window.$wujie.bus.$emit('submit', {
  from: 'file-cache',
  open: true,
});

文件缓存 close

功能:关闭文件缓存组件。

参数:无。

响应:父组件触发 cancel

ts
window.$wujie.bus.$emit('close');

图片缓存 submit

功能:通知父组件提交图片缓存配置。

参数:

字段类型必填说明
fromstring必须为 image-cache

响应:父组件触发 submit,无额外参数。

ts
window.$wujie.bus.$emit('submit', {
  from: 'image-cache',
});

图片缓存 close

功能:关闭图片缓存组件。

参数:无。

响应:父组件触发 cancel

ts
window.$wujie.bus.$emit('close');

GPUStack 专用事件

注册位置:w7panel-ui/src/views/app/gpustack/index.vue

这些事件仅在 GPUStack 页面内有效,用于微应用管理 GPU worker。

createApp

功能:创建 GPUStack worker。

参数:

字段类型必填说明
cpustring/numberCPU 数值
cpuDwstringCPU 单位,例如 m 或空字符串
memorystring/number内存,单位固定拼接为 Mi
gpuComputestring/numberGPU 算力
gpuNumberstring/numberGPU 数量
gpuVmstring/numberGPU 显存
runtimeClassNamestringRuntimeClass 名称

响应:无直接回调;成功后面板提示“操作成功”并触发 podList 下行事件。

ts
window.$wujie.bus.$emit('createApp', {
  cpu: 2,
  cpuDw: '',
  memory: 4096,
  gpuNumber: 1,
  gpuCompute: 100,
  gpuVm: 8192,
});

editApp

功能:修改 GPUStack worker StatefulSet 的资源限制和请求。

参数:

字段类型必填说明
namestringStatefulSet 名称
cpustring/numberCPU 数值
cpuDwstringCPU 单位
memorystring/number内存 Mi
gpuComputestring/numberGPU 算力
gpuNumberstring/numberGPU 数量
gpuVmstring/numberGPU 显存

响应:无直接回调;成功后触发 podList 下行事件。

ts
window.$wujie.bus.$emit('editApp', {
  name: 'gpustack-worker-a',
  cpu: 4,
  memory: 8192,
  gpuNumber: 1,
});

deleteApp

功能:删除 GPUStack worker StatefulSet。

参数:

字段类型必填说明
namestringStatefulSet 名称

响应:无直接回调;成功后触发 podList 下行事件。

ts
window.$wujie.bus.$emit('deleteApp', { name: 'gpustack-worker-a' });

getPodList

功能:请求面板重新查询并下发 GPUStack worker Pod 列表。

参数:无。

响应:通过下行事件 podList 返回。

ts
window.$wujie.bus.$emit('getPodList');

window.$wujie.bus.$on('podList', (list) => {
  // list 为 worker pod 列表
});

podList 元素主要字段:

字段说明
namePod 名称
hostIp节点 IP
statusTxtPod phase
ipPod IP 列表字符串
workerNameworker StatefulSet 名称
replicas副本数
formCPU、内存、GPU 等资源表单数据

changeMenu

功能:同步 GPUStack 当前菜单。

参数:

参数类型说明
vstring菜单 key 或路径

响应:无。

ts
window.$wujie.bus.$emit('changeMenu', '/workers');

changeReplicas

功能:修改 GPUStack worker StatefulSet 副本数。

参数:

字段类型必填说明
namestringStatefulSet 名称
replicasnumber目标副本数

响应:无直接回调;成功后面板提示“操作成功”。

ts
window.$wujie.bus.$emit('changeReplicas', {
  name: 'gpustack-worker-a',
  replicas: 2,
});

面板下发给微应用的事件

这些事件不是通过 registerWujieEvent() 注册,而是面板通过 Wujie bus 主动下发给微应用。微应用侧使用 window.$wujie.bus.$on() 监听。

事件触发位置参数说明
routeChangetopapp/micro-container.vueapp/apps/detail.vueapp/apps/micro.vuegpustack/index.vuestring面板菜单或路由变化
podListgpustack/index.vuearrayGPUStack worker Pod 列表

监听示例:

ts
window.$wujie.bus.$on('routeChange', (path: string) => {
  // 微应用内部切换路由
});

window.$wujie.bus.$on('podList', (list) => {
  // 更新 GPUStack worker 列表
});

新增事件规范

  • 事件名使用动词或动词短语,例如 openFilebuildContainerImage
  • 入参使用对象,除非事件只有一个简单字符串参数。
  • 需要响应时优先使用第二参数 callback;失败路径需要明确是否调用 callback 或 rejectCallback。
  • 新增注册事件后同步更新本文档和前端开发文档入口。
  • 组件卸载时必须清理注册事件,避免微应用切换后重复响应。