本地音乐服务器(三)

 6. 删除音乐模块设计

6.1 删除单个音乐

1. 请求响应设计

2. 开始实现

首先在musicmapper新增操作

 Music findMusicById(int id);int deleteMusicById(int musicId);

其次新增相对应的.xml代码:

 <select id="findMusicById" resultType="com.example.spring_musicserver_1113.model.Music">select * from music where id = #{id};</select><delete id="deleteMusicById" parameterType="java.lang.Integer">delete from music where id = #{id};</delete>

最后musiccontroller代码:

 /*** 删除单个音乐* @param id* @return*/@RequestMapping("/delete")public ResponseBodyMessage<Boolean> deleteMusicById(@RequestParam String id){//1、检查当前ID的音乐是否存在int iid = Integer.parseInt(id);//2、如果当前ID音乐存在的话就要删除Music music = musicMapper.findMusicById(iid);if(music == null){System.out.println("没有查询到当前id的音乐");return new ResponseBodyMessage<>(-1,"没有查询到当前id的音乐",false);}else {//2.1 删除数据路int ret = musicMapper.deleteMusicById(iid);if(ret == 1){//2.2 删除服务器上的数据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()){return new ResponseBodyMessage<>(0,"服务器中的音乐删除成功",true);}else {return   new ResponseBodyMessage<>(-1,"服务器中的音乐删除失败",false);}}else {return new ResponseBodyMessage<>(-1,"数据库当中的音乐没有删除成功",false);}}}

进行测试:

发现数据库和服务器路径下的mp3文件都被删除了;

6.2 批量删除选中的音乐

 1、请求响应设计

2、代码实现

新增deleteSelMusic方法:

        其逻辑和之前单个删除的类似,在之前代码的基础上使用一个for循环,来查询每一个音乐文件是否存在并进行删除和统计,当统计的数量值是需要删除的数量值的时候就是批量删除成功;

@RequestMapping("/deleteSel")public ResponseBodyMessage<Boolean> deleteSelMusic(@RequestParam("id[]")List<Integer> id){System.out.println("所有的id"+ id);int sum = 0;for (int i = 0; i < id.size(); i++) {Music music = musicMapper.findMusicById(id.get(i));if(music == null){System.out.println("没有查询到当前id的音乐");return new ResponseBodyMessage<>(-1,"没有查询到当前id的音乐",false);}int ret = musicMapper.deleteMusicById(id.get(i));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()) {sum += ret;} else {return new ResponseBodyMessage<>(-1, "服务器中的音乐删除失败", false);}}else {return new ResponseBodyMessage<>(-1,"数据库当中的音乐没有删除成功",false);}}if(sum == id.size()){System.out.println("批量删除成功");return new ResponseBodyMessage<>(0,"音乐批量删除成功",true);}else {System.out.println("批量删除失败");return   new ResponseBodyMessage<>(-1,"音乐批量删除失败",false);}}

进行测试:

7. 查询⾳乐模块设计

        1、请求响应模块设计

         此处查询需要满⾜⼏个功能:

1. ⽀持模糊查询

2. ⽀持传⼊参数为空

        当我们传递的参数为空的时候,查询的结果就是当前表里面的所所有music数据;

2、代码实现

数据层代码如下:

musicmapper新增接口:

 List<Music> findMusic();List<Music> findMusicByName(String musicName);

