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 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> getMusicList( @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size, @RequestParam(required = false) String keyword, @RequestParam(required = false) Long typeId) { PageResult 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> getMusicListBySinger( @PathVariable Long singerId, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size) { PageResult pageResult = musicService.getMusicListBySinger(singerId, page, size); return Result.success(pageResult); } /** * 获取最新音乐列表 * * @param limit 限制数量 * @return 响应结果 */ @GetMapping("/latest") public Result> getLatestMusic(@RequestParam(defaultValue = "10") Integer limit) { List musicList = musicService.getLatestMusic(limit); return Result.success(musicList); } /** * 获取热门音乐列表 * * @param limit 限制数量 * @return 响应结果 */ @GetMapping("/hot") public Result> getHotMusic(@RequestParam(defaultValue = "10") Integer limit) { List musicList = musicService.getHotMusic(limit); return Result.success(musicList); } /** * 搜索音乐 * * @param keyword 关键字 * @param page 页码 * @param size 每页大小 * @return 响应结果 */ @GetMapping("/search") public Result> searchMusic( @RequestParam String keyword, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size) { PageResult 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 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 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 deleteMusic(@PathVariable Long id) { boolean result = musicService.deleteMusic(id); return Result.success("删除成功", result); } /** * 收藏/取消收藏音乐 * * @param id 音乐ID * @return 响应结果 */ @SaCheckLogin @PostMapping("/{id}/collect") public Result 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> getCollectedMusic( @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size) { // 获取当前登录用户ID Long userId = StpUtil.getLoginIdAsLong(); PageResult pageResult = musicService.getCollectedMusic(userId, page, size); return Result.success(pageResult); } /** * 播放音乐 * * @param id 音乐ID * @return 响应结果 */ @PostMapping("/{id}/play") public Result playMusic(@PathVariable Long id) { MusicDTO musicDTO = musicService.playMusic(id); return Result.success(musicDTO); } /** * 点赞/取消点赞音乐 * * @param id 音乐ID * @return 响应结果 */ @SaCheckLogin @PostMapping("/{id}/like") public Result 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 getMusicStatus(@PathVariable Long id) { Long userId = StpUtil.getLoginIdDefaultNull() != null ? StpUtil.getLoginIdAsLong() : null; MusicStatusDTO status = musicService.getMusicStatus(id, userId); return Result.success(status); } }