Files
video-tool/app/pages/settings.vue
2025-08-17 19:26:43 +08:00

277 lines
7.6 KiB
Vue

<template>
<div class="space-y-6">
<!-- 连接设置 -->
<UCard>
<template #header>
<h2 class="text-lg font-semibold text-gray-900 dark:text-white">
连接设置
</h2>
</template>
<div class="space-y-4">
<UFormGroup label="视频播放器地址" description="设置要连接的视频播放器的IP地址和端口">
<div class="flex space-x-2">
<UInput v-model="settings.playerHost" placeholder="192.168.1.100" class="flex-1 mb-3" />
<span class="self-center text-gray-500">:</span>
<UInput v-model="settings.playerPort" type="number" placeholder="8080" class="w-24" />
</div>
</UFormGroup>
<UFormGroup label="连接超时时间 (秒)" description="连接超时的时间设置">
<UInput v-model.number="settings.connectionTimeout" type="number" min="1" max="60" />
</UFormGroup>
<UFormGroup label="自动重连" description="连接断开后是否自动尝试重连">
<UToggle v-model="settings.autoReconnect" />
</UFormGroup>
<UFormGroup label="重连间隔 (秒)" description="自动重连的间隔时间">
<UInput
v-model.number="settings.reconnectInterval"
type="number"
min="1"
max="300"
:disabled="!settings.autoReconnect"
/>
</UFormGroup>
</div>
</UCard>
<!-- 播放设置 -->
<UCard>
<template #header>
<h2 class="text-lg font-semibold text-gray-900 dark:text-white">
播放设置
</h2>
</template>
<div class="space-y-4">
<UFormGroup label="默认音量" description="新视频播放时的默认音量">
<div class="flex items-center space-x-4">
<URange v-model="settings.defaultVolume" :min="0" :max="100" class="flex-1" />
<span class="text-sm text-gray-600 dark:text-gray-400 min-w-[3rem]">{{ settings.defaultVolume }}%</span>
</div>
</UFormGroup>
<UFormGroup label="默认循环播放" description="是否默认启用循环播放">
<UToggle v-model="settings.defaultLoop" />
</UFormGroup>
<UFormGroup label="自动全屏" description="播放视频时是否自动全屏">
<UToggle v-model="settings.autoFullscreen" />
</UFormGroup>
<UFormGroup label="播放完成后行为">
<USelectMenu
v-model="settings.playbackEndBehavior"
:options="playbackEndOptions"
option-attribute="label"
value-attribute="value"
/>
</UFormGroup>
</div>
</UCard>
<!-- 界面设置 -->
<UCard>
<template #header>
<h2 class="text-lg font-semibold text-gray-900 dark:text-white">
界面设置
</h2>
</template>
<div class="space-y-4">
<UFormGroup label="主题模式">
<USelectMenu
v-model="settings.theme"
:options="themeOptions"
option-attribute="label"
value-attribute="value"
/>
</UFormGroup>
<UFormGroup label="语言">
<USelectMenu
v-model="settings.language"
:options="languageOptions"
option-attribute="label"
value-attribute="value"
/>
</UFormGroup>
<UFormGroup label="显示通知" description="是否显示操作通知">
<UToggle v-model="settings.showNotifications" />
</UFormGroup>
</div>
</UCard>
<!-- 高级设置 -->
<UCard>
<template #header>
<h2 class="text-lg font-semibold text-gray-900 dark:text-white">
高级设置
</h2>
</template>
<div class="space-y-4">
<UFormGroup label="调试模式" description="启用详细的日志记录">
<UToggle v-model="settings.debugMode" />
</UFormGroup>
<UFormGroup label="缓存大小 (MB)" description="播放列表和缩略图缓存大小">
<UInput v-model.number="settings.cacheSize" type="number" min="10" max="1000" />
</UFormGroup>
<UFormGroup label="网络代理" description="设置网络代理(可选)">
<UInput v-model="settings.proxy" placeholder="http://proxy.example.com:8080" />
</UFormGroup>
</div>
</UCard>
<!-- 操作按钮 -->
<div class="flex justify-between">
<UButton variant="outline" color="success" @click="resetSettings">
<UIcon name="i-heroicons-arrow-path" class="w-4 h-4 mr-2" />
重置设置
</UButton>
<div class="space-x-2">
<UButton variant="outline" @click="exportSettings">
<UIcon name="i-heroicons-arrow-up-tray" class="w-4 h-4 mr-2" />
导出配置
</UButton>
<UButton variant="outline" @click="importSettings">
<UIcon name="i-heroicons-arrow-down-tray" class="w-4 h-4 mr-2" />
导入配置
</UButton>
<UButton color="primary" @click="saveSettings">
<UIcon name="i-heroicons-check" class="w-4 h-4 mr-2" />
保存设置
</UButton>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
interface AppSettings {
playerHost: string
playerPort: number
connectionTimeout: number
autoReconnect: boolean
reconnectInterval: number
defaultVolume: number
defaultLoop: boolean
autoFullscreen: boolean
playbackEndBehavior: string
theme: string
language: string
showNotifications: boolean
debugMode: boolean
cacheSize: number
proxy: string
}
// 响应式设置数据
const settings = ref<AppSettings>({
playerHost: "192.168.1.100",
playerPort: 8080,
connectionTimeout: 10,
autoReconnect: true,
reconnectInterval: 5,
defaultVolume: 50,
defaultLoop: false,
autoFullscreen: false,
playbackEndBehavior: "stop",
theme: "system",
language: "zh-CN",
showNotifications: true,
debugMode: false,
cacheSize: 100,
proxy: ""
});
// 选项数据
const playbackEndOptions = [
{ label: "停止播放", value: "stop" },
{ label: "播放下一个", value: "next" },
{ label: "重复播放", value: "repeat" }
];
const themeOptions = [
{ label: "跟随系统", value: "system" },
{ label: "浅色模式", value: "light" },
{ label: "深色模式", value: "dark" }
];
const languageOptions = [
{ label: "简体中文", value: "zh-CN" },
{ label: "English", value: "en" },
{ label: "日本語", value: "ja" }
];
// 方法
const saveSettings = async () => {
try {
// TODO: 调用 Tauri API 保存设置
console.log("保存设置:", settings.value);
// 显示成功通知
// useToast().add({ title: '设置已保存', color: 'green' })
} catch (error) {
console.error("保存设置失败:", error);
// 显示错误通知
// useToast().add({ title: '保存失败', color: 'red' })
}
};
const resetSettings = async () => {
// 重置为默认设置
settings.value = {
playerHost: "192.168.1.100",
playerPort: 8080,
connectionTimeout: 10,
autoReconnect: true,
reconnectInterval: 5,
defaultVolume: 50,
defaultLoop: false,
autoFullscreen: false,
playbackEndBehavior: "stop",
theme: "system",
language: "zh-CN",
showNotifications: true,
debugMode: false,
cacheSize: 100,
proxy: ""
};
};
const exportSettings = async () => {
try {
// TODO: 调用 Tauri API 导出设置到文件
console.log("导出设置");
} catch (error) {
console.error("导出设置失败:", error);
}
};
const importSettings = async () => {
try {
// TODO: 调用 Tauri API 从文件导入设置
console.log("导入设置");
} catch (error) {
console.error("导入设置失败:", error);
}
};
// 页面加载时读取设置
onMounted(async () => {
try {
// TODO: 调用 Tauri API 读取保存的设置
console.log("加载设置");
} catch (error) {
console.error("加载设置失败:", error);
}
});
// 监听设置变化并自动保存关键设置
watch(() => [settings.value.playerHost, settings.value.playerPort], async () => {
// 自动保存连接相关设置
await saveSettings();
}, { debounce: 1000 });
</script>