From dfb8f55fbaa68d2b58f56c8011fd368edbcca991 Mon Sep 17 00:00:00 2001 From: alger Date: Sat, 29 Mar 2025 20:52:50 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=E6=B7=BB=E5=8A=A0=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E6=AD=8C=E6=89=8B=E8=AF=A6=E6=83=85=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/components.d.ts | 1 + src/renderer/components/common/SongItem.vue | 9 +- src/renderer/components/home/TopBanner.vue | 19 +- src/renderer/hooks/useArtist.ts | 17 + src/renderer/layout/AppLayout.vue | 24 +- src/renderer/layout/components/MusicFull.vue | 7 +- src/renderer/layout/components/PlayBar.vue | 5 +- src/renderer/router/other.ts | 11 + src/renderer/views/artist/detail.vue | 334 +++++++++++++++++++ 9 files changed, 389 insertions(+), 38 deletions(-) create mode 100644 src/renderer/hooks/useArtist.ts create mode 100644 src/renderer/views/artist/detail.vue diff --git a/src/renderer/components.d.ts b/src/renderer/components.d.ts index 7e15b09..bcbdfed 100644 --- a/src/renderer/components.d.ts +++ b/src/renderer/components.d.ts @@ -8,6 +8,7 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { + NAlert: typeof import('naive-ui')['NAlert'] NAvatar: typeof import('naive-ui')['NAvatar'] NBadge: typeof import('naive-ui')['NBadge'] NButton: typeof import('naive-ui')['NButton'] diff --git a/src/renderer/components/common/SongItem.vue b/src/renderer/components/common/SongItem.vue index 9949d16..11ef719 100644 --- a/src/renderer/components/common/SongItem.vue +++ b/src/renderer/components/common/SongItem.vue @@ -92,8 +92,9 @@ import { computed, h, inject, ref, useTemplateRef } from 'vue'; import { useI18n } from 'vue-i18n'; import { getSongUrl } from '@/hooks/MusicListHook'; +import { useArtist } from '@/hooks/useArtist'; import { audioService } from '@/services/audioService'; -import { usePlayerStore, useSettingsStore } from '@/store'; +import { usePlayerStore } from '@/store'; import type { SongResult } from '@/type/music'; import { getImgUrl, isElectron } from '@/utils'; import { getImageBackground } from '@/utils/linearColor'; @@ -121,7 +122,6 @@ const props = withDefaults( ); const playerStore = usePlayerStore(); -const settingsStore = useSettingsStore(); const message = useMessage(); @@ -142,6 +142,8 @@ const isDownloading = ref(false); const openPlaylistDrawer = inject<(songId: number) => void>('openPlaylistDrawer'); +const { navigateToArtist } = useArtist(); + const renderSongPreview = () => { return h( 'div', @@ -392,8 +394,7 @@ const toggleSelect = () => { }; const handleArtistClick = (id: number) => { - settingsStore.setCurrentArtistId(id); - settingsStore.setShowArtistDrawer(true); + navigateToArtist(id); }; // 获取歌手列表(最多显示5个) diff --git a/src/renderer/components/home/TopBanner.vue b/src/renderer/components/home/TopBanner.vue index 2f9a6bd..8c07a95 100644 --- a/src/renderer/components/home/TopBanner.vue +++ b/src/renderer/components/home/TopBanner.vue @@ -88,7 +88,7 @@ class="recommend-singer-item relative" :class="setAnimationClass('animate__backInRight')" :style="setAnimationDelay(index + 2, 100)" - @click="handleOpenSinger(item.id)" + @click="handleArtistClick(item.id)" >
-
+
@@ -140,7 +143,8 @@ import { getDayRecommend, getHotSinger } from '@/api/home'; import { getListDetail } from '@/api/list'; import { getUserPlaylist } from '@/api/user'; import MusicList from '@/components/MusicList.vue'; -import { useSettingsStore, useUserStore } from '@/store'; +import { useArtist } from '@/hooks/useArtist'; +import { useUserStore } from '@/store'; import { IDayRecommend } from '@/type/day_recommend'; import { Playlist } from '@/type/list'; import type { IListDetail } from '@/type/listDetail'; @@ -169,6 +173,8 @@ const playlistLoading = ref(false); const playlistItem = ref(null); const playlistDetail = ref(null); +const { navigateToArtist } = useArtist(); + /** * 获取轮播项的样式 * @param index 项目索引(用于动画延迟) @@ -259,11 +265,8 @@ const loadData = async () => { } }; -const settingsStore = useSettingsStore(); - -const handleOpenSinger = (id: number) => { - settingsStore.setCurrentArtistId(id); - settingsStore.setShowArtistDrawer(true); +const handleArtistClick = (id: number) => { + navigateToArtist(id); }; const toPlaylist = async (id: number) => { diff --git a/src/renderer/hooks/useArtist.ts b/src/renderer/hooks/useArtist.ts new file mode 100644 index 0000000..d157cb0 --- /dev/null +++ b/src/renderer/hooks/useArtist.ts @@ -0,0 +1,17 @@ +import { useRouter } from 'vue-router'; + +export const useArtist = () => { + const router = useRouter(); + + /** + * 跳转到歌手详情页 + * @param id 歌手ID + */ + const navigateToArtist = (id: number) => { + router.push(`/artist/detail/${id}`); + }; + + return { + navigateToArtist + }; +}; diff --git a/src/renderer/layout/AppLayout.vue b/src/renderer/layout/AppLayout.vue index 1bd46ad..cb3727c 100644 --- a/src/renderer/layout/AppLayout.vue +++ b/src/renderer/layout/AppLayout.vue @@ -47,13 +47,12 @@
-
+ +