Spring Boot音乐服务器项目-移除喜欢和操作
二、移除收藏功能
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. 关键技术点
双ID验证:同时校验用户ID和音乐ID防止越权操作
原子操作:单条SQL完成记录删除
结果映射:通过返回值判断操作成功与否
错误处理:明确区分登录失败和操作失败
验证接口:
由于之前在我的前面设置的收藏歌曲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);}}