mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-06 16:16:42 +08:00
新增配置向导
This commit is contained in:
@@ -5,7 +5,7 @@ import avatar1 from '@images/avatars/avatar-1.png'
|
|||||||
import api from '@/api'
|
import api from '@/api'
|
||||||
import ProgressDialog from '@/components/dialog/ProgressDialog.vue'
|
import ProgressDialog from '@/components/dialog/ProgressDialog.vue'
|
||||||
import UserAuthDialog from '@/components/dialog/UserAuthDialog.vue'
|
import UserAuthDialog from '@/components/dialog/UserAuthDialog.vue'
|
||||||
import { useAuthStore, useUserStore } from '@/stores'
|
import { useAuthStore, useUserStore, useGlobalSettingsStore } from '@/stores'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { useDisplay, useTheme } from 'vuetify'
|
import { useDisplay, useTheme } from 'vuetify'
|
||||||
import { SUPPORTED_LOCALES, SupportedLocale } from '@/types/i18n'
|
import { SUPPORTED_LOCALES, SupportedLocale } from '@/types/i18n'
|
||||||
@@ -20,6 +20,8 @@ import { themeManager } from '@/utils/themeManager'
|
|||||||
const authStore = useAuthStore()
|
const authStore = useAuthStore()
|
||||||
// 用户 Store
|
// 用户 Store
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
|
// 全局设置 Store
|
||||||
|
const globalSettingsStore = useGlobalSettingsStore()
|
||||||
// 国际化
|
// 国际化
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
// 显示器
|
// 显示器
|
||||||
@@ -217,6 +219,11 @@ const userName = computed(() => userStore.userName)
|
|||||||
const avatar = computed(() => userStore.avatar || avatar1)
|
const avatar = computed(() => userStore.avatar || avatar1)
|
||||||
const userLevel = computed(() => userStore.level)
|
const userLevel = computed(() => userStore.level)
|
||||||
|
|
||||||
|
// 检查是否为高级模式
|
||||||
|
const isAdvancedMode = computed(() => {
|
||||||
|
return globalSettingsStore.get('ADVANCED_MODE') !== false
|
||||||
|
})
|
||||||
|
|
||||||
// 主题相关功能
|
// 主题相关功能
|
||||||
const { name: themeName, global: globalTheme } = useTheme()
|
const { name: themeName, global: globalTheme } = useTheme()
|
||||||
const savedTheme = ref(localStorage.getItem('theme') ?? themeName)
|
const savedTheme = ref(localStorage.getItem('theme') ?? themeName)
|
||||||
@@ -509,11 +516,17 @@ onUnmounted(() => {
|
|||||||
<VListItemTitle>{{ t('user.profile') }}</VListItemTitle>
|
<VListItemTitle>{{ t('user.profile') }}</VListItemTitle>
|
||||||
</VListItem>
|
</VListItem>
|
||||||
|
|
||||||
<VListItem v-if="superUser" link @click="router.push('/setting')" class="mb-1 rounded-lg" hover>
|
<VListItem
|
||||||
|
v-if="superUser"
|
||||||
|
link
|
||||||
|
@click="isAdvancedMode ? router.push('/setting') : router.push('/setup-wizard')"
|
||||||
|
class="mb-1 rounded-lg"
|
||||||
|
hover
|
||||||
|
>
|
||||||
<template #prepend>
|
<template #prepend>
|
||||||
<VIcon icon="mdi-cog-outline" />
|
<VIcon :icon="isAdvancedMode ? 'mdi-cog-outline' : 'mdi-wizard-hat'" />
|
||||||
</template>
|
</template>
|
||||||
<VListItemTitle>{{ t('user.systemSettings') }}</VListItemTitle>
|
<VListItemTitle>{{ isAdvancedMode ? t('user.systemSettings') : t('setupWizard.title') }}</VListItemTitle>
|
||||||
</VListItem>
|
</VListItem>
|
||||||
|
|
||||||
<!-- 👉 Site Auth -->
|
<!-- 👉 Site Auth -->
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ export default {
|
|||||||
itemsPerPage: 'Items per page',
|
itemsPerPage: 'Items per page',
|
||||||
pageText: '{0}-{1} of {2}',
|
pageText: '{0}-{1} of {2}',
|
||||||
noDataText: 'No data',
|
noDataText: 'No data',
|
||||||
|
next: 'Next',
|
||||||
|
previous: 'Previous',
|
||||||
loadingText: 'Loading...',
|
loadingText: 'Loading...',
|
||||||
networkRequired: 'This feature requires network connection',
|
networkRequired: 'This feature requires network connection',
|
||||||
networkDisconnected: 'Network connection lost',
|
networkDisconnected: 'Network connection lost',
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ export default {
|
|||||||
itemsPerPage: '每页条数',
|
itemsPerPage: '每页条数',
|
||||||
pageText: '{0}-{1} 共 {2} 条',
|
pageText: '{0}-{1} 共 {2} 条',
|
||||||
noDataText: '没有数据',
|
noDataText: '没有数据',
|
||||||
|
next: '下一步',
|
||||||
|
previous: '上一步',
|
||||||
loadingText: '加载中...',
|
loadingText: '加载中...',
|
||||||
networkRequired: '此功能需要网络连接',
|
networkRequired: '此功能需要网络连接',
|
||||||
networkDisconnected: '网络连接已断开',
|
networkDisconnected: '网络连接已断开',
|
||||||
@@ -2845,4 +2847,110 @@ export default {
|
|||||||
customBackgroundImageHint: '支持网络图片URL,留空则使用渐变背景',
|
customBackgroundImageHint: '支持网络图片URL,留空则使用渐变背景',
|
||||||
pluginCount: '{count} 个插件',
|
pluginCount: '{count} 个插件',
|
||||||
},
|
},
|
||||||
|
setupWizard: {
|
||||||
|
title: '配置向导',
|
||||||
|
subtitle: '快速配置 MoviePilot 的基础设置',
|
||||||
|
completed: '配置向导完成!',
|
||||||
|
failed: '配置向导失败,请重试',
|
||||||
|
complete: '完成配置',
|
||||||
|
step1: {
|
||||||
|
title: '基础参数配置',
|
||||||
|
description: '设置访问域名、背景壁纸和识别数据源',
|
||||||
|
},
|
||||||
|
step2: {
|
||||||
|
title: '存储目录配置',
|
||||||
|
description: '配置下载目录和媒体库目录',
|
||||||
|
},
|
||||||
|
step3: {
|
||||||
|
title: '下载器配置',
|
||||||
|
description: '配置下载器(可选)',
|
||||||
|
},
|
||||||
|
step4: {
|
||||||
|
title: '媒体服务器配置',
|
||||||
|
description: '配置媒体服务器(可选)',
|
||||||
|
},
|
||||||
|
step5: {
|
||||||
|
title: '通知配置',
|
||||||
|
description: '配置通知渠道(可选)',
|
||||||
|
},
|
||||||
|
step6: {
|
||||||
|
title: '资源偏好配置',
|
||||||
|
description: '设置资源下载偏好',
|
||||||
|
},
|
||||||
|
basic: {
|
||||||
|
appDomain: '访问域名',
|
||||||
|
appDomainHint: '用于发送通知时,添加快捷跳转地址',
|
||||||
|
wallpaper: '背景壁纸',
|
||||||
|
wallpaperHint: '选择登录页面背景来源',
|
||||||
|
recognizeSource: '识别数据源',
|
||||||
|
recognizeSourceHint: '设置默认媒体信息识别数据源',
|
||||||
|
apiToken: 'API 令牌',
|
||||||
|
apiTokenHint: '系统自动生成的 API 访问令牌',
|
||||||
|
},
|
||||||
|
storage: {
|
||||||
|
info: '存储配置说明',
|
||||||
|
infoDesc: '配置本地存储目录,用于下载和媒体库管理',
|
||||||
|
downloadPath: '下载目录',
|
||||||
|
downloadPathHint: '设置下载文件的存储路径',
|
||||||
|
libraryPath: '媒体库目录',
|
||||||
|
libraryPathHint: '设置媒体文件的存储路径',
|
||||||
|
},
|
||||||
|
downloader: {
|
||||||
|
info: '下载器配置说明',
|
||||||
|
infoDesc: '配置下载器用于自动下载资源(可选)',
|
||||||
|
type: '下载器类型',
|
||||||
|
typeHint: '选择要使用的下载器类型',
|
||||||
|
name: '下载器名称',
|
||||||
|
nameHint: '为下载器设置一个名称',
|
||||||
|
qbittorrentConfig: 'qBittorrent 配置',
|
||||||
|
transmissionConfig: 'Transmission 配置',
|
||||||
|
host: '服务器地址',
|
||||||
|
username: '用户名',
|
||||||
|
password: '密码',
|
||||||
|
downloadPath: '下载路径',
|
||||||
|
},
|
||||||
|
mediaServer: {
|
||||||
|
info: '媒体服务器配置说明',
|
||||||
|
infoDesc: '配置媒体服务器用于媒体库管理(可选)',
|
||||||
|
type: '媒体服务器类型',
|
||||||
|
typeHint: '选择要使用的媒体服务器类型',
|
||||||
|
name: '服务器名称',
|
||||||
|
nameHint: '为媒体服务器设置一个名称',
|
||||||
|
embyConfig: 'Emby 配置',
|
||||||
|
jellyfinConfig: 'Jellyfin 配置',
|
||||||
|
plexConfig: 'Plex 配置',
|
||||||
|
host: '服务器地址',
|
||||||
|
apiKey: 'API 密钥',
|
||||||
|
token: '访问令牌',
|
||||||
|
},
|
||||||
|
notification: {
|
||||||
|
info: '通知配置说明',
|
||||||
|
infoDesc: '配置通知渠道用于接收系统消息(可选)',
|
||||||
|
type: '通知类型',
|
||||||
|
typeHint: '选择要使用的通知渠道类型',
|
||||||
|
name: '通知名称',
|
||||||
|
nameHint: '为通知渠道设置一个名称',
|
||||||
|
telegramConfig: 'Telegram 配置',
|
||||||
|
emailConfig: '邮件配置',
|
||||||
|
botToken: '机器人令牌',
|
||||||
|
chatId: '聊天ID',
|
||||||
|
smtpServer: 'SMTP 服务器',
|
||||||
|
smtpPort: 'SMTP 端口',
|
||||||
|
senderEmail: '发送邮箱',
|
||||||
|
senderPassword: '发送密码',
|
||||||
|
receiverEmail: '接收邮箱',
|
||||||
|
},
|
||||||
|
preferences: {
|
||||||
|
info: '资源偏好说明',
|
||||||
|
infoDesc: '设置资源下载的偏好,系统将根据这些偏好自动选择最佳资源',
|
||||||
|
quality: '质量偏好',
|
||||||
|
qualityHint: '选择偏好的视频质量',
|
||||||
|
subtitle: '字幕偏好',
|
||||||
|
subtitleHint: '选择偏好的字幕类型',
|
||||||
|
resolution: '分辨率偏好',
|
||||||
|
resolutionHint: '选择偏好的视频分辨率',
|
||||||
|
presetRules: '预设规则',
|
||||||
|
detailedConfig: '详细配置',
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ export default {
|
|||||||
itemsPerPage: '每頁條數',
|
itemsPerPage: '每頁條數',
|
||||||
pageText: '{0}-{1} 共 {2} 條',
|
pageText: '{0}-{1} 共 {2} 條',
|
||||||
noDataText: '沒有數據',
|
noDataText: '沒有數據',
|
||||||
|
next: '下一步',
|
||||||
|
previous: '上一步',
|
||||||
loadingText: '加載中...',
|
loadingText: '加載中...',
|
||||||
networkRequired: '此功能需要網絡連接',
|
networkRequired: '此功能需要網絡連接',
|
||||||
networkDisconnected: '網絡連接已斷開',
|
networkDisconnected: '網絡連接已斷開',
|
||||||
|
|||||||
+17
-8
@@ -1,8 +1,13 @@
|
|||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
|
import { useGlobalSettingsStore } from '@/stores'
|
||||||
|
|
||||||
// 构建路由菜单,每次调用时使用当前的语言环境
|
// 构建路由菜单,每次调用时使用当前的语言环境
|
||||||
export function getNavMenus() {
|
export function getNavMenus() {
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
const globalSettingsStore = useGlobalSettingsStore()
|
||||||
|
|
||||||
|
// 检查是否为高级模式
|
||||||
|
const isAdvancedMode = globalSettingsStore.get('ADVANCED_MODE') !== false
|
||||||
|
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
@@ -127,14 +132,18 @@ export function getNavMenus() {
|
|||||||
admin: true,
|
admin: true,
|
||||||
permission: 'admin',
|
permission: 'admin',
|
||||||
},
|
},
|
||||||
{
|
...(isAdvancedMode
|
||||||
title: t('navItems.settings'),
|
? [
|
||||||
icon: 'mdi-cog-outline',
|
{
|
||||||
to: '/setting',
|
title: t('navItems.settings'),
|
||||||
header: t('menu.system'),
|
icon: 'mdi-cog-outline',
|
||||||
admin: true,
|
to: '/setting',
|
||||||
permission: 'admin',
|
header: t('menu.system'),
|
||||||
},
|
admin: true,
|
||||||
|
permission: 'admin',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: []),
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -208,6 +208,13 @@ const router = createRouter({
|
|||||||
path: 'login',
|
path: 'login',
|
||||||
component: () => import('../pages/login.vue'),
|
component: () => import('../pages/login.vue'),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'setup-wizard',
|
||||||
|
component: () => import('../views/setting/SetupWizard.vue'),
|
||||||
|
meta: {
|
||||||
|
requiresAuth: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: '/:pathMatch(.*)*',
|
path: '/:pathMatch(.*)*',
|
||||||
component: () => import('../pages/[...all].vue'),
|
component: () => import('../pages/[...all].vue'),
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user