chore: 依赖调整

This commit is contained in:
wangxuefeng 2025-03-21 10:30:12 +08:00
parent e329f77cb2
commit b76b9e9013
9 changed files with 459 additions and 1004 deletions

View File

@ -15,17 +15,17 @@
"typecheck": "vue-tsc --noEmit --skipLibCheck"
},
"dependencies": {
"@vtj/core": "^0.11.2",
"@vtj/designer": "0.11.2",
"@vtj/icons": "0.11.2",
"@vtj/local": "^0.11.2",
"@vtj/materials": "^0.11.2",
"@vtj/node": "0.11.1",
"@vtj/pro": "^0.11.2",
"@vtj/renderer": "^0.11.2",
"@vtj/ui": "^0.11.2",
"@vtj/utils": "0.11.2",
"@vtj/web": "^0.11.2",
"@vtj/core": "^0.11.5",
"@vtj/designer": "0.11.5",
"@vtj/icons": "0.11.5",
"@vtj/local": "^0.11.5",
"@vtj/materials": "^0.11.5",
"@vtj/node": "0.11.2",
"@vtj/pro": "^0.11.5",
"@vtj/renderer": "^0.11.5",
"@vtj/ui": "^0.11.5",
"@vtj/utils": "0.11.5",
"@vtj/web": "^0.11.5",
"axios": "^1.8.1",
"element-plus": "^2.9.4",
"licia-es": "^1.46.0",
@ -38,7 +38,7 @@
},
"devDependencies": {
"@types/postmate": "catalog:",
"@vtj/cli": "^0.11.1",
"@vtj/cli": "^0.11.2",
"vite": "catalog:",
"vite-plugin-mkcert": "catalog:",
"vitest": "catalog:"

View File

@ -1,35 +0,0 @@
import path from 'node:path';
import { defineConfig, loadEnv } from '@farmfe/core';
import vue from '@vitejs/plugin-vue';
import mkcert from 'vite-plugin-mkcert';
// @ts-ignore
export default defineConfig(({ mode }) => {
console.log('mode', mode);
const env = loadEnv(mode, process.cwd(), ['VITE_']);
const isDev = env.VITE_NODE_ENV === 'development';
return {
server: isDev
? {
port: Number(env.VITE_PORT),
cors: true,
}
: undefined,
// @ts-ignore coding
vitePlugins: [vue(), mkcert({ source: 'coding' })],
compilation: {
resolve: {
alias: {
'@': path.resolve(process.cwd(), 'src'),
$vtj: path.resolve(process.cwd(), '.vtj'),
},
},
define: {
// 注入环境变量到客户端
'process.env': JSON.stringify(env),
},
},
};
});

View File

@ -14,33 +14,30 @@
},
"dependencies": {
"@iframe-resizer/child": "^5.3.3",
"@sentry/vue": "^9.5.0",
"@sentry/vue": "^9.7.0",
"@sy/web-vitals": "workspace:*",
"@tanstack/vue-query": "^5.66.9",
"@vtj/charts": "^0.11.2",
"@vtj/core": "^0.11.2",
"@vtj/icons": "0.11.2",
"@vtj/materials": "^0.11.2",
"@vtj/pro": "^0.11.2",
"@vtj/renderer": "^0.11.2",
"@vtj/ui": "^0.11.2",
"@vtj/utils": "^0.11.2",
"@vtj/web": "^0.11.2",
"@tanstack/vue-query": "^5.69.0",
"@vtj/charts": "^0.11.5",
"@vtj/core": "^0.11.5",
"@vtj/icons": "0.11.5",
"@vtj/materials": "^0.11.5",
"@vtj/pro": "^0.11.5",
"@vtj/renderer": "^0.11.5",
"@vtj/ui": "^0.11.5",
"@vtj/utils": "^0.11.5",
"@vtj/web": "^0.11.5",
"axios": "catalog:",
"core-js": "^3.40.0",
"core-js": "catalog:",
"element-plus": "catalog:",
"licia-es": "catalog:",
"postmate": "catalog:",
"rrweb": "2.0.0-alpha.4",
"vue": "catalog:",
"vue-router": "catalog:"
},
"devDependencies": {
"@farmfe/cli": "catalog:",
"@farmfe/core": "catalog:",
"@types/postmate": "catalog:",
"@vitejs/plugin-vue": "^5.2.1",
"@vtj/cli": "^0.11.1",
"@vitejs/plugin-vue": "catalog:",
"@vtj/cli": "^0.11.2",
"vite": "catalog:",
"vite-plugin-mkcert": "catalog:"
}

View File

