You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

203 lines
5.5 KiB
Vue

2 weeks ago
<template>
<!-- <button @click="test2"></button> -->
<mt-preview ref="MtPreviewRef" @on-event-call-back="onEventCallBack"></mt-preview>
</template>
<script setup lang="ts">
// 定义组件名称用于 keep-alive
defineOptions({
name: 'PreviewIndex'
});
import { MtPreview } from '@/export';
import { onMounted, ref, reactive, onUnmounted } from 'vue';
import { ElMessage } from 'element-plus';
import { globalStore } from '@/components/mt-edit/store/global';
import { genExportJson, useExportJsonToDoneJson } from '@/components/mt-edit/composables';
import { objectDeepClone, randomString } from '@/components/mt-edit/utils/index';
import { useRoute } from 'vue-router';
import { modelApi } from '@/utils/request';
import type { IDoneJson } from '@/components/mt-edit/store/types';
const route = useRoute();
console.log('参数:', route.query.screen);
let drawerVisible = ref(false);
let fileNames: Array<{ id: string; name: string }> = reactive([]);
let radio = ref('-1');
// 用于调试:跟踪组件是否被重新创建
let randomString1 = randomString();
//文件读取
function fileRead() {
fetch('/dataModes/index.json')
.then((response) => response.json())
.then((data) => {
fileNames = Object.assign(data);
})
.catch((error) => {
console.error('获取JSON文件错误', error);
});
}
const MtPreviewRef = ref<InstanceType<typeof MtPreview>>();
const onEventCallBack = (type: string, item_id: string) => {
console.log(type, item_id);
if (type == 'test-dialog') {
ElMessage.success(`获取到了id:${item_id}`);
}
};
//属性抽取
function extractValFromProps(props: any) {
const result: Record<string, any> = {};
for (const key in props) {
if (props[key] && typeof props[key] === 'object' && 'val' in props[key]) {
result[key] = props[key].val;
}
}
return result;
}
//获取组数据
function loadModeData() {
console.log('文件', route.query.screen);
console.log('xx:', globalStore.group_ids.get(route.query.screen as string));
if (globalStore.group_ids.get(route.query.screen as string)) {
let json: Array<IDoneJson> = objectDeepClone(
globalStore.group_ids.get(route.query.screen as string) || []
);
console.log('json1', json);
let endJson = {
canvasCfg: globalStore.canvasCfg,
gridCfg: globalStore.gridCfg,
json: json
};
console.log('endJson', endJson);
MtPreviewRef.value?.setImportJson(endJson);
}
}
function initLoad() {
let canvasCfg = globalStore.canvasCfg;
let gridCfg = globalStore.gridCfg;
// let json = globalStore.done_json;
let json: Array<any> = objectDeepClone(globalStore.done_json);
globalStore.done_json.forEach((item) => {
const extractedProps = extractValFromProps(item.props);
json.forEach((obj) => {
if (obj.id === item.id) {
obj.props = extractedProps;
}
});
});
let endJson = {
canvasCfg: canvasCfg,
gridCfg: gridCfg,
json: json
};
console.log('endJson', endJson);
MtPreviewRef.value?.setImportJson(endJson);
}
async function newLoadModel() {
let endJson = {
menuType: route.query.screen
};
try {
const response = await modelApi.model_getModelData_post(endJson);
if (response.code == 200) {
const result = response.data;
const { canvasCfg, gridCfg, importDoneJson } = useExportJsonToDoneJson(result);
// 对 importDoneJson 集合中每个元素的 props 属性使用 reactive 包装
const processedImportDoneJson = importDoneJson.map((item) => {
if (item.props) {
return {
...item,
props: reactive(item.props || {})
};
}
return {
...item,
props: reactive(item.props || {})
};
});
console.log('processedImportDoneJson:', processedImportDoneJson);
MtPreviewRef.value?.setNewImportJson({ canvasCfg, gridCfg, json: processedImportDoneJson });
if (globalStore.group_ids.has(route.query.screen as string)) {
globalStore.group_ids.delete(route.query.screen as string);
}
// globalStore.group_ids.set(route.query.screen as string, processedImportDoneJson);
ElMessage.success('数据模型加载成功');
} else {
ElMessage.error(`数据模型加载失败: ${response.code} - ${response.message}`);
}
} catch (error) {
console.error('请求错误:', error);
ElMessage.error('网络请求失败');
}
}
onUnmounted(() => {
console.log('view卸载完毕');
});
onMounted(() => {
console.log('view挂载完毕');
newLoadModel();
});
//加载数据模型
function loadModel() {
console.log('选中:', radio.value, radio);
if (!radio.value || radio.value == '-1') {
ElMessage.warning('请先选择一个模型文件');
}
fileNames.forEach((item) => {
if (item.id == radio.value) {
fetch(`/dataModes/${item.name}`)
.then((response) => response.json())
.then((data) => {
console.log('文件内容:', data);
const { canvasCfg, gridCfg, importDoneJson } = useExportJsonToDoneJson(data);
globalStore.canvasCfg = canvasCfg;
globalStore.gridCfg = gridCfg;
globalStore.setGlobalStoreDoneJson(importDoneJson);
initLoad();
})
.catch((error) => {
ElMessage.error('获取文件错误:', error);
});
}
});
}
function test2() {
console.log('test3', globalStore);
}
</script>
<style scoped>
.vertical-radio-group {
display: flex;
flex-direction: column;
gap: 5px;
align-items: flex-start;
}
</style>