基于SpringBoot+Vue+AI+大屏+推荐算法的音乐系统,很惊艳,开源了
AI+推荐算法+大屏的音乐
你好,我是程序员小孟,十年开发老司机。
近搞了一个音乐的项目,非常强悍,小白也可以学习,
有详细的教程、文档、源码。
开发工具: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 、权限、协同过滤智能推荐算法。
同时还有详细的文档。
系统的视频教程:
教程我也发到线上了:
系统的演示:
系统核心的代码如下所示:
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));
}
}
教程我也发到线上了:
希望大家多多点赞、转发、在看,这是对我最大的鼓励 和支持。图片我才有动力去开源更多优质的项目。
我是程序员小孟,欢迎关注我,我会更新更多的项目和教程。
更多推荐
所有评论(0)