You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
3.4 KiB
107 lines
3.4 KiB
<template>
|
|
<div class="flow-list-page">
|
|
<el-card>
|
|
<template #header>
|
|
<div class="card-header">
|
|
<span>流列表</span>
|
|
<el-button type="primary" @click="$router.push('/admin/flow/editor')" v-if="userStore.hasPermission('flow:create')">创建新流</el-button>
|
|
</div>
|
|
</template>
|
|
|
|
<el-table :data="flows" v-loading="loading">
|
|
<el-table-column prop="name" label="名称" min-width="200" />
|
|
<el-table-column prop="description" label="描述" min-width="200" />
|
|
<el-table-column prop="version" label="版本" width="80">
|
|
<template #default="{ row }">v{{ row.version }}</template>
|
|
</el-table-column>
|
|
<el-table-column prop="status" label="状态" width="100">
|
|
<template #default="{ row }">
|
|
<el-tag :type="row.status === 'published' ? 'success' : 'info'">{{ row.status === 'published' ? '已上架' : '草稿' }}</el-tag>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column label="操作" width="340">
|
|
<template #default="{ row }">
|
|
<el-button size="small" @click="$router.push(`/admin/flow/market/${row.id}`)">详情</el-button>
|
|
<el-button size="small" @click="$router.push(`/admin/flow/editor/${row.id}`)">编辑</el-button>
|
|
<el-button size="small" @click="handleTest(row)">测试</el-button>
|
|
<el-button v-if="row.status === 'draft'" size="small" type="success" @click="handlePublish(row)">上架</el-button>
|
|
<el-button v-else size="small" type="warning" @click="handleUnpublish(row)">下架</el-button>
|
|
<el-button size="small" type="danger" @click="handleDelete(row)">删除</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
</el-card>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { ref, onMounted } from 'vue'
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
import { flowApi } from '@/api'
|
|
import { useUserStore } from '@/stores/user'
|
|
|
|
const userStore = useUserStore()
|
|
const loading = ref(false)
|
|
const flows = ref<any[]>([])
|
|
|
|
onMounted(async () => {
|
|
loading.value = true
|
|
try {
|
|
const res: any = await flowApi.getFlows()
|
|
flows.value = res || []
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
})
|
|
|
|
async function handlePublish(row: any) {
|
|
await flowApi.publishFlow(row.id)
|
|
ElMessage.success('流已上架到企微')
|
|
await refreshList()
|
|
}
|
|
|
|
async function handleUnpublish(row: any) {
|
|
await flowApi.unpublishFlow(row.id)
|
|
ElMessage.success('流已下架')
|
|
await refreshList()
|
|
}
|
|
|
|
async function handleTest(row: any) {
|
|
try {
|
|
const res: any = await flowApi.testFlow(row.id)
|
|
const data = res?.data || res || {}
|
|
if (data.valid) {
|
|
ElMessage.success(`测试通过: ${data.node_count}个节点, ${data.edge_count}条边`)
|
|
} else {
|
|
ElMessage.warning(`测试发现问题: ${(data.issues || []).join(', ')}`)
|
|
}
|
|
} catch { /**/ }
|
|
}
|
|
|
|
async function handleDelete(row: any) {
|
|
try {
|
|
await ElMessageBox.confirm('确认删除该流?', '提示', { type: 'warning' })
|
|
await flowApi.deleteFlow(row.id)
|
|
ElMessage.success('已删除')
|
|
await refreshList()
|
|
} catch { /**/ }
|
|
}
|
|
|
|
async function refreshList() {
|
|
loading.value = true
|
|
try {
|
|
const res: any = await flowApi.getFlows()
|
|
flows.value = res || []
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.card-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
}
|
|
</style>
|