mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-05 15:36:49 +08:00
feat: 重构工作流组件,动态加载节点类型,移除旧的侧边栏和背景组件
This commit is contained in:
@@ -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>
|
||||||
Reference in New Issue
Block a user