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 : [])