二、移除收藏功能
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);
}
}