mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-05-13 08:59:58 +08:00
241 lines
7.2 KiB
Vue
241 lines
7.2 KiB
Vue
<!-- eslint-disable sonarjs/no-duplicate-string -->
|
||
<script lang="ts" setup>
|
||
import { useToast } from 'vue-toast-notification'
|
||
import { VRow } from 'vuetify/lib/components/index.mjs'
|
||
import draggable from 'vuedraggable'
|
||
import api from '@/api'
|
||
import { DownloaderConf, MediaServerConf } from '@/api/types'
|
||
import DownloaderCard from '@/components/cards/DownloaderCard.vue'
|
||
import MediaServerCard from '@/components/cards/MediaServerCard.vue'
|
||
|
||
// 系统设置项
|
||
const SystemSettings = ref({
|
||
APP_DOMAIN: '',
|
||
})
|
||
|
||
// 选中的媒体服务器
|
||
const mediaServers = ref<MediaServerConf[]>([])
|
||
|
||
// 下载器
|
||
const downloaders = ref<DownloaderConf[]>([])
|
||
|
||
// 提示框
|
||
const $toast = useToast()
|
||
|
||
// 调用API查询下载器设置
|
||
async function loadDownloaderSetting() {
|
||
try {
|
||
const result: { [key: string]: any } = await api.get('system/setting/Downloaders')
|
||
downloaders.value = result.data?.value ?? []
|
||
} catch (error) {
|
||
console.log(error)
|
||
}
|
||
}
|
||
|
||
// 调用API保存下载器设置
|
||
async function saveDownloaderSetting() {
|
||
try {
|
||
const result: { [key: string]: any } = await api.post('system/setting/Downloaders', downloaders.value)
|
||
if (result.success) $toast.success('下载器设置保存成功')
|
||
else $toast.error('下载器设置保存失败!')
|
||
} catch (error) {
|
||
console.log(error)
|
||
}
|
||
}
|
||
|
||
// 调用API查询媒体服务器设置
|
||
async function loadMediaServerSetting() {
|
||
try {
|
||
const result: { [key: string]: any } = await api.get('system/setting/MediaServers')
|
||
mediaServers.value = result.data?.value ?? []
|
||
} catch (error) {
|
||
console.log(error)
|
||
}
|
||
}
|
||
|
||
// 调用API保存媒体服务器设置
|
||
async function saveMediaServerSetting() {
|
||
try {
|
||
const result: { [key: string]: any } = await api.post('system/setting/MediaServers', mediaServers.value)
|
||
if (result.success) $toast.success('媒体服务器设置保存成功')
|
||
else $toast.error('媒体服务器设置保存失败!')
|
||
} catch (error) {
|
||
console.log(error)
|
||
}
|
||
}
|
||
|
||
// 加载系统设置
|
||
async function loadSystemSettings() {
|
||
try {
|
||
const result: { [key: string]: any } = await api.get('system/env')
|
||
if (result.success) {
|
||
const { APP_DOMAIN } = result.data
|
||
SystemSettings.value = {
|
||
APP_DOMAIN,
|
||
}
|
||
}
|
||
} catch (error) {
|
||
console.log(error)
|
||
}
|
||
}
|
||
|
||
// 调用API保存系统设置
|
||
async function saveSystemSetting() {
|
||
try {
|
||
const result: { [key: string]: any } = await api.post('system/env', SystemSettings.value)
|
||
|
||
if (result.success) $toast.success('保存设置成功')
|
||
else $toast.error('保存设置失败!')
|
||
} catch (error) {
|
||
console.log(error)
|
||
}
|
||
}
|
||
|
||
// 添加下载器
|
||
function addDownloader(downloader: string) {
|
||
downloaders.value.push({
|
||
name: `下载器${downloaders.value.length + 1}`,
|
||
type: downloader,
|
||
default: false,
|
||
enabled: false,
|
||
})
|
||
}
|
||
|
||
// 添加媒体服务器
|
||
function addMediaServer(mediaserver: string) {
|
||
mediaServers.value.push({
|
||
name: `服务器${mediaServers.value.length + 1}`,
|
||
type: mediaserver,
|
||
enabled: false,
|
||
})
|
||
}
|
||
|
||
// 加载数据
|
||
onMounted(() => {
|
||
loadDownloaderSetting()
|
||
loadMediaServerSetting()
|
||
loadSystemSettings()
|
||
})
|
||
</script>
|
||
|
||
<template>
|
||
<VRow>
|
||
<VCol cols="12">
|
||
<VCard>
|
||
<VCardItem>
|
||
<VCardTitle>系统</VCardTitle>
|
||
<VCardSubtitle>设置服务使用的域名等基础信息。</VCardSubtitle>
|
||
</VCardItem>
|
||
<VCardText>
|
||
<VForm>
|
||
<VRow>
|
||
<VCol cols="12" md="6">
|
||
<VTextField
|
||
v-model="SystemSettings.APP_DOMAIN"
|
||
label="访问域名"
|
||
hint="用于通知跳转,格式:http(s)://domain:port"
|
||
persistent-hint
|
||
/>
|
||
</VCol>
|
||
</VRow>
|
||
</VForm>
|
||
</VCardText>
|
||
<VCardText>
|
||
<VForm @submit.prevent="() => {}">
|
||
<div class="d-flex flex-wrap gap-4 mt-4">
|
||
<VBtn mtype="submit" @click="saveSystemSetting"> 保存 </VBtn>
|
||
</div>
|
||
</VForm>
|
||
</VCardText>
|
||
</VCard>
|
||
</VCol>
|
||
<VCol cols="12">
|
||
<VCard>
|
||
<VCardItem>
|
||
<VCardTitle>下载器</VCardTitle>
|
||
<VCardSubtitle>只有第1个启用的下载器才会被默认使用。</VCardSubtitle>
|
||
</VCardItem>
|
||
<VCardText>
|
||
<draggable
|
||
v-model="downloaders"
|
||
handle=".cursor-move"
|
||
item-key="name"
|
||
tag="div"
|
||
:component-data="{ 'class': 'grid gap-3 grid-app-card' }"
|
||
>
|
||
<template #item="{ element }">
|
||
<DownloaderCard :downloader="element" />
|
||
</template>
|
||
</draggable>
|
||
</VCardText>
|
||
<VCardText>
|
||
<VForm @submit.prevent="() => {}">
|
||
<div class="d-flex flex-wrap gap-4 mt-4">
|
||
<VBtn mtype="submit" @click="saveDownloaderSetting"> 保存 </VBtn>
|
||
<VBtn color="success" variant="tonal">
|
||
<VIcon icon="mdi-plus" />
|
||
<VMenu activator="parent" close-on-content-click>
|
||
<VList>
|
||
<VListItem variant="plain" @click="addDownloader('qbittottent')">
|
||
<VListItemTitle>Qbittorrent</VListItemTitle>
|
||
</VListItem>
|
||
<VListItem variant="plain" @click="addDownloader('transmission')">
|
||
<VListItemTitle>Transmission</VListItemTitle>
|
||
</VListItem>
|
||
</VList>
|
||
</VMenu>
|
||
</VBtn>
|
||
</div>
|
||
</VForm>
|
||
</VCardText>
|
||
</VCard>
|
||
</VCol>
|
||
</VRow>
|
||
<VRow>
|
||
<VCol cols="12">
|
||
<VCard>
|
||
<VCardItem>
|
||
<VCardTitle>媒体服务器</VCardTitle>
|
||
<VCardSubtitle>所有启用的媒体服务器都会被使用。</VCardSubtitle>
|
||
</VCardItem>
|
||
<VCardText>
|
||
<draggable
|
||
v-model="mediaServers"
|
||
handle=".cursor-move"
|
||
item-key="name"
|
||
tag="div"
|
||
:component-data="{ 'class': 'grid gap-3 grid-app-card' }"
|
||
>
|
||
<template #item="{ element }">
|
||
<MediaServerCard :mediaserver="element" />
|
||
</template>
|
||
</draggable>
|
||
</VCardText>
|
||
<VCardText>
|
||
<VForm @submit.prevent="() => {}">
|
||
<div class="d-flex flex-wrap gap-4 mt-4">
|
||
<VBtn mtype="submit" @click="saveMediaServerSetting"> 保存 </VBtn>
|
||
<VBtn color="success" variant="tonal">
|
||
<VIcon icon="mdi-plus" />
|
||
<VMenu activator="parent" close-on-content-click>
|
||
<VList>
|
||
<VListItem variant="plain" @click="addMediaServer('emby')">
|
||
<VListItemTitle>Emby</VListItemTitle>
|
||
</VListItem>
|
||
<VListItem variant="plain" @click="addMediaServer('jellyfin')">
|
||
<VListItemTitle>Jellyfin</VListItemTitle>
|
||
</VListItem>
|
||
<VListItem variant="plain" @click="addMediaServer('plex')">
|
||
<VListItemTitle>Plex</VListItemTitle>
|
||
</VListItem>
|
||
</VList>
|
||
</VMenu>
|
||
</VBtn>
|
||
</div>
|
||
</VForm>
|
||
</VCardText>
|
||
</VCard>
|
||
</VCol>
|
||
</VRow>
|
||
</template>
|