From 678149df79702251b289c694bdd4086f39dcb3e0 Mon Sep 17 00:00:00 2001 From: ikmkj <1@qq,com> Date: Sat, 26 Jul 2025 12:44:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(playlist):=20=E5=A2=9E=E5=8A=A0=E6=AD=8C?= =?UTF-8?q?=E5=8D=95=E6=94=B6=E8=97=8F=E7=8A=B6=E6=80=81=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 isPlaylistCollected 接口和相关实现 - 修改 toggleCollectPlaylist 函数,增加当前收藏状态参数 - 在前端 PlaylistDetail 组件中添加收藏状态检查逻辑 - 后端增加对应的控制层、服务层和实现类方法 --- .../controller/PlaylistController.java | 13 ++++++++ .../controller/SingerController.java | 13 ++++++++ .../musichouduan/service/PlaylistService.java | 8 +++++ .../musichouduan/service/SingerService.java | 8 +++++ .../service/impl/PlaylistServiceImpl.java | 14 +++++++-- .../service/impl/SingerServiceImpl.java | 14 +++++++-- music-qianduan/src/api/playlist.js | 18 +++++++++-- music-qianduan/src/api/singer.js | 30 +++++++++---------- music-qianduan/src/views/PlaylistDetail.vue | 22 +++++++++++--- music-qianduan/src/views/SingerDetail.vue | 22 +++++++++++--- 10 files changed, 133 insertions(+), 29 deletions(-) diff --git a/music-houduan/src/main/java/com/test/musichouduan/controller/PlaylistController.java b/music-houduan/src/main/java/com/test/musichouduan/controller/PlaylistController.java index 98127c5..5a70465 100644 --- a/music-houduan/src/main/java/com/test/musichouduan/controller/PlaylistController.java +++ b/music-houduan/src/main/java/com/test/musichouduan/controller/PlaylistController.java @@ -189,6 +189,19 @@ public class PlaylistController { return Result.success("取消收藏成功", result); } + /** + * 检查当前用户是否收藏了该歌单 + * + * @param id 歌单ID + * @return 响应结果 + */ + @SaCheckLogin + @GetMapping("/{id}/is-collected") + public Result isCollected(@PathVariable Long id) { + boolean result = playlistService.isCollected(id); + return Result.success(result); + } + /** * 获取用户收藏的歌单列表 * diff --git a/music-houduan/src/main/java/com/test/musichouduan/controller/SingerController.java b/music-houduan/src/main/java/com/test/musichouduan/controller/SingerController.java index 882d628..debba46 100644 --- a/music-houduan/src/main/java/com/test/musichouduan/controller/SingerController.java +++ b/music-houduan/src/main/java/com/test/musichouduan/controller/SingerController.java @@ -175,6 +175,19 @@ public class SingerController { return Result.success("取消收藏成功", result); } + /** + * 检查当前用户是否收藏了该歌手 + * + * @param id 歌手ID + * @return 响应结果 + */ + @SaCheckLogin + @GetMapping("/{id}/is-collected") + public Result isCollected(@PathVariable Long id) { + boolean result = singerService.isCollected(id); + return Result.success(result); + } + /** * 获取用户收藏的歌手列表 * diff --git a/music-houduan/src/main/java/com/test/musichouduan/service/PlaylistService.java b/music-houduan/src/main/java/com/test/musichouduan/service/PlaylistService.java index 612d802..aec57e5 100644 --- a/music-houduan/src/main/java/com/test/musichouduan/service/PlaylistService.java +++ b/music-houduan/src/main/java/com/test/musichouduan/service/PlaylistService.java @@ -99,6 +99,14 @@ public interface PlaylistService { */ boolean uncollectPlaylist(Long id); + /** + * 检查当前用户是否收藏了该歌单 + * + * @param id 歌单ID + * @return 是否收藏 + */ + boolean isCollected(Long id); + /** * 获取用户收藏的歌单列表 * diff --git a/music-houduan/src/main/java/com/test/musichouduan/service/SingerService.java b/music-houduan/src/main/java/com/test/musichouduan/service/SingerService.java index 04568bc..57f2b30 100644 --- a/music-houduan/src/main/java/com/test/musichouduan/service/SingerService.java +++ b/music-houduan/src/main/java/com/test/musichouduan/service/SingerService.java @@ -90,6 +90,14 @@ public interface SingerService { */ boolean uncollectSinger(Long id); + /** + * 检查当前用户是否收藏了该歌手 + * + * @param id 歌手ID + * @return 是否收藏 + */ + boolean isCollected(Long id); + /** * 获取用户收藏的歌手列表 * diff --git a/music-houduan/src/main/java/com/test/musichouduan/service/impl/PlaylistServiceImpl.java b/music-houduan/src/main/java/com/test/musichouduan/service/impl/PlaylistServiceImpl.java index 3c2836f..31b9364 100644 --- a/music-houduan/src/main/java/com/test/musichouduan/service/impl/PlaylistServiceImpl.java +++ b/music-houduan/src/main/java/com/test/musichouduan/service/impl/PlaylistServiceImpl.java @@ -247,6 +247,7 @@ public class PlaylistServiceImpl implements PlaylistService { playlist.setCover(coverUrl); playlist.setCreator(user); playlist.setPlayCount(0L); + playlist.setCollectCount(0); playlist.setIsOfficial(0); // 默认为非官方歌单 // 设置歌单类型 @@ -358,7 +359,7 @@ public class PlaylistServiceImpl implements PlaylistService { userPlaylistRepository.collectPlaylist(user.getId(), playlist.getId()); // 更新收藏数 - playlist.setCollectCount(playlist.getCollectCount() + 1); + playlist.setCollectCount((playlist.getCollectCount() == null ? 0 : playlist.getCollectCount()) + 1); playlistRepository.save(playlist); return true; @@ -385,12 +386,21 @@ public class PlaylistServiceImpl implements PlaylistService { userPlaylistRepository.uncollectPlaylist(user.getId(), playlist.getId()); // 更新收藏数 - playlist.setCollectCount(playlist.getCollectCount() - 1); + playlist.setCollectCount((playlist.getCollectCount() == null ? 0 : playlist.getCollectCount()) - 1); playlistRepository.save(playlist); return true; } + @Override + public boolean isCollected(Long id) { + if (!StpUtil.isLogin()) { + return false; + } + Long userId = StpUtil.getLoginIdAsLong(); + return userPlaylistRepository.existsByUserIdAndPlaylistId(userId, id); + } + @Override public PageResult getCollectedPlaylist(Integer page, Integer size) { // 获取当前登录用户 diff --git a/music-houduan/src/main/java/com/test/musichouduan/service/impl/SingerServiceImpl.java b/music-houduan/src/main/java/com/test/musichouduan/service/impl/SingerServiceImpl.java index fb1a1cb..7b93e60 100644 --- a/music-houduan/src/main/java/com/test/musichouduan/service/impl/SingerServiceImpl.java +++ b/music-houduan/src/main/java/com/test/musichouduan/service/impl/SingerServiceImpl.java @@ -214,6 +214,7 @@ public class SingerServiceImpl implements SingerService { singer.setName(singerDTO.getName()); singer.setAvatar(avatarUrl); singer.setIntroduction(singerDTO.getIntroduction()); + singer.setCollectCount(0); // 设置歌手类型 if (singerDTO.getType() != null && singerDTO.getType().getId() != null) { @@ -309,7 +310,7 @@ public class SingerServiceImpl implements SingerService { userSingerRepository.collectSinger(user.getId(), singer.getId()); // 更新收藏数 - singer.setCollectCount(singer.getCollectCount() + 1); + singer.setCollectCount((singer.getCollectCount() == null ? 0 : singer.getCollectCount()) + 1); singerRepository.save(singer); return true; @@ -336,12 +337,21 @@ public class SingerServiceImpl implements SingerService { userSingerRepository.uncollectSinger(user.getId(), singer.getId()); // 更新收藏数 - singer.setCollectCount(singer.getCollectCount() - 1); + singer.setCollectCount((singer.getCollectCount() == null ? 0 : singer.getCollectCount()) - 1); singerRepository.save(singer); return true; } + @Override + public boolean isCollected(Long id) { + if (!StpUtil.isLogin()) { + return false; + } + Long userId = StpUtil.getLoginIdAsLong(); + return userSingerRepository.existsByUserIdAndSingerId(userId, id); + } + @Override public PageResult getCollectedSinger(Integer page, Integer size) { // 获取当前登录用户 diff --git a/music-qianduan/src/api/playlist.js b/music-qianduan/src/api/playlist.js index 5b56779..6ec2abd 100644 --- a/music-qianduan/src/api/playlist.js +++ b/music-qianduan/src/api/playlist.js @@ -289,10 +289,24 @@ export function deletePlaylist(id) { /** * 收藏/取消收藏歌单 * @param {number} id 歌单ID + * @param {boolean} isCollected 当前是否收藏 * @returns {Promise} */ -export function toggleCollectPlaylist(id) { - return api.post(`/playlist/${id}/collect`) +export function toggleCollectPlaylist(id, isCollected) { + if (isCollected) { + return api.delete(`/playlist/${id}/collect`) + } else { + return api.post(`/playlist/${id}/collect`) + } +} + +/** + * 检查当前用户是否收藏了该歌单 + * @param {number} id 歌单ID + * @returns {Promise} + */ +export function isPlaylistCollected(id) { + return api.get(`/playlist/${id}/is-collected`) } /** diff --git a/music-qianduan/src/api/singer.js b/music-qianduan/src/api/singer.js index d4852cf..1b66132 100644 --- a/music-qianduan/src/api/singer.js +++ b/music-qianduan/src/api/singer.js @@ -203,24 +203,24 @@ export function getHotSinger(limit = 10) { /** * 收藏/取消收藏歌手 * @param {number} id 歌手ID + * @param {boolean} isCollected 当前是否收藏 * @returns {Promise} */ -export function toggleCollectSinger(id) { - // 检查是否已收藏 - return api.get(`/singer/${id}`).then(res => { - if (res.code === 200) { - const isCollected = res.data.isCollected === true +export function toggleCollectSinger(id, isCollected) { + if (isCollected) { + return api.delete(`/singer/${id}/collect`) + } else { + return api.post(`/singer/${id}/collect`) + } +} - // 根据当前收藏状态决定调用收藏或取消收藏接口 - if (isCollected) { - return api.delete(`/singer/${id}/collect`) - } else { - return api.post(`/singer/${id}/collect`) - } - } else { - return Promise.reject(new Error(res.message || '获取歌手信息失败')) - } - }) +/** + * 检查当前用户是否收藏了该歌手 + * @param {number} id 歌手ID + * @returns {Promise} + */ +export function isSingerCollected(id) { + return api.get(`/singer/${id}/is-collected`) } /** diff --git a/music-qianduan/src/views/PlaylistDetail.vue b/music-qianduan/src/views/PlaylistDetail.vue index 311ab90..f26af6d 100644 --- a/music-qianduan/src/views/PlaylistDetail.vue +++ b/music-qianduan/src/views/PlaylistDetail.vue @@ -4,7 +4,7 @@ import { useRoute, useRouter } from 'vue-router' import { usePlayerStore } from '../stores/player' import { useUserStore } from '../stores/user' import { ElMessage, ElMessageBox } from 'element-plus' -import { getPlaylistById, toggleCollectPlaylist, deletePlaylist as apiDeletePlaylist } from '../api/playlist' +import { getPlaylistById, toggleCollectPlaylist, deletePlaylist as apiDeletePlaylist, isPlaylistCollected } from '../api/playlist' import { getMusicStatus } from '../api/music' import { getCommentList, addComment, deleteComment as apiDeleteComment } from '../api/comment' import { connect, subscribe, unsubscribe, disconnect } from '../utils/websocket' // 导入 WebSocket 工具 @@ -67,8 +67,10 @@ const fetchPlaylistDetail = async () => { // 判断是否是创建者 isCreator.value = playlist.value.creator?.id === userStore.user?.id - // 获取收藏状态 - isCollected.value = playlist.value.collected === true + // 如果用户已登录,则检查是否收藏 + if (userStore.isLoggedIn) { + checkIfCollected() + } // 更新歌单内歌曲的状态 updateMusicStatuses(playlist.value.songs) @@ -83,6 +85,18 @@ const fetchPlaylistDetail = async () => { } } +// 检查是否收藏 +const checkIfCollected = async () => { + try { + const res = await isPlaylistCollected(playlistId.value) + if (res.code === 200) { + isCollected.value = res.data + } + } catch (error) { + console.error('检查收藏状态失败:', error) + } +} + // 获取评论列表 const fetchComments = async () => { try { @@ -139,7 +153,7 @@ const toggleCollect = async () => { } try { - const res = await toggleCollectPlaylist(playlistId.value) + const res = await toggleCollectPlaylist(playlistId.value, isCollected.value) if (res.code === 200) { isCollected.value = !isCollected.value // 更新收藏数 diff --git a/music-qianduan/src/views/SingerDetail.vue b/music-qianduan/src/views/SingerDetail.vue index 8216828..a5edf66 100644 --- a/music-qianduan/src/views/SingerDetail.vue +++ b/music-qianduan/src/views/SingerDetail.vue @@ -4,7 +4,7 @@ import { useRoute, useRouter } from 'vue-router' import { usePlayerStore } from '../stores/player' import { useUserStore } from '../stores/user' import { ElMessage, ElMessageBox } from 'element-plus' -import { getSingerById, toggleCollectSinger } from '../api/singer' +import { getSingerById, isSingerCollected, collectSinger, uncollectSinger } from '../api/singer' import { getCommentList, addComment, deleteComment as apiDeleteComment } from '../api/comment' import { processImageUrl } from '../utils/imageUtils' import { processMusicUrl, getMusicBySinger, getMusicStatus } from '../api/music' @@ -67,8 +67,10 @@ const fetchSingerDetail = async () => { // 获取歌手的音乐列表 await fetchSingerMusic() - // 获取收藏状态 - isCollected.value = singer.value.collected === true + // 如果用户已登录,则检查是否收藏 + if (userStore.isLoggedIn) { + checkIfCollected() + } } else { ElMessage.error(res.message || '获取歌手详情失败') } @@ -80,6 +82,18 @@ const fetchSingerDetail = async () => { } } +// 检查是否收藏 +const checkIfCollected = async () => { + try { + const res = await isSingerCollected(singerId.value) + if (res.code === 200) { + isCollected.value = res.data + } + } catch (error) { + console.error('检查收藏状态失败:', error) + } +} + // 获取歌手的音乐列表 const fetchSingerMusic = async () => { try { @@ -181,7 +195,7 @@ const toggleCollect = async () => { } try { - const res = await toggleCollectSinger(singerId.value) + const res = await toggleCollectSinger(singerId.value, isCollected.value) if (res.code === 200) { isCollected.value = !isCollected.value // 更新收藏数