feat: 重构工作流组件,动态加载节点类型,移除旧的侧边栏和背景组件

This commit is contained in:
jxxghp
2025-02-27 13:55:06 +08:00
parent 5cd021ea85
commit b467bb6c56
16 changed files with 296 additions and 6 deletions
+2 -3
View File
@@ -1,13 +1,12 @@
import { useVueFlow } from '@vue-flow/core' import { useVueFlow } from '@vue-flow/core'
import { ref, watch } from 'vue' import { ref, watch } from 'vue'
let id = 0
/** /**
* @returns {string} - A unique id. * @returns {string} - A unique id.
*/ */
function getId() { function getId() {
return `act_${id++}` // 生成以act_开头的唯一id
return 'act_' + Math.random().toString(36).substr(2, 9)
} }
/** /**
@@ -6,8 +6,8 @@ import useDragAndDrop from '@core/utils/workflow'
import { Workflow } from '@/api/types' import { Workflow } from '@/api/types'
import { useToast } from 'vue-toast-notification' import { useToast } from 'vue-toast-notification'
import api from '@/api' import api from '@/api'
import Sidebar from '../workflow/Sidebar.vue' import WorkflowSidebar from '@/layouts/components/WorkflowSidebar.vue'
import DropzoneBackground from '../workflow/DropzoneBackground.vue' import DropzoneBackground from '@/layouts/components/DropzoneBackground.vue'
const { onConnect, addEdges, nodes, edges } = useVueFlow() const { onConnect, addEdges, nodes, edges } = useVueFlow()
@@ -15,6 +15,32 @@ const { onDragOver, onDrop, onDragLeave, isDragOver } = useDragAndDrop()
onConnect(addEdges) onConnect(addEdges)
// 自定义节点类型
const nodeTypes: Record<string, any> = ref({})
// 自动扫描目录下所有的 .vue 文件
const components = import.meta.glob('../workflow/*Action.vue')
// 动态加载某个组件
const loadComponent = async (componentName: string) => {
const component = components[`../workflow/${componentName}.vue`]
if (component) {
return ((await component()) as any).default
}
throw new Error(`组件 ${componentName} 未找到`)
}
// 将所有components中的组件加载到nodeTypes中
for (const path in components) {
const componentName = path.match(/\.\/workflow\/(.*).vue$/)?.[1]
if (!componentName) {
continue
}
loadComponent(componentName).then(component => {
nodeTypes.value[componentName] = markRaw(component)
})
}
// 定义输入参数 // 定义输入参数
const props = defineProps({ const props = defineProps({
workflow: Object as PropType<Workflow>, workflow: Object as PropType<Workflow>,
@@ -80,6 +106,7 @@ onMounted(() => {
<VueFlow <VueFlow
:nodes="nodes" :nodes="nodes"
:edges="edges" :edges="edges"
:nodeTypes="nodeTypes"
:default-edge-options="{ type: 'animation', animated: true }" :default-edge-options="{ type: 'animation', animated: true }"
@dragover="onDragOver" @dragover="onDragOver"
@dragleave="onDragLeave" @dragleave="onDragLeave"
@@ -93,7 +120,7 @@ onMounted(() => {
> >
</DropzoneBackground> </DropzoneBackground>
</VueFlow> </VueFlow>
<Sidebar /> <WorkflowSidebar />
</div> </div>
</VCardText> </VCardText>
</VCard> </VCard>
@@ -0,0 +1,22 @@
<script setup lang="ts">
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
</script>
<template>
<VCard>
<VCardItem prepend-icon="mdi-download">
<VCardTitle>添加下载</VCardTitle>
<VCardSubtitle>根据资源列表添加下载任务</VCardSubtitle>
</VCardItem>
<VDivider />
<VCardText></VCardText>
</VCard>
</template>
@@ -0,0 +1,22 @@
<script setup lang="ts">
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
</script>
<template>
<VCard>
<VCardItem prepend-icon="mdi-star-check">
<VCardTitle>添加订阅</VCardTitle>
<VCardSubtitle>根据媒体列表添加订阅</VCardSubtitle>
</VCardItem>
<VDivider />
<VCardText></VCardText>
</VCard>
</template>
@@ -0,0 +1,22 @@
<script setup lang="ts">
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
</script>
<template>
<VCard>
<VCardItem prepend-icon="mdi-download-circle-outline">
<VCardTitle>获取下载任务</VCardTitle>
<VCardSubtitle>获取下载任务更新任务状态</VCardSubtitle>
</VCardItem>
<VDivider />
<VCardText></VCardText>
</VCard>
</template>
@@ -0,0 +1,22 @@
<script setup lang="ts">
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
</script>
<template>
<VCard>
<VCardItem prepend-icon="mdi-multimedia">
<VCardTitle>获取媒体数据</VCardTitle>
<VCardSubtitle>获取榜单等媒体数据列表</VCardSubtitle>
</VCardItem>
<VDivider />
<VCardText></VCardText>
</VCard>
</template>
@@ -0,0 +1,22 @@
<script setup lang="ts">
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
</script>
<template>
<VCard>
<VCardItem prepend-icon="mdi-rss-box">
<VCardTitle>获取RSS资源</VCardTitle>
<VCardSubtitle>请求RSS地址获取数据并解析为资源列表</VCardSubtitle>
</VCardItem>
<VDivider />
<VCardText></VCardText>
</VCard>
</template>
@@ -0,0 +1,22 @@
<script setup lang="ts">
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
</script>
<template>
<VCard>
<VCardItem prepend-icon="mdi-search-web">
<VCardTitle>搜索站点资源</VCardTitle>
<VCardSubtitle>根据关键字搜索站点种子资源</VCardSubtitle>
</VCardItem>
<VDivider />
<VCardText></VCardText>
</VCard>
</template>
@@ -0,0 +1,22 @@
<script setup lang="ts">
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
</script>
<template>
<VCard>
<VCardItem prepend-icon="mdi-filter-check">
<VCardTitle>过滤媒体数据</VCardTitle>
<VCardSubtitle>对媒体数据列表进行过滤</VCardSubtitle>
</VCardItem>
<VDivider />
<VCardText></VCardText>
</VCard>
</template>
@@ -0,0 +1,22 @@
<script setup lang="ts">
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
</script>
<template>
<VCard>
<VCardItem prepend-icon="mdi-filter-multiple">
<VCardTitle>过滤资源</VCardTitle>
<VCardSubtitle>对资源列表数据进行过滤</VCardSubtitle>
</VCardItem>
<VDivider />
<VCardText></VCardText>
</VCard>
</template>
@@ -0,0 +1,22 @@
<script setup lang="ts">
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
</script>
<template>
<VCard>
<VCardItem prepend-icon="mdi-file-find">
<VCardTitle>刮削文件</VCardTitle>
<VCardSubtitle>刮削媒体信息和图片</VCardSubtitle>
</VCardItem>
<VDivider />
<VCardText></VCardText>
</VCard>
</template>
@@ -0,0 +1,22 @@
<script setup lang="ts">
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
</script>
<template>
<VCard>
<VCardItem prepend-icon="mdi-send-check">
<VCardTitle>发送事件</VCardTitle>
<VCardSubtitle>发送特定事件</VCardSubtitle>
</VCardItem>
<VDivider />
<VCardText></VCardText>
</VCard>
</template>
@@ -0,0 +1,22 @@
<script setup lang="ts">
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
</script>
<template>
<VCard>
<VCardItem prepend-icon="mdi-message-arrow-right">
<VCardTitle>发送消息</VCardTitle>
<VCardSubtitle>发送特定消息</VCardSubtitle>
</VCardItem>
<VDivider />
<VCardText></VCardText>
</VCard>
</template>
@@ -0,0 +1,22 @@
<script setup lang="ts">
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
</script>
<template>
<VCard>
<VCardItem prepend-icon="mdi-file-move">
<VCardTitle>整理文件</VCardTitle>
<VCardSubtitle>转移和重命名文件</VCardSubtitle>
</VCardItem>
<VDivider />
<VCardText></VCardText>
</VCard>
</template>