.xml配置如下:

  <select id="findMusic" resultType="com.example.spring_musicserver_1113.model.Music">select * from music;</select><select id="findMusicByName" resultType="com.example.spring_musicserver_1113.model.Music">select * from music where title like concat('%',#{musicName},'%');</select>

控制层代码如下:

@RequestMapping("/findmusic")public ResponseBodyMessage<List<Music>> findMusic(@RequestParam(required = false) String musicName){List<Music> musicList = null;if(musicName != null){musicList = musicMapper.findMusicByName(musicName);}else {musicList = musicMapper.findMusic();}return new ResponseBodyMessage<>(0,"查询到了当前的所有音乐",musicList);}

进行测试,模糊有参查找:

        空参查找测试:

8. 喜欢音乐模块设计

8.1 添加⾳乐⾄喜欢的列表模块设计

1、响应和请求

        2、代码实现

数据层:

        实现LoveMusicMapper接⼝,收藏/喜欢⾳乐功能:

        1、需要查询此次收藏⾳乐是否之前收藏过,收藏过则不能添加

         2、没有收藏过,插⼊数据库中⼀条记录

   Music findLoveMusicByMusicIdAndUserId(int userId,int musicId);boolean insertLoveMusic(int userId,int musicId);

进行xml文件配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.spring_musicserver_1113.mapper.LoveMusicMapper"><select id="findLoveMusicByMusicIdAndUserId" resultType="com.example.spring_musicserver_1113.model.Music">select * from lovemusic where user_id = #{userId} and music_id = #{musicId};</select><insert id="insertLoveMusic">insert into lovemusic(user_id,music_id) values(#{userId},#{musicId});</insert>
</

控制层:实现LoveMusicController类 

@RestController
@RequestMapping("/lovemusic")
public class LoveMusicController {@Resourceprivate LoveMusicMapper loveMusicMapper;@RequestMapping("/likeMusic")public ResponseBodyMessage<Boolean> likeMusic(@RequestParam String id,HttpServletRequest request){int musicId = Integer.parseInt(id);System.out.println("musicId:"+musicId);//1、检查当前是否等了HttpSession httpSession = request.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();System.out.println("userId:"+userId);Music music = loveMusicMapper.findLoveMusicByMusicIdAndUserId(userId,musicId);if(music != null){//这里加一个取消收藏的功能return new  ResponseBodyMessage<>(-1,"该音乐已被喜欢收藏",false);}boolean effect = loveMusicMapper.insertLoveMusic(userId,musicId);if(effect){return new ResponseBodyMessage<>(0,"收藏成功",true);}else {return new ResponseBodyMessage<>(-1,"收藏失败",false);}}
}

测试结果如下:

 首先进行喜欢收藏测试,测试通过;当同一首歌进行第二次喜欢收藏时:

lovemusic表如下所示:

8.2 查询喜欢的⾳乐模块设计

1、请求和响应

上面是无参数请求,同时和有参数请求类似; 

2、代码实现

        数据层:实现LoveMusicMapper新增⽅法:

    List<Music> findLoveMusicByUserId(int userId);List<Music> findLoveMusicByKeyAndUID(String musicName,int userId);

         实现LoveMusicMapper.xml

    <select id="findLoveMusicByUserId" resultType="com.example.spring_musicserver_1113.model.Music">select m.* from lovemusic lm,music m where m.id = lm.music_id and lm.user_id = #{userId};</select><select id="findLoveMusicByKeyAndUID" resultType="com.example.spring_musicserver_1113.model.Music">select m.* from lovemusic lm,music m where m.id = lm.music_id and lm.user_id = #{userId}and title like concat("%",#{musicName},"%");</select>

         控制层:实现LoveMusicController,新增⽅法

 @RequestMapping("findLoveMusic")public ResponseBodyMessage<List<Music>> findLoveMusic(@RequestParam(required = false) String musicName,HttpServletRequest request){//1、验证当前是否登录HttpSession httpSession = request.getSession(false);if(httpSession == null || httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null){System.out.println("没有登录!");return new ResponseBodyMessage<>(-1,"请登录后进行查找收藏喜欢的音乐",null);}User user = (User) httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);int userId = user.getId();System.out.println("userId"+userId);List<Music>  musicList=null;if(musicName == null){musicList =loveMusicMapper.findLoveMusicByUserId(userId);}else {musicList = loveMusicMapper.findLoveMusicByKeyAndUID(musicName,userId);}return new ResponseBodyMessage<>(0,"查询到了所有的歌曲信息",musicList);}

 对于@RequestParam 注解:

        该注解@RequestParam 可以从请求中提取查询参数、表单参数甚至是多个参数,即获取下面请求中的查询字符串的值;

        变量名和参数名都是相同的(userId),如果变量名称和参数名称不同,可以使用 name 属性配置 @RequestParam 名称:

        @RequestParam(name = "name") String musicName:将请求中name的值提取出来赋给musicName:127.0.0.1:8089/lovemusic/findLoveMusic?name=w

        使用 @RequestParam 注解的方法参数默认为必填参数(默认是require== true),如果想要进行下面请求中带有参数的请求的话,spring会按照要求处理请求中查询字符串参数;如果没有请求字符串的话服务器会返回404的状态码;

        @RequestParam(required = false)就是对于请求中的查询字符串不做是否存在的要求;即没有查询字符串是为查询当前所有的数据;

有查询字符串是按照要求查找当前指定的数据;

8.3 移除喜欢的⾳乐模块设计

当前我们的收藏音乐表:

1. 请求和响应

2.代码实现

数据层:

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

控制层:

 @RequestMapping("/deletelovemusic")public ResponseBodyMessage<Boolean> deleteLoveMusic(@RequestParam String id,HttpServletRequest request){int musicId = Integer.parseInt(id);//验证登录HttpSession httpSession = request.getSession(false);if(httpSession == null || httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null){System.out.println("没有登录!");return new ResponseBodyMessage<>(-1,"请登录后进行查找收藏喜欢的音乐",null);}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<>(-1,"取消收藏失败",false);}}

如上所示,测试成功;

此时我们存在这样一个问题:

        表一为收藏音乐的表,表二为音乐列表,我们在表一中进行取消收藏操作是不会对表二有影响的;对表二进行删除操作也是没有影响的(但是实际上表二中的删除操作会导致表一中音乐会被间接的被取消收藏)

问题解决方法:

在音乐删除操作的逻辑中,添加通过musicid取消收藏的逻辑:

int deleteLoveMusicByMusicId(int musicId);
    <delete id="deleteLoveMusicByMusicId" parameterType="java.lang.Integer">delete from lovemusic where music_id =#{musicId};</delete>

测试结果如下:进行删除单曲音乐之后:

存在的问题:音乐在服务器中删除之后还能进行收藏; 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot图书馆管理系统:疫情中的管理利器

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了疫情下图书馆管理系统的开发全过程。通过分析疫情下图书馆管理系统管理的不足&#xff0c;创建了一个计算机管理疫情下图书馆管理系统的方案。文章介绍了疫情下图…

集群聊天服务器(7)数据模块

目录 Mysql数据库代码封装头文件与源文件 Mysql数据库代码封装 业务层代码不要直接写数据库&#xff0c;因为业务层和数据层的代码逻辑也想完全区分开。万一不想存储mysql&#xff0c;想存redis的话&#xff0c;就要改动大量业务代码。解耦合就是改起来很方便。 首先需要安装m…

Linux第93步_Linux内核的LED灯驱动

Linux内核的LED灯驱动采用platfomm框架&#xff0c;因此我们只需要按照要求在“设备树文件”中添加相应的LED节点即可。 1 、通过“linux内核图形化配置界面”令“CONFIG_LEDS_GPIOy” 1)、打开终端&#xff0c;输入“cd linux/atk-mp1/linux/my_linux/linux-5.4.31/回车”&a…

Zmap+python脚本+burp实现自动化Fuzzing测试

声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者简介&#xff1a;致…

红外相机和RGB相机外参标定 - 无需标定板方案

1. 动机 在之前的文章中红外相机和RGB相机标定&#xff1a;实现两种模态数据融合_红外相机标定-CSDN博客 &#xff0c;介绍了如何利用标定板实现外参标定&#xff1b;但实测下来发现2个问题&#xff1a; &#xff08;1&#xff09;红外标定板尺寸问题&#xff0c;由于标定板小…

android:taskAffinity 对Activity退出时跳转的影响

android:taskAffinity 对Activity跳转的影响 概述taskAffinity 的工作机制taskAffinity对 Activity 跳转的影响一个实际的开发问题总结参考 概述 在 Android 开发中&#xff0c;任务栈&#xff08;Task&#xff09;是一个核心概念。它决定了应用程序的 Activity 如何相互交互以…

Ubuntu常见命令

关于export LD_LIBRARY_PATHcmake默认地址CMakelists.txt知识扩充/home&#xff1a;挂载新磁盘到 /home 子目录 关于export LD_LIBRARY_PATH 程序运行时默认的依赖库的位置包括lib, /usr/lib ,/usr/local/lib 通过命令export LD_LIBRARY_PATHdesired_path:$LD_LIBRARY_PATH追加…

时间类的实现

在现实生活中&#xff0c;我们常常需要计算某一天的前/后xx天是哪一天&#xff0c;算起来十分麻烦&#xff0c;为此我们不妨写一个程序&#xff0c;来减少我们的思考时间。 1.基本实现过程 为了实现时间类&#xff0c;我们需要将代码写在3个文件中&#xff0c;以增强可读性&a…

php交友源码交友系统源码相亲交友系统源码php社交系统php婚恋源码php社区交友源码vue 仿交友社交语聊技术栈

关于PHP交友、相亲、婚恋、社区交友系统的源码以及Vue仿交友社交语聊技术栈&#xff0c;以下是一些详细信息和建议&#xff1a; 一、PHP交友系统源码 系统架构设计 前端展示层&#xff1a;负责向用户提供直观友好的界面&#xff0c;包括注册登录页面、个人资料页面、匹配页面、…

Java小技艺

使用bat文件启动jar包 平时在工作中运行jar包一般是导出后命令行窗口运行 jar -jar xxx.jar 这个其实是很不方便的。可以在win上编写bat脚本去运行jar包的。 1 编写bat脚本 start jre8/bin/javaw -jar xxxx.jar2 将jre和待执行的jar包存放到一个目录下(和bat文件在同一目录…

蓝桥杯第22场小白入门赛2~5题

这场比赛开打第二题就理解错意思了&#xff0c;还以为只能用3个消除和5个消除其中一种呢&#xff0c;结果就是死活a不过去&#xff0c;第三题根本读不懂题意&#xff0c;这蓝桥杯的题面我只能说出的是一言难尽啊。。第四题写出来一点但是后来知道是错了&#xff0c;不会正解&am…

‘视’不可挡:OAK相机助力无人机智控飞行!

南京邮电大学通达学院的刘同学用我们的oak-d-lite实现精确打击无人机的避障和目标识别定位功能&#xff0c;取得了比赛冠军。我们盼望着更多的朋友们能够加入到我们OAK的队伍中来&#xff0c;参与到各式各样的比赛中去。我们相信&#xff0c;有了我们相机的助力&#xff0c;大家…

最小生成树——Kruskal、Prim算法

图的存储&#xff1a; 高阶数据结构——图 文章目录 目录 文章目录 一、kruskal算法 二、Prim算法 前言 连通图中的每一棵生成树&#xff0c;都是原图的一个极大无环子图&#xff0c;即&#xff1a;从其中删去任何一条边&#xff0c;生成树 就不在连通&#xff1b;反之&#xf…

集群聊天服务器(9)一对一聊天功能

目录 一对一聊天离线消息服务器异常处理 一对一聊天 先新添一个消息码 在业务层增加该业务 没有绑定事件处理器的话消息会派发不出去 聊天其实是服务器做一个中转 现在同时登录两个账号 收到了聊天信息 再回复一下 离线消息 声明中提供接口和方法 张三对离线的李…

华为再掀技术革新!超薄膜天线设计路由器首发!

随着Wi-Fi技术的不断进步&#xff0c;新一代的Wi-Fi 7路由器凭借其高速率、低延迟、更稳定的性能受到了广泛关注。它能够更好地满足现代家庭对网络性能的高要求&#xff0c;带来更加流畅、高效的网络体验。9月24日&#xff0c;华为在其秋季全场景新品发布会上推出了全新Wi-Fi 7…

【阅读记录-章节2】Build a Large Language Model (From Scratch)

目录 2.Working with text data2.1 Understanding word embeddings2.2 Tokenizing text通过一个简单的实验来理解文本的词元化概念关键概念 2.3 Converting tokens into token IDs实现分词器类&#xff08;Tokenizer Class&#xff09;应用分词器测试文本的编码与解码通过分词器…

SDF,一个从1978年运行至今的公共Unix Shell

关于SDF 最近发现了一个很古老的公共Unix Shell服务器&#xff0c;这个项目从1978年运行至今&#xff0c;如果对操作系统&#xff0c;对Unix感兴趣&#xff0c;可以进去玩一玩体验一下 SDF Public Access UNIX System - Free Shell Account and Shell Access 注册方式 我一…

关于Qt C++中connect的几种写法

目录 1. 传统的槽函数写法 2. 使用函数指针的connect写法&#xff08;5.0&#xff09; 3. Lambda表达式作为槽函数&#xff08;C11&#xff09; 4.使用QOverload选择重载信号的写法 这connect函数就像是编程世界里的“茴”字&#xff0c;千变万化&#xff0c;各有千秋。咱们…

反向代理模块

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…