基于java+ssm+vue的音乐播放器

项目介绍

当下,如果还依然使用纸质文档来记录并且管理相关信息,可能会出现很多问题,比如原始文件的丢失,因为采用纸质文档,很容易受潮或者怕火,不容易备份,需要花费大量的人员和资金来管理用纸质文档存储的信息,最重要的是数据出现问题寻找起来很麻烦,并且修改也困难,如果还这样操作会造成很大的资源浪费和经济损失。所以,对于本课题研究的音乐信息的管理就需要有一款软件来代替手工操作,因此音乐播放器就应运而生。

音乐播放器运用的工具包括idea,Tomcat以及Navicat等。该系统可以实现音乐信息管理,论坛信息管理,公告信息管理,音乐留言管理,音乐收藏管理,用户管理等功能。

音乐播放器就是采用目前最流行的互联网应用思维,让信息处理变得更加高效,并且处理结果更加的符合预期,只要是关于数据管理方面,不管是添加还是修改,以及数据维护甚至是数据迁移,都可以达到更快更安全的要求。

4.2 功能结构设计
在基于系统功能分析的基础之上,开始对系统的详细功能进行设计,最终将使用结构图的形式对设计的结果进行展示。
管理员具备的详细功能将参照最终的设计结果,即图4.1所示的管理员功能结构图。其中管理员管理用户,管理音乐基本信息,回复用户提交的音乐留言,管理音乐收藏信息,管理论坛与公告等。
在这里插入图片描述
用户具备的详细功能将参照最终的设计结果,即图4.2所示的用户功能结构图。其中用户可以播放音乐,发布关于音乐的留言信息,查看公告,参与论坛交流,查看公告等。
在这里插入图片描述

开发环境

编程语言:Java
数据库 :Mysql
系统架构:B/S
后端框架:SSM
编译工具:idea或者eclipse,jdk1.8,maven
支持定做:java/php/python/android/小程序/vue/爬虫/c#/asp.net

系统实现

5.1 管理员功能实现
5.1.1 论坛管理
实现论坛管理功能,其界面运行的效果图见图5.1。在该界面,管理员修改,删除,查询论坛信息,对论坛的帖子回复信息进行查看。
在这里插入图片描述

图5.1 论坛管理界面

5.1.2 音乐信息管理
实现音乐信息管理功能,其界面运行的效果图见图5.2。在该界面,管理员对音乐进行添加,修改音乐信息,删除需要删除的音乐,通过歌曲名称来获取需要的音乐。
在这里插入图片描述

图5.2 音乐信息管理界面

5.1.3 音乐留言管理
实现音乐留言管理功能,其界面运行的效果图见图5.3。在该界面,管理员需要对用户收听音乐时发布的留言信息进行查看,同时,需要管理员及时回复留言。
在这里插入图片描述

图5.3 音乐留言管理界面

5.1.4 用户管理
实现用户管理功能,其界面运行的效果图见图5.4。在该界面,管理员主要是增删改查用户的基本信息。其中包括用户的头像,联系方式等信息。
在这里插入图片描述

图5.4 用户管理界面

5.1.5 公告信息管理
实现公告信息管理功能,其界面运行的效果图见图5.5。在该界面,管理员需要每天发布公告,在本界面对公告进行管理,包括修改,删除。
在这里插入图片描述

图5.5 公告信息管理界面

5.2 用户功能实现
5.2.1 公告信息
实现公告信息功能,其界面运行的效果图见图5.6。在该界面,用户可以查询公告,查看公告的图片,用户点击公告标题或者是公告的图片都可以进入其详细介绍的界面查看其对应的公告内容。
在这里插入图片描述

图5.6 公告信息界面

5.2.2 在线论坛
实现在线论坛功能,其界面运行的效果图见图5.7。在该界面,用户可以参与帖子发布,帖子查看以及评论帖子等操作。
在这里插入图片描述

图5.7 在线论坛界面

5.2.3 音乐信息
实现音乐信息功能,其界面运行的效果图见图5.8。在该界面,用户不仅可以收藏音乐,还可以直接播放音乐,同时在界面的底部也提供让用户发布留言的功能。
在这里插入图片描述

图5.8 音乐信息界面

核心代码

package com.controller;

import java.io.File;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.*;
import java.lang.reflect.InvocationTargetException;

import com.service.DictionaryService;
import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.*;
import com.entity.view.*;
import com.service.*;
import com.utils.PageUtils;
import com.utils.R;
import com.alibaba.fastjson.*;

/**
 * 歌曲收藏
 * 后端接口
 * @author
 * @email
*/
@RestController
@Controller
@RequestMapping("/gequCollection")
public class GequCollectionController {
    private static final Logger logger = LoggerFactory.getLogger(GequCollectionController.class);

    @Autowired
    private GequCollectionService gequCollectionService;


