首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【从0做项目】Java音缘心动(7)——收藏音乐

【从0做项目】Java音缘心动(7)——收藏音乐

作者头像
三三是该溜子
发布2025-02-25 15:11:58
发布2025-02-25 15:11:58
2600
举报
文章被收录于专栏:该溜子的专栏该溜子的专栏

零:项目结果展示

项目目前已经上线

音乐播放器登录页面

​​

一:导入

上一篇文章,我们完成了删除音乐,查询音乐模块,本篇文章我们肝,收藏页面——收藏音乐功能,取消收藏,收藏页面的删除音乐

二:添加音乐到喜欢的列表

1:请求响应模块设计

2:Mapper层接口设计

代码语言:javascript
复制
    /**
     * 检查是否已经收藏过该音乐
     * @param userId
     * @param musicId
     * @return
     */
    Music findLoveMusicByMusicIdAndUserId(int musicId,int userId);

    /**
     * 点赞/收藏音乐
     * @param userId
     * @param musicId
     * @return
     */
    boolean insertLoveMusic(int userId , int musicId);

3:Mybatis层

代码语言:javascript
复制
    <!--根据⽤⼾ID和⾳乐ID查询收藏的⾳乐 -->
    <select id="findLoveMusicByMusicIdAndUserId" resultType="com.example.musicserver.model.Music">
        select * from lovemusic where music_id = #{musicId} and user_id = #{userId};
    </select>

    <insert id="insertLoveMusic">
        insert into lovemusic (user_id , music_id) values (#{userId} , #{musicId});
    </insert>

4:Controller层

注意Service层的依赖的注入哦

这里简单讲解一下代码逻辑,参数绑定id,前端传过是字符串,我们解析为int类型 ,

第一步:判断一下当前是否已经登录

第二步:拿到当前用户id,和用户想要收藏的音乐id,去数据库收藏表中找是否已有,有的话说明已经收藏过了

第三步:没收藏过,就把当前音乐插入,数据库收藏table中,记录一下信息

代码语言:javascript
复制
    /**
     * 收藏音乐
     * @param id
     * @param request
     * @return
     */
    @RequestMapping("/likeMusic")
    public ResponseBodyMessage<Boolean> likeMusic(@RequestParam String id , HttpServletRequest request){
        int musicId = Integer.parseInt(id);
        log.info("喜欢的音乐的id是{}",musicId);
        HttpSession httpSession = request.getSession(false);//没有session不创建
        if(httpSession == null ||
                httpSession.getAttribute(Constants.USERINFO_SESSION_KEY) == null){
            log.info("没有登陆");
            return new ResponseBodyMessage<>(-1,"没有登录",false);
        }
        User user = (User)httpSession.getAttribute(Constants.USERINFO_SESSION_KEY);//获取用户信息
        int userId = user.getId();
        log.info("当前登录用户的id是{}",userId);
        //查询当前⽤⼾是否点赞过该⾳乐
        Music music = loveMusicService.findLoveMusicByMusicIdAndUserId(userId, musicId);
        if(music != null){
            return new ResponseBodyMessage<>(-1,"该用户已经收藏过该音乐了",false);
        }
        boolean result = loveMusicService.insertLoveMusic(userId,musicId);
        if(result){
            return new ResponseBodyMessage<>(0,"该音乐收藏成功",true);
        }
        return new ResponseBodyMessage<>(-1,"该音乐收藏失败",false);
    }

上述的代码就不过多bb了,比较简单

5:Service层

我们主要实现这两个方法

代码语言:javascript
复制
    public List<Music> findAllLoveMusicByUserId(int userId) {
        return loveMusicMapper.findAllLoveMusicByUserId(userId);
    }
    public List<Music> findLoveMusicByKeyAndUserId(String musicName, int userId) {
        return loveMusicMapper.findLoveMusicByKeyAndUserId(musicName,userId);
    }

三:查询喜欢音乐模块

这里的查询逻辑与上一篇文章逻辑一样,就不过多赘述了

1:Mapper层

代码语言:javascript
复制
    /**
     * 如果没有传入具体的歌曲名,显示当前用户收藏的所有音乐
     * @param userId
     * @return
     */
    List<Music> findAllLoveMusicByUserId(int userId);

    /**
     * 根据某个用户id和歌曲名称查询,某个用户收藏的音乐
     * @param musicName
     * @param userId
     * @return
     */
    List<Music> findLoveMusicByKeyAndUserId(String musicName , int userId);

2:Mybatis

代码语言:javascript
复制
    <select id="findAllLoveMusicByUserId" resultType="com.example.musicserver.model.Music">
        select m.* from lovemusic lm , music m where lm.music_id = m.id and lm.user_id = #{userId};
    </select>

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

3:Controller

注意的一点:这里我们返回的是一个集合,里面有很多Music

代码语言:javascript
复制
    @RequestMapping("/findLoveMusic")
    public ResponseBodyMessage<List<Music>> findLoveMusic(@RequestParam(required = false) String musicName
            , HttpServletRequest request){
        HttpSession httpSession = request.getSession(false);
        if(httpSession == null
                || httpSession.getAttribute(Constants.USERINFO_SESSION_KEY)== null){
            log.info("没有登陆");
            return new ResponseBodyMessage<>(-1,"没有登录",null);
        }

        User user = (User)httpSession.getAttribute(Constants.USERINFO_SESSION_KEY);
        int userId = user.getId();
        List<Music> musics = new ArrayList<>();
        if(musicName == null || musicName == ""){
            musics = loveMusicService.findAllLoveMusicByUserId(userId);
        }else{
            musics = loveMusicService.findLoveMusicByKeyAndUserId(musicName, userId);//歌曲名不为null就模糊查询
        }
        return new ResponseBodyMessage<>(0,"查询到了所有的收藏音乐",musics);
    }

4:Service

代码语言:javascript
复制
    public List<Music> findAllLoveMusicByUserId(int userId) {
        return loveMusicMapper.findAllLoveMusicByUserId(userId);
    }
    public List<Music> findLoveMusicByKeyAndUserId(String musicName, int userId) {
        return loveMusicMapper.findLoveMusicByKeyAndUserId(musicName,userId);
    }

四: 移除收藏音乐模块

1:请求响应设计

2:Mapper层

代码语言:javascript
复制
    /**
     * 移除收藏的音乐,但不是删除音乐本身,只是从数据库中删除了记录
     * @param userId
     * @param musicId
     * @return
     */
    int deleteLoveMusic(int userId , int musicId);

    /**
     * 当删除库中的⾳乐的时候,同步删除lovemusic中的数据
     * @param musicId
     * @return
     */
    int deleteLoveMusicById(int musicId);

3:MyBatis

代码语言:javascript
复制
    <delete id="deleteLoveMusic">
        delete from lovemusic where user_id = #{userId} and music_id = #{musicId}
    </delete>

    <insert id="deleteLoveMusicById">
        delete from lovemusic where music_id = #{musicId}
    </insert>

4:Controller

代码语言:javascript
复制
    @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(Constants.USERINFO_SESSION_KEY)== null){
            log.info("没有登陆");
            return new ResponseBodyMessage<>(-1,"没有登录",false);
        }
        User user = (User)httpSession.getAttribute(Constants.USERINFO_SESSION_KEY);
        int userId = user.getId();
        int ret = loveMusicService.deleteLoveMusic(userId,musicId);
        if(ret == 1){
            return new ResponseBodyMessage<>(0,"取消收藏成功",true);
        }else{
            return new ResponseBodyMessage<>(-1,"取消收藏失败",false);
        }
    }

5:Service

注意:在收藏页面删除的音乐,那么音乐主页中该音乐也需要同步删除

代码语言:javascript
复制
    public int deleteLoveMusic(int userId, int musicId) {
        return loveMusicMapper.deleteLoveMusic(userId,musicId);
    }

    public Integer deleteLoveMusicById(int iid) {
        return loveMusicMapper.deleteLoveMusicById(iid);
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 零:项目结果展示
  • 一:导入
  • 二:添加音乐到喜欢的列表
    • 1:请求响应模块设计
    • 2:Mapper层接口设计
    • 3:Mybatis层
    • 4:Controller层
    • 5:Service层
  • 三:查询喜欢音乐模块
    • 1:Mapper层
    • 2:Mybatis
    • 3:Controller
    • 4:Service
  • 四: 移除收藏音乐模块
    • 1:请求响应设计
    • 2:Mapper层
    • 3:MyBatis
    • 4:Controller
    • 5:Service
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档