调整词表、缓存、关于功能的位置

This commit is contained in:
jxxghp
2025-09-11 15:29:24 +08:00
parent 28afe2a922
commit 2ddc51aa4f
10 changed files with 228 additions and 167 deletions
@@ -118,10 +118,7 @@ onMounted(() => {
<template> <template>
<div class="px-3"> <div class="px-3">
<div class="section"> <div class="section">
<div> <div class="section border-gray-800">
<h3 class="heading">{{ t('setting.about.title') }}</h3>
</div>
<div class="section border-t border-gray-800">
<dl> <dl>
<div> <div>
<div class="max-w-6xl py-4 sm:grid sm:grid-cols-3 sm:gap-4"> <div class="max-w-6xl py-4 sm:grid sm:grid-cols-3 sm:gap-4">
+63 -1
View File
@@ -5,6 +5,8 @@ import LoggingView from '@/views/system/LoggingView.vue'
import RuleTestView from '@/views/system/RuleTestView.vue' import RuleTestView from '@/views/system/RuleTestView.vue'
import ModuleTestView from '@/views/system/ModuleTestView.vue' import ModuleTestView from '@/views/system/ModuleTestView.vue'
import MessageView from '@/views/system/MessageView.vue' import MessageView from '@/views/system/MessageView.vue'
import WordsView from '@/views/system/WordsView.vue'
import CacheView from '@/views/system/CacheView.vue'
import api from '@/api' import api from '@/api'
import { useDisplay } from 'vuetify' import { useDisplay } from 'vuetify'
import { getQueryValue } from '@/@core/utils' import { getQueryValue } from '@/@core/utils'
@@ -41,6 +43,12 @@ const systemTestDialog = ref(false)
// 消息中心弹窗 // 消息中心弹窗
const messageDialog = ref(false) const messageDialog = ref(false)
// 词表设置弹窗
const wordsDialog = ref(false)
// 缓存管理弹窗
const cacheDialog = ref(false)
// 输入消息 // 输入消息
const user_message = ref('') const user_message = ref('')
@@ -100,6 +108,20 @@ const shortcuts = [
dialog: 'message', dialog: 'message',
dialogRef: messageDialog, dialogRef: messageDialog,
}, },
{
title: t('shortcut.words.title'),
subtitle: t('shortcut.words.subtitle'),
icon: 'mdi-file-word-box',
dialog: 'words',
dialogRef: wordsDialog,
},
{
title: t('shortcut.cache.title'),
subtitle: t('shortcut.cache.subtitle'),
icon: 'mdi-database',
dialog: 'cache',
dialogRef: cacheDialog,
},
] ]
// 打开对话框 // 打开对话框
@@ -249,7 +271,15 @@ onMounted(() => {
flat flat
class="pa-2 d-flex align-center cursor-pointer transition-transform duration-300 hover:-translate-y-1 border h-full" class="pa-2 d-flex align-center cursor-pointer transition-transform duration-300 hover:-translate-y-1 border h-full"
hover hover
@click="item.dialog === 'message' ? openMessageDialog() : openDialog(item.dialogRef)" @click="
item.dialog === 'message'
? openMessageDialog()
: item.dialog === 'words'
? openDialog(item.dialogRef)
: item.dialog === 'cache'
? openDialog(item.dialogRef)
: openDialog(item.dialogRef)
"
> >
<VAvatar variant="text" size="48" rounded="lg"> <VAvatar variant="text" size="48" rounded="lg">
<VIcon color="primary" :icon="item.icon" size="24" /> <VIcon color="primary" :icon="item.icon" size="24" />
@@ -425,4 +455,36 @@ onMounted(() => {
</VCardActions> </VCardActions>
</VCard> </VCard>
</VDialog> </VDialog>
<!-- 词表设置弹窗 -->
<VDialog v-if="wordsDialog" v-model="wordsDialog" max-width="60rem" scrollable :fullscreen="!display.mdAndUp.value">
<VCard>
<VCardItem>
<VCardTitle>
<VIcon icon="mdi-file-word-box" class="me-2" />
{{ t('shortcut.words.subtitle') }}
</VCardTitle>
<VDialogCloseBtn @click="wordsDialog = false" />
</VCardItem>
<VDivider />
<VCardText>
<WordsView />
</VCardText>
</VCard>
</VDialog>
<!-- 缓存管理弹窗 -->
<VDialog v-if="cacheDialog" v-model="cacheDialog" max-width="90rem" scrollable :fullscreen="!display.mdAndUp.value">
<VCard>
<VCardItem>
<VCardTitle>
<VIcon icon="mdi-database" class="me-2" />
{{ t('shortcut.cache.subtitle') }}
</VCardTitle>
<VDialogCloseBtn @click="cacheDialog = false" />
</VCardItem>
<VDivider />
<VCardText>
<CacheView />
</VCardText>
</VCard>
</VDialog>
</template> </template>
+34
View File
@@ -5,6 +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 AboutDialog from '@/components/dialog/AboutDialog.vue'
import { useAuthStore, useUserStore, useGlobalSettingsStore } 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'
@@ -55,6 +56,9 @@ const transparencyLevel = ref(localStorage.getItem('transparency-level') || 'med
const isTransparentTheme = computed(() => currentThemeName.value === 'transparent') const isTransparentTheme = computed(() => currentThemeName.value === 'transparent')
const showTransparencyDialog = ref(false) const showTransparencyDialog = ref(false)
// 关于对话框
const aboutDialog = ref(false)
// 预设值配置 // 预设值配置
const transparencyPresets = { const transparencyPresets = {
low: { opacity: 0.1, blur: 5 }, low: { opacity: 0.1, blur: 5 },
@@ -207,6 +211,11 @@ function showSiteAuthDialog() {
siteAuthDialog.value = true siteAuthDialog.value = true
} }
// 显示关于对话框
function showAboutDialog() {
aboutDialog.value = true
}
// 用户站点认证成功 // 用户站点认证成功
function siteAuthDone() { function siteAuthDone() {
siteAuthDialog.value = false siteAuthDialog.value = false
@@ -633,6 +642,14 @@ onUnmounted(() => {
<VListItemTitle>{{ t('user.helpDocs') }}</VListItemTitle> <VListItemTitle>{{ t('user.helpDocs') }}</VListItemTitle>
</VListItem> </VListItem>
<!-- 👉 About -->
<VListItem @click="showAboutDialog" class="mb-1 rounded-lg" hover>
<template #prepend>
<VIcon icon="mdi-information-outline" />
</template>
<VListItemTitle>{{ t('setting.about.title') }}</VListItemTitle>
</VListItem>
<!-- Divider --> <!-- Divider -->
<VDivider v-if="superUser" class="my-3" /> <VDivider v-if="superUser" class="my-3" />
@@ -777,6 +794,23 @@ onUnmounted(() => {
</VCardText> </VCardText>
</VCard> </VCard>
</VDialog> </VDialog>
<!-- 关于对话框 -->
<VDialog v-if="aboutDialog" v-model="aboutDialog" max-width="50rem" scrollable>
<VCard>
<VCardItem>
<VCardTitle>
<VIcon icon="mdi-information" class="me-2" />
{{ t('setting.about.title') }}
</VCardTitle>
<VDialogCloseBtn @click="aboutDialog = false" />
</VCardItem>
<VDivider />
<VCardText>
<AboutDialog />
</VCardText>
</VCard>
</VDialog>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
+11 -6
View File
@@ -324,11 +324,6 @@ export default {
title: 'Notifications', title: 'Notifications',
description: 'Notification channels (WeChat, Telegram, Slack, SynologyChat, VoceChat, WebPush), message scope', description: 'Notification channels (WeChat, Telegram, Slack, SynologyChat, VoceChat, WebPush), message scope',
}, },
words: {
title: 'Word Lists',
description:
'Custom recognition words, custom production/subtitle groups, custom placeholders, file organization block words',
},
about: { about: {
title: 'About', title: 'About',
description: 'Software version', description: 'Software version',
@@ -375,6 +370,7 @@ export default {
wizardSettings: 'Setup Wizard', wizardSettings: 'Setup Wizard',
siteAuth: 'User Authentication', siteAuth: 'User Authentication',
helpDocs: 'Help Documents', helpDocs: 'Help Documents',
about: 'About',
restart: 'Restart', restart: 'Restart',
management: 'User Management', management: 'User Management',
noUsers: 'No Users', noUsers: 'No Users',
@@ -514,6 +510,14 @@ export default {
title: 'Messages', title: 'Messages',
subtitle: 'Message Center', subtitle: 'Message Center',
}, },
words: {
title: 'Words',
subtitle: 'Word Settings',
},
cache: {
title: 'Cache',
subtitle: 'Manage Cache',
},
}, },
workflow: { workflow: {
components: 'Action Components', components: 'Action Components',
@@ -1233,7 +1237,8 @@ export default {
apiTokenLength: 'API Token must be at least 16 characters', apiTokenLength: 'API Token must be at least 16 characters',
githubToken: 'Github Token', githubToken: 'Github Token',
githubTokenFormat: 'ghp_**** or github_pat_****', githubTokenFormat: 'ghp_**** or github_pat_****',
githubTokenHint: 'Used to increase the rate limit threshold when plugins access Github APIit is recommended to configure, otherwise plugins may not work properly', githubTokenHint:
'Used to increase the rate limit threshold when plugins access Github APIit is recommended to configure, otherwise plugins may not work properly',
ocrHost: 'OCR Server', ocrHost: 'OCR Server',
ocrHostHint: 'Used for site check-in, updating site cookies and other captcha recognition', ocrHostHint: 'Used for site check-in, updating site cookies and other captcha recognition',
advancedSettings: 'Advanced Settings', advancedSettings: 'Advanced Settings',
+9 -4
View File
@@ -323,10 +323,6 @@ export default {
title: '通知', title: '通知',
description: '通知渠道(微信、Telegram、Slack、SynologyChat、VoceChat、WebPush)、消息发送范围', description: '通知渠道(微信、Telegram、Slack、SynologyChat、VoceChat、WebPush)、消息发送范围',
}, },
words: {
title: '词表',
description: '自定义识别词、自定义制作组/字幕组、自定义占位符、文件整理屏蔽词',
},
about: { about: {
title: '关于', title: '关于',
description: '软件版本', description: '软件版本',
@@ -373,6 +369,7 @@ export default {
wizardSettings: '设置向导', wizardSettings: '设置向导',
siteAuth: '用户认证', siteAuth: '用户认证',
helpDocs: '帮助文档', helpDocs: '帮助文档',
about: '关于',
restart: '重启', restart: '重启',
management: '用户管理', management: '用户管理',
noUsers: '没有用户', noUsers: '没有用户',
@@ -511,6 +508,14 @@ export default {
title: '消息', title: '消息',
subtitle: '消息中心', subtitle: '消息中心',
}, },
words: {
title: '词表',
subtitle: '词表设置',
},
cache: {
title: '缓存',
subtitle: '管理缓存',
},
}, },
workflow: { workflow: {
components: '动作组件', components: '动作组件',
+9 -4
View File
@@ -324,10 +324,6 @@ export default {
title: '通知', title: '通知',
description: '通知渠道(微信、Telegram、Slack、SynologyChat、VoceChat、WebPush)、消息發送範圍', description: '通知渠道(微信、Telegram、Slack、SynologyChat、VoceChat、WebPush)、消息發送範圍',
}, },
words: {
title: '詞表',
description: '自定義識別詞、自定義製作組/字幕組、自定義占位符、文件整理屏蔽詞',
},
about: { about: {
title: '關於', title: '關於',
description: '軟件版本', description: '軟件版本',
@@ -374,6 +370,7 @@ export default {
wizardSettings: '設定向導', wizardSettings: '設定向導',
siteAuth: '用戶認證', siteAuth: '用戶認證',
helpDocs: '幫助文檔', helpDocs: '幫助文檔',
about: '關於',
restart: '重啟', restart: '重啟',
management: '用戶管理', management: '用戶管理',
noUsers: '沒有用戶', noUsers: '沒有用戶',
@@ -498,6 +495,14 @@ export default {
title: '消息', title: '消息',
subtitle: '消息中心', subtitle: '消息中心',
}, },
words: {
title: '詞表',
subtitle: '詞表設置',
},
cache: {
title: '緩存',
subtitle: '管理緩存',
},
}, },
workflow: { workflow: {
components: '動作組件', components: '動作組件',
-30
View File
@@ -3,15 +3,12 @@ import { useRoute } from 'vue-router'
import router from '@/router' import router from '@/router'
import AccountSettingNotification from '@/views/setting/AccountSettingNotification.vue' import AccountSettingNotification from '@/views/setting/AccountSettingNotification.vue'
import AccountSettingSite from '@/views/setting/AccountSettingSite.vue' import AccountSettingSite from '@/views/setting/AccountSettingSite.vue'
import AccountSettingWords from '@/views/setting/AccountSettingWords.vue'
import AccountSettingAbout from '@/views/setting/AccountSettingAbout.vue'
import AccountSettingSearch from '@/views/setting/AccountSettingSearch.vue' import AccountSettingSearch from '@/views/setting/AccountSettingSearch.vue'
import AccountSettingSubscribe from '@/views/setting/AccountSettingSubscribe.vue' import AccountSettingSubscribe from '@/views/setting/AccountSettingSubscribe.vue'
import AccountSettingSystem from '@/views/setting/AccountSettingSystem.vue' import AccountSettingSystem from '@/views/setting/AccountSettingSystem.vue'
import AccountSettingService from '@/views/setting/AccountSettingService.vue' import AccountSettingService from '@/views/setting/AccountSettingService.vue'
import AccountSettingDirectory from '@/views/setting/AccountSettingDirectory.vue' import AccountSettingDirectory from '@/views/setting/AccountSettingDirectory.vue'
import AccountSettingRule from '@/views/setting/AccountSettingRule.vue' import AccountSettingRule from '@/views/setting/AccountSettingRule.vue'
import AccountSettingCache from '@/views/setting/AccountSettingCache.vue'
import { getSettingTabs } from '@/router/i18n-menu' import { getSettingTabs } from '@/router/i18n-menu'
import { useDynamicHeaderTab } from '@/composables/useDynamicHeaderTab' import { useDynamicHeaderTab } from '@/composables/useDynamicHeaderTab'
@@ -104,15 +101,6 @@ onMounted(() => {
</transition> </transition>
</VWindowItem> </VWindowItem>
<!-- 缓存 -->
<VWindowItem value="cache">
<transition name="fade-slide" appear>
<div>
<AccountSettingCache />
</div>
</transition>
</VWindowItem>
<!-- 通知 --> <!-- 通知 -->
<VWindowItem value="notification"> <VWindowItem value="notification">
<transition name="fade-slide" appear> <transition name="fade-slide" appear>
@@ -121,24 +109,6 @@ onMounted(() => {
</div> </div>
</transition> </transition>
</VWindowItem> </VWindowItem>
<!-- 词表 -->
<VWindowItem value="words">
<transition name="fade-slide" appear>
<div>
<AccountSettingWords />
</div>
</transition>
</VWindowItem>
<!-- 关于 -->
<VWindowItem value="about">
<transition name="fade-slide" appear>
<div>
<AccountSettingAbout />
</div>
</transition>
</VWindowItem>
</VWindow> </VWindow>
</div> </div>
</template> </template>
-18
View File
@@ -194,30 +194,12 @@ export function getSettingTabs() {
tab: 'scheduler', tab: 'scheduler',
description: t('settingTabs.scheduler.description'), description: t('settingTabs.scheduler.description'),
}, },
{
title: t('settingTabs.cache.title'),
icon: 'mdi-database',
tab: 'cache',
description: t('settingTabs.cache.description'),
},
{ {
title: t('settingTabs.notification.title'), title: t('settingTabs.notification.title'),
icon: 'mdi-bell', icon: 'mdi-bell',
tab: 'notification', tab: 'notification',
description: t('settingTabs.notification.description'), description: t('settingTabs.notification.description'),
}, },
{
title: t('settingTabs.words.title'),
icon: 'mdi-file-word-box',
tab: 'words',
description: t('settingTabs.words.description'),
},
{
title: t('settingTabs.about.title'),
icon: 'mdi-information',
tab: 'about',
description: t('settingTabs.about.description'),
},
] ]
} }
@@ -232,64 +232,65 @@ onMounted(() => {
</script> </script>
<template> <template>
<VCard> <div>
<VCardItem> <!-- 工具栏操作按钮 -->
<VCardTitle>{{ t('setting.cache.title') }}</VCardTitle> <VCard class="mb-4">
<VCardSubtitle>{{ t('setting.cache.subtitle') }}</VCardSubtitle> <VCardItem>
<VCardTitle>{{ t('setting.cache.title') }}</VCardTitle>
<VCardSubtitle>{{ t('setting.cache.subtitle') }}</VCardSubtitle>
<template #append> <template #append>
<div class="d-flex gap-2"> <div class="d-flex gap-2">
<VBtn icon color="primary" :loading="loading" @click="refreshCache"> <VBtn icon color="primary" :loading="loading" @click="refreshCache">
<VIcon>mdi-refresh</VIcon> <VIcon>mdi-refresh</VIcon>
<VTooltip activator="parent" location="bottom">{{ t('setting.cache.refresh') }}</VTooltip> <VTooltip activator="parent" location="bottom">{{ t('setting.cache.refresh') }}</VTooltip>
</VBtn> </VBtn>
<VBtn <VBtn
icon icon
color="warning" color="warning"
:loading="loading" :loading="loading"
:disabled="selectedItems.length === 0" :disabled="selectedItems.length === 0"
@click="deleteSelectedItems" @click="deleteSelectedItems"
>
<VIcon>mdi-delete-sweep</VIcon>
<VTooltip activator="parent" location="bottom"
>{{ t('setting.cache.deleteSelected') }} ({{ selectedItems.length }})</VTooltip
> >
</VBtn> <VIcon>mdi-delete-sweep</VIcon>
<VTooltip activator="parent" location="bottom"
>{{ t('setting.cache.deleteSelected') }} ({{ selectedItems.length }})</VTooltip
>
</VBtn>
<VBtn icon color="error" :loading="loading" @click="clearAllCache"> <VBtn icon color="error" :loading="loading" @click="clearAllCache">
<VIcon>mdi-delete-variant</VIcon> <VIcon>mdi-delete-variant</VIcon>
<VTooltip activator="parent" location="bottom">{{ t('setting.cache.clearAll') }}</VTooltip> <VTooltip activator="parent" location="bottom">{{ t('setting.cache.clearAll') }}</VTooltip>
</VBtn> </VBtn>
</div> </div>
</template> </template>
</VCardItem> </VCardItem>
</VCard>
<!-- 筛选框 --> <!-- 筛选框 -->
<VCardText> <VRow class="mb-4">
<VRow> <VCol cols="6">
<VCol cols="6"> <VTextField
<VTextField v-model="titleFilter"
v-model="titleFilter" :label="t('setting.cache.filterByTitle')"
:label="t('setting.cache.filterByTitle')" prepend-inner-icon="mdi-magnify"
prepend-inner-icon="mdi-magnify" clearable
clearable density="compact"
density="compact" />
/> </VCol>
</VCol> <VCol cols="6">
<VCol cols="6"> <VAutocomplete
<VAutocomplete v-model="siteFilter"
v-model="siteFilter" :label="t('setting.cache.filterBySite')"
:label="t('setting.cache.filterBySite')" :items="siteOptions"
:items="siteOptions" prepend-inner-icon="mdi-web"
prepend-inner-icon="mdi-web" clearable
clearable density="compact"
density="compact" :placeholder="t('setting.cache.selectSite')"
:placeholder="t('setting.cache.selectSite')" />
/> </VCol>
</VCol> </VRow>
</VRow>
</VCardText>
<!-- 缓存列表 --> <!-- 缓存列表 -->
<VDataTable <VDataTable
@@ -419,54 +420,54 @@ onMounted(() => {
</div> </div>
</template> </template>
</VDataTable> </VDataTable>
</VCard>
<!-- 重新识别对话框 --> <!-- 重新识别对话框 -->
<VDialog v-model="reidentifyDialog" scrollable max-width="35rem"> <VDialog v-model="reidentifyDialog" scrollable max-width="35rem">
<VCard> <VCard>
<VCardItem class="py-2"> <VCardItem class="py-2">
<template #prepend> <template #prepend>
<VIcon>mdi-text-recognition</VIcon> <VIcon>mdi-text-recognition</VIcon>
</template> </template>
<VCardTitle>{{ t('setting.cache.reidentifyDialog.title') }}</VCardTitle> <VCardTitle>{{ t('setting.cache.reidentifyDialog.title') }}</VCardTitle>
<VCardSubtitle>{{ currentReidentifyItem?.title }}</VCardSubtitle> <VCardSubtitle>{{ currentReidentifyItem?.title }}</VCardSubtitle>
</VCardItem> </VCardItem>
<VDialogCloseBtn @click="reidentifyDialog = false" /> <VDialogCloseBtn @click="reidentifyDialog = false" />
<VDivider /> <VDivider />
<VCardText> <VCardText>
<VRow> <VRow>
<VCol cols="12"> <VCol cols="12">
<VTextField <VTextField
v-if="globalSettings.RECOGNIZE_SOURCE === 'themoviedb'" v-if="globalSettings.RECOGNIZE_SOURCE === 'themoviedb'"
v-model="tmdbId" v-model="tmdbId"
:label="t('setting.cache.reidentifyDialog.tmdbId')" :label="t('setting.cache.reidentifyDialog.tmdbId')"
:hint="t('setting.cache.reidentifyDialog.tmdbIdHint')" :hint="t('setting.cache.reidentifyDialog.tmdbIdHint')"
clearable clearable
prepend-inner-icon="mdi-id-card" prepend-inner-icon="mdi-id-card"
persistent-hint persistent-hint
/> />
<VTextField <VTextField
v-else v-else
v-model="doubanId" v-model="doubanId"
:label="t('setting.cache.reidentifyDialog.doubanId')" :label="t('setting.cache.reidentifyDialog.doubanId')"
:hint="t('setting.cache.reidentifyDialog.doubanIdHint')" :hint="t('setting.cache.reidentifyDialog.doubanIdHint')"
clearable clearable
prepend-inner-icon="mdi-id-card" prepend-inner-icon="mdi-id-card"
persistent-hint persistent-hint
/> />
</VCol> </VCol>
</VRow> </VRow>
<VAlert type="info" variant="tonal" class="mt-4"> <VAlert type="info" variant="tonal" class="mt-4">
{{ t('setting.cache.reidentifyDialog.autoHint') }} {{ t('setting.cache.reidentifyDialog.autoHint') }}
</VAlert> </VAlert>
</VCardText> </VCardText>
<VCardActions> <VCardActions>
<VSpacer /> <VSpacer />
<VBtn color="primary" :loading="loading" prepend-icon="mdi-check" @click="performReidentify"> <VBtn color="primary" :loading="loading" prepend-icon="mdi-check" @click="performReidentify">
{{ t('setting.cache.reidentifyDialog.confirm') }} {{ t('setting.cache.reidentifyDialog.confirm') }}
</VBtn> </VBtn>
</VCardActions> </VCardActions>
</VCard> </VCard>
</VDialog> </VDialog>
</div>
</template> </template>