From 721d4f768540463dce304dbb133f97bed0c490c7 Mon Sep 17 00:00:00 2001
From: Aqr-K <95741669+Aqr-K@users.noreply.github.com>
Date: Mon, 24 Feb 2025 19:26:56 +0800
Subject: [PATCH 1/3] refactor: replace Vuex with Pinia
---
src/api/index.ts | 14 ++-
src/components/cards/MediaCard.vue | 6 +-
src/components/cards/UserCard.vue | 15 +--
src/components/dialog/UserAddEditDialog.vue | 13 ++-
src/layouts/components/DefaultLayout.vue | 7 +-
src/layouts/components/UserProfile.vue | 20 ++--
src/main.ts | 13 +--
src/pages/appcenter.vue | 6 +-
src/pages/dashboard.vue | 6 +-
src/pages/login.vue | 56 ++++++-----
src/router/index.ts | 8 +-
src/store/auth.ts | 96 -------------------
src/store/index.ts | 19 ----
src/stores/auth.ts | 42 ++++++++
src/stores/index.ts | 16 ++++
src/stores/types.ts | 23 +++++
src/stores/user.ts | 62 ++++++++++++
.../dashboard/AnalyticsWeeklyOverview.vue | 7 +-
src/views/discover/MediaDetailView.vue | 6 +-
src/views/reorganize/DownloadingListView.vue | 11 ++-
src/views/subscribe/SubscribeListView.vue | 15 +--
src/views/system/SearchBarView.vue | 9 +-
src/views/user/UserProfileView.vue | 21 ++--
23 files changed, 269 insertions(+), 222 deletions(-)
delete mode 100644 src/store/auth.ts
delete mode 100644 src/store/index.ts
create mode 100644 src/stores/auth.ts
create mode 100644 src/stores/index.ts
create mode 100644 src/stores/types.ts
create mode 100644 src/stores/user.ts
diff --git a/src/api/index.ts b/src/api/index.ts
index 89b8ba34..4ec94ee3 100644
--- a/src/api/index.ts
+++ b/src/api/index.ts
@@ -1,6 +1,6 @@
import axios from 'axios'
import router from '@/router'
-import store from '@/store'
+import { useAuthStore } from '@/stores'
// 创建axios实例
const api = axios.create({
@@ -9,10 +9,12 @@ const api = axios.create({
// 添加请求拦截器
api.interceptors.request.use(config => {
+ // 认证 Store
+ const authStore = useAuthStore()
// 在请求头中添加token
- const token = store.state.auth.token
- if (token) config.headers.Authorization = `Bearer ${token}`
-
+ if (authStore.token) {
+ config.headers.Authorization = `Bearer ${authStore.token}`
+ }
return config
})
@@ -26,8 +28,10 @@ api.interceptors.response.use(
// 请求超时
return Promise.reject(new Error(error))
} else if (error.response.status === 403) {
+ // 认证 Store
+ const authStore = useAuthStore()
// 清除登录状态信息
- store.dispatch('auth/logout')
+ authStore.logout()
// token验证失败,跳转到登录页面
router.push('/login')
}
diff --git a/src/components/cards/MediaCard.vue b/src/components/cards/MediaCard.vue
index e6f677f0..d42e96cf 100644
--- a/src/components/cards/MediaCard.vue
+++ b/src/components/cards/MediaCard.vue
@@ -11,6 +11,7 @@ import noImage from '@images/no-image.jpeg'
import tmdbImage from '@images/logos/tmdb.png'
import doubanImage from '@images/logos/douban-black.png'
import bangumiImage from '@images/logos/bangumi.png'
+import { useUserStore } from '@/stores'
// 输入参数
const props = defineProps({
@@ -22,7 +23,8 @@ const props = defineProps({
// 从 provide 中获取全局设置
const globalSettings: any = inject('globalSettings')
-const store = useStore()
+// 用户 Store
+const userStore = useUserStore()
// 提示框
const $toast = useToast()
@@ -340,7 +342,7 @@ async function getMediaSeasons() {
// 查询订阅弹窗规则
async function queryDefaultSubscribeConfig() {
// 非管理员不显示
- if (!store.state.auth.superUser) return false
+ if (!userStore.superUser) return false
try {
let subscribe_config_url = ''
if (props.media?.type === '电影') subscribe_config_url = 'system/setting/DefaultMovieSubscribeConfig'
diff --git a/src/components/cards/UserCard.vue b/src/components/cards/UserCard.vue
index d3c515aa..6ddeaded 100644
--- a/src/components/cards/UserCard.vue
+++ b/src/components/cards/UserCard.vue
@@ -1,7 +1,7 @@
diff --git a/src/main.ts b/src/main.ts
index 301425e4..8e479c98 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -8,7 +8,7 @@ import '@/plugins/webfontloader'
import { createApp } from 'vue'
import vuetify from '@/plugins/vuetify'
import router from '@/router'
-import store from '@/store'
+import pinia from '@/stores/index'
// 3. 全局组件
import App from '@/App.vue'
@@ -65,10 +65,13 @@ async function initializeApp() {
// 注册全局组件
initializeApp().then(() => {
- // 优先注册框架
+ // 1. 注册 UI 框架
app.use(vuetify)
- // 注册全局组件
+ // 2. 注册状态管理与路由
+ app.use(pinia).use(router)
+
+ // 3. 注册全局组件
app
.component('VAceEditor', VAceEditor)
.component('VApexChart', VueApexCharts)
@@ -84,10 +87,8 @@ initializeApp().then(() => {
.component('VCronField', CronField)
.component('VPathField', PathField)
- // 注册插件
+ // 4. 注册其他插件
app
- .use(router)
- .use(store)
.use(PerfectScrollbarPlugin)
.use(ToastPlugin, {
position: 'bottom-right',
diff --git a/src/pages/appcenter.vue b/src/pages/appcenter.vue
index 6647ff93..d19d0256 100644
--- a/src/pages/appcenter.vue
+++ b/src/pages/appcenter.vue
@@ -1,11 +1,11 @@
From 5618d87e58f6f7d68adf7dac296484c164296056 Mon Sep 17 00:00:00 2001
From: Aqr-K <95741669+Aqr-K@users.noreply.github.com>
Date: Mon, 24 Feb 2025 19:49:10 +0800
Subject: [PATCH 2/3] refactor: replace lodash with lodash-es
---
src/components/cards/CustomRuleCard.vue | 2 +-
src/components/cards/DownloaderCard.vue | 4 ++--
src/components/cards/FilterRuleCard.vue | 2 +-
src/components/cards/FilterRuleGroupCard.vue | 2 +-
src/components/cards/MediaServerCard.vue | 2 +-
src/components/cards/NotificationChannelCard.vue | 2 +-
src/pages/login.vue | 2 +-
src/views/discover/ExtraSourceView.vue | 2 +-
src/views/reorganize/TransferHistoryView.vue | 2 +-
src/views/torrent/TorrentCardListView.vue | 4 ++--
10 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/components/cards/CustomRuleCard.vue b/src/components/cards/CustomRuleCard.vue
index 046580c6..0e88774d 100644
--- a/src/components/cards/CustomRuleCard.vue
+++ b/src/components/cards/CustomRuleCard.vue
@@ -2,7 +2,7 @@
import { CustomRule } from '@/api/types'
import { useToast } from 'vue-toast-notification'
import filter_svg from '@images/svg/filter.svg'
-import { cloneDeep } from 'lodash'
+import { cloneDeep } from 'lodash-es'
import { innerFilterRules } from '@/api/constants'
// 输入参数
diff --git a/src/components/cards/DownloaderCard.vue b/src/components/cards/DownloaderCard.vue
index 5eec797d..b7e9062c 100644
--- a/src/components/cards/DownloaderCard.vue
+++ b/src/components/cards/DownloaderCard.vue
@@ -6,7 +6,7 @@ import { useToast } from 'vue-toast-notification'
import type { DownloaderInfo } from '@/api/types'
import qbittorrent_image from '@images/logos/qbittorrent.png'
import transmission_image from '@images/logos/transmission.png'
-import { cloneDeep } from 'lodash'
+import { cloneDeep } from 'lodash-es'
// 定义输入
const props = defineProps({
@@ -104,7 +104,7 @@ function saveDownloaderInfo() {
props.downloaders.forEach(item => {
if (item.default && item !== props.downloader) {
item.default = false
- $toast.info(`【${item.name}】存在默认下载器,已替换成【${downloaderInfo.value.name}】`)
+ $toast.info(`存在默认下载器【${item.name}】,已替换成【${downloaderInfo.value.name}】`)
}
})
}
diff --git a/src/components/cards/FilterRuleCard.vue b/src/components/cards/FilterRuleCard.vue
index 5dc42072..eeea60c3 100644
--- a/src/components/cards/FilterRuleCard.vue
+++ b/src/components/cards/FilterRuleCard.vue
@@ -1,7 +1,7 @@