mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-05 07:28:37 +08:00
fix 聚合搜索
This commit is contained in:
Vendored
+6
@@ -120,6 +120,12 @@ export interface NavLink extends NavLinkProps, Partial<AclProperties> {
|
|||||||
disable?: boolean
|
disable?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface NavMenu extends NavLink {
|
||||||
|
header: string
|
||||||
|
admin: boolean
|
||||||
|
description?: string
|
||||||
|
}
|
||||||
|
|
||||||
// 👉 Vertical nav group
|
// 👉 Vertical nav group
|
||||||
export interface NavGroup extends Partial<AclProperties> {
|
export interface NavGroup extends Partial<AclProperties> {
|
||||||
title: string
|
title: string
|
||||||
|
|||||||
@@ -9,9 +9,16 @@ import SearchBar from '@/layouts/components/SearchBar.vue'
|
|||||||
import ShortcutBar from '@/layouts/components/ShortcutBar.vue'
|
import ShortcutBar from '@/layouts/components/ShortcutBar.vue'
|
||||||
import UserProfile from '@/layouts/components/UserProfile.vue'
|
import UserProfile from '@/layouts/components/UserProfile.vue'
|
||||||
import store from '@/store'
|
import store from '@/store'
|
||||||
|
import { SystemNavMenus } from '@/router/menu'
|
||||||
|
import { NavMenu } from '@/@layouts/types'
|
||||||
|
|
||||||
// 从Vuex Store中获取superuser信息
|
// 从Vuex Store中获取superuser信息
|
||||||
const superUser = store.state.auth.superUser
|
const superUser = store.state.auth.superUser
|
||||||
|
|
||||||
|
// 根据分类获取菜单列表
|
||||||
|
const getMenuList = (header: string) => {
|
||||||
|
return SystemNavMenus.filter((item: NavMenu) => item.header === header && (!item.admin || superUser))
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -39,89 +46,28 @@ const superUser = store.state.auth.superUser
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #vertical-nav-content>
|
<template #vertical-nav-content>
|
||||||
<VerticalNavLink
|
<VerticalNavLink v-for="item in getMenuList('开始')" :item="item" />
|
||||||
:item="{
|
|
||||||
title: '仪表板',
|
|
||||||
icon: 'mdi-home-outline',
|
|
||||||
to: '/dashboard',
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
<!-- 👉 发现 -->
|
<!-- 👉 发现 -->
|
||||||
<VerticalNavSectionTitle
|
<VerticalNavSectionTitle
|
||||||
:item="{
|
:item="{
|
||||||
heading: '发现',
|
heading: '发现',
|
||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
<VerticalNavLink
|
<VerticalNavLink v-for="item in getMenuList('发现')" :item="item" />
|
||||||
:item="{
|
|
||||||
title: '推荐',
|
|
||||||
icon: 'mdi-table-star',
|
|
||||||
to: '/ranking',
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
<VerticalNavLink
|
|
||||||
:item="{
|
|
||||||
title: '资源搜索',
|
|
||||||
icon: 'mdi-magnify',
|
|
||||||
to: '/resource',
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
<!-- 👉 订阅 -->
|
<!-- 👉 订阅 -->
|
||||||
<VerticalNavSectionTitle
|
<VerticalNavSectionTitle
|
||||||
:item="{
|
:item="{
|
||||||
heading: '订阅',
|
heading: '订阅',
|
||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
<VerticalNavLink
|
<VerticalNavLink v-for="item in getMenuList('订阅')" :item="item" />
|
||||||
:item="{
|
|
||||||
title: '电影',
|
|
||||||
icon: 'mdi-movie-check-outline',
|
|
||||||
to: '/subscribe-movie?tab=mysub',
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
<VerticalNavLink
|
|
||||||
:item="{
|
|
||||||
title: '电视剧',
|
|
||||||
icon: 'mdi-television-classic',
|
|
||||||
to: '/subscribe-tv?tab=mysub',
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
<VerticalNavLink
|
|
||||||
:item="{
|
|
||||||
title: '日历',
|
|
||||||
icon: 'mdi-calendar',
|
|
||||||
to: '/calendar',
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
<!-- 👉 整理 -->
|
<!-- 👉 整理 -->
|
||||||
<VerticalNavSectionTitle
|
<VerticalNavSectionTitle
|
||||||
:item="{
|
:item="{
|
||||||
heading: '整理',
|
heading: '整理',
|
||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
<VerticalNavLink
|
<VerticalNavLink v-for="item in getMenuList('整理')" :item="item" />
|
||||||
:item="{
|
|
||||||
title: '正在下载',
|
|
||||||
icon: 'mdi-download-outline',
|
|
||||||
to: '/downloading',
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
<VerticalNavLink
|
|
||||||
v-if="superUser"
|
|
||||||
:item="{
|
|
||||||
title: '历史记录',
|
|
||||||
icon: 'mdi-history',
|
|
||||||
to: '/history',
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
<VerticalNavLink
|
|
||||||
v-if="superUser"
|
|
||||||
:item="{
|
|
||||||
title: '文件管理',
|
|
||||||
icon: 'mdi-folder-multiple-outline',
|
|
||||||
to: '/filemanager',
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
<!-- 👉 系统 -->
|
<!-- 👉 系统 -->
|
||||||
<VerticalNavSectionTitle
|
<VerticalNavSectionTitle
|
||||||
v-if="superUser"
|
v-if="superUser"
|
||||||
@@ -129,30 +75,7 @@ const superUser = store.state.auth.superUser
|
|||||||
heading: '系统',
|
heading: '系统',
|
||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
<VerticalNavLink
|
<VerticalNavLink v-for="item in getMenuList('系统')" :item="item" />
|
||||||
v-if="superUser"
|
|
||||||
:item="{
|
|
||||||
title: '插件',
|
|
||||||
icon: 'mdi-apps',
|
|
||||||
to: '/plugins?tab=installed',
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
<VerticalNavLink
|
|
||||||
v-if="superUser"
|
|
||||||
:item="{
|
|
||||||
title: '站点管理',
|
|
||||||
icon: 'mdi-web',
|
|
||||||
to: '/site',
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
<VerticalNavLink
|
|
||||||
v-if="superUser"
|
|
||||||
:item="{
|
|
||||||
title: '设定',
|
|
||||||
icon: 'mdi-cog',
|
|
||||||
to: '/setting?tab=account',
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #after-vertical-nav-items />
|
<template #after-vertical-nav-items />
|
||||||
|
|||||||
+9
-57
@@ -11,75 +11,27 @@ import AccountSettingSubscribe from '@/views/setting/AccountSettingSubscribe.vue
|
|||||||
import AccountSettingService from '@/views/setting/AccountSettingService.vue'
|
import AccountSettingService from '@/views/setting/AccountSettingService.vue'
|
||||||
import AccountSettingSystem from '@/views/setting/AccountSettingSystem.vue'
|
import AccountSettingSystem from '@/views/setting/AccountSettingSystem.vue'
|
||||||
import AccountSettingDirectory from '@/views/setting/AccountSettingDirectory.vue'
|
import AccountSettingDirectory from '@/views/setting/AccountSettingDirectory.vue'
|
||||||
|
import { SettingTabs } from '@/router/menu'
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
|
||||||
const activeTab = ref(route.query.tab)
|
const activeTab = ref(route.query.tab)
|
||||||
|
|
||||||
// tabs
|
|
||||||
const tabs = [
|
|
||||||
{
|
|
||||||
title: '用户',
|
|
||||||
icon: 'mdi-account',
|
|
||||||
tab: 'account',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '连接',
|
|
||||||
icon: 'mdi-server-network',
|
|
||||||
tab: 'system',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '目录',
|
|
||||||
icon: 'mdi-folder',
|
|
||||||
tab: 'directory',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '站点',
|
|
||||||
icon: 'mdi-web',
|
|
||||||
tab: 'site',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '搜索',
|
|
||||||
icon: 'mdi-magnify',
|
|
||||||
tab: 'search',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '订阅',
|
|
||||||
icon: 'mdi-rss',
|
|
||||||
tab: 'subscribe',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '服务',
|
|
||||||
icon: 'mdi-list-box',
|
|
||||||
tab: 'service',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '通知',
|
|
||||||
icon: 'mdi-bell',
|
|
||||||
tab: 'notification',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '词表',
|
|
||||||
icon: 'mdi-file-word-box',
|
|
||||||
tab: 'words',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '关于',
|
|
||||||
icon: 'mdi-information',
|
|
||||||
tab: 'about',
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
// 跳转tab
|
|
||||||
function jumpTab(tab: string) {
|
function jumpTab(tab: string) {
|
||||||
router.push("/setting?tab=" + tab)
|
router.push('/setting?tab=' + tab)
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<VTabs v-model="activeTab" show-arrows class="v-tabs-pill">
|
<VTabs v-model="activeTab" show-arrows class="v-tabs-pill">
|
||||||
<VTab v-for="item in tabs" :key="item.icon" :value="item.tab" @click="jumpTab(item.tab)" selected-class="v-slide-group-item--active v-tab--selected">
|
<VTab
|
||||||
|
v-for="item in SettingTabs"
|
||||||
|
:key="item.icon"
|
||||||
|
:value="item.tab"
|
||||||
|
@click="jumpTab(item.tab)"
|
||||||
|
selected-class="v-slide-group-item--active v-tab--selected"
|
||||||
|
>
|
||||||
<VIcon size="20" start :icon="item.icon" />
|
<VIcon size="20" start :icon="item.icon" />
|
||||||
{{ item.title }}
|
{{ item.title }}
|
||||||
</VTab>
|
</VTab>
|
||||||
|
|||||||
@@ -2,34 +2,23 @@
|
|||||||
import SubscribeListView from '@/views/subscribe/SubscribeListView.vue'
|
import SubscribeListView from '@/views/subscribe/SubscribeListView.vue'
|
||||||
import SubscribePopularView from '@/views/subscribe/SubscribePopularView.vue'
|
import SubscribePopularView from '@/views/subscribe/SubscribePopularView.vue'
|
||||||
import router from '@/router'
|
import router from '@/router'
|
||||||
|
import { SubscribeMovieTabs } from '@/router/menu'
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
|
||||||
// 标签页
|
|
||||||
const tabs = [
|
|
||||||
{
|
|
||||||
title: '我的订阅',
|
|
||||||
tab: 'mysub',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '热门订阅',
|
|
||||||
tab: 'popular',
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
// 当前标签
|
// 当前标签
|
||||||
const activeTab = ref(route.query.tab)
|
const activeTab = ref(route.query.tab)
|
||||||
|
|
||||||
// 跳转tab
|
// 跳转tab
|
||||||
function jumpTab(tab: string) {
|
function jumpTab(tab: string) {
|
||||||
router.push("/subscribe-movie?tab=" + tab)
|
router.push('/subscribe-movie?tab=' + tab)
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<VTabs v-model="activeTab">
|
<VTabs v-model="activeTab">
|
||||||
<VTab v-for="item in tabs" :value="item.tab" @click="jumpTab(item.tab)">
|
<VTab v-for="item in SubscribeMovieTabs" :value="item.tab" @click="jumpTab(item.tab)">
|
||||||
<span class="mx-5">{{ item.title }}</span>
|
<span class="mx-5">{{ item.title }}</span>
|
||||||
</VTab>
|
</VTab>
|
||||||
</VTabs>
|
</VTabs>
|
||||||
|
|||||||
@@ -2,34 +2,22 @@
|
|||||||
import SubscribeListView from '@/views/subscribe/SubscribeListView.vue'
|
import SubscribeListView from '@/views/subscribe/SubscribeListView.vue'
|
||||||
import SubscribePopularView from '@/views/subscribe/SubscribePopularView.vue'
|
import SubscribePopularView from '@/views/subscribe/SubscribePopularView.vue'
|
||||||
import router from '@/router'
|
import router from '@/router'
|
||||||
|
import { SubscribeTvTabs } from '@/router/menu'
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
|
||||||
// 标签页
|
|
||||||
const tabs = [
|
|
||||||
{
|
|
||||||
title: '我的订阅',
|
|
||||||
tab: 'mysub',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '热门订阅',
|
|
||||||
tab: 'popular',
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
// 当前标签
|
|
||||||
const activeTab = ref(route.query.tab)
|
const activeTab = ref(route.query.tab)
|
||||||
|
|
||||||
// 跳转tab
|
// 跳转tab
|
||||||
function jumpTab(tab: string) {
|
function jumpTab(tab: string) {
|
||||||
router.push("/subscribe-tv?tab=" + tab)
|
router.push('/subscribe-tv?tab=' + tab)
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<VTabs v-model="activeTab">
|
<VTabs v-model="activeTab">
|
||||||
<VTab v-for="item in tabs" :value="item.tab" @click="jumpTab(item.tab)">
|
<VTab v-for="item in SubscribeTvTabs" :value="item.tab" @click="jumpTab(item.tab)">
|
||||||
<span class="mx-5">{{ item.title }}</span>
|
<span class="mx-5">{{ item.title }}</span>
|
||||||
</VTab>
|
</VTab>
|
||||||
</VTabs>
|
</VTabs>
|
||||||
|
|||||||
@@ -0,0 +1,221 @@
|
|||||||
|
// 导般菜单
|
||||||
|
export const SystemNavMenus = [
|
||||||
|
{
|
||||||
|
title: '仪表板',
|
||||||
|
icon: 'mdi-home-outline',
|
||||||
|
to: '/dashboard',
|
||||||
|
header: '开始',
|
||||||
|
admin: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '推荐',
|
||||||
|
icon: 'mdi-table-star',
|
||||||
|
to: '/ranking',
|
||||||
|
header: '发现',
|
||||||
|
admin: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '资源搜索',
|
||||||
|
icon: 'mdi-magnify',
|
||||||
|
to: '/resource',
|
||||||
|
header: '发现',
|
||||||
|
admin: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '电影',
|
||||||
|
icon: 'mdi-movie-roll',
|
||||||
|
to: '/subscribe-movie?tab=mysub',
|
||||||
|
header: '订阅',
|
||||||
|
admin: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '电视剧',
|
||||||
|
icon: 'mdi-television-classic',
|
||||||
|
to: '/subscribe-tv?tab=mysub',
|
||||||
|
header: '订阅',
|
||||||
|
admin: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '日历',
|
||||||
|
icon: 'mdi-calendar',
|
||||||
|
to: '/calendar',
|
||||||
|
header: '订阅',
|
||||||
|
admin: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '正在下载',
|
||||||
|
icon: 'mdi-download-outline',
|
||||||
|
to: '/downloading',
|
||||||
|
header: '整理',
|
||||||
|
admin: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '历史记录',
|
||||||
|
icon: 'mdi-history',
|
||||||
|
to: '/history',
|
||||||
|
header: '整理',
|
||||||
|
admin: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '文件管理',
|
||||||
|
icon: 'mdi-folder-multiple-outline',
|
||||||
|
to: '/filemanager',
|
||||||
|
header: '整理',
|
||||||
|
admin: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '插件',
|
||||||
|
icon: 'mdi-apps',
|
||||||
|
to: '/plugins?tab=installed',
|
||||||
|
header: '系统',
|
||||||
|
admin: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '站点管理',
|
||||||
|
icon: 'mdi-web',
|
||||||
|
to: '/site',
|
||||||
|
header: '系统',
|
||||||
|
admin: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '设定',
|
||||||
|
icon: 'mdi-cog',
|
||||||
|
to: '/setting',
|
||||||
|
header: '系统',
|
||||||
|
admin: true,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
// 常用菜单功能
|
||||||
|
export const UserfulMenus = [
|
||||||
|
{
|
||||||
|
title: '搜索设置',
|
||||||
|
icon: 'mdi-magnify',
|
||||||
|
to: 'setting?tab=search',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '订阅设置',
|
||||||
|
icon: 'mdi-rss',
|
||||||
|
to: 'setting?tab=subscribe',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '服务',
|
||||||
|
icon: 'mdi-list-box',
|
||||||
|
to: 'setting?tab=service',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '词表',
|
||||||
|
icon: 'mdi-file-word-box',
|
||||||
|
to: 'setting?tab=words',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '历史记录',
|
||||||
|
icon: 'mdi-history',
|
||||||
|
to: 'history',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
// 设定标签页
|
||||||
|
export const SettingTabs = [
|
||||||
|
{
|
||||||
|
title: '用户',
|
||||||
|
icon: 'mdi-account',
|
||||||
|
tab: 'account',
|
||||||
|
description: '个人信息、用户管理、修改密码、双重认证',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '连接',
|
||||||
|
icon: 'mdi-server-network',
|
||||||
|
tab: 'system',
|
||||||
|
description: '下载器(Qbittorrent、Transmission)、媒体服务器(Emby、Jellyfin、Plex)',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '目录',
|
||||||
|
icon: 'mdi-folder',
|
||||||
|
tab: 'directory',
|
||||||
|
description: '下载目录、媒体库目录、整理模式',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '站点',
|
||||||
|
icon: 'mdi-web',
|
||||||
|
tab: 'site',
|
||||||
|
description: '站点同步、下载优先规则、站点重置',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '搜索',
|
||||||
|
icon: 'mdi-magnify',
|
||||||
|
tab: 'search',
|
||||||
|
description: '媒体数据源、搜索站点、搜索优先级、默认过滤规则',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '订阅',
|
||||||
|
icon: 'mdi-rss',
|
||||||
|
tab: 'subscribe',
|
||||||
|
description: '订阅站点、订阅优先级、洗版优先级、默认过滤规则',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '服务',
|
||||||
|
icon: 'mdi-list-box',
|
||||||
|
tab: 'service',
|
||||||
|
description: '定时作业',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '通知',
|
||||||
|
icon: 'mdi-bell',
|
||||||
|
tab: 'notification',
|
||||||
|
description: '通知渠道(微信、Telegram、Slack、SynologyChat、VoceChat)、消息类型',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '词表',
|
||||||
|
icon: 'mdi-file-word-box',
|
||||||
|
tab: 'words',
|
||||||
|
description: '自定义识别词、自定义制作组/字幕组、自定义占位符、文件整理屏蔽词',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '关于',
|
||||||
|
icon: 'mdi-information',
|
||||||
|
tab: 'about',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
// 电影订阅标签页
|
||||||
|
export const SubscribeMovieTabs = [
|
||||||
|
{
|
||||||
|
title: '我的订阅',
|
||||||
|
tab: 'mysub',
|
||||||
|
icon: 'mdi-movie-roll',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '热门订阅',
|
||||||
|
tab: 'popular',
|
||||||
|
icon: 'mdi-movie-roll',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
// 电视剧订阅标签页
|
||||||
|
export const SubscribeTvTabs = [
|
||||||
|
{
|
||||||
|
title: '我的订阅',
|
||||||
|
tab: 'mysub',
|
||||||
|
icon: 'mdi-television-classic',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '热门订阅',
|
||||||
|
tab: 'popular',
|
||||||
|
icon: 'mdi-television-classic',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
// 插件标签页
|
||||||
|
export const PluginTabs = [
|
||||||
|
{
|
||||||
|
title: '我的插件',
|
||||||
|
tab: 'installed',
|
||||||
|
icon: 'mdi-puzzle',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '插件市场',
|
||||||
|
tab: 'market',
|
||||||
|
icon: 'mdi-store',
|
||||||
|
},
|
||||||
|
]
|
||||||
@@ -10,6 +10,7 @@ import { useDisplay } from 'vuetify'
|
|||||||
import { isNullOrEmptyObject } from '@/@core/utils'
|
import { isNullOrEmptyObject } from '@/@core/utils'
|
||||||
import { useDefer } from '@/@core/utils/dom'
|
import { useDefer } from '@/@core/utils/dom'
|
||||||
import router from '@/router'
|
import router from '@/router'
|
||||||
|
import { PluginTabs } from '@/router/menu'
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
|
||||||
@@ -25,18 +26,6 @@ const activeTab = ref(route.query.tab)
|
|||||||
// 插件ID参数
|
// 插件ID参数
|
||||||
const pluginId = ref(route.query.id)
|
const pluginId = ref(route.query.id)
|
||||||
|
|
||||||
// 标签页
|
|
||||||
const tabs = [
|
|
||||||
{
|
|
||||||
title: '我的插件',
|
|
||||||
tab: 'installed',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '插件市场',
|
|
||||||
tab: 'market',
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
// 当前排序字段
|
// 当前排序字段
|
||||||
const activeSort = ref(null)
|
const activeSort = ref(null)
|
||||||
|
|
||||||
@@ -346,7 +335,7 @@ onBeforeMount(async () => {
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<VTabs v-model="activeTab">
|
<VTabs v-model="activeTab">
|
||||||
<VTab v-for="item in tabs" :value="item.tab" @click="jumpTab(item.tab)">
|
<VTab v-for="item in PluginTabs" :value="item.tab" @click="jumpTab(item.tab)">
|
||||||
<span class="mx-5">{{ item.title }}</span>
|
<span class="mx-5">{{ item.title }}</span>
|
||||||
</VTab>
|
</VTab>
|
||||||
</VTabs>
|
</VTabs>
|
||||||
|
|||||||
@@ -21,8 +21,7 @@ const transferExcludeWords = ref('')
|
|||||||
async function queryCustomIdentifiers() {
|
async function queryCustomIdentifiers() {
|
||||||
try {
|
try {
|
||||||
const result: { [key: string]: any } = await api.get('system/setting/CustomIdentifiers')
|
const result: { [key: string]: any } = await api.get('system/setting/CustomIdentifiers')
|
||||||
|
if (result && result.data && result.data.value) customIdentifiers.value = result.data.value.join('\n')
|
||||||
customIdentifiers.value = result.data?.value.join('\n')
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
}
|
}
|
||||||
@@ -32,8 +31,7 @@ async function queryCustomIdentifiers() {
|
|||||||
async function queryCustomReleaseGroups() {
|
async function queryCustomReleaseGroups() {
|
||||||
try {
|
try {
|
||||||
const result: { [key: string]: any } = await api.get('system/setting/CustomReleaseGroups')
|
const result: { [key: string]: any } = await api.get('system/setting/CustomReleaseGroups')
|
||||||
|
if (result && result.data && result.data.value) customReleaseGroups.value = result.data.value.join('\n')
|
||||||
customReleaseGroups.value = result.data?.value.join('\n')
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
}
|
}
|
||||||
@@ -43,8 +41,7 @@ async function queryCustomReleaseGroups() {
|
|||||||
async function queryCustomization() {
|
async function queryCustomization() {
|
||||||
try {
|
try {
|
||||||
const result: { [key: string]: any } = await api.get('system/setting/Customization')
|
const result: { [key: string]: any } = await api.get('system/setting/Customization')
|
||||||
|
if (result && result.data && result.data.value) customization.value = result.data?.value.join('\n')
|
||||||
customization.value = result.data?.value.join('\n')
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
}
|
}
|
||||||
@@ -54,8 +51,7 @@ async function queryCustomization() {
|
|||||||
async function queryTransferExcludeWords() {
|
async function queryTransferExcludeWords() {
|
||||||
try {
|
try {
|
||||||
const result: { [key: string]: any } = await api.get('system/setting/TransferExcludeWords')
|
const result: { [key: string]: any } = await api.get('system/setting/TransferExcludeWords')
|
||||||
|
if (result && result.data && result.data.value) transferExcludeWords.value = result.data?.value.join('\n')
|
||||||
transferExcludeWords.value = result.data?.value.join('\n')
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,15 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import api from '@/api'
|
import api from '@/api'
|
||||||
import type { Plugin } from '@/api/types'
|
import type { Plugin } from '@/api/types'
|
||||||
|
import {
|
||||||
|
SystemNavMenus,
|
||||||
|
UserfulMenus,
|
||||||
|
SubscribeMovieTabs,
|
||||||
|
SubscribeTvTabs,
|
||||||
|
PluginTabs,
|
||||||
|
SettingTabs,
|
||||||
|
} from '@/router/menu'
|
||||||
|
import { NavMenu } from '@/@layouts/types'
|
||||||
|
|
||||||
// 路由
|
// 路由
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
@@ -18,43 +27,77 @@ const searchWordInput = ref<HTMLElement | null>(null)
|
|||||||
const searchHintList = ref<string[]>([])
|
const searchHintList = ref<string[]>([])
|
||||||
|
|
||||||
// 所有菜单功能
|
// 所有菜单功能
|
||||||
const menuItems = ref([])
|
function getMenus(): NavMenu[] {
|
||||||
|
let menus: NavMenu[] = []
|
||||||
|
// 导航菜单
|
||||||
|
for (const key in SystemNavMenus) {
|
||||||
|
menus.push({
|
||||||
|
title: SystemNavMenus[key].title,
|
||||||
|
icon: SystemNavMenus[key].icon,
|
||||||
|
to: SystemNavMenus[key].to,
|
||||||
|
header: SystemNavMenus[key].header,
|
||||||
|
admin: SystemNavMenus[key].admin,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 各类标签页
|
||||||
|
for (const key in SettingTabs) {
|
||||||
|
menus.push({
|
||||||
|
title: '设定 -> ' + SettingTabs[key].title,
|
||||||
|
icon: SettingTabs[key].icon,
|
||||||
|
to: `/setting?tab=${SettingTabs[key].tab}`,
|
||||||
|
header: '',
|
||||||
|
admin: true,
|
||||||
|
description: SettingTabs[key].description,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
for (const key in SubscribeMovieTabs) {
|
||||||
|
menus.push({
|
||||||
|
title: '电影 -> ' + SubscribeMovieTabs[key].title,
|
||||||
|
icon: SubscribeMovieTabs[key].icon,
|
||||||
|
to: `/subscribe-movie?tab=${SubscribeMovieTabs[key].tab}`,
|
||||||
|
header: '',
|
||||||
|
admin: false,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
for (const key in SubscribeTvTabs) {
|
||||||
|
menus.push({
|
||||||
|
title: '电视剧 -> ' + SubscribeTvTabs[key].title,
|
||||||
|
icon: SubscribeTvTabs[key].icon,
|
||||||
|
to: `/subscribe-tv?tab=${SubscribeTvTabs[key].tab}`,
|
||||||
|
header: '',
|
||||||
|
admin: false,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
for (const key in PluginTabs) {
|
||||||
|
menus.push({
|
||||||
|
title: '插件 -> ' + PluginTabs[key].title,
|
||||||
|
icon: PluginTabs[key].icon,
|
||||||
|
to: `/plugins?tab=${PluginTabs[key].tab}`,
|
||||||
|
header: '',
|
||||||
|
admin: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// 常用菜单功能
|
return menus
|
||||||
const commonMenuItems = ref([
|
}
|
||||||
{
|
|
||||||
title: '搜索设置',
|
// 匹配的菜单列表
|
||||||
icon: 'mdi-magnify',
|
const matchedMenuItems = computed(() => {
|
||||||
to: 'setting?tab=search',
|
if (!searchWord.value) return []
|
||||||
},
|
const lowerWord = searchWord.value?.toLowerCase()
|
||||||
{
|
const menuItems = getMenus()
|
||||||
title: '订阅设置',
|
if (menuItems)
|
||||||
icon: 'mdi-rss',
|
return menuItems.filter(
|
||||||
to: 'setting?tab=subscribe',
|
item =>
|
||||||
},
|
item.title.toLowerCase().includes(lowerWord) ||
|
||||||
{
|
(item.description && item.description.toLowerCase().includes(lowerWord)),
|
||||||
title: '服务',
|
)
|
||||||
icon: 'mdi-list-box',
|
return []
|
||||||
to: 'setting?tab=service',
|
})
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '词表',
|
|
||||||
icon: 'mdi-file-word-box',
|
|
||||||
to: 'setting?tab=words',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '历史记录',
|
|
||||||
icon: 'mdi-history',
|
|
||||||
to: 'history',
|
|
||||||
},
|
|
||||||
])
|
|
||||||
|
|
||||||
// 所有插件(已安装)
|
// 所有插件(已安装)
|
||||||
const pluginItems = ref<Plugin[]>([])
|
const pluginItems = ref<Plugin[]>([])
|
||||||
|
|
||||||
// 匹配的菜单列表
|
|
||||||
const matchedMenuItems = ref([])
|
|
||||||
|
|
||||||
// 获取插件列表数据
|
// 获取插件列表数据
|
||||||
async function fetchInstalledPlugins() {
|
async function fetchInstalledPlugins() {
|
||||||
try {
|
try {
|
||||||
@@ -153,7 +196,7 @@ onMounted(() => {
|
|||||||
@click="searchMedia('media')"
|
@click="searchMedia('media')"
|
||||||
>
|
>
|
||||||
<VListItemTitle>
|
<VListItemTitle>
|
||||||
搜索 <span class="font-bold">{{ searchWord }} </span> 相关的电影、电视剧
|
搜索 <span class="font-bold">{{ searchWord }} </span> 相关的电影、电视剧 ...
|
||||||
</VListItemTitle>
|
</VListItemTitle>
|
||||||
<template #append>
|
<template #append>
|
||||||
<VIcon v-if="hover.isHovering" icon="ri-corner-down-left-line" />
|
<VIcon v-if="hover.isHovering" icon="ri-corner-down-left-line" />
|
||||||
@@ -171,7 +214,7 @@ onMounted(() => {
|
|||||||
@click="searchMedia('person')"
|
@click="searchMedia('person')"
|
||||||
>
|
>
|
||||||
<VListItemTitle>
|
<VListItemTitle>
|
||||||
搜索 <span class="font-bold">{{ searchWord }}</span> 相关的人物
|
搜索 <span class="font-bold">{{ searchWord }}</span> 相关的人物 ...
|
||||||
</VListItemTitle>
|
</VListItemTitle>
|
||||||
<template #append>
|
<template #append>
|
||||||
<VIcon v-if="hover.isHovering" icon="ri-corner-down-left-line" />
|
<VIcon v-if="hover.isHovering" icon="ri-corner-down-left-line" />
|
||||||
@@ -180,6 +223,25 @@ onMounted(() => {
|
|||||||
</template>
|
</template>
|
||||||
</VHover>
|
</VHover>
|
||||||
<VListSubheader v-if="matchedMenuItems.length > 0"> 功能 </VListSubheader>
|
<VListSubheader v-if="matchedMenuItems.length > 0"> 功能 </VListSubheader>
|
||||||
|
<VHover v-if="matchedMenuItems.length > 0" v-for="menu in matchedMenuItems" :key="menu.title">
|
||||||
|
<template #default="hover">
|
||||||
|
<VListItem
|
||||||
|
:prepend-icon="menu.icon as string"
|
||||||
|
density="compact"
|
||||||
|
link
|
||||||
|
v-bind="hover.props"
|
||||||
|
@click="goPage(menu.to as string)"
|
||||||
|
>
|
||||||
|
<VListItemTitle>
|
||||||
|
{{ menu.title }}
|
||||||
|
</VListItemTitle>
|
||||||
|
<VListItemSubtitle v-if="menu.description"> {{ menu.description }} </VListItemSubtitle>
|
||||||
|
<template #append>
|
||||||
|
<VIcon v-if="hover.isHovering" icon="ri-corner-down-left-line" />
|
||||||
|
</template>
|
||||||
|
</VListItem>
|
||||||
|
</template>
|
||||||
|
</VHover>
|
||||||
<VListSubheader v-if="matchedPluginItems.length > 0"> 插件 </VListSubheader>
|
<VListSubheader v-if="matchedPluginItems.length > 0"> 插件 </VListSubheader>
|
||||||
<VHover v-if="matchedPluginItems.length > 0" v-for="plugin in matchedPluginItems" :key="plugin.id">
|
<VHover v-if="matchedPluginItems.length > 0" v-for="plugin in matchedPluginItems" :key="plugin.id">
|
||||||
<template #default="hover">
|
<template #default="hover">
|
||||||
@@ -206,7 +268,7 @@ onMounted(() => {
|
|||||||
<VCol cols="12" md="6">
|
<VCol cols="12" md="6">
|
||||||
<p class="custom-letter-spacing text-sm text-disabled text-uppercase py-2 px-4 mb-0">常用功能</p>
|
<p class="custom-letter-spacing text-sm text-disabled text-uppercase py-2 px-4 mb-0">常用功能</p>
|
||||||
<VList lines="one">
|
<VList lines="one">
|
||||||
<VHover v-for="(menu, index) in commonMenuItems" :key="index">
|
<VHover v-for="(menu, index) in UserfulMenus" :key="index">
|
||||||
<template #default="hover">
|
<template #default="hover">
|
||||||
<VListItem
|
<VListItem
|
||||||
:prepend-icon="menu.icon"
|
:prepend-icon="menu.icon"
|
||||||
|
|||||||
Reference in New Issue
Block a user