From f021ba8a98587e325f02791cdc8b885b785cd48a Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 16 Jan 2025 19:25:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AA=92=E4=BD=93=E5=8D=A1?= =?UTF-8?q?=E7=89=87=E5=92=8C=E6=B5=B7=E6=8A=A5=E5=8D=A1=E7=89=87=E7=9A=84?= =?UTF-8?q?=E7=82=B9=E5=87=BB=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E8=BF=9B=E8=B7=AF=E7=94=B1=E6=BB=9A=E5=8A=A8=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA=EF=BC=8C=E6=B3=A8=E5=86=8C=E4=B8=AD=E6=AD=A2=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=99=A8=E4=BB=A5=E7=AE=A1=E7=90=86=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/cards/MediaCard.vue | 15 ++++++------ src/components/cards/PosterCard.vue | 1 + src/router/index.ts | 17 +++++++++----- src/views/discover/MediaCardSlideView.vue | 28 ++++++++++------------- 4 files changed, 31 insertions(+), 30 deletions(-) diff --git a/src/components/cards/MediaCard.vue b/src/components/cards/MediaCard.vue index 91bc0318..ca1f3cfb 100644 --- a/src/components/cards/MediaCard.vue +++ b/src/components/cards/MediaCard.vue @@ -59,11 +59,7 @@ const seasonInfos = ref([]) // 选中的订阅季 const seasonsSelected = ref([]) -let abortController: AbortController | null = null -abortController = new AbortController() -registerAbortController(abortController) -const { signal } = abortController // 来源角标字典 const sourceIconDict: { [key: string]: any } = { themoviedb: tmdbImage, @@ -100,7 +96,6 @@ function getChipColor(type: string) { } // 添加订阅处理 - async function handleAddSubscribe() { if (props.media?.type === '电视剧' && props.media?.tmdb_id) { // TMDB电视剧 @@ -229,6 +224,9 @@ async function handleCheckSubscribe() { // 查询当前媒体是否已入库 async function handleCheckExists() { try { + const abortController = new AbortController() + registerAbortController(abortController) + const { signal } = abortController const result: { [key: string]: any } = await api.get('mediaserver/exists', { params: { tmdbid: props.media?.tmdb_id, @@ -249,8 +247,10 @@ async function handleCheckExists() { // 调用API检查是否已订阅,电视剧需要指定季 async function checkSubscribe(season = 0) { try { + const abortController = new AbortController() + registerAbortController(abortController) + const { signal } = abortController const mediaid = getMediaId() - const result: Subscribe = await api.get(`subscribe/media/${mediaid}`, { params: { season, @@ -279,7 +279,6 @@ async function checkSeasonsNotExists() { let state = 0 if (item.episodes.length === 0) state = 2 else if (item.episodes.length < item.total_episode) state = 1 - seasonsNotExisted.value[item.season] = state }) } @@ -502,7 +501,7 @@ function onRemoveSubscribe() {

{{ props.media?.overview }}

-
+
diff --git a/src/components/cards/PosterCard.vue b/src/components/cards/PosterCard.vue index 2d1136a9..32c24a7a 100644 --- a/src/components/cards/PosterCard.vue +++ b/src/components/cards/PosterCard.vue @@ -79,6 +79,7 @@ function goPlay(isHovering = false) { {{ props.media?.subtitle }}

diff --git a/src/router/index.ts b/src/router/index.ts index 7e95863d..630b76be 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -8,7 +8,7 @@ configureNProgress() // Router const router = createRouter({ history: createWebHashHistory(import.meta.env.BASE_URL), - scrollBehavior(to, from, savedPosition) { + scrollBehavior(to: any, from: any, savedPosition: any) { // 如果页面有缓存那么恢复其位置, 否则始终滚动到顶部 if (to.meta.keepAlive && savedPosition) return savedPosition return { top: 0 } @@ -189,31 +189,36 @@ const router = createRouter({ }, ], }) + const abortControllers = new Set() +// 注册中止控制器 function registerAbortController(controller: AbortController) { abortControllers.add(controller) } +// 中止所有组件的任务 function abortAllControllers() { for (const controller of abortControllers) { controller.abort() } abortControllers.clear() } + // 路由导航守卫 -router.beforeEach((to, from, next) => { +router.beforeEach((to: any, from: any, next: any) => { // 总是记录非login路由 if (to.fullPath != '/login') store.state.auth.originalPath = to.fullPath const isAuthenticated = store.state.auth.token !== null if (to.meta.requiresAuth && !isAuthenticated) { next('/login') } else { - abortAllControllers() // 中止所有组件的任务 - + abortAllControllers() next() } }) -export default router // 导出默认对象 -export { registerAbortController } // 另行导出其他功能 +// 导出默认对象 +export default router +// 另行导出其他功能 +export { registerAbortController } diff --git a/src/views/discover/MediaCardSlideView.vue b/src/views/discover/MediaCardSlideView.vue index 562d2d44..0d93bba2 100644 --- a/src/views/discover/MediaCardSlideView.vue +++ b/src/views/discover/MediaCardSlideView.vue @@ -3,7 +3,7 @@ import api from '@/api' import type { MediaInfo } from '@/api/types' import MediaCard from '@/components/cards/MediaCard.vue' import SlideView from '@/components/slide/SlideView.vue' -import { registerAbortController } from "@/router"; +import { registerAbortController } from '@/router' // 输入参数 const props = defineProps({ @@ -11,8 +11,8 @@ const props = defineProps({ linkurl: String, title: String, }) -let abortController: AbortController | null = null; +// 提供给子组件的属性 provide('rankingPropsKey', reactive({ ...props })) // 组件加载完成 @@ -24,30 +24,26 @@ const dataList = ref([]) // 获取订阅列表数据 async function fetchData() { try { - if (!props.apipath) - return - abortController = new AbortController(); - registerAbortController(abortController); - const { signal } = abortController; + if (!props.apipath) return + const abortController = new AbortController() + registerAbortController(abortController) + const { signal } = abortController dataList.value = await api.get(props.apipath, { signal }) - if (dataList.value.length > 0) - componentLoaded.value = true - } - catch (error) { + if (dataList.value.length > 0) componentLoaded.value = true + } catch (error) { console.error(error) } } // 加载时获取数据 onMounted(() => { - fetchData(); -}); + fetchData() +}) onActivated(() => { if (dataList.value.length == 0) { - fetchData(); - + fetchData() } -}); +})