diff --git a/src/layouts/components/UserProfile.vue b/src/layouts/components/UserProfile.vue index b96f403f..d239315a 100644 --- a/src/layouts/components/UserProfile.vue +++ b/src/layouts/components/UserProfile.vue @@ -5,7 +5,7 @@ import avatar1 from '@images/avatars/avatar-1.png' import api from '@/api' import ProgressDialog from '@/components/dialog/ProgressDialog.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 { useDisplay, useTheme } from 'vuetify' import { SUPPORTED_LOCALES, SupportedLocale } from '@/types/i18n' @@ -20,6 +20,8 @@ import { themeManager } from '@/utils/themeManager' const authStore = useAuthStore() // 用户 Store const userStore = useUserStore() +// 全局设置 Store +const globalSettingsStore = useGlobalSettingsStore() // 国际化 const { t } = useI18n() // 显示器 @@ -217,6 +219,11 @@ const userName = computed(() => userStore.userName) const avatar = computed(() => userStore.avatar || avatar1) const userLevel = computed(() => userStore.level) +// 检查是否为高级模式 +const isAdvancedMode = computed(() => { + return globalSettingsStore.get('ADVANCED_MODE') !== false +}) + // 主题相关功能 const { name: themeName, global: globalTheme } = useTheme() const savedTheme = ref(localStorage.getItem('theme') ?? themeName) @@ -509,11 +516,17 @@ onUnmounted(() => { {{ t('user.profile') }} - + - {{ t('user.systemSettings') }} + {{ isAdvancedMode ? t('user.systemSettings') : t('setupWizard.title') }} diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts index 5eaf9b4d..22476c4b 100644 --- a/src/locales/en-US.ts +++ b/src/locales/en-US.ts @@ -49,6 +49,8 @@ export default { itemsPerPage: 'Items per page', pageText: '{0}-{1} of {2}', noDataText: 'No data', + next: 'Next', + previous: 'Previous', loadingText: 'Loading...', networkRequired: 'This feature requires network connection', networkDisconnected: 'Network connection lost', diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index f0fb9920..8c5ee4bc 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -49,6 +49,8 @@ export default { itemsPerPage: '每页条数', pageText: '{0}-{1} 共 {2} 条', noDataText: '没有数据', + next: '下一步', + previous: '上一步', loadingText: '加载中...', networkRequired: '此功能需要网络连接', networkDisconnected: '网络连接已断开', @@ -2845,4 +2847,110 @@ export default { customBackgroundImageHint: '支持网络图片URL,留空则使用渐变背景', 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: '详细配置', + }, + }, } diff --git a/src/locales/zh-TW.ts b/src/locales/zh-TW.ts index 8241acbe..206d652b 100644 --- a/src/locales/zh-TW.ts +++ b/src/locales/zh-TW.ts @@ -49,6 +49,8 @@ export default { itemsPerPage: '每頁條數', pageText: '{0}-{1} 共 {2} 條', noDataText: '沒有數據', + next: '下一步', + previous: '上一步', loadingText: '加載中...', networkRequired: '此功能需要網絡連接', networkDisconnected: '網絡連接已斷開', diff --git a/src/router/i18n-menu.ts b/src/router/i18n-menu.ts index 70836359..1c3bb563 100644 --- a/src/router/i18n-menu.ts +++ b/src/router/i18n-menu.ts @@ -1,8 +1,13 @@ import { useI18n } from 'vue-i18n' +import { useGlobalSettingsStore } from '@/stores' // 构建路由菜单,每次调用时使用当前的语言环境 export function getNavMenus() { const { t } = useI18n() + const globalSettingsStore = useGlobalSettingsStore() + + // 检查是否为高级模式 + const isAdvancedMode = globalSettingsStore.get('ADVANCED_MODE') !== false return [ { @@ -127,14 +132,18 @@ export function getNavMenus() { admin: true, permission: 'admin', }, - { - title: t('navItems.settings'), - icon: 'mdi-cog-outline', - to: '/setting', - header: t('menu.system'), - admin: true, - permission: 'admin', - }, + ...(isAdvancedMode + ? [ + { + title: t('navItems.settings'), + icon: 'mdi-cog-outline', + to: '/setting', + header: t('menu.system'), + admin: true, + permission: 'admin', + }, + ] + : []), ] } diff --git a/src/router/index.ts b/src/router/index.ts index 6f80c363..eed850b3 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -208,6 +208,13 @@ const router = createRouter({ path: 'login', component: () => import('../pages/login.vue'), }, + { + path: 'setup-wizard', + component: () => import('../views/setting/SetupWizard.vue'), + meta: { + requiresAuth: true, + }, + }, { path: '/:pathMatch(.*)*', component: () => import('../pages/[...all].vue'), diff --git a/src/views/setting/SetupWizard.vue b/src/views/setting/SetupWizard.vue new file mode 100644 index 00000000..038174c1 --- /dev/null +++ b/src/views/setting/SetupWizard.vue @@ -0,0 +1,1234 @@ + + + + +