mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-06 16:16:42 +08:00
增强配置向导功能
This commit is contained in:
@@ -32,6 +32,7 @@ export interface WizardData {
|
|||||||
name: string
|
name: string
|
||||||
config: any
|
config: any
|
||||||
sync_libraries: any[]
|
sync_libraries: any[]
|
||||||
|
switchs: any[]
|
||||||
}
|
}
|
||||||
notification: {
|
notification: {
|
||||||
type: string
|
type: string
|
||||||
@@ -110,6 +111,7 @@ const wizardData = ref<WizardData>({
|
|||||||
name: '',
|
name: '',
|
||||||
config: {},
|
config: {},
|
||||||
sync_libraries: [],
|
sync_libraries: [],
|
||||||
|
switchs: [],
|
||||||
},
|
},
|
||||||
notification: {
|
notification: {
|
||||||
type: '',
|
type: '',
|
||||||
@@ -410,6 +412,7 @@ export function useSetupWizard() {
|
|||||||
|
|
||||||
// 根据通知类型验证必输项
|
// 根据通知类型验证必输项
|
||||||
const config = wizardData.value.notification.config || {}
|
const config = wizardData.value.notification.config || {}
|
||||||
|
alert(wizardData.value.notification.type)
|
||||||
switch (wizardData.value.notification.type) {
|
switch (wizardData.value.notification.type) {
|
||||||
case 'wechat':
|
case 'wechat':
|
||||||
if (!config.WECHAT_CORPID?.trim()) {
|
if (!config.WECHAT_CORPID?.trim()) {
|
||||||
|
|||||||
@@ -117,15 +117,6 @@ const { wizardData, selectDownloader, validationErrors } = useSetupWizard()
|
|||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
<VCol cols="12" md="6">
|
|
||||||
<VSwitch
|
|
||||||
v-model="wizardData.downloader.config.category"
|
|
||||||
:label="t('downloader.category')"
|
|
||||||
:hint="t('downloader.category')"
|
|
||||||
persistent-hint
|
|
||||||
active
|
|
||||||
/>
|
|
||||||
</VCol>
|
|
||||||
<VCol cols="12" md="6">
|
<VCol cols="12" md="6">
|
||||||
<VSwitch
|
<VSwitch
|
||||||
v-model="wizardData.downloader.config.sequentail"
|
v-model="wizardData.downloader.config.sequentail"
|
||||||
|
|||||||
@@ -1,9 +1,71 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { useSetupWizard } from '@/composables/useSetupWizard'
|
import { useSetupWizard } from '@/composables/useSetupWizard'
|
||||||
|
import api from '@/api'
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
||||||
|
|
||||||
|
// 同步媒体库选项
|
||||||
|
const librariesOptions = ref<{ title: string; value: string | undefined }[]>([
|
||||||
|
{
|
||||||
|
title: t('common.all'),
|
||||||
|
value: 'all',
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
|
// 调用API查询媒体库
|
||||||
|
async function loadLibrary(server: string) {
|
||||||
|
try {
|
||||||
|
console.log('Loading library for server:', server)
|
||||||
|
const result: any[] = await api.get('mediaserver/library', { params: { server } })
|
||||||
|
if (result && result.length > 0) {
|
||||||
|
librariesOptions.value = result.map(item => ({
|
||||||
|
title: item.name,
|
||||||
|
value: item.id?.toString(),
|
||||||
|
}))
|
||||||
|
console.log('Loaded libraries:', librariesOptions.value)
|
||||||
|
} else {
|
||||||
|
librariesOptions.value = []
|
||||||
|
console.log('No libraries found')
|
||||||
|
}
|
||||||
|
librariesOptions.value.unshift({
|
||||||
|
title: t('common.all'),
|
||||||
|
value: 'all',
|
||||||
|
})
|
||||||
|
} catch (e) {
|
||||||
|
console.log('Error loading library:', e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 选择媒体服务器并自动加载媒体库
|
||||||
|
async function selectMediaServerWithLibrary(type: string) {
|
||||||
|
selectMediaServer(type)
|
||||||
|
// 如果选择了媒体服务器类型,自动加载媒体库
|
||||||
|
if (type && wizardData.value.mediaServer.name) {
|
||||||
|
await loadLibrary(wizardData.value.mediaServer.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 组件挂载时检查是否需要加载媒体库
|
||||||
|
onMounted(async () => {
|
||||||
|
// 如果已经有媒体服务器配置,自动加载媒体库
|
||||||
|
if (wizardData.value.mediaServer.type && wizardData.value.mediaServer.name) {
|
||||||
|
await loadLibrary(wizardData.value.mediaServer.name)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 监听媒体服务器配置变化,自动加载媒体库
|
||||||
|
watch(
|
||||||
|
() => [wizardData.value.mediaServer.type, wizardData.value.mediaServer.name],
|
||||||
|
async ([type, name]) => {
|
||||||
|
console.log('Media server changed:', { type, name })
|
||||||
|
if (type && name) {
|
||||||
|
await loadLibrary(name)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true },
|
||||||
|
)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -31,7 +93,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
|||||||
:color="wizardData.mediaServer.type === 'emby' ? 'primary' : 'default'"
|
:color="wizardData.mediaServer.type === 'emby' ? 'primary' : 'default'"
|
||||||
:variant="wizardData.mediaServer.type === 'emby' ? 'tonal' : 'outlined'"
|
:variant="wizardData.mediaServer.type === 'emby' ? 'tonal' : 'outlined'"
|
||||||
class="cursor-pointer"
|
class="cursor-pointer"
|
||||||
@click="selectMediaServer('emby')"
|
@click="selectMediaServerWithLibrary('emby')"
|
||||||
>
|
>
|
||||||
<VCardText class="text-center">
|
<VCardText class="text-center">
|
||||||
<VImg src="/src/assets/images/logos/emby.png" height="48" width="48" class="mx-auto mb-2" />
|
<VImg src="/src/assets/images/logos/emby.png" height="48" width="48" class="mx-auto mb-2" />
|
||||||
@@ -44,7 +106,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
|||||||
:color="wizardData.mediaServer.type === 'jellyfin' ? 'primary' : 'default'"
|
:color="wizardData.mediaServer.type === 'jellyfin' ? 'primary' : 'default'"
|
||||||
:variant="wizardData.mediaServer.type === 'jellyfin' ? 'tonal' : 'outlined'"
|
:variant="wizardData.mediaServer.type === 'jellyfin' ? 'tonal' : 'outlined'"
|
||||||
class="cursor-pointer"
|
class="cursor-pointer"
|
||||||
@click="selectMediaServer('jellyfin')"
|
@click="selectMediaServerWithLibrary('jellyfin')"
|
||||||
>
|
>
|
||||||
<VCardText class="text-center">
|
<VCardText class="text-center">
|
||||||
<VImg src="/src/assets/images/logos/jellyfin.png" height="48" width="48" class="mx-auto mb-2" />
|
<VImg src="/src/assets/images/logos/jellyfin.png" height="48" width="48" class="mx-auto mb-2" />
|
||||||
@@ -57,7 +119,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
|||||||
:color="wizardData.mediaServer.type === 'plex' ? 'primary' : 'default'"
|
:color="wizardData.mediaServer.type === 'plex' ? 'primary' : 'default'"
|
||||||
:variant="wizardData.mediaServer.type === 'plex' ? 'tonal' : 'outlined'"
|
:variant="wizardData.mediaServer.type === 'plex' ? 'tonal' : 'outlined'"
|
||||||
class="cursor-pointer"
|
class="cursor-pointer"
|
||||||
@click="selectMediaServer('plex')"
|
@click="selectMediaServerWithLibrary('plex')"
|
||||||
>
|
>
|
||||||
<VCardText class="text-center">
|
<VCardText class="text-center">
|
||||||
<VImg src="/src/assets/images/logos/plex.png" height="48" width="48" class="mx-auto mb-2" />
|
<VImg src="/src/assets/images/logos/plex.png" height="48" width="48" class="mx-auto mb-2" />
|
||||||
@@ -70,7 +132,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
|||||||
:color="wizardData.mediaServer.type === 'trimemedia' ? 'primary' : 'default'"
|
:color="wizardData.mediaServer.type === 'trimemedia' ? 'primary' : 'default'"
|
||||||
:variant="wizardData.mediaServer.type === 'trimemedia' ? 'tonal' : 'outlined'"
|
:variant="wizardData.mediaServer.type === 'trimemedia' ? 'tonal' : 'outlined'"
|
||||||
class="cursor-pointer"
|
class="cursor-pointer"
|
||||||
@click="selectMediaServer('trimemedia')"
|
@click="selectMediaServerWithLibrary('trimemedia')"
|
||||||
>
|
>
|
||||||
<VCardText class="text-center">
|
<VCardText class="text-center">
|
||||||
<VImg src="/src/assets/images/logos/trimemedia.png" height="48" width="48" class="mx-auto mb-2" />
|
<VImg src="/src/assets/images/logos/trimemedia.png" height="48" width="48" class="mx-auto mb-2" />
|
||||||
@@ -144,7 +206,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
|||||||
<VAutocomplete
|
<VAutocomplete
|
||||||
v-model="wizardData.mediaServer.sync_libraries"
|
v-model="wizardData.mediaServer.sync_libraries"
|
||||||
:label="t('mediaserver.syncLibraries')"
|
:label="t('mediaserver.syncLibraries')"
|
||||||
:items="[]"
|
:items="librariesOptions"
|
||||||
chips
|
chips
|
||||||
multiple
|
multiple
|
||||||
clearable
|
clearable
|
||||||
@@ -153,6 +215,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
|||||||
active
|
active
|
||||||
append-inner-icon="mdi-refresh"
|
append-inner-icon="mdi-refresh"
|
||||||
prepend-inner-icon="mdi-library"
|
prepend-inner-icon="mdi-library"
|
||||||
|
@click:append-inner="loadLibrary(wizardData.mediaServer.name)"
|
||||||
/>
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
@@ -213,7 +276,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
|||||||
<VAutocomplete
|
<VAutocomplete
|
||||||
v-model="wizardData.mediaServer.sync_libraries"
|
v-model="wizardData.mediaServer.sync_libraries"
|
||||||
:label="t('mediaserver.syncLibraries')"
|
:label="t('mediaserver.syncLibraries')"
|
||||||
:items="[]"
|
:items="librariesOptions"
|
||||||
chips
|
chips
|
||||||
multiple
|
multiple
|
||||||
clearable
|
clearable
|
||||||
@@ -222,6 +285,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
|||||||
active
|
active
|
||||||
append-inner-icon="mdi-refresh"
|
append-inner-icon="mdi-refresh"
|
||||||
prepend-inner-icon="mdi-library"
|
prepend-inner-icon="mdi-library"
|
||||||
|
@click:append-inner="loadLibrary(wizardData.mediaServer.name)"
|
||||||
/>
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
@@ -292,7 +356,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
|||||||
<VAutocomplete
|
<VAutocomplete
|
||||||
v-model="wizardData.mediaServer.sync_libraries"
|
v-model="wizardData.mediaServer.sync_libraries"
|
||||||
:label="t('mediaserver.syncLibraries')"
|
:label="t('mediaserver.syncLibraries')"
|
||||||
:items="[]"
|
:items="librariesOptions"
|
||||||
chips
|
chips
|
||||||
multiple
|
multiple
|
||||||
clearable
|
clearable
|
||||||
@@ -301,6 +365,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
|||||||
active
|
active
|
||||||
append-inner-icon="mdi-refresh"
|
append-inner-icon="mdi-refresh"
|
||||||
prepend-inner-icon="mdi-library"
|
prepend-inner-icon="mdi-library"
|
||||||
|
@click:append-inner="loadLibrary(wizardData.mediaServer.name)"
|
||||||
/>
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
@@ -361,7 +426,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
|||||||
<VAutocomplete
|
<VAutocomplete
|
||||||
v-model="wizardData.mediaServer.sync_libraries"
|
v-model="wizardData.mediaServer.sync_libraries"
|
||||||
:label="t('mediaserver.syncLibraries')"
|
:label="t('mediaserver.syncLibraries')"
|
||||||
:items="[]"
|
:items="librariesOptions"
|
||||||
chips
|
chips
|
||||||
multiple
|
multiple
|
||||||
clearable
|
clearable
|
||||||
@@ -370,6 +435,7 @@ const { wizardData, selectMediaServer, validationErrors } = useSetupWizard()
|
|||||||
active
|
active
|
||||||
append-inner-icon="mdi-refresh"
|
append-inner-icon="mdi-refresh"
|
||||||
prepend-inner-icon="mdi-library"
|
prepend-inner-icon="mdi-library"
|
||||||
|
@click:append-inner="loadLibrary(wizardData.mediaServer.name)"
|
||||||
/>
|
/>
|
||||||
</VCol>
|
</VCol>
|
||||||
</VRow>
|
</VRow>
|
||||||
|
|||||||
@@ -4,6 +4,18 @@ import { useSetupWizard } from '@/composables/useSetupWizard'
|
|||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
const { wizardData, selectNotification, validationErrors } = useSetupWizard()
|
const { wizardData, selectNotification, validationErrors } = useSetupWizard()
|
||||||
|
|
||||||
|
// 消息类型下拉字典
|
||||||
|
const notificationTypes = [
|
||||||
|
{ value: '资源下载', title: t('notificationSwitch.resourceDownload') },
|
||||||
|
{ value: '整理入库', title: t('notificationSwitch.organize') },
|
||||||
|
{ value: '订阅', title: t('notificationSwitch.subscribe') },
|
||||||
|
{ value: '站点', title: t('notificationSwitch.site') },
|
||||||
|
{ value: '媒体服务器', title: t('notificationSwitch.mediaServer') },
|
||||||
|
{ value: '手动处理', title: t('notificationSwitch.manual') },
|
||||||
|
{ value: '插件', title: t('notificationSwitch.plugin') },
|
||||||
|
{ value: '其它', title: t('notificationSwitch.other') },
|
||||||
|
]
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -117,7 +129,7 @@ const { wizardData, selectNotification, validationErrors } = useSetupWizard()
|
|||||||
<VCol cols="12">
|
<VCol cols="12">
|
||||||
<VAutocomplete
|
<VAutocomplete
|
||||||
v-model="wizardData.notification.switchs"
|
v-model="wizardData.notification.switchs"
|
||||||
:items="[] as string[]"
|
:items="notificationTypes"
|
||||||
:label="t('notification.type')"
|
:label="t('notification.type')"
|
||||||
:hint="t('notification.typeHint')"
|
:hint="t('notification.typeHint')"
|
||||||
multiple
|
multiple
|
||||||
|
|||||||
Reference in New Issue
Block a user