当前位置: 首页 > news >正文

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. 关键技术点
  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);}}

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

http://www.dtcms.com/a/308564.html

相关文章:

  • C语言07
  • 【n8n】mysql凭证设置,及注意问题
  • 智能交通顶刊TITS论文分享|跨区域自适应车辆轨迹预测:TRACER框架攻克域偏移难题!
  • Linux进程创建,终止与等待
  • 哈希的概念及其应用
  • Java学习------Executor框架
  • C++语言的发展历程、核心特性与学习指南
  • Tang Prime 20K板OV5640例程
  • 【软件架构】八大架构解析
  • 点控云数据洞察智能体:让汽车行业决策有据可循,让业务增长稳健前行
  • OpenCV 的 Mat 类详解
  • 亚马逊自然流量增长密码:从算法逻辑到运营体系的全维度解析
  • WSL配置网络说明
  • 太阳光模拟器测试包装材料的耐候性
  • SUID/SGID是啥?如何让普通用户拥有root的能力?
  • WinForm之CheckBox 控件
  • Conda环境下配置的基本命令
  • 【Android】PopupWindow实现长按菜单
  • 难以逾越的夏天
  • 小架构step系列31:处理异常
  • documentPictureInPicture API 教程
  • IK 字段级别词典的升级之路
  • 14day-ai入门-人工智能基础学习-OpenCV-图像预处理4
  • 2683. 相邻值的按位异或
  • GXHT30温湿度传感器可兼容SHT30
  • NMOS防反接电路分析
  • [特殊字符] 数字孪生 + 数据可视化:实战经验分享,让物理世界数据 “会说话”
  • ubuntu18.04 部署nfs服务
  • 第15届蓝桥杯C++青少组中级组选拔赛(STEMA)2024年3月10日真题
  • Java与MySQL AES加密解密实战指南