基于SpringBoot+Vue+AI+大屏+推荐算法的音乐系统,开源了
更新时间:2025-09-06 10:21 浏览量:2
你好,我是程序员小孟,十年开发老司机。
近搞了一个音乐的项目,非常强悍,小白也可以学习,
有详细的教程、文档、源码。
开发工具:Idea+HBuilder+Navicat
运行环境:Jdk1.8+Maven3+MySQL8+Nodejs
后端技术:Springboot2.5.9+Mybatis-Plus3
Spring Boot作为主框架,MyBatis-Plus作为ORM框架,Swagger用于API文档管理
前端技术:Vue2
需要的软件如下
前端启动:
npm installnpm run serve系统的核心的功能:
音乐管理、音乐管理(MusicController.java)、歌手管理(SingerController.java)、音乐类型管理(TypeController.java)、播放列表功能、播放列表管理(PlaylistController.java)、播放列表收藏(PlaylistCollectController.java)、播放列表音乐关联(PlaylistMusicController.java)、用户互动功能、用户评论管理(CommentController.java, CommentVideoController.java)、博客及博客评论(BlogController.java, BlogCommentController.java)、收藏功能(CollectController.java)、点赞功能(CountryLikeController.java)
社交功能、聊天功能(ChatController.java)、用户管理(UserController.java)、内容管理、公告管理(NoticeController.java)
MV视频管理(VideoController.java)、菜单管理(MenuController.java)
文件管理(FileController.java)、数据统计、图表数据展示(EchartsController.java)、用户管理系统、登录(Login.vue)、注册(Register.vue)功能、个人中心(Person.vue)、密码修改(Password.vue)、音乐管理功能、音乐列表展示(MusicList.vue、Music.vue)、音乐详情(MusicDetail.vue)、歌手列表(MusicSingerList.vue)。
我的音乐(MyMusic.vue)、博客系统、博客发布(AddBlog.vue)、博客列表和详情(Blog.vue、BlogDetail.vue)、视频功能、视频展示(Video.vue)、视频详情(VideoDetail.vue)、播放列表管理、播放列表(PlaylistList.vue)、播放列表收藏(PlaylistCollect.vue)、AI功能、包含Ai.vue组件,可能集成人工智能相关功能、公告系统、首页公告展示(如Home.vue中所示)、后台管理、包含多个管理组件如Manage.vue、Dashbord.vue等,用于后台数据管理。
package com.example.springboot.controller;import cn.hutool.core.date.DateUtil;import cn.hutool.poi.excel.ExcelUtil;import cn.hutool.poi.excel.ExcelReader;import cn.hutool.poi.excel.ExcelWriter;import javax.servlet.http.HttpServletResponse;import javax.servlet.ServletOutputStream;import java.net.URLEncoder;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.example.springboot.controller.dto.MusicDTO;import com.example.springboot.service.ISingerService;import com.example.springboot.service.ITypeService;import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;import java.io.InputStream;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.stream.Collectors;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.example.springboot.common.Result;import org.springframework.web.multipart.MultipartFile;import com.example.springboot.entity.User;import com.example.springboot.utils.TokenUtils;import com.example.springboot.service.IUserService;import com.example.springboot.service.IMusicService;import com.example.springboot.entity.Music;import org.springframework.web.bind.annotation.RestController;/** ** * @author * @since */@RestController@RequestMapping("/music")public class MusicController { @Resource private IMusicService musicService; @Resource IUserService userService; @Resource private ITypeService typeService; @Resource private ISingerService singerService; private final String now = DateUtil.now; @GetMapping("/time") public Result time { return Result.success(musicService.list(new LambdaQueryWrapper.orderByDesc(Music::getId)).stream.limit(4).collect(Collectors.toList)); } @GetMapping("/singer/{singerId}") public Result findAll(@PathVariable Integer singerId) { Listmusics = musicService.list(new LambdaQueryWrapper.eq(Music::getSingerId, singerId)); Listsingers = new ArrayList; musics.stream.forEach(music -> { MusicDTO musicDTO = new MusicDTO.setTitle(music.getName).setArtist(singerService.getById(music.getSingerId).getName).setUrl(music.getUrl) .setPic(music.getImg).setLrc("[00:00.00] (,,•́ . •̀,,) 刚刚开始学钢琴弹的hhhh").setTheme(""); singers.add(musicDTO); }); Mapmap = new HashMap; map.put("singers",singers); map.put("singer",singerService.getById(singerId)); return Result.success(map); } @GetMapping("/page/type") public Result findPage(@RequestParam Integer typeId, @RequestParam("") String name, @RequestParam Integer pageNum, @RequestParam Integer pageSize) { QueryWrapperqueryWrapper = new QueryWrapper; queryWrapper.orderByDesc("id"); if (0 != typeId) { queryWrapper.eq("type_id", typeId); } if (!"".equals(name)) { queryWrapper.like("name", name); } Pagepage = musicService.page(new Page(pageNum, pageSize), queryWrapper); page.getRecords.stream.forEach(music -> { music.setTypeName(typeService.getById(music.getTypeId).getName); music.setSingerName(singerService.getById(music.getSingerId).getName); }); return Result.success(page); } // 新增或者更新 @PostMapping public Result save(@RequestBody Music music) { if (music.getId == null) { //music.setTime(DateUtil.now); //music.setUser(TokenUtils.getCurrentUser.getNickname); music.setUserId(TokenUtils.getCurrentUser.getId); } musicService.saveOrUpdate(music); return Result.success; } @DeleteMapping("/{id}") public Result delete(@PathVariable Integer id) { musicService.removeById(id); return Result.success; } @PostMapping("/del/batch") public Result deleteBatch(@RequestBody Listids) { musicService.removeByIds(ids); return Result.success; } @GetMapping public Result findAll { return Result.success(musicService.list); } @GetMapping("/{id}") public Result findOne(@PathVariable Integer id) { Music music = musicService.getById(id); music.setTypeName(typeService.getById(music.getTypeId).getName); music.setSingerName(singerService.getById(music.getSingerId).getName); return Result.success(music); } @GetMapping("/page") public Result findPage(@RequestParam(defaultValue = "") String name, @RequestParam Integer pageNum, @RequestParam Integer pageSize) { QueryWrapperqueryWrapper = new QueryWrapper; queryWrapper.orderByDesc("id"); if (!"".equals(name)) { queryWrapper.like("name", name); } User currentUser = TokenUtils.getCurrentUser; if (currentUser.getRole.equals("ROLE_USER")) { queryWrapper.eq("user_id", currentUser.getId); } Pagepage = musicService.page(new Page(pageNum, pageSize), queryWrapper); page.getRecords.stream.forEach(music -> { music.setTypeName(typeService.getById(music.getTypeId).getName); music.setSingerName(singerService.getById(music.getSingerId).getName); }); return Result.success(page); } @GetMapping("/recommendMusic") public Result recommendMusic(@RequestParam(defaultValue = "1") Integer userId, @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "6") Integer pageSize) { Listlist = musicService.findRecommendMusic(userId,pageNum, pageSize); return Result.success(list); } /** * 导出接口 */ @GetMapping("/export") public void export(HttpServletResponse response) throws Exception { // 从数据库查询出所有的数据 Listlist = musicService.list; // 在内存操作,写出到浏览器 ExcelWriter writer = ExcelUtil.getWriter(true); // 一次性写出list内的对象到excel,使用默认样式,强制输出标题 writer.write(list, true); // 设置浏览器响应的格式 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); String fileName = URLEncoder.encode("Music信息表", "UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx"); ServletOutputStream out = response.getOutputStream; writer.flush(out, true); out.close; writer.close; } /** * excel 导入 * @param file * @throws Exception */ @PostMapping("/import") public Result imp(MultipartFile file) throws Exception { InputStream inputStream = file.getInputStream; ExcelReader reader = ExcelUtil.getReader(inputStream); // 通过 javabean的方式读取Excel内的对象,但是要求表头必须是英文,跟javabean的属性要对应起来 Listlist = reader.readAll(Music.class); musicService.saveBatch(list); return Result.success; } private User getUser { return TokenUtils.getCurrentUser; }}package com.example.springboot.controller;/** ** * @author * */@RestController@RequestMapping("/role")public class RoleController { @Resource private IRoleService roleService; // 新增或者更新 @PostMapping public Result save(@RequestBody Role role) { roleService.saveOrUpdate(role); return Result.success; } @DeleteMapping("/{id}") public Result delete(@PathVariable Integer id) { roleService.removeById(id); return Result.success; } @PostMapping("/del/batch") public Result deleteBatch(@RequestBody Listids) { roleService.removeByIds(ids); return Result.success; } @GetMapping public Result findAll { return Result.success(roleService.list); } @GetMapping("/{id}") public Result findOne(@PathVariable Integer id) { return Result.success(roleService.getById(id)); } @GetMapping("/page") public Result findPage(@RequestParam String name, @RequestParam Integer pageNum, @RequestParam Integer pageSize) { QueryWrapperqueryWrapper = new QueryWrapper; queryWrapper.like("name", name); queryWrapper.orderByDesc("id"); return Result.success(roleService.page(new Page(pageNum, pageSize), queryWrapper)); } /** * 绑定角色和菜单的关系 * @param roleId 角色id * @param menuIds 菜单id数组 * @return */ @PostMapping("/roleMenu/{roleId}") public Result roleMenu(@PathVariable Integer roleId, @RequestBody ListmenuIds) { roleService.setRoleMenu(roleId, menuIds); return Result.success; } @GetMapping("/roleMenu/{roleId}") public Result getRoleMenu(@PathVariable Integer roleId) { return Result.success( roleService.getRoleMenu(roleId)); }}项目有非常多的创新点:大屏、AI 、权限、协同过滤智能推荐算法。
同时还有详细的文档。
系统的视频教程:
教程我也发到线上了:
【手把手带敲】基于SpringBoot+Vue的AI+大屏+推荐算法的音乐系统【详细源码+文档】-使用毕设、课设_哔哩哔哩_bilibili
系统的演示:
希望大家多多点赞、转发、在看,这是对我最大的鼓励 和支持。图片我才有动力去开源更多优质的项目。