From f27a4cc7ec3b9b3200f233e30d40ac93112fe448 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 8 Mar 2026 23:38:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E9=9F=B3=E4=B9=90=E9=A1=B5?= =?UTF-8?q?=E5=A4=9A=E7=B1=BB=E5=9E=8B=E5=88=86=E7=B1=BB=E7=AD=9B=E9=80=89?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- music-qianduan/src/views/Music.vue | 44 +++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/music-qianduan/src/views/Music.vue b/music-qianduan/src/views/Music.vue index 9097916..5f00aa5 100644 --- a/music-qianduan/src/views/Music.vue +++ b/music-qianduan/src/views/Music.vue @@ -36,6 +36,45 @@ const getMusicTypeId = (music) => { return music?.typeId ?? music?.musicTypeId ?? music?.type?.id ?? null } +const normalizeTypeToken = (value) => { + if (value == null || value === '') return [] + + if (Array.isArray(value)) { + return value.flatMap(item => normalizeTypeToken(item)) + } + + if (typeof value === 'object') { + return normalizeTypeToken(value.id ?? value.typeId ?? value.name ?? value.typeName) + } + + if (typeof value === 'string') { + return value + .split(/[,,、|/]/) + .map(item => item.trim()) + .filter(Boolean) + } + + return [String(value)] +} + +const getMusicTypeTokens = (music) => { + const sources = [ + music?.typeId, + music?.musicTypeId, + music?.type?.id, + music?.typeName, + music?.type?.name, + music?.types, + music?.typeList, + music?.typeIds, + music?.typeNames, + music?.tags, + music?.labels + ] + + return sources.flatMap(source => normalizeTypeToken(source)) +} + const applyMusicFilter = (list = []) => { const normalizedKeyword = keyword.value.trim().toLowerCase() const selectedTypeItem = musicTypes.value.find(item => item.id === selectedType.value) @@ -44,10 +83,12 @@ const applyMusicFilter = (list = []) => { return list.filter((music) => { const musicTypeId = getMusicTypeId(music) const musicTypeName = music?.typeName || music?.type?.name || '' + const typeTokens = getMusicTypeTokens(music) const matchType = selectedType.value == null || (musicTypeId != null && Number(musicTypeId) === Number(selectedType.value)) - || (musicTypeId == null && selectedTypeName && musicTypeName === selectedTypeName) + || typeTokens.some(token => Number(token) === Number(selectedType.value)) + || (selectedTypeName && typeTokens.includes(selectedTypeName)) if (!normalizedKeyword) { return matchType @@ -56,6 +97,7 @@ const applyMusicFilter = (list = []) => { const searchText = [ music.name, musicTypeName, + ...typeTokens, music.album, music.singer, ...(Array.isArray(music.singerNames) ? music.singerNames : [])