    @Autowired
    private TokenService tokenService;
    @Autowired
    private DictionaryService dictionaryService;

    //级联表service
    @Autowired
    private GequService gequService;
    @Autowired
    private YonghuService yonghuService;



    /**
    * 后端列表
    */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永不会进入");
        else if("用户".equals(role))
            params.put("yonghuId",request.getSession().getAttribute("userId"));
        if(params.get("orderBy")==null || params.get("orderBy")==""){
            params.put("orderBy","id");
        }
        PageUtils page = gequCollectionService.queryPage(params);

        //字典表数据转换
        List<GequCollectionView> list =(List<GequCollectionView>)page.getList();
        for(GequCollectionView c:list){
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(c, request);
        }
        return R.ok().put("data", page);
    }

    /**
    * 后端详情
    */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        GequCollectionEntity gequCollection = gequCollectionService.selectById(id);
        if(gequCollection !=null){
            //entity转view
            GequCollectionView view = new GequCollectionView();
            BeanUtils.copyProperties( gequCollection , view );//把实体数据重构到view中

                //级联表
                GequEntity gequ = gequService.selectById(gequCollection.getGequId());
                if(gequ != null){
                    BeanUtils.copyProperties( gequ , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setGequId(gequ.getId());
                }
                //级联表
                YonghuEntity yonghu = yonghuService.selectById(gequCollection.getYonghuId());
                if(yonghu != null){
                    BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setYonghuId(yonghu.getId());
                }
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(view, request);
            return R.ok().put("data", view);
        }else {
            return R.error(511,"查不到数据");
        }

    }

    /**
    * 后端保存
    */
    @RequestMapping("/save")
    public R save(@RequestBody GequCollectionEntity gequCollection, HttpServletRequest request){
        logger.debug("save方法:,,Controller:{},,gequCollection:{}",this.getClass().getName(),gequCollection.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永远不会进入");
        else if("用户".equals(role))
            gequCollection.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));

        Wrapper<GequCollectionEntity> queryWrapper = new EntityWrapper<GequCollectionEntity>()
            .eq("gequ_id", gequCollection.getGequId())
            .eq("yonghu_id", gequCollection.getYonghuId())
            .eq("gequ_collection_types", gequCollection.getGequCollectionTypes())
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        GequCollectionEntity gequCollectionEntity = gequCollectionService.selectOne(queryWrapper);
        if(gequCollectionEntity==null){
            gequCollection.setInsertTime(new Date());
            gequCollection.setCreateTime(new Date());
            gequCollectionService.insert(gequCollection);
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }

    /**
    * 后端修改
    */
    @RequestMapping("/update")
    public R update(@RequestBody GequCollectionEntity gequCollection, HttpServletRequest request){
        logger.debug("update方法:,,Controller:{},,gequCollection:{}",this.getClass().getName(),gequCollection.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
//        if(false)
//            return R.error(511,"永远不会进入");
//        else if("用户".equals(role))
//            gequCollection.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));
        //根据字段查询是否有相同数据
        Wrapper<GequCollectionEntity> queryWrapper = new EntityWrapper<GequCollectionEntity>()
            .notIn("id",gequCollection.getId())
            .andNew()
            .eq("gequ_id", gequCollection.getGequId())
            .eq("yonghu_id", gequCollection.getYonghuId())
            .eq("gequ_collection_types", gequCollection.getGequCollectionTypes())
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        GequCollectionEntity gequCollectionEntity = gequCollectionService.selectOne(queryWrapper);
        if(gequCollectionEntity==null){
            gequCollectionService.updateById(gequCollection);//根据id更新
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }

    /**
    * 删除
    */
    @RequestMapping("/delete")
    public R delete(@RequestBody Integer[] ids){
        logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
        gequCollectionService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }


    /**
     * 批量上传
     */
    @RequestMapping("/batchInsert")
    public R save( String fileName){
        logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
        try {
            List<GequCollectionEntity> gequCollectionList = new ArrayList<>();//上传的东西
            Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
            Date date = new Date();
            int lastIndexOf = fileName.lastIndexOf(".");
            if(lastIndexOf == -1){
                return R.error(511,"该文件没有后缀");
            }else{
                String suffix = fileName.substring(lastIndexOf);
                if(!".xls".equals(suffix)){
                    return R.error(511,"只支持后缀为xls的excel文件");
                }else{
                    URL resource = this.getClass().getClassLoader().getResource("static/upload/" + fileName);//获取文件路径
                    File file = new File(resource.getFile());
                    if(!file.exists()){
                        return R.error(511,"找不到上传文件,请联系管理员");
                    }else{
                        List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
                        dataList.remove(0);//删除第一行,因为第一行是提示
                        for(List<String> data:dataList){
                            //循环
                            GequCollectionEntity gequCollectionEntity = new GequCollectionEntity();
//                            gequCollectionEntity.setGequId(Integer.valueOf(data.get(0)));   //歌曲 要改的
//                            gequCollectionEntity.setYonghuId(Integer.valueOf(data.get(0)));   //用户 要改的
//                            gequCollectionEntity.setGequCollectionTypes(Integer.valueOf(data.get(0)));   //类型 要改的
//                            gequCollectionEntity.setInsertTime(date);//时间
//                            gequCollectionEntity.setCreateTime(date);//时间
                            gequCollectionList.add(gequCollectionEntity);


                            //把要查询是否重复的字段放入map中
                        }

                        //查询是否重复
                        gequCollectionService.insertBatch(gequCollectionList);
                        return R.ok();
                    }
                }
            }
        }catch (Exception e){
            return R.error(511,"批量插入数据异常,请联系管理员");
        }
    }





    /**
    * 前端列表
    */
    @IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("list方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));

        // 没有指定排序字段就默认id倒序
        if(StringUtil.isEmpty(String.valueOf(params.get("orderBy")))){
            params.put("orderBy","id");
        }
        PageUtils page = gequCollectionService.queryPage(params);

        //字典表数据转换
        List<GequCollectionView> list =(List<GequCollectionView>)page.getList();
        for(GequCollectionView c:list)
            dictionaryService.dictionaryConvert(c, request); //修改对应字典表字段
        return R.ok().put("data", page);
    }

    /**
    * 前端详情
    */
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("detail方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        GequCollectionEntity gequCollection = gequCollectionService.selectById(id);
            if(gequCollection !=null){


                //entity转view
                GequCollectionView view = new GequCollectionView();
                BeanUtils.copyProperties( gequCollection , view );//把实体数据重构到view中

                //级联表
                    GequEntity gequ = gequService.selectById(gequCollection.getGequId());
                if(gequ != null){
                    BeanUtils.copyProperties( gequ , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setGequId(gequ.getId());
                }
                //级联表
                    YonghuEntity yonghu = yonghuService.selectById(gequCollection.getYonghuId());
                if(yonghu != null){
                    BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setYonghuId(yonghu.getId());
                }
                //修改对应字典表字段
                dictionaryService.dictionaryConvert(view, request);
                return R.ok().put("data", view);
            }else {
                return R.error(511,"查不到数据");
            }
    }


    /**
    * 前端保存
    */
    @RequestMapping("/add")
    public R add(@RequestBody GequCollectionEntity gequCollection, HttpServletRequest request){
        logger.debug("add方法:,,Controller:{},,gequCollection:{}",this.getClass().getName(),gequCollection.toString());
        Wrapper<GequCollectionEntity> queryWrapper = new EntityWrapper<GequCollectionEntity>()
            .eq("gequ_id", gequCollection.getGequId())
            .eq("yonghu_id", gequCollection.getYonghuId())
            .eq("gequ_collection_types", gequCollection.getGequCollectionTypes())
            ;
        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        GequCollectionEntity gequCollectionEntity = gequCollectionService.selectOne(queryWrapper);
        if(gequCollectionEntity==null){
            gequCollection.setInsertTime(new Date());
            gequCollection.setCreateTime(new Date());
        gequCollectionService.insert(gequCollection);
            return R.ok();
        }else {
            return R.error(511,"您已经收藏过了");
        }
    }


}

论文参考

在这里插入图片描述

目 录
第1章 绪论 1
1.1 选题动因 1
1.2 目的和意义 1
1.3 论文结构安排 2
第2章 开发环境与技术 3
2.1 Tomcat 简介 3
2.2 Eclipse简介 3
2.3 Navicat简介 4
第3章 系统分析 5
3.1 可行性分析 5
3.1.1 经济可行性 5
3.1.2 技术可行性 5
3.1.3 操作可行性 5
3.2 系统流程分析 6
3.3 系统性能分析 7
3.4 系统功能分析 8
第4章 系统设计 11
4.1 布局设计原则 11
4.2 功能结构设计 12
4.3 数据库设计 13
4.3.1 数据库E-R图设计 13
4.3.2 数据库表结构设计 16
第5章 系统实现 20
5.1 管理员功能实现 20
5.1.1 论坛管理 20
5.1.2 音乐信息管理 20
5.1.3 音乐留言管理 21
5.1.4 用户管理 21
5.1.5 公告信息管理 22
5.2 用户功能实现 22
5.2.1 公告信息 22
5.2.2 在线论坛 23
5.2.3 音乐信息 23
第6章 系统测试 25
6.1 系统测试方法 25
6.2 功能测试 25
6.2.1 登录功能测试 25
6.2.2 音乐查询功能测试 26
6.3 测试结果分析 26
结 论 27
参考文献 28
致 谢 29

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_3306428634

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值