- 新增 getMusicStatus API 接口,用于获取音乐的收藏和点赞状态 - 在音乐列表、歌单详情、搜索结果等页面中集成音乐状态获取功能 - 优化音乐播放器,主动获取并更新音乐状态 - 为每首歌曲添加收藏和点赞状态字段
252 lines
7.9 KiB
Java
252 lines
7.9 KiB
Java
package com.test.musichouduan.controller;
|
|
|
|
import cn.dev33.satoken.annotation.SaCheckLogin;
|
|
import cn.dev33.satoken.annotation.SaCheckRole;
|
|
import cn.dev33.satoken.stp.StpUtil;
|
|
import com.test.musichouduan.dto.MusicDTO;
|
|
import com.test.musichouduan.dto.MusicStatusDTO;
|
|
import com.test.musichouduan.dto.PageResult;
|
|
import com.test.musichouduan.dto.Result;
|
|
import com.test.musichouduan.service.MusicService;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.web.bind.annotation.*;
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
import java.util.List;
|
|
|
|
/**
|
|
* 音乐控制器
|
|
*/
|
|
@RestController
|
|
@RequestMapping("/api/music")
|
|
public class MusicController {
|
|
|
|
@Autowired
|
|
private MusicService musicService;
|
|
|
|
/**
|
|
* 根据ID获取音乐
|
|
*
|
|
* @param id 音乐ID
|
|
* @return 响应结果
|
|
*/
|
|
@GetMapping("/{id}")
|
|
public Result<MusicDTO> getMusicById(@PathVariable Long id) {
|
|
Long userId = null;
|
|
// 检查用户是否登录,但不强制要求登录
|
|
if (StpUtil.isLogin()) {
|
|
userId = StpUtil.getLoginIdAsLong();
|
|
}
|
|
MusicDTO musicDTO = musicService.getMusicById(id, userId);
|
|
if (musicDTO == null) {
|
|
// 如果音乐不存在,返回空数据而不是错误
|
|
return Result.success(null);
|
|
}
|
|
return Result.success(musicDTO);
|
|
}
|
|
|
|
/**
|
|
* 分页获取音乐列表
|
|
*
|
|
* @param page 页码
|
|
* @param size 每页大小
|
|
* @param keyword 关键字
|
|
* @param typeId 类型ID
|
|
* @return 响应结果
|
|
*/
|
|
@GetMapping("/list")
|
|
public Result<PageResult<MusicDTO>> getMusicList(
|
|
@RequestParam(defaultValue = "1") Integer page,
|
|
@RequestParam(defaultValue = "10") Integer size,
|
|
@RequestParam(required = false) String keyword,
|
|
@RequestParam(required = false) Long typeId) {
|
|
PageResult<MusicDTO> pageResult = musicService.getMusicList(page, size, keyword, typeId);
|
|
return Result.success(pageResult);
|
|
}
|
|
|
|
/**
|
|
* 根据歌手ID获取音乐列表
|
|
*
|
|
* @param singerId 歌手ID
|
|
* @param page 页码
|
|
* @param size 每页大小
|
|
* @return 响应结果
|
|
*/
|
|
@GetMapping("/singer/{singerId}")
|
|
public Result<PageResult<MusicDTO>> getMusicListBySinger(
|
|
@PathVariable Long singerId,
|
|
@RequestParam(defaultValue = "1") Integer page,
|
|
@RequestParam(defaultValue = "10") Integer size) {
|
|
PageResult<MusicDTO> pageResult = musicService.getMusicListBySinger(singerId, page, size);
|
|
return Result.success(pageResult);
|
|
}
|
|
|
|
/**
|
|
* 获取最新音乐列表
|
|
*
|
|
* @param limit 限制数量
|
|
* @return 响应结果
|
|
*/
|
|
@GetMapping("/latest")
|
|
public Result<List<MusicDTO>> getLatestMusic(@RequestParam(defaultValue = "10") Integer limit) {
|
|
List<MusicDTO> musicList = musicService.getLatestMusic(limit);
|
|
return Result.success(musicList);
|
|
}
|
|
|
|
/**
|
|
* 获取热门音乐列表
|
|
*
|
|
* @param limit 限制数量
|
|
* @return 响应结果
|
|
*/
|
|
@GetMapping("/hot")
|
|
public Result<List<MusicDTO>> getHotMusic(@RequestParam(defaultValue = "10") Integer limit) {
|
|
List<MusicDTO> musicList = musicService.getHotMusic(limit);
|
|
return Result.success(musicList);
|
|
}
|
|
|
|
/**
|
|
* 搜索音乐
|
|
*
|
|
* @param keyword 关键字
|
|
* @param page 页码
|
|
* @param size 每页大小
|
|
* @return 响应结果
|
|
*/
|
|
@GetMapping("/search")
|
|
public Result<PageResult<MusicDTO>> searchMusic(
|
|
@RequestParam String keyword,
|
|
@RequestParam(defaultValue = "1") Integer page,
|
|
@RequestParam(defaultValue = "10") Integer size) {
|
|
PageResult<MusicDTO> pageResult = musicService.getMusicList(page, size, keyword, null);
|
|
return Result.success(pageResult);
|
|
}
|
|
|
|
/**
|
|
* 添加音乐
|
|
*
|
|
* @param musicDTO 音乐DTO
|
|
* @param file 音乐文件
|
|
* @param cover 封面文件
|
|
* @return 响应结果
|
|
*/
|
|
@SaCheckRole("admin")
|
|
@PostMapping("/add")
|
|
public Result<MusicDTO> addMusic(
|
|
@RequestPart("music") MusicDTO musicDTO,
|
|
@RequestPart(value = "file", required = false) MultipartFile file,
|
|
@RequestPart(value = "cover", required = false) MultipartFile cover) {
|
|
MusicDTO result = musicService.addMusic(musicDTO, file, cover);
|
|
return Result.success("添加成功", result);
|
|
}
|
|
|
|
/**
|
|
* 更新音乐
|
|
*
|
|
* @param id 音乐ID
|
|
* @param musicDTO 音乐DTO
|
|
* @param file 音乐文件
|
|
* @param cover 封面文件
|
|
* @return 响应结果
|
|
*/
|
|
@SaCheckRole("admin")
|
|
@PutMapping("/{id}")
|
|
public Result<MusicDTO> updateMusic(
|
|
@PathVariable Long id,
|
|
@RequestPart("music") MusicDTO musicDTO,
|
|
@RequestPart(value = "file", required = false) MultipartFile file,
|
|
@RequestPart(value = "cover", required = false) MultipartFile cover,
|
|
@RequestPart(value = "lyric", required = false) MultipartFile lyric) {
|
|
MusicDTO result = musicService.updateMusic(id, musicDTO, file, cover, lyric);
|
|
return Result.success("更新成功", result);
|
|
}
|
|
|
|
/**
|
|
* 删除音乐
|
|
*
|
|
* @param id 音乐ID
|
|
* @return 响应结果
|
|
*/
|
|
@SaCheckRole("admin")
|
|
@DeleteMapping("/{id}")
|
|
public Result<Boolean> deleteMusic(@PathVariable Long id) {
|
|
boolean result = musicService.deleteMusic(id);
|
|
return Result.success("删除成功", result);
|
|
}
|
|
|
|
/**
|
|
* 收藏/取消收藏音乐
|
|
*
|
|
* @param id 音乐ID
|
|
* @return 响应结果
|
|
*/
|
|
@SaCheckLogin
|
|
@PostMapping("/{id}/collect")
|
|
public Result<Boolean> toggleCollectMusic(@PathVariable Long id) {
|
|
// 获取当前登录用户ID
|
|
Long userId = StpUtil.getLoginIdAsLong();
|
|
boolean isCollected = musicService.toggleCollectMusic(id, userId);
|
|
String message = isCollected ? "收藏成功" : "取消收藏成功";
|
|
return Result.success(message, isCollected);
|
|
}
|
|
|
|
/**
|
|
* 获取用户收藏的音乐列表
|
|
*
|
|
* @param page 页码
|
|
* @param size 每页大小
|
|
* @return 响应结果
|
|
*/
|
|
@SaCheckLogin
|
|
@GetMapping("/collect")
|
|
public Result<PageResult<MusicDTO>> getCollectedMusic(
|
|
@RequestParam(defaultValue = "1") Integer page,
|
|
@RequestParam(defaultValue = "10") Integer size) {
|
|
// 获取当前登录用户ID
|
|
Long userId = StpUtil.getLoginIdAsLong();
|
|
PageResult<MusicDTO> pageResult = musicService.getCollectedMusic(userId, page, size);
|
|
return Result.success(pageResult);
|
|
}
|
|
|
|
/**
|
|
* 播放音乐
|
|
*
|
|
* @param id 音乐ID
|
|
* @return 响应结果
|
|
*/
|
|
@PostMapping("/{id}/play")
|
|
public Result<MusicDTO> playMusic(@PathVariable Long id) {
|
|
MusicDTO musicDTO = musicService.playMusic(id);
|
|
return Result.success(musicDTO);
|
|
}
|
|
|
|
/**
|
|
* 点赞/取消点赞音乐
|
|
*
|
|
* @param id 音乐ID
|
|
* @return 响应结果
|
|
*/
|
|
@SaCheckLogin
|
|
@PostMapping("/{id}/like")
|
|
public Result<Boolean> toggleLikeMusic(@PathVariable Long id) {
|
|
// 获取当前登录用户ID
|
|
Long userId = StpUtil.getLoginIdAsLong();
|
|
boolean isLiked = musicService.toggleLikeMusic(id, userId);
|
|
String message = isLiked ? "点赞成功" : "取消点赞成功";
|
|
return Result.success(message, isLiked);
|
|
}
|
|
|
|
/**
|
|
* 获取音乐的收藏和点赞状态
|
|
*
|
|
* @param id 音乐ID
|
|
* @return 响应结果
|
|
*/
|
|
@GetMapping("/{id}/status")
|
|
public Result<MusicStatusDTO> getMusicStatus(@PathVariable Long id) {
|
|
Long userId = StpUtil.getLoginIdDefaultNull() != null ? StpUtil.getLoginIdAsLong() : null;
|
|
MusicStatusDTO status = musicService.getMusicStatus(id, userId);
|
|
return Result.success(status);
|
|
}
|
|
}
|