Files
pj_admin_cloud/src/views/gen/table/preview.vue
T

159 lines
4.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<el-dialog fullscreen title="代码预览" v-model="visible" width="90%" top="3vh" append-to-body :close-on-click-modal="false">
<splitpanes>
<pane size="25">
<el-scrollbar height="calc(100vh - 100px)" class="mt20">
<el-tree
ref="treeRef"
node-key="id"
:data="preview.fileTree"
:expand-on-click-node="false"
highlight-current
@node-click="handleNodeClick"
/>
</el-scrollbar>
</pane>
<pane>
<el-tabs v-model="preview.activeName" @tab-click="handleTabClick">
<el-tab-pane
v-for="item in previewCodegen"
:label="item.codePath.substring(item.codePath.lastIndexOf('/') + 1)"
:name="item.codePath"
:key="item.codePath"
>
<SvgIcon name="ele-CopyDocument" :size="25" class="copy_btn" @click="copyText(item.code)" />
</el-tab-pane>
<code-editor ref="codeEditorRef" theme="darcula" v-model="previewCodeStr" mode="go" readOnly height="calc(100vh - 100px)"></code-editor>
</el-tabs>
</pane>
</splitpanes>
</el-dialog>
</template>
<script setup lang="ts" name="preview">
import { useGeneratorPreviewApi } from '/@/api/gen/table';
import { handleTree } from '/@/utils/other';
import commonFunction from '/@/utils/commonFunction';
const CodeEditor = defineAsyncComponent(() => import('/@/components/CodeEditor/index.vue'));
const { copyText } = commonFunction();
const visible = ref(false);
// ======== 显示页面 ========
const preview = reactive({
open: false,
titel: '代码预览',
fileTree: [],
activeName: '',
});
const previewCodegen = ref([]);
const previewCodeStr = ref('');
const fileTreeOriginal = ref([] as any[]);
const openDialog = async (id: string) => {
await getGenCodeFile(id);
visible.value = true;
};
const loading = ref(false);
const codeEditorRef = ref();
/**
* 获取特定资源的代码生成文件,显示在页面上。
* @param id 需要渲染的资源 ID。
*/
const getGenCodeFile = (id: string) => {
loading.value = true;
fileTreeOriginal.value = [];
useGeneratorPreviewApi(id)
.then((res: any) => {
previewCodegen.value = res;
for (let index in res) {
fileTreeOriginal.value.push(res[index].codePath);
}
// 默认选中第一个 选项卡
previewCodeStr.value = res[0].code;
preview.activeName = res[0].codePath;
const files = handleFiles(fileTreeOriginal);
preview.fileTree = handleTree(files, 'id', 'parentId', 'children', '/');
})
.finally(() => {
loading.value = false;
});
};
const handleNodeClick = async (data: any, node: any) => {
if (node && !node.isLeaf) {
return false;
}
preview.activeName = data.id;
const filteredCode = previewCodegen.value.filter((code: any) => code.codePath === data.id);
if (filteredCode.length > 0) {
previewCodeStr.value = filteredCode[0].code;
}
};
const handleTabClick = (item: any) => {
const filteredCode = previewCodegen.value.filter((code: any) => code.codePath === item.paneName);
if (filteredCode.length > 0) {
previewCodeStr.value = filteredCode[0].code;
}
};
/**
* 生成 files 目录
* @param fileTreeOriginal
* @returns {*[]}
*/
const handleFiles = (fileTreeOriginal: any) => {
const exists = {};
const files = [] as any[];
// 遍历每个元素
for (const data of fileTreeOriginal.value) {
let paths = [];
if (data.includes('\\')) {
paths = data.split('\\');
} else {
paths = data.split('/');
}
let fullPath = ''; // 从头开始的路径,用于生成 id
// 遍历每个 path, 拼接成树
for (let i = 0; i < paths.length; i++) {
// 已经添加到 files 中,则跳过
const oldFullPath = fullPath;
// 下面的 replaceAll 的原因,是因为上面包处理了,导致和 tabs 不匹配,所以 replaceAll 下
fullPath = fullPath.length === 0 ? paths[i] : fullPath.replaceAll('.', '/') + '/' + paths[i];
if (exists[fullPath]) {
continue;
}
// 添加到 files 中
exists[fullPath] = true;
files.push({
id: fullPath,
label: paths[i],
parentId: oldFullPath || '/',
templateName: data.k,
});
}
}
return files;
};
defineExpose({
openDialog,
});
</script>
<style scoped lang="scss">
.copy_btn {
position: absolute;
top: 10px;
right: 20px;
z-index: 9;
color: white;
}
</style>