新增配置向导

This commit is contained in:
jxxghp
2025-09-09 12:43:53 +08:00
parent c7c05f5897
commit 280de47dac
7 changed files with 1387 additions and 12 deletions

View File

@@ -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(() => {
<VListItemTitle>{{ t('user.profile') }}</VListItemTitle>
</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>
<VIcon icon="mdi-cog-outline" />
<VIcon :icon="isAdvancedMode ? 'mdi-cog-outline' : 'mdi-wizard-hat'" />
</template>
<VListItemTitle>{{ t('user.systemSettings') }}</VListItemTitle>
<VListItemTitle>{{ isAdvancedMode ? t('user.systemSettings') : t('setupWizard.title') }}</VListItemTitle>
</VListItem>
<!-- 👉 Site Auth -->

View File

@@ -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',

View File

@@ -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: '详细配置',
},
},
}

View File

@@ -49,6 +49,8 @@ export default {
itemsPerPage: '每頁條數',
pageText: '{0}-{1} 共 {2} 條',
noDataText: '沒有數據',
next: '下一步',
previous: '上一步',
loadingText: '加載中...',
networkRequired: '此功能需要網絡連接',
networkDisconnected: '網絡連接已斷開',

View File

@@ -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',
},
]
: []),
]
}

View File

@@ -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'),

File diff suppressed because it is too large Load Diff