你好,我是程序员小孟,十年开发老司机。

近搞了一个音乐的项目,非常强悍,小白也可以学习,

有详细的教程、文档、源码。

开发工具:Idea+HBuilder+Navicat

运行环境:Jdk1.8+Maven3+MySQL8+Nodejs

后端技术:Springboot2.5.9+Mybatis-Plus3

Spring Boot作为主框架,MyBatis-Plus作为ORM框架,Swagger用于API文档管理

前端技术:Vue2

在这里插入图片描述

需要的软件如下

在这里插入图片描述

前端启动:

npm install
npm 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等,用于后台数据管理。

项目有非常多的创新点:大屏、AI 、权限、协同过滤智能推荐算法。

同时还有详细的文档。

系统的视频教程:

图片

教程我也发到线上了:

音乐AI+大屏+算法在线教程

系统的演示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
系统核心的代码如下所示:

package com.example.springboot.controller;

/**
 * <p>
 *  前端控制器,小孟开发,微:xiaomengcode
 * </p>
 *
 * @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<Music>().orderByDesc(Music::getId)).stream().limit(4).collect(Collectors.toList()));
    }

    @GetMapping("/singer/{singerId}")
    public Result findAll(@PathVariable Integer singerId) {
        List<Music> musics = musicService.list(new LambdaQueryWrapper<Music>().eq(Music::getSingerId, singerId));

        List<MusicDTO> singers = 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);
        });

        Map<String, Object> map = 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) {
        QueryWrapper<Music> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("id");
        if (0 != typeId) {
            queryWrapper.eq("type_id", typeId);
        }

        if (!"".equals(name)) {
            queryWrapper.like("name", name);
        }

        Page<Music> page = 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 List<Integer> ids) {
        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) {
        QueryWrapper<Music> queryWrapper = 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());
        }

        Page<Music> page = 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) {

        List<Music> list =  musicService.findRecommendMusic(userId,pageNum, pageSize);
        return Result.success(list);
    }

    /**
    * 导出接口
    */
    @GetMapping("/export")
    public void export(HttpServletResponse response) throws Exception {
        // 从数据库查询出所有的数据
        List<Music> list = 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的属性要对应起来
        List<Music> list = reader.readAll(Music.class);

        musicService.saveBatch(list);
        return Result.success();
    }

    private User getUser() {
        return TokenUtils.getCurrentUser();
    }

}


package com.example.springboot.controller;
/**
 * <p>
 * 前端控制器,开发找小孟,微:xiaomengcode
 * </p>
 *
 * @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 List<Integer> ids) {
        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) {
        QueryWrapper<Role> queryWrapper = 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 List<Integer> menuIds) {
        roleService.setRoleMenu(roleId, menuIds);
        return Result.success();
    }

    @GetMapping("/roleMenu/{roleId}")
    public Result getRoleMenu(@PathVariable Integer roleId) {
        return Result.success( roleService.getRoleMenu(roleId));
    }

}


教程我也发到线上了:

音乐AI+大屏+算法在线教程

希望大家多多点赞、转发、在看,这是对我最大的鼓励 和支持。图片我才有动力去开源更多优质的项目。

我是程序员小孟,欢迎关注我,我会更新更多的项目和教程。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