From 5bd71b4688010f3aa0e41b39e04c7b51d2918faf Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 12 Jun 2025 11:13:37 +0800 Subject: [PATCH] fix https://github.com/jxxghp/MoviePilot/issues/4424#issuecomment-2964853532 --- package.json | 2 +- src/components/dialog/SearchBarDialog.vue | 75 +++++++++++++++++++---- src/layouts/components/SearchBar.vue | 20 +----- src/locales/en-US.ts | 2 +- src/locales/zh-CN.ts | 2 +- src/locales/zh-TW.ts | 2 +- src/pages/appcenter.vue | 1 - 7 files changed, 69 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 3de09d70..b053e7f4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "moviepilot", - "version": "2.5.5", + "version": "2.5.5-1", "private": true, "type": "module", "bin": "dist/service.js", diff --git a/src/components/dialog/SearchBarDialog.vue b/src/components/dialog/SearchBarDialog.vue index 659efb2e..4372594f 100644 --- a/src/components/dialog/SearchBarDialog.vue +++ b/src/components/dialog/SearchBarDialog.vue @@ -7,6 +7,7 @@ import { useUserStore } from '@/stores' import SearchSiteDialog from '@/components/dialog/SearchSiteDialog.vue' import { useI18n } from 'vue-i18n' import { useDisplay } from 'vuetify' +import { hasPermission, filterMenusByPermission } from '@/utils/permission' // 显示器宽度 const display = useDisplay() @@ -31,6 +32,37 @@ const superUser = userStore.superUser // 当前用户名 const userName = userStore.userName +// 权限检查 +const hasSearchPermission = computed(() => { + return hasPermission( + { + is_superuser: userStore.superUser, + ...userStore.permissions, + }, + 'search', + ) +}) + +const hasSubscribePermission = computed(() => { + return hasPermission( + { + is_superuser: userStore.superUser, + ...userStore.permissions, + }, + 'subscribe', + ) +}) + +const hasManagePermission = computed(() => { + return hasPermission( + { + is_superuser: userStore.superUser, + ...userStore.permissions, + }, + 'manage', + ) +}) + // 所有订阅数据 const SubscribeItems = ref([]) @@ -109,18 +141,27 @@ function getMenus(): NavMenu[] { return menus } +// 获取用户权限信息 +const userPermissions = computed(() => ({ + is_superuser: userStore.superUser, + ...userStore.permissions, +})) + // 匹配的菜单列表 const matchedMenuItems = computed(() => { if (!searchWord.value) return [] - if (!superUser) return [] const lowerWord = (searchWord.value as string).toLowerCase() const menuItems = getMenus() - if (menuItems) - return menuItems.filter( + if (menuItems) { + // 先根据用户权限过滤菜单 + const filteredMenus = filterMenusByPermission(menuItems, userPermissions.value) + // 再根据搜索词过滤 + return filteredMenus.filter( item => item.title.toLowerCase().includes(lowerWord) || (item.description && item.description.toLowerCase().includes(lowerWord)), ) + } return [] }) @@ -140,10 +181,10 @@ async function fetchInstalledPlugins() { } } -// 区配的插件列表 +// 匹配的插件列表 const matchedPluginItems = computed(() => { if (!searchWord.value) return [] - if (!superUser) return [] + if (!hasManagePermission.value) return [] const lowerWord = (searchWord.value as string).toLowerCase() return pluginItems.value.filter((item: Plugin) => { if (!item.plugin_name && !item.plugin_desc) return false @@ -196,6 +237,7 @@ const openSiteDialog = () => { // 匹配的订阅列表 const matchedSubscribeItems = computed(() => { if (!searchWord.value) return [] + if (!hasSubscribePermission.value) return [] const lowerWord = (searchWord.value as string).toLowerCase() return SubscribeItems.value.filter((item: Subscribe) => { return (item.name.toLowerCase().includes(lowerWord) && (superUser || userName === item.username)) || false @@ -298,11 +340,20 @@ onMounted(() => { setTimeout(() => { searchWordInput.value?.focus() }, 500) - fetchInstalledPlugins() - fetchSubscribes() + // 根据权限加载不同的数据 + if (hasManagePermission.value) { + fetchInstalledPlugins() + } + if (hasSubscribePermission.value) { + fetchSubscribes() + } loadRecentSearches() - loadUserSitePreferences() - if (superUser) queryAllSites() + if (hasSearchPermission.value) { + loadUserSitePreferences() + if (hasManagePermission.value) { + queryAllSites() + } + } }) - + -