在线音乐播放器(SSM版)

文章详细介绍了JavaWeb应用中的用户登录验证、音乐上传功能,包括数据库设计、文件上传处理、用户权限控制以及音乐的增删改查操作,涉及RESTfulAPI和Spring框架。
摘要由CSDN通过智能技术生成

首先,创建一个,选好配置。

数据库的设计

一共 设计了三张表,分别是用户表,音乐表和喜欢音乐表。

 统一数据返回

@Data
public class ResponseBodyMessage<T> {
    private int status;//状态码
    private String message;//状态描述信息
    private T data;//返回的数据
    public ResponseBodyMessage(int status, String message, T data) {
        this.status = status;
        this.message = message;
        this.data = data;
    }
}

核心功能:

  • 登录

UserContorller层代码:

@RestController//@ResponseBody + @Controller合在一起的作用
@RequestMapping("/user")//使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求
public class UserController {
    @Autowired
    private UserMapper userMapper;
    @RequestMapping("/login")
    public ResponseBodyMessage<User> login(@RequestParam String username, @RequestParam String password,
    HttpServletRequest request) {
        User loginUser = new User();
        loginUser.setUsername(username);
        loginUser.setPassword(password);
        User userInfo = userMapper.login(loginUser);
        if(userInfo == null) {
            return new ResponseBodyMessage<>(-1,"用户名或者密码错误",userInfo);
        }else {
            request.getSession().setAttribute("USERINFO_SESSION_KEY",userInfo);
            return new ResponseBodyMessage<>(0,"登录成功",userInfo);
        }
    }
}

  • 上传音乐

MusicContorller层代码:

    @RequestMapping("/upload")
    public ResponseBodyMessage<Boolean> insertMusic(@RequestParam String singer, @RequestParam("filename")
            MultipartFile file, HttpServletRequest request, HttpServletResponse resp) throws IOException {
        //没有session不创建
        HttpSession httpSession = request.getSession(false);
        if (httpSession == null || httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null) {
            System.out.println("没有登录!");
            return new ResponseBodyMessage<>(-1, "请登录后上传!", false);
        }

        String filenameAndType = file.getOriginalFilename();//xxx.mp3
        System.out.println("filenameAndType:" + filenameAndType);
        String path = SAVE_PATH + "/" + filenameAndType;
        File dest = new File(path);
        System.out.println("dest:=>" + dest.getPath());
        if (!dest.exists()) {
            dest.mkdirs();//创建目录
        }
        try {
            file.transferTo(dest);//上传文件到目标
//            return new ResponseBodyMessage<>(0, "上传成功", true);

        } catch (IOException e) {
            e.printStackTrace();
            return new ResponseBodyMessage<>(-1, "服务器上传失败!", false);
        }


        //数据库当中存储的歌曲名称不包含.mp3. 所以,需要进行截取。从后向前找点号,去掉点号
        String title = filenameAndType.substring(0,filenameAndType.lastIndexOf("."));
        System.out.println(title);

        //SimpleDateFormat来格式化当前的系统时间,赋值给time
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        String time=sf.format(new Date());
        //这里会被用到 播放音乐的模块,我们暂且这么写,原因后面解释
        String url = "/music/get?path="+title;

        User user = (User)httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);
        int userId = user.getId();


        try {
            int ret = musicMapper.insert(title, singer, time, url, userId);
            System.out.println(ret);

            if (ret == 1) {
                resp.sendRedirect("/list.html"); //跳转页面
                return new ResponseBodyMessage<>(0, "上传成功!", true);
            } else {
                System.out.println("上传失败!");
//                dest.delete();
                return new ResponseBodyMessage<>(-1, "数据库上传失败,删除上传的音乐!", false);
            }
        }catch (BindingException e){
            dest.delete();
            return new ResponseBodyMessage<>(-1,"数据库上传失败",false);
        }
    }
如何判断是否为MP3文件

位于音频问阿金的最后128个字节,可以读取出这个文件最后的128个字节获得标签,存放“ TAG ”字符,表示 ID3 V1.0 标准 ,根据是否包含这个字符,判断是不是音频文件。

  • 删除指定音乐

首先检查登录状态,有权限在继续删除。

查询音乐表中是否存在该音乐,存在在进行删除操作。

特别的情况是,当删除音乐库中音乐时,喜欢列表中的相应音乐也应该删除。

MusicContorller层代码:

@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);
        }
    }
  • 批量删除选中的音乐

MusicContorller层代码:

@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);
        }
    }
  • 查询你想要的音乐

MusicContorller层代码:

@RequestMapping("/findmusic")//(required=false)可以不传入参数
    public ResponseBodyMessage<List<Music>> findMusic(@RequestParam(required=false) String musicName) {
        List<Music> musicList = null;
        if (musicName != null) {
            musicList = musicMapper.findMusicByMusicName(musicName);
        } else {
//默认查询全部的音乐
            musicList = musicMapper.findMusic();
        }
        return new ResponseBodyMessage<>(0, "查询到了歌曲的信息", musicList);

    }

支持模糊查询

sql语句实现:

    <select id="findMusicByMusicName" resultType="com.example.music.model.Music">
        select * from music where title like concat('%',#{musicName},'%')
    </select>
  • 添加音乐至喜欢的列表

LoveMuiscController层代码:

@RequestMapping("/likeMusic")
    public ResponseBodyMessage<Boolean> likeMusic(@RequestParam String id, HttpServletRequest req) {
        int musicId = Integer.parseInt(id);
        System.out.println("likeMusic->musicId: "+musicId);
        //没有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();
        System.out.println("likeMusic__userID: "+userId);
        //查询当前用户是否点赞过该音乐
        Music music = loveMusicMapper.findLoveMusicByMusicIdAndUserId(userId,musicId);
        if(music!=null) {
            //之前收藏过,取消收藏
            int effect = loveMusicMapper.deleteLoveMusic(userId,musicId);
            return new ResponseBodyMessage<>(0,"取消收藏成功",false);
        }else {
            boolean effect = loveMusicMapper.insertLoveMusic(userId,musicId);
            if(effect) {
                return new ResponseBodyMessage<>(0,"点赞音乐成功",true);
            }else {
                return new ResponseBodyMessage<>(-1,"点赞音乐失败",false);
            }
        }
    }

  • 移除喜欢的音乐

LoveMusicController层代码:

 @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<>(-1,"取消收藏失败!",false);
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值