@ -10,22 +10,28 @@ import { LowCodeService } from './service';
// wujie props
interface WujieProps {
// axios
interceptors?: {
request?: (config: any) => any;
response?: (response: any) => any;
};
accessToken?: string;
//
fileId: string;
projectId: number | 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);
//
interface InitParams {
//
fileId: string;
projectId: number | string;
//
applicationId?: number | string;
[key: string]: any;
}
//
const renderer = ref();
@ -33,29 +39,68 @@ const lowCodeService = new LowCodeService();
const isLoading = ref(false);
const provider = ref(null);
const loadingInstance = ref(null);
const errorMessage = ref('');
const initParams = ref<InitParams | null>(null);
// wujie
const isWujieSubApp = window.$wujie !== undefined;
// URL
const getParamsFromUrl = (): Partial<InitParams> => {
const params = new URLSearchParams(window.location.search);
return {
fileId: params.get('fileId') || undefined,
projectId: params.get('projectId') || undefined,
applicationId: params.get('applicationId') || undefined,
};
};
//
const getInitParams = (): InitParams | null => {
// 1. wujie props
if (isWujieSubApp && window.$wujie?.props) {
const props = window.$wujie.props;
//
if (props.fileId && props.projectId) {
console.log('使用wujie props初始化渲染器');
return props as InitParams;
}
}
// 2. URL
const urlParams = getParamsFromUrl();
if (urlParams.fileId && urlParams.projectId) {
console.log('使用URL参数初始化渲染器:', urlParams);
return urlParams as InitParams;
}
// 3. null
console.error('无法获取初始化参数');
errorMessage.value = '无法获取初始化参数请检查无界配置或URL参数';
return null;
};
//
const isValidParams = (params: InitParams | null): params is InitParams => {
return !!params && !!params.fileId && !!params.projectId;
};
//
const initRequestConfig = (token: string) => {
if (!token) return;
if (wujieProps.interceptors?.request) {
request.useRequest(wujieProps.interceptors.request);
const initRequestConfig = () => {
//
if (initParams.value?.interceptors?.request) {
request.useRequest(initParams.value.interceptors.request);
}
if (wujieProps.interceptors?.response) {
request.useResponse(wujieProps.interceptors.response);
//
if (initParams.value?.interceptors?.response) {
request.useResponse(initParams.value.interceptors.response);
}
request.useRequest((req) => {
req.headers.set('Authorization', `Bearer ${token}`);
return req;
});
};
//
const showLoading = (text = '低代码文件加载中...') => {
if (loadingInstance.value) return;
loadingInstance.value = ElLoading.service({ text });
};
@ -72,14 +117,21 @@ const initLowCodeEngine = async () => {
//
if (provider.value) return provider.value;
//
if (!isValidParams(initParams.value)) {
const error = new Error('缺少必要参数fileId 和 projectId');
errorMessage.value = error.message;
throw error;
}
//
initRequestConfig(wujieProps.accessToken);
initRequestConfig();
try {
const { provider: lowCodeProvider, onReady } = createProvider({
nodeEnv: import.meta.env.NODE_ENV,
service: lowCodeService,
project: { id: Number(wujieProps.projectId) },
project: { id: Number(initParams.value.projectId) },
adapter: {
request,
jsonp,
@ -90,6 +142,7 @@ const initLowCodeEngine = async () => {
return { provider: lowCodeProvider, onReady };
} catch (error) {
console.error('初始化低代码引擎失败:', error);
errorMessage.value = '初始化低代码引擎失败';
ElMessage.error('初始化低代码引擎失败');
return Promise.reject(error);
}
@ -97,6 +150,11 @@ const initLowCodeEngine = async () => {
//
const getRenderComponent = async () => {
if (!isValidParams(initParams.value)) {
errorMessage.value = '缺少必要参数fileId 和 projectId';
return null;
}
isLoading.value = true;
showLoading();
@ -111,12 +169,13 @@ const getRenderComponent = async () => {
instance?.appContext.app.use(lowCodeProvider);
try {
const renderComponent = await lowCodeProvider.getRenderComponent(
wujieProps.fileId,
initParams.value!.fileId,
);
console.log('渲染组件获取成功');
resolve(renderComponent);
} catch (error) {
console.error('获取渲染组件失败:', error);
errorMessage.value = '获取渲染组件失败';
ElMessage.error('获取渲染组件失败');
resolve(null);
}
@ -133,9 +192,13 @@ const getRenderComponent = async () => {
// 使 useQuery
const { data: rendererComponent, isError } = useQuery({
queryKey: ['getRenderer', wujieProps.fileId, wujieProps.projectId],
queryKey: [
'getRenderer',
initParams.value?.fileId,
initParams.value?.projectId,
],
queryFn: getRenderComponent,
enabled: false, //
enabled: false, //
retry: 1, //
staleTime: 1000 * 60 * 5, // 5
});
@ -150,15 +213,29 @@ watch(rendererComponent, (newVal) => {
//
const notifyParent = (event: string, data?: any) => {
if (window.$wujie?.bus) {
if (isWujieSubApp && window.$wujie?.bus) {
window.$wujie.bus.$emit(event, data);
}
};
//
onMounted(async () => {
//
// wujie
if (isWujieSubApp) {
notifyParent('ready', 'y-code-renderer is ready');
}
// -
initParams.value = getInitParams();
const paramsValid = isValidParams(initParams.value);
if (!paramsValid) {
errorMessage.value = '缺少必要参数fileId 和 projectId';
if (isWujieSubApp) {
notifyParent('render-fail', errorMessage.value);
}
return;
}
try {
await initLowCodeEngine();
@ -166,14 +243,20 @@ onMounted(async () => {
const component = await getRenderComponent();
if (component) {
renderer.value = component;
if (isWujieSubApp) {
notifyParent('render-success');
}
} else {
if (isWujieSubApp) {
notifyParent('render-fail', 'Failed to get component');
}
}
} catch (error) {
console.error('初始化过程出错:', error);
if (isWujieSubApp) {
notifyParent('render-fail', error);
}
}
});
</script>
@ -182,16 +265,20 @@ onMounted(async () => {
<component
:is="renderer"
v-if="renderer"
:ctx-props="wujieProps"
v-bind="wujieProps"
:ctx-props="initParams"
v-bind="initParams"
/>
<div v-else-if="!isValidParams(initParams)" class="error-message">
{{ errorMessage || '缺少必要参数fileId 和 projectId' }}
</div>
<div v-else-if="!isLoading && isError" class="error-message">
组件加载失败请检查参数和网络连接
{{ errorMessage || '组件加载失败,请检查参数和网络连接' }}
</div>
<div v-else-if="!isLoading" class="error-message">
组件加载失败请检查控制台日志
{{ errorMessage || '组件加载失败,请检查控制台日志' }}
</div>
</div>
</template>

View File

@ -1,186 +0,0 @@
<script setup lang="ts">
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 Postmate from 'postmate';
import { LowCodeService } from './service';
// sessionStorage
sessionStorage.clear();
//
const renderer = ref();
const lowCodeService = new LowCodeService();
const isLoading = ref(false);
const handshakeCompleted = ref(false);
const accessToken = ref('');
const urlParams = ref(parseUrlParams());
const provider = ref(null);
// URL
function parseUrlParams() {
const urlParams = new URLSearchParams(window.location.search);
const params = {
fileId: urlParams.get('fileId') || '',
projectId: Number(urlParams.get('projectId')) || -1,
applicationId: Number(urlParams.get('applicationId')) || -1,
name: urlParams.get('name') || '',
};
console.log('解析URL参数:', params);
return params;
}
// Postmate
const initPostmateHandshake = async () => {
const model = new Postmate.Model({
sayHi: (data: any) => {
console.log('sayHi', data);
},
});
return model.then((parent) => {
console.log('parent', parent);
// accessToken
accessToken.value = parent.model.accessToken || '';
sessionStorage.setItem('y-code-access-token', accessToken.value);
parent.emit('renderer-ready', 'y-code-renderer is ready');
//
if (accessToken.value) {
initRequestConfig(accessToken.value);
}
handshakeCompleted.value = true;
return accessToken.value;
});
};
//
const initRequestConfig = (token: string) => {
request.useRequest((req) => {
req.headers.set('Authorization', `Bearer ${token}`);
return req;
});
};
// -
const initLowCodeEngine = async () => {
//
if (provider.value) return provider.value;
const token =
accessToken.value || sessionStorage.getItem('y-code-access-token') || '';
if (token) {
initRequestConfig(token);
}
const { provider: lowCodeProvider, onReady } = createProvider({
nodeEnv: import.meta.env.NODE_ENV,
service: lowCodeService,
project: { id: urlParams.value.projectId },
adapter: {
request,
jsonp,
},
});
provider.value = { provider: lowCodeProvider, onReady };
return { provider: lowCodeProvider, onReady };
};
//
const getRenderComponent = async () => {
isLoading.value = true;
ElLoading.service({ text: '低代码文件加载中...' });
try {
// 1.
const { provider: lowCodeProvider, onReady } = await initLowCodeEngine();
// 3.
return new Promise<any>((resolve) => {
onReady(async () => {
const instance = getCurrentInstance();
instance?.appContext.app.use(lowCodeProvider);
try {
const renderComponent = await lowCodeProvider.getRenderComponent(
urlParams.value.fileId,
);
console.log('渲染组件获取成功');
resolve(renderComponent);
} catch (error) {
console.error('获取渲染组件失败:', error);
resolve(null);
}
});
});
} catch (error) {
console.error('获取渲染组件过程出错:', error);
return null;
} finally {
isLoading.value = false;
ElLoading.service().close();
}
};
// 使 useQuery 使
const { data: rendererComponent } = useQuery({
queryKey: ['getRenderer'],
queryFn: getRenderComponent,
enabled: false, //
});
// renderer
watch(rendererComponent, (newVal) => {
if (newVal) {
renderer.value = newVal;
console.log('渲染器组件已更新');
}
});
//
watch(handshakeCompleted, (newVal) => {
if (newVal) {
console.log('握手完成,开始获取渲染组件');
getRenderComponent().then((component) => {
if (component) {
renderer.value = component;
}
});
}
});
//
onMounted(async () => {
// 1.
await initLowCodeEngine();
// 2.
getRenderComponent().then((component) => {
if (component) {
renderer.value = component;
}
});
// 3.
initPostmateHandshake().catch((error) => {
console.warn('握手失败:', error);
});
});
</script>
<template>
<div style="padding: 20px">
<component :is="renderer" v-if="renderer" />
<div
v-else-if="!isLoading"
style="margin-top: 50px; color: red; text-align: center"
>
组件加载失败请检查控制台日志
</div>
</div>
</template>

View File

@ -1,206 +0,0 @@
<script setup lang="ts">
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, ElMessage } from 'element-plus';
import { LowCodeService } from './service';
// url
const urlParams = new URLSearchParams(window.location.search);
const fileId = urlParams.get('fileId');
console.log('urlParams-fileId', fileId);
const projectId = urlParams.get('projectId');
console.log('urlParams-projectId', projectId);
// 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 || {
fileId,
projectId,
};
console.log('wujie props:', wujieProps);
// sessionStorage
sessionStorage.clear();
//
const renderer = ref();
const lowCodeService = new LowCodeService();
const isLoading = ref(false);
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 initLowCodeEngine = async () => {
//
if (provider.value) return provider.value;
//
initRequestConfig(wujieProps.accessToken);
try {
const { provider: lowCodeProvider, onReady } = createProvider({
nodeEnv: import.meta.env.NODE_ENV,
service: lowCodeService,
project: { id: Number(wujieProps.projectId) },
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 () => {
isLoading.value = true;
showLoading();
try {
// 1.
const { provider: lowCodeProvider, onReady } = await initLowCodeEngine();
// 2.
return new Promise<any>((resolve) => {
onReady(async () => {
const instance = getCurrentInstance();
instance?.appContext.app.use(lowCodeProvider);
try {
const renderComponent = await lowCodeProvider.getRenderComponent(
wujieProps.fileId,
);
console.log('渲染组件获取成功');
resolve(renderComponent);
} catch (error) {
console.error('获取渲染组件失败:', error);
ElMessage.error('获取渲染组件失败');
resolve(null);
}
});
});
} catch (error) {
console.error('获取渲染组件过程出错:', error);
return null;
} finally {
isLoading.value = false;
hideLoading();
}
};
// 使 useQuery
const { data: rendererComponent, isError } = useQuery({
queryKey: ['getRenderer', wujieProps.fileId, wujieProps.projectId],
queryFn: getRenderComponent,
enabled: false, //
retry: 1, //
staleTime: 1000 * 60 * 5, // 5
});
// renderer
watch(rendererComponent, (newVal) => {
if (newVal) {
renderer.value = newVal;
console.log('渲染器组件已更新');
}
});
//
const notifyParent = (event: string, data?: any) => {
if (window.$wujie?.bus) {
window.$wujie.bus.$emit(event, data);
}
};
//
onMounted(async () => {
//
notifyParent('ready', 'y-code-renderer is ready');
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 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>
</template>
<style scoped>
.renderer-container {
padding: 20px;
height: 100%;
width: 100%;
}
.error-message {
margin-top: 50px;
color: red;
text-align: center;
}
</style>

View File

@ -33,7 +33,6 @@
"wujie-vue2": "1.0.22"
},
"devDependencies": {
"@types/axios": "0.14.4",
"@vitejs/plugin-vue": "catalog:",
"axios": "catalog:",
"vite-plugin-dts": "catalog:",

View File

@ -32,8 +32,6 @@
"wujie-vue3": "1.0.22"
},
"devDependencies": {
"@types/axios": "0.14.4",
"@types/vue-router": "2.0.0",
"@vitejs/plugin-vue": "catalog:",
"axios": "catalog:",
"vite-plugin-dts": "catalog:",

821
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff