From bd26319b9187181d73dcbdfb11a3a1567cef5d5b Mon Sep 17 00:00:00 2001 From: ikmkj <1@qq,com> Date: Sat, 26 Jul 2025 00:13:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(music):=20=E6=B7=BB=E5=8A=A0=E7=82=B9?= =?UTF-8?q?=E8=B5=9E=E5=8A=9F=E8=83=BD-=20=E5=9C=A8=20MusicList=20?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E4=B8=AD=E6=B7=BB=E5=8A=A0=E7=82=B9=E8=B5=9E?= =?UTF-8?q?=E6=8C=89=E9=92=AE=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E6=AD=8C=E6=9B=B2=E7=82=B9=E8=B5=9E=E7=8A=B6=E6=80=81=20-=20?= =?UTF-8?q?=E5=9C=A8=20MusicPlayer=20=E7=BB=84=E4=BB=B6=E4=B8=AD=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=82=B9=E8=B5=9E=E6=8C=89=E9=92=AE=EF=BC=8C=E7=94=A8?= =?UTF-8?q?=E4=BA=8E=E5=88=87=E6=8D=A2=E5=BD=93=E5=89=8D=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E6=AD=8C=E6=9B=B2=E7=9A=84=E7=82=B9=E8=B5=9E=E7=8A=B6=E6=80=81?= =?UTF-8?q?=20-=20=E5=AE=9E=E7=8E=B0=20toggleLike=20=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=88=87=E6=8D=A2=E6=AD=8C=E6=9B=B2?= =?UTF-8?q?=E7=82=B9=E8=B5=9E=E7=8A=B6=E6=80=81=E5=B9=B6=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=20UI=20-=20=E5=BC=95=E5=85=A5=20Pointer=20=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E7=82=B9=E8=B5=9E=E6=8C=89=E9=92=AE-=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=82=B9=E8=B5=9E=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?=20API=20=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- music-qianduan/src/components/MusicList.vue | 33 +++++++++++++++-- music-qianduan/src/components/MusicPlayer.vue | 35 ++++++++++++++++++- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/music-qianduan/src/components/MusicList.vue b/music-qianduan/src/components/MusicList.vue index ea4151b..9d07f3c 100644 --- a/music-qianduan/src/components/MusicList.vue +++ b/music-qianduan/src/components/MusicList.vue @@ -72,6 +72,16 @@ + + + + import { ref, computed, watch } from 'vue' import { useRouter } from 'vue-router' -import { VideoPlay, VideoPause, Star, More, InfoFilled } from '@element-plus/icons-vue' +import { VideoPlay, VideoPause, Star, More, InfoFilled, Pointer } from '@element-plus/icons-vue' import { usePlayerStore } from '../stores/player' -import { toggleCollectMusic } from '../api/music' +import { toggleCollectMusic, toggleLikeMusic } from '../api/music' import { ElMessage } from 'element-plus' const props = defineProps({ @@ -147,7 +157,7 @@ const props = defineProps({ } }) -const emit = defineEmits(['update:currentPage', 'update:pageSize', 'page-change', 'collect-change']) +const emit = defineEmits(['update:currentPage', 'update:pageSize', 'page-change', 'collect-change', 'like-change']) const router = useRouter() @@ -202,6 +212,23 @@ const toggleCollect = async (music) => { } } +// 切换点赞状态 +const toggleLike = async (music) => { + try { + const res = await toggleLikeMusic(music.id) + if (res.code === 200) { + music.liked = !music.liked + ElMessage.success(music.liked ? '点赞成功' : '已取消点赞') + emit('like-change', music) + } else { + ElMessage.error(res.message || '操作失败') + } + } catch (error) { + console.error('点赞操作失败:', error) + ElMessage.error('操作失败,请稍后重试') + } +} + // 处理下拉菜单命令 const handleCommand = (command, music) => { switch (command) { diff --git a/music-qianduan/src/components/MusicPlayer.vue b/music-qianduan/src/components/MusicPlayer.vue index 8b09932..426cdde 100644 --- a/music-qianduan/src/components/MusicPlayer.vue +++ b/music-qianduan/src/components/MusicPlayer.vue @@ -101,6 +101,16 @@ +
+ + + + + + + +
+
@@ -290,7 +300,7 @@ import { processMusicUrl, toggleCollectMusic, getMusicStatus } from '../api/musi import { ElMessage } from 'element-plus' import { VideoPlay, VideoPause, Back, Right, List, Close, Delete, - Mute, VideoCamera, Microphone, Star, StarFilled, ArrowDown + Mute, VideoCamera, Microphone, Star, StarFilled, ArrowDown, Pointer } from '@element-plus/icons-vue' const router = useRouter() @@ -462,6 +472,29 @@ const toggleCollect = async () => { } } +// 点赞/取消点赞 +const toggleLike = async () => { + if (!userStore.isLoggedIn) { + ElMessage.warning('请先登录') + router.push('/login') + return + } + if (!currentMusic.value || !currentMusic.value.id) return + + try { + const res = await toggleLikeMusic(currentMusic.value.id) + if (res.code === 200) { + playerStore.updateCurrentMusicStatus({ liked: res.data }) + ElMessage.success(res.message || (res.data ? '点赞成功' : '已取消点赞')) + } else { + ElMessage.error(res.message || '操作失败') + } + } catch (error) { + console.error('点赞操作失败:', error) + ElMessage.error('操作失败,请稍后重试') + } +} + // 播放列表相关 const togglePlaylist = () => playerStore.setShowPlaylist(!showPlaylist.value) const playFromPlaylist = (index) => playerStore.playFromPlaylist(index)