fix: 修正订阅卡片占位符样式和媒体 ID 校验逻辑

This commit is contained in:
jxxghp
2026-08-09 12:49:54 +08:00
parent 6bf9cf9d18
commit 139721d62a
2 changed files with 13 additions and 5 deletions
+8 -3
View File
@@ -540,7 +540,7 @@ function handleCardClick() {
<template #image v-if="display.smAndUp.value"> <template #image v-if="display.smAndUp.value">
<div <div
v-if="showPlaceholder" v-if="showPlaceholder"
class="subscribe-card-placeholder d-flex align-center justify-center relative" class="subscribe-card-placeholder subscribe-card-placeholder--cover d-flex align-center justify-center relative"
> >
<VIcon :icon="placeholderIcon" size="64" color="medium-emphasis" /> <VIcon :icon="placeholderIcon" size="64" color="medium-emphasis" />
<div class="absolute inset-0 outline-none subscribe-card-background"></div> <div class="absolute inset-0 outline-none subscribe-card-background"></div>
@@ -675,7 +675,7 @@ function handleCardClick() {
</template> </template>
<div v-else> <div v-else>
<VCardText class="flex items-center pt-3 pb-2"> <VCardText class="flex flex-1 items-center pt-3 pb-9">
<div <div
class="h-auto w-12 flex-shrink-0 overflow-hidden rounded-md relative" class="h-auto w-12 flex-shrink-0 overflow-hidden rounded-md relative"
v-if="imageLoaded && posterUrl" v-if="imageLoaded && posterUrl"
@@ -699,7 +699,7 @@ function handleCardClick() {
</div> </div>
</div> </div>
</VCardText> </VCardText>
<VCardText class="flex min-w-0 justify-space-between align-center flex-wrap px-3 mt-auto"> <VCardText class="absolute inset-x-0 bottom-2 z-10 flex min-w-0 justify-space-between align-center flex-wrap px-3">
<div class="flex min-w-0 max-w-full align-center"> <div class="flex min-w-0 max-w-full align-center">
<VIcon <VIcon
v-if="props.media?.total_episode && props.sortable" v-if="props.media?.total_episode && props.sortable"
@@ -981,6 +981,11 @@ function handleCardClick() {
background: rgba(var(--v-theme-on-surface), 0.08); background: rgba(var(--v-theme-on-surface), 0.08);
} }
/* 桌面版占位与图片同高,避免无图时卡片整体塌陷上浮 */
.subscribe-card-placeholder--cover {
aspect-ratio: 3 / 2;
}
/** /**
* 暂停:降低不透明度表达"已停止活动" * 暂停:降低不透明度表达"已停止活动"
*/ */
+5 -2
View File
@@ -1,11 +1,14 @@
import type { MediaDataSource } from '@/api/types' import type { MediaDataSource } from '@/api/types'
const MUSICBRAINZ_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i const MUSICBRAINZ_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
/** 按媒体数据源校验原生 IDMusicBrainz 使用 UUID,其它现有来源使用数字 ID。 */ /** 按媒体数据源校验原生 IDMusicBrainz 使用 UUID,其它现有来源使用数字 ID。 */
export function isValidMediaSourceId(value: string | number | null | undefined, source?: MediaDataSource): boolean { export function isValidMediaSourceId(value: string | number | null | undefined, source?: MediaDataSource): boolean {
const normalized = value?.toString().trim() const normalized = value?.toString().trim()
if (!normalized) return true if (!normalized) return true
if (source === 'musicbrainz') return MUSICBRAINZ_ID_PATTERN.test(normalized) // 无媒体上下文或来源为非 MusicBrainz 时,UUID 形态同样按 MusicBrainz ID 放行
if (source === 'musicbrainz' || MUSICBRAINZ_ID_PATTERN.test(normalized)) {
return MUSICBRAINZ_ID_PATTERN.test(normalized)
}
return /^\d+$/.test(normalized) return /^\d+$/.test(normalized)
} }