test: 应用通信添加基座 adapter 信息

This commit is contained in:
wangxuefeng 2025-03-18 09:57:37 +08:00
parent 9f15b89fff
commit b8b8ddc467
3 changed files with 160 additions and 48 deletions

View File

@ -25,8 +25,8 @@ const routes: RouteRecordRaw[] = [
},
props: {
// url: 'https://y-code-renderer.shiyue.com/',
url: `${VITE_RENDERER_URL}?fileId=7pfr394d6&projectId=4`,
// url: `${VITE_RENDERER_URL}`,
// url: `${VITE_RENDERER_URL}?fileId=7pfr394d6&projectId=4`,
url: `${VITE_RENDERER_URL}`,
// accessToken: localStorage.getItem('y-code-access-token'),
fileId: '7pfr394d6',
projectId: 4,

View File

@ -4,12 +4,22 @@ import { getCurrentInstance, onMounted, ref, watch } from 'vue';
import { useQuery } from '@tanstack/vue-query';
import { jsonp, request } from '@vtj/utils';
import { createProvider } from '@vtj/web';
import { ElLoading } from 'element-plus';
import { ElLoading, ElMessage } from 'element-plus';
import { LowCodeService } from './service';
// wujie props
const wujieProps = window.$wujie?.props || {};
// wujie props
interface WujieProps {
accessToken?: string;
applicationId?: number | string;
fileId?: string;
name?: string;
projectId?: number | string;
[key: string]: any;
}
// wujie props
const wujieProps: WujieProps = window.$wujie?.props || {};
console.log('wujie props:', wujieProps);
// sessionStorage
@ -19,52 +29,90 @@ sessionStorage.clear();
const renderer = ref();
const lowCodeService = new LowCodeService();
const isLoading = ref(false);
const accessToken = ref(wujieProps.accessToken || '');
const urlParams = ref({
fileId: wujieProps.fileId || '',
projectId: Number(wujieProps.projectId) || -1,
applicationId: Number(wujieProps.applicationId) || -1,
name: wujieProps.name || '',
});
const provider = ref(null);
const loadingInstance = ref(null);
//
const initRequestConfig = (token: string) => {
if (!token) return;
request.useRequest((req) => {
req.headers.set('Authorization', `Bearer ${token}`);
return req;
});
};
//
const showLoading = (text = '低代码文件加载中...') => {
if (loadingInstance.value) return;
loadingInstance.value = ElLoading.service({ text });
};
//
const hideLoading = () => {
if (loadingInstance.value) {
loadingInstance.value.close();
loadingInstance.value = null;
}
};
//
const validateProps = () => {
const { fileId, projectId } = wujieProps;
if (!fileId) {
ElMessage.error('缺少必要参数fileId');
return false;
}
if (!projectId) {
ElMessage.error('缺少必要参数projectId');
return false;
}
return true;
};
// -
const initLowCodeEngine = async () => {
//
if (provider.value) return provider.value;
const token = accessToken.value;
if (token) {
initRequestConfig(token);
sessionStorage.setItem('y-code-access-token', token);
//
if (!validateProps()) {
throw new Error('参数校验失败');
}
const { provider: lowCodeProvider, onReady } = createProvider({
nodeEnv: import.meta.env.NODE_ENV,
service: lowCodeService,
project: { id: urlParams.value.projectId },
adapter: {
request,
jsonp,
},
});
//
initRequestConfig(wujieProps.accessToken);
provider.value = { provider: lowCodeProvider, onReady };
return { provider: lowCodeProvider, onReady };
try {
const { provider: lowCodeProvider, onReady } = createProvider({
nodeEnv: import.meta.env.NODE_ENV,
service: lowCodeService,
project: { id: Number(wujieProps.projectId) || -1 },
adapter: {
request,
jsonp,
},
});
provider.value = { provider: lowCodeProvider, onReady };
return { provider: lowCodeProvider, onReady };
} catch (error) {
console.error('初始化低代码引擎失败:', error);
ElMessage.error('初始化低代码引擎失败');
return Promise.reject(error);
}
};
//
const getRenderComponent = async () => {
if (!validateProps()) return null;
isLoading.value = true;
ElLoading.service({ text: '低代码文件加载中...' });
showLoading();
try {
// 1.
@ -77,12 +125,13 @@ const getRenderComponent = async () => {
instance?.appContext.app.use(lowCodeProvider);
try {
const renderComponent = await lowCodeProvider.getRenderComponent(
urlParams.value.fileId,
wujieProps.fileId,
);
console.log('渲染组件获取成功');
resolve(renderComponent);
} catch (error) {
console.error('获取渲染组件失败:', error);
ElMessage.error('获取渲染组件失败');
resolve(null);
}
});
@ -92,15 +141,17 @@ const getRenderComponent = async () => {
return null;
} finally {
isLoading.value = false;
ElLoading.service().close();
hideLoading();
}
};
// 使 useQuery
const { data: rendererComponent } = useQuery({
queryKey: ['getRenderer'],
const { data: rendererComponent, isError } = useQuery({
queryKey: ['getRenderer', wujieProps.fileId, wujieProps.projectId],
queryFn: getRenderComponent,
enabled: false, //
retry: 1, //
staleTime: 1000 * 60 * 5, // 5
});
// renderer
@ -111,31 +162,59 @@ watch(rendererComponent, (newVal) => {
}
});
//
const notifyParent = (event: string, data?: any) => {
if (window.$wujie?.bus) {
window.$wujie.bus.$emit(event, data);
}
};
//
onMounted(async () => {
//
if (window.$wujie) {
window.$wujie.bus.$emit('ready', 'y-code-renderer is ready');
}
notifyParent('ready', 'y-code-renderer is ready');
//
await initLowCodeEngine();
getRenderComponent().then((component) => {
try {
await initLowCodeEngine();
const component = await getRenderComponent();
if (component) {
renderer.value = component;
notifyParent('render-success');
} else {
notifyParent('render-fail', 'Failed to get component');
}
});
} catch (error) {
console.error('初始化过程出错:', error);
notifyParent('render-fail', error);
}
});
</script>
<template>
<div style="padding: 20px">
<component :is="renderer" :wujie-props="wujieProps" />
<!-- <div
v-else-if="!isLoading"
style="margin-top: 50px; color: red; text-align: center"
>
<div class="renderer-container">
<component :is="renderer" v-if="renderer" :wujie-props="wujieProps" />
<div v-else-if="!isLoading && isError" class="error-message">
组件加载失败请检查参数和网络连接
</div>
<div v-else-if="!isLoading" class="error-message">
组件加载失败请检查控制台日志
</div> -->
</div>
</div>
</template>
<style scoped>
.renderer-container {
padding: 20px;
height: 100%;
width: 100%;
}
.error-message {
margin-top: 50px;
color: red;
text-align: center;
}
</style>

View File

@ -3,6 +3,8 @@ import { onBeforeUnmount, onMounted } from 'vue';
import WujieVue from 'wujie-vue3';
import { version } from '/package.json';
const props = defineProps<{
[key: string]: any;
accessToken?: string;
@ -33,16 +35,47 @@ const handleMessage = (data: any) => {
console.log('收到子应用消息:', data);
};
//
const subAppProps = {
...props,
adapterInfo: {
version,
},
};
//
const handleReady = (data: any) => {
console.log('子应用就绪:', data);
//
};
const handleRenderSuccess = () => {
console.log('子应用渲染成功');
//
};
const handleRenderFail = (error: any) => {
console.error('子应用渲染失败:', error);
//
};
onMounted(() => {
//
bus.$on('message', handleMessage);
bus.$on('ready', handleReady);
bus.$on('render-success', handleRenderSuccess);
bus.$on('render-fail', handleRenderFail);
});
onBeforeUnmount(() => {
//
bus.$off('message', handleMessage);
bus.$off('ready', handleReady);
bus.$off('render-success', handleRenderSuccess);
bus.$off('render-fail', handleRenderFail);
});
</script>
<template>
{{ 1 }}
<div style="width: 100%; height: 100%">
<WujieVue
:id="name"
@ -53,7 +86,7 @@ onBeforeUnmount(() => {
:degrade="degrade"
width="100%"
height="100%"
:props="props"
:props="subAppProps"
:before-load="beforeLoad"
:after-mount="afterMount"
/>