Spring Boot音乐服务器项目-移除喜欢和操作

发布于:2025-08-01 ⋅ 阅读:(19) ⋅ 点赞:(0)

二、移除收藏功能

1. 接口设计

请求方式POST
请求路径/lovemusic/deletelovemusic
请求参数

  • id:要移除的音乐ID

// 请求示例
POST /lovemusic/deletelovemusic?id=19

响应结构

{
  "status": 0,
  "message": "取消收藏成功",
  "data": true
}
2. 核心实现代码

Mapper接口

     /**
     移除⾃⼰收藏的⾳乐,但是不是删除⾳乐本⾝,只是从数据库中删除了记录⽽已
     @param userId
     @param musicId
     @return
     */
    int deleteLoveMusic(int userId,int musicId);

XML映射

<delete id="deleteLoveMusic" parameterType="java.lang.Integer">
        delete from lovemusic where user_id=#{userId} and music_id=#{musicId}
    </delete>

Controller层

@RequestMapping("/deletelovemusic")
    public ResponseBodyMessage<Boolean> deleteLoveMusic(@RequestParam String id, HttpServletRequest req) {
        int musicId = Integer.parseInt(id);
        //没有session不创建 
        HttpSession httpSession = req.getSession(false);
        if(httpSession == null ||
                httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null) {
            System.out.println("没有登录!");
            return new ResponseBodyMessage<>(-1,"没有登录",false);
        }
        User user = (User)httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);
        int userid = user.getId();
        int ret = loveMusicMapper.deleteLoveMusic(userid,musicId);
        if(ret == 1) {
            return new ResponseBodyMessage<>(0,"取消收藏成功!",true);
        }else {
            return new ResponseBodyMessage<>(0,"取消收藏失败!",false);
        }
    }
3. 关键技术点
  1. 双ID验证:同时校验用户ID和音乐ID防止越权操作

  2. 原子操作:单条SQL完成记录删除

  3. 结果映射:通过返回值判断操作成功与否

  4. 错误处理:明确区分登录失败和操作失败

验证接口:

由于之前在我的前面设置的收藏歌曲id是6,所以当我们将入参设置为6,json响应确认是取消收藏成功。

同样的,当我们将id置为5时,我们同样可以看到


上述的删除⾳乐,不会lovemusic表中的数据,此时我们需要同步删除。

完善删除音乐功能

1.LoveMusicMapper接⼝新增⽅法:

 /**
     * 当删除库中的⾳乐的时候,同步删除lovemusic中的数据
     * @param musicId
     * @return
     */
    int deleteLoveMusicById(int musicId);

2.重写LoveMusicMapper.xml

<delete id="deleteLoveMusicById" parameterType="java.lang.Integer">
        delete from lovemusic where music_id=#{musicId}
    </delete>

3.重写MusicController.java⽂件中的deleteMusicById和deleteSelMusic两个⽅法

@RequestMapping("/delete")

        public ResponseBodyMessage<Boolean> deleteMusicById(@RequestParam String id) {
            int iid = Integer.parseInt(id);
            Music music = musicMapper.findMusicById(iid);
            if(music == null)
                return new ResponseBodyMessage<>(-1,"没有你要删除的⾳乐",false);
            int ret = musicMapper.deleteMusicById(iid);
            if(ret == 1) {
                //数据库删除成功,那么服务器上的数据也需要发⽣改变
                //删除服务器⽬录下的对应的⽂件
                int index = music.getUrl().lastIndexOf("=");
                String filename = music.getUrl().substring(index+1);
                File file = new File(SAVE_PATH+"\\"+filename+".mp3");
                System.out.println("此时的路径:"+file.getPath());
                if(file.delete()) {
                    //同步删除lovemusic表中的数据
                    loveMusicMapper.deleteLoveMusicById(iid);
                    return new ResponseBodyMessage<>(0,"删除服务器⾳乐成功",true);
                }else {
                    return new ResponseBodyMessage<>(-1,"删除服务器⾳乐失败",false);
                }
            }else{
                return new ResponseBodyMessage<>(-1,"删除数据库中的⾳乐失败",false);
            }
        }

    @RequestMapping("/deleteSel")
    public ResponseBodyMessage<Boolean> deleteSelMusic(@RequestParam("id[]")
                                                               List<Integer> id) {
        //System.out.println(id);

        int sum = 0;
        for (int i = 0; i < id.size(); i++) {
            int musicId = id.get(i);
            Music music = musicMapper.findMusicById(musicId);
            int ret = musicMapper.deleteMusicById(musicId);
            if(ret == 1) {
                //数据库删除成功,那么服务器上的数据也需要发⽣改变
                //删除服务器⽬录下的对应的⽂件
                int index = music.getUrl().lastIndexOf("=");
                String filename = music.getUrl().substring(index+1);
                File file = new File(SAVE_PATH+"\\"+filename+".mp3");
                if(file.delete()) {
                    //同步删除lovemusic表中的数据
                    loveMusicMapper.deleteLoveMusicById(musicId);
                    sum += ret;
                }else {
                    System.out.println("删除失败!");
                    return new ResponseBodyMessage<>(-1,"删除服务器上的⾳乐失败",false);
                }
            }else {
                System.out.println("删除失败!");
                return new ResponseBodyMessage<>(-1,"删除数据上的⾳乐信息失败",false);
            }
        }
        if(sum == id.size()) {
            System.out.println("删除成功!");
            return new ResponseBodyMessage<>(0,"批量删除成功",true);
        }else {
            System.out.println("删除失败!");
            return new ResponseBodyMessage<>(0,"批量删除失败",false);
        }
    }

基于此简单的这个音乐服务器的接口就基本都有了。


网站公告

今日签到

点亮在社区的每一天
去签到