1、后端编写
1.1 歌单服务模块编写
1)Service服务层编写
package com.gmw.musicserver.service;
import com.gmw.musicserver.entity.SongList;
import com.gmw.musicserver.entity.SongSheet;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 歌单表 服务类
* </p>
*
* @author 未进化的程序猿
* @since 2022-01-26
*/
public interface SongSheetService extends IService<SongSheet> {
/**
*增加歌单
*/
public boolean insertSongSheet(SongSheet songSheet);
/**
*修改歌单
*/
public boolean updateSongSheet(SongSheet songSheet);
/**
* 删除歌单
*/
public boolean deleteSongSheet(Integer id);
/**
* 根据主键查询整个对象
*/
public SongSheet selectByPrimaryKey(Integer id);
/**
* 查询所有歌单
*/
public List<SongSheet> allSongList();
/**
* 根据标题精确查询歌单列表
*/
public List<SongSheet> songListOfTitle(String title);
/**
* 根据标题模糊查询歌单列表
*/
public List<SongSheet> likeTitle(String title);
/**
* 根据风格模糊查询歌单列表
*/
public List<SongSheet> likeStyle(String style);
}
package com.gmw.musicserver.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gmw.musicserver.entity.SongSheet;
import com.gmw.musicserver.mapper.SongSheetMapper;
import com.gmw.musicserver.service.SongSheetService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 歌单表 服务实现类
* </p>
*
* @author 未进化的程序猿
* @since 2022-01-26
*/
@Service
public class SongSheetServiceImpl extends ServiceImpl<SongSheetMapper, SongSheet> implements SongSheetService {
/**
* 增加歌单
*
* @param songSheet
*/
@Override
public boolean insertSongSheet(SongSheet songSheet) {
return this.baseMapper.insert(songSheet) > 0;
}
/**
* 修改歌单
*
* @param songSheet
*/
@Override
public boolean updateSongSheet(SongSheet songSheet) {
return this.baseMapper.updateById(songSheet) > 0;
}
/**
* 删除歌单
*
* @param id
*/
@Override
public boolean deleteSongSheet(Integer id) {
return this.baseMapper.deleteById(id) > 0;
}
/**
* 根据主键查询整个对象
*
* @param id
*/
@Override
public SongSheet selectByPrimaryKey(Integer id) {
return this.baseMapper.selectById(id);
}
/**
* 查询所有歌单
*/
@Override
public List<SongSheet> allSongList() {
return this.baseMapper.selectList(null);
}
/**
* 根据标题精确查询歌单列表
*
* @param title
*/
@Override
public List<SongSheet> songListOfTitle(String title) {
QueryWrapper<SongSheet> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("title",title);
return this.baseMapper.selectList(queryWrapper);
}
/**
* 根据标题模糊查询歌单列表
*
* @param title
*/
@Override
public List<SongSheet> likeTitle(String title) {
QueryWrapper<SongSheet> queryWrapper = new QueryWrapper<>();
queryWrapper.like("title",title);
return this.baseMapper.selectList(queryWrapper);
}
/**
* 根据风格模糊查询歌单列表
*
* @param style
*/
@Override
public List<SongSheet> likeStyle(String style) {
QueryWrapper<SongSheet> queryWrapper = new QueryWrapper<>();
queryWrapper.like("style",style);
return this.baseMapper.selectList(queryWrapper);
}
}
2)Controller控制层编写
package com.gmw.musicserver.controller;
import com.gmw.musicserver.commonutils.R;
import com.gmw.musicserver.entity.Song;
import com.gmw.musicserver.entity.SongSheet;
import com.gmw.musicserver.service.SongSheetService;
import io.swagger.models.auth.In;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* <p>
* 歌单表 前端控制器
* </p>
*
* @author 未进化的程序猿
* @since 2022-01-26
*/
@RestController
@RequestMapping("/musicserver/songSheet")
public class SongSheetController {
public static final Logger logger = LoggerFactory.getLogger(SongSheetController.class);
@Autowired
public SongSheetService songSheetService;
/**
* 添加歌单
*/
@PostMapping(value = "/addSongSheet")
public R addSongSheet(HttpServletRequest request){
String title = request.getParameter("title").trim(); //标题
String pic = request.getParameter("pic").trim(); //歌单图片
String introduction = request.getParameter("introduction").trim();//简介
String style = request.getParameter("style").trim(); //风格
//保存到歌单的对象中
SongSheet songSheet = new SongSheet();
songSheet.setTitle(title);
songSheet.setPic(pic);
songSheet.setIntroduction(introduction);
songSheet.setStyle(style);
logger.info("保存的歌单对象: {}",songSheet);
boolean flag = this.songSheetService.insertSongSheet(songSheet);
if(flag){ //保存成功
return R.ok().message("保存歌单成功!!");
}
return R.error().message("保存歌单失败!!");
}
/**
* 修改歌单
*/
@PostMapping(value = "/updateSongSheet")
public R updateSongSheet(HttpServletRequest request){
String id = request.getParameter("id").trim(); //主键
String title = request.getParameter("title").trim(); //标题
String introduction = request.getParameter("introduction").trim();//简介
String style = request.getParameter("style").trim(); //风格
//保存到歌单的对象中
SongSheet songSheet = new SongSheet();
songSheet.setId(Integer.parseInt(id));
songSheet.setTitle(title);
songSheet.setIntroduction(introduction);
songSheet.setStyle(style);
logger.info("修改歌单保存的歌单对象: {}",songSheet);
boolean flag = this.songSheetService.updateSongSheet(songSheet);
if(flag){ //保存成功
return R.ok().message("修改歌单成功!!");
}
return R.error().message("修改歌单失败!!");
}
/**
* 删除歌单
*/
@GetMapping(value = "/deleteSongSheet")
public R deleteSongSheet(HttpServletRequest request){
String id = request.getParameter("id").trim(); //主键
//-TODO 先查询到数据库中对应的文件地址,删除掉它再进行下面的代码
//通过ID主键查询歌手对象
SongSheet songSheet = this.songSheetService.selectByPrimaryKey(Integer.parseInt(id));
//获取歌曲图片
String songPic = songSheet.getPic();
logger.info("歌单图片: {}",songPic);
//如果文件的相对路径是/img/songListPic/123.jpg就没必要删除
//因为它是当作默认相对路径的,需要用到
if(!songPic.equals("/img/songListPic/123.jpg")){
//获取歌曲保存的文件目录
String songPath = System.getProperty("user.dir") + songPic;
logger.info("获取歌单保存的文件目录: {}",songPath);
File file = new File(songPath);
if(file.isFile()){
//判断如果是文件的话,就删除文件
boolean isDelete = file.delete();
logger.info("是否删除成功: {}",isDelete);
if(!isDelete){
return R.error().message("删除歌曲失败!!");
}
}
}
boolean flag = this.songSheetService.deleteSongSheet(Integer.parseInt(id));
if(flag) {
return R.ok().message("删除歌单成功!!");
}
return R.error().message("删除歌单失败!!");
}
/**
* 根据主键查询整个对象
*/
@GetMapping(value = "/selectByPrimaryKey")
public R selectByPrimaryKey(HttpServletRequest request){
String id = request.getParameter("id").trim(); //主键
SongSheet songSheet = this.songSheetService.selectByPrimaryKey(Integer.parseInt(id));
return R.ok().data("songSheet",songSheet);
}
/**
* 查询所有歌单
*/
@GetMapping(value = "/allSongSheet")
public R allSongSheet(HttpServletRequest request){
List<SongSheet> songSheetList = this.songSheetService.allSongList();
logger.info("查询所有的歌单: {}",songSheetList);
return R.ok().data("list",songSheetList);
}
/**
* 根据标题精确查询歌单列表
*/
@GetMapping(value = "/songListOfTitle")
public R songListOfName(HttpServletRequest request){
String title = request.getParameter("title").trim(); //歌单标题
List<SongSheet> songSheetList = this.songSheetService.songListOfTitle(title);
return R.ok().data("list",songSheetList);
}
/**
* 根据标题模糊查询歌单列表
*/
@GetMapping(value = "/likeTitle")
public R likeTitle(HttpServletRequest request){
String title = request.getParameter("title").trim(); //歌单标题
List<SongSheet> songSheetList = this.songSheetService.likeTitle(title);
return R.ok().data("list",songSheetList);
}
/**
* 根据风格模糊查询歌单列表
*/
@GetMapping(value = "/likeStyle")
public Object likeStyle(HttpServletRequest request){
String style = request.getParameter("style").trim(); //歌单风格
List<SongSheet> songSheetList = this.songSheetService.likeStyle(style);
return R.ok().data("list",songSheetList);
}
/**
* 更新歌单图片
*/
@PostMapping(value = "/updateSongSheetPic")
public R updateSongSheetPic(@RequestParam("file") MultipartFile file, @RequestParam("id")int id){
/**
* 更新歌单图片之前,必须把原来的歌单图片删除掉
*/
//通过ID主键查询歌单对象
SongSheet songSheet = this.songSheetService.selectByPrimaryKey(id);
//获取歌曲图片
String pic = songSheet.getPic();
logger.info("歌单图片: {}",pic);
//如果文件的相对路径是/img/songListPic/123.jpg就没必要删除
//因为它是当作默认相对路径的,需要用到
if(!pic.equals("/img/songListPic/123.jpg")){
//获取歌曲保存的文件目录
String songPath = System.getProperty("user.dir") + pic;
logger.info("获取歌单保存的文件目录: {}",songPath);
File file1 = new File(songPath);
if(file1.isFile()){
file1.delete();
}
}
//开始更新歌曲图片
if(file.isEmpty()){
return R.error().message("图片上传失败!!");
}
//文件名=当前时间到毫秒+原来的文件名
String fileName = System.currentTimeMillis()+file.getOriginalFilename();
//文件路径
String filePath = System.getProperty("user.dir")+System.getProperty("file.separator")+"img"
+System.getProperty("file.separator")+"songListPic";
//如果文件路径不存在,新增该路径
File file1 = new File(filePath);
if(!file1.exists()){
file1.mkdir();
}
//实际的文件地址
File dest = new File(filePath+System.getProperty("file.separator")+fileName);
//存储到数据库里的相对文件地址
String storeAvatorPath = "/img/songListPic/"+fileName;
try {
file.transferTo(dest);
SongSheet songSheet1 = new SongSheet();
songSheet1.setId(id);
songSheet1.setPic(storeAvatorPath);
boolean flag = this.songSheetService.updateSongSheet(songSheet1);
if(flag){
return R.ok().message("图片上传成功!!");
}else {
return R.error().message("图片上传失败!!");
}
} catch (IOException e) {
return R.error().message("图片上传失败!!");
}
}
}
1.2 歌单包含歌曲服务模块编写
1)Service服务层编写
package com.gmw.musicserver.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gmw.musicserver.entity.SongList;
import java.util.List;
/**
* <p>
* 歌单包含歌曲列表 服务类
* 歌单里面的歌曲service接口
* </p>
*
* @author 未进化的程序猿
* @since 2022-01-26
*/
public interface SongListService extends IService<SongList> {
/**
*增加歌单里面的歌曲
*/
public boolean insertSongList(SongList songList);
/**
*修改歌单里面的歌曲
*/
public boolean updateSongList(SongList songList);
/**
* 删除歌单里面的歌曲
*/
public boolean deleteSongList(Integer id);
/**
* 根据歌曲id和歌单id删除
*/
public boolean deleteBySongIdAndSongListId(Integer songId,Integer songListId);
/**
* 根据主键查询整个对象
*/
public SongList selectByPrimaryKey(Integer id);
/**
* 查询所有歌单里面的歌曲
*/
public List<SongList> allSongList();
/**
* 根据歌单id查询所有的歌曲
*/
public List<SongList> listSongOfSongListId(Integer songListId);
}
package com.gmw.musicserver.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gmw.musicserver.entity.SongList;
import com.gmw.musicserver.mapper.SongListMapper;
import com.gmw.musicserver.service.SongListService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 歌单包含歌曲列表 服务实现类
* </p>
*
* @author 未进化的程序猿
* @since 2022-01-26
*/
@Service
public class SongListServiceImpl extends ServiceImpl<SongListMapper, SongList> implements SongListService {
/**
* 增加歌单里面的歌曲
*
* @param songList
*/
@Override
public boolean insertSongList(SongList songList) {
return this.baseMapper.insert(songList) > 0;
}
/**
* 修改歌单里面的歌曲
*
* @param songList
*/
@Override
public boolean updateSongList(SongList songList) {
return this.baseMapper.updateById(songList) > 0;
}
/**
* 删除歌单里面的歌曲
*
* @param id
*/
@Override
public boolean deleteSongList(Integer id) {
return this.baseMapper.deleteById(id) > 0;
}
/**
* 根据歌曲id和歌单id删除
*
* @param songId
* @param songListId
*/
@Override
public boolean deleteBySongIdAndSongListId(Integer songId, Integer songListId) {
QueryWrapper<SongList> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("song_id",songId);
queryWrapper.eq("song_sheet_id",songListId);
return this.baseMapper.delete(queryWrapper) > 0;
}
/**
* 根据主键查询整个对象
*
* @param id
*/
@Override
public SongList selectByPrimaryKey(Integer id) {
return this.baseMapper.selectById(id);
}
/**
* 查询所有歌单里面的歌曲
*/
@Override
public List<SongList> allSongList() {
return this.baseMapper.selectList(null);
}
/**
* 根据歌单id查询所有的歌曲
*
* @param songListId
*/
@Override
public List<SongList> listSongOfSongListId(Integer songListId) {
QueryWrapper<SongList> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("song_sheet_id",songListId);
return this.baseMapper.selectList(queryWrapper);
}
}
2)Controller控制层编写
package com.gmw.musicserver.controller;
import com.gmw.musicserver.commonutils.R;
import com.gmw.musicserver.entity.SongList;
import com.gmw.musicserver.service.SongListService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* <p>
* 歌单包含歌曲列表 前端控制器
* </p>
*
* @author 未进化的程序猿
* @since 2022-01-26
*/
@RestController
@RequestMapping("/musicserver/songList")
public class SongListController {
public static final Logger logger = LoggerFactory.getLogger(SongListController.class);
@Autowired
public SongListService songListService;
/**
* 给歌单添加歌曲
*/
@PostMapping(value = "/addListSong")
public R addListSong(HttpServletRequest request){
//获取前端传来的参数
String songId = request.getParameter("songId").trim(); //歌曲id
String songListId = request.getParameter("songListId").trim(); //歌单id
SongList songList = new SongList();
songList.setSongId(Integer.parseInt(songId));
songList.setSongSheetId(Integer.parseInt(songListId));
logger.info("歌单添加歌曲对象: {}",songList);
boolean flag = this.songListService.insertSongList(songList);
if(flag){
return R.ok().message("添加歌单歌曲成功!!");
}
return R.error().message("添加歌单歌曲失败!!");
}
/**
* 根据歌单id查询歌曲
*/
@GetMapping(value = "/detail")
public R detail(HttpServletRequest request){
String songListId = request.getParameter("songListId");
List<SongList> lists = this.songListService.listSongOfSongListId(Integer.parseInt(songListId));
return R.ok().data("list",lists);
}
/**
* 删除歌单里的歌曲
*/
@GetMapping(value = "/delete")
public Object delete(HttpServletRequest request){
String songId = request.getParameter("songId").trim(); //歌曲id
String songListId = request.getParameter("songListId").trim(); //歌单id
boolean flag = this.songListService.deleteBySongIdAndSongListId(Integer.parseInt(songId),Integer.parseInt(songListId));
if (flag){
return R.ok().message("删除歌单歌曲成功!!");
}
return R.error().message("删除歌单歌曲失败!!");
}
}
1.3 在歌曲管理模块Controller控制层中添加(根据歌曲id查询歌曲对象/根据歌手id查询歌曲)
/**
* 根据歌曲id查询歌曲对象
*/
@GetMapping(value = "/detail")
public R detail(HttpServletRequest request){
String songId = request.getParameter("songId");
Song song = this.songService.selectByPrimaryKey(Integer.parseInt(songId));
return R.ok().data("song",song);
}
/**
* 根据歌手名称查询歌曲
*/
@GetMapping(value = "/songOfSongName")
public R songOfSongName(HttpServletRequest request){
String songName = request.getParameter("songName");
List<Song> songList = this.songService.songOfName(songName);
return R.ok().data("list",songList);
}
2、前端编写
2.1 歌单管理模块
<template>
<div class="table">
<div class="container">
<div class="handle-box">
<el-button type="primary" size="mini" @click="delAll">批量删除</el-button>
<el-input v-model="select_word" size="mini" placeholder="筛选关键字" class="handle-input"></el-input>
<el-button type="primary" size="mini" @click="centerDialogVisible = true">添加歌单</el-button>
</div>
</div>
<el-table size="mini" ref="multipleTable" border style="width:100%" height="680px" :data="data" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="40"></el-table-column>
<el-table-column label="歌单图片" width="110" align="center">
<template slot-scope="scope">
<div class="songList-img">
<img :src="getUrl(scope.row.pic)" style="width:100%"/>
</div>
<el-upload :action="uploadUrl(scope.row.id)" :before-upload="beforeAvatorUpload"
:on-success="handleAvatorSuccess">
<el-button size="mini">更新图片</el-button>
</el-upload>
</template>
</el-table-column>
<el-table-column prop="title" label="标题" width="120" align="center"></el-table-column>
<el-table-column label="简介">
<template slot-scope="scope">
<p style="height:100px;overflow:scroll">{{scope.row.introduction}}</p>
</template>
</el-table-column>
<el-table-column prop="style" label="风格" width="120" align="center"></el-table-column>
<el-table-column label="歌曲管理" width="110" align="center">
<template slot-scope="scope">
<el-button size="mini" @click="songEdit(scope.row.id)">歌曲管理</el-button>
</template>
</el-table-column>
<el-table-column label="操作" width="150" align="center">
<template slot-scope="scope">
<el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
<el-button size="mini" type="danger" @click="handleDelete(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination
background
layout = "total,prev,pager,next"
:current-page="currentPage"
:page-size="pageSize"
:total="tableData.length"
@current-change="handleCurrentChange"
>
</el-pagination>
</div>
<el-dialog title="添加歌单" :visible.sync="centerDialogVisible" width="400px" center>
<el-form :model="registerForm" ref="registerForm" label-width="80px">
<el-form-item prop="title" label="标题" size="mini">
<el-input v-model="registerForm.title" placeholder="标题"></el-input>
</el-form-item>
<el-form-item prop="introduction" label="简介" size="mini">
<el-input v-model="registerForm.introduction" placeholder="简介" type="textarea"></el-input>
</el-form-item>
<el-form-item prop="style" label="风格" size="mini">
<el-input v-model="registerForm.style" placeholder="风格"></el-input>
</el-form-item>
</el-form>
<span slot="footer">
<el-button size="mini" @click="centerDialogVisible = false">取消</el-button>
<el-button size="mini" @click="addSongList">确定</el-button>
</span>
</el-dialog>
<el-dialog title="修改歌单" :visible.sync="editVisible" width="400px" center>
<el-form :model="form" ref="form" label-width="80px">
<el-form-item prop="title" label="标题" size="mini">
<el-input v-model="form.title" placeholder="标题"></el-input>
</el-form-item>
<el-form-item prop="introduction" label="简介" size="mini">
<el-input v-model="form.introduction" placeholder="简介" type="textarea"></el-input>
</el-form-item>
<el-form-item prop="style" label="风格" size="mini">
<el-input v-model="form.style" placeholder="风格"></el-input>
</el-form-item>
</el-form>
<span slot="footer">
<el-button size="mini" @click="editVisible = false">取消</el-button>
<el-button size="mini" @click="editSave">确定</el-button>
</span>
</el-dialog>
<el-dialog title="删除歌单" :visible.sync="delVisible" width="300px" center>
<div align="center">删除不可恢复,是否确定删除?</div>
<span slot="footer">
<el-button size="mini" @click="delVisible = false">取消</el-button>
<el-button size="mini" @click="deleteRow">确定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {getAllSongList,setSongList,updateSongList,delSongList} from '../api/songsheet/index';
import { mixin } from '../mixins/index';
export default {
mixins: [mixin],
data(){
return{
centerDialogVisible: false, //添加弹窗是否显示
editVisible: false, //编辑弹窗是否显示
delVisible: false, //删除弹窗是否显示
registerForm:{ //添加框
title: '',
introduction: '',
style: ''
},
form:{ //编辑框
id: '',
title: '',
introduction: '',
style: ''
},
tableData: [],
tempData: [],
select_word: '',
pageSize: 5, //分页每页大小
currentPage: 1, //当前页
idx: -1, //当前选择项
multipleSelection: [] //哪些项已经打勾
}
},
computed:{
//计算当前搜索结果表里的数据
data(){
return this.tableData.slice((this.currentPage - 1) * this.pageSize,this.currentPage * this.pageSize)
}
},
watch:{
//搜索框里面的内容发生变化的时候,搜索结果table列表的内容跟着它的内容发生变化
select_word: function(){
if(this.select_word == ''){
this.tableData = this.tempData;
}else{
this.tableData = [];
for(let item of this.tempData){
if(item.title.includes(this.select_word)){
this.tableData.push(item);
}
}
}
}
},
created(){
this.getData();
},
methods:{
//获取当前页
handleCurrentChange(val){
this.currentPage = val;
},
//查询所有歌单
getData(){
this.tempData = [];
this.tableData = [];
getAllSongList().then(res => {
this.tempData = res.data.list;
this.tableData = res.data.list;
this.currentPage = 1;
})
},
//添加歌单
addSongList(){
var _this = this;
let params = new URLSearchParams();
params.append('title',this.registerForm.title);
params.append('pic','/img/songListPic/123.jpg');
params.append('introduction',this.registerForm.introduction);
params.append('style',this.registerForm.style);
setSongList(params)
.then(res => {
if(res.code == 20000){
this.getData();
this.notify("添加成功","success");
//添加成功后删除文本框里面的值
_this.registerForm = {}
}else{
this.notify("添加失败","error");
_this.registerForm = {}
}
})
.catch(err => {
console.log(err);
});
this.centerDialogVisible = false;
},
//弹出编辑页面
handleEdit(row){
this.editVisible = true;
this.form = {
id: row.id,
title: row.title,
introduction: row.introduction,
style: row.style
}
},
//保存编辑页面修改的数据
editSave(){
let params = new URLSearchParams();
params.append('id',this.form.id);
params.append('title',this.form.title);
params.append('introduction',this.form.introduction);
params.append('style',this.form.style);
updateSongList(params)
.then(res => {
if(res.code == 20000){
this.getData();
this.notify("修改成功","success");
}else{
this.notify("修改失败","error");
}
})
.catch(err => {
console.log(err);
});
this.editVisible = false;
},
//更新图片
uploadUrl(id){
return `${this.$store.state.HOST}/musicserver/songSheet/updateSongSheetPic?id=${id}`
},
//删除一个歌单
deleteRow(){
delSongList(this.idx)
.then(res => {
if(res.code == 20000){
this.getData();
this.notify("删除成功","success");
}else{
this.notify("删除失败","error");
}
})
.catch(err => {
console.log(err);
});
this.delVisible = false;
},
//转向歌曲管理页面,id表示歌单的ID
songEdit(id){
this.$router.push({path:`/ListSong`,query:{id}});
}
}
}
</script>
<style scoped>
.handle-box{
margin-bottom: 20px;
}
.songList-img{
width: 100%;
height: 80px;
border-radius: 5px;
margin-bottom: 5px;
overflow: hidden;
}
.handle-input{
width: 300px;
display: inline-block;
}
.pagination{
display: flex;
justify-content: center;
}
</style>
编写请求后端服务接口方法
import {get,post} from '../http'
//============歌单相关================
//查询歌单
export const getAllSongList =() => get(`musicserver/songSheet/allSongSheet`);
//添加歌单
export const setSongList = (params) => post(`musicserver/songSheet/addSongSheet`,params);
//编辑歌单
export const updateSongList = (params) => post(`musicserver/songSheet/updateSongSheet`,params);
//删除歌单
export const delSongList = (id) => get(`musicserver/songSheet/deleteSongSheet?id=${id}`);
引入请求后端接口方法
2.2 歌单包含歌曲模块列表
歌曲模块列表展示
<template>
<div class="table">
<div class="crumbs">
<i class="el-icon-tickets"></i>歌单歌曲信息
</div>
<div class="container">
<div class="handle-box">
<el-button type="primary" size="mini" @click="delAll">批量删除</el-button>
<el-input v-model="select_word" size="mini" placeholder="请输入歌曲名" class="handle-input"></el-input>
<el-button type="primary" size="mini" @click="centerDialogVisible = true">添加歌曲</el-button>
</div>
</div>
<el-table size="mini" ref="multipleTable" border style="width:100%" height="680px" :data="tableData" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="40"></el-table-column>
<el-table-column prop="name" label="歌手-歌名" align="center"></el-table-column>
<el-table-column label="操作" width="150" align="center">
<template slot-scope="scope">
<el-button size="mini" type="danger" @click="handleDelete(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-dialog title="添加歌曲" :visible.sync="centerDialogVisible" width="400px" center>
<el-form :model="registerForm" ref="registerForm" label-width="80px" action="" id="tf">
<el-form-item prop="singerName" label="歌手名字" size="mini">
<el-input v-model="registerForm.singerName" placeholder="歌手名字"></el-input>
</el-form-item>
<el-form-item prop="songName" label="歌曲名字" size="mini">
<el-input v-model="registerForm.songName" placeholder="歌曲名字"></el-input>
</el-form-item>
</el-form>
<span slot="footer">
<el-button size="mini" @click="centerDialogVisible = false">取消</el-button>
<el-button size="mini" @click="getSongId">确定</el-button>
</span>
</el-dialog>
<el-dialog title="删除歌曲" :visible.sync="delVisible" width="300px" center>
<div align="center">删除不可恢复,是否确定删除?</div>
<span slot="footer">
<el-button size="mini" @click="delVisible = false">取消</el-button>
<el-button size="mini" @click="deleteRow">确定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { mixin } from '../mixins/index';
import {listSongDetail,listSongAdd,delListSong} from '../api/songlist/index';
import {songOfSongId,songOfSongName} from '../api/song/index'
export default {
mixins: [mixin],
data(){
return{
centerDialogVisible: false, //添加弹窗是否显示
delVisible: false, //删除弹窗是否显示
registerForm:{ //添加框
singerName: '', //歌手名字
songName: '' //歌曲名字
},
tableData: [],
tempData: [],
select_word: '',
idx: -1, //当前选择项
multipleSelection: [], //哪些项已经打勾
songListId: '' //歌单id
}
},
watch:{
//搜索框里面的内容发生变化的时候,搜索结果table列表的内容跟着它的内容发生变化
select_word: function(){
if(this.select_word == ''){
this.tableData = this.tempData;
}else{
this.tableData = [];
for(let item of this.tempData){
if(item.name.includes(this.select_word)){
this.tableData.push(item);
}
}
}
}
},
created(){
//获取歌单管理从路由传过来的歌单id
this.songListId = this.$route.query.id;
this.getData();
},
methods:{
//查询所有歌手
getData(){
this.tempData = [];
this.tableData = [];
//通过歌单id,查询该歌单下的所有歌曲
listSongDetail(this.songListId).then(res => {
//通过每一项的歌曲id,获取到每一项的歌曲对象
for(let item of res.data.list){
this.getSong(item.songId);
}
})
},
//根据歌曲id查询歌曲对象,放到tempData和tableData里面
getSong(id){
songOfSongId(id)
.then(res => {
this.tempData.push(res.data.song);
this.tableData.push(res.data.song);
})
.catch(err => {
console.log(err);
});
},
//添加歌曲前的准备,获取到歌曲id
getSongId(){
let _this = this;
//添加歌曲之前,通过歌手名称+歌曲名称拼接,查找到歌曲对象,并获取到这个对象的歌曲id,然后,传送给后端保存
var songOfName = _this.registerForm.singerName+"-"+_this.registerForm.songName;
songOfSongName(songOfName).then(
res => {
_this.addSong(res.data.list[0].id)
}
)
},
//添加歌曲
addSong(songId){
let _this = this;
let params = new URLSearchParams();
params.append('songId',songId);
params.append('songListId',this.songListId);
listSongAdd(params)
.then(res => {
if(res.code == 20000){
this.getData();
this.notify("添加成功","success");
}else{
this.notify("添加失败","error");
}
})
.catch(err => {
console.log(err);
});
_this.centerDialogVisible = false;
},
//删除一条歌曲
deleteRow(){
delListSong(this.idx,this.songListId)
.then(res => {
if(res.code == 20000){
this.getData();
this.notify("删除成功","success");
}else{
this.notify("删除失败","error");
}
})
.catch(err => {
console.log(err);
});
this.delVisible = false;
}
}
}
</script>
<style scoped>
.handle-box{
margin-bottom: 20px;
}
.song-img{
width: 100%;
height: 80px;
border-radius: 5px;
margin-bottom: 5px;
overflow: hidden;
}
.handle-input{
width: 300px;
display: inline-block;
}
.pagination{
display: flex;
justify-content: center;
}
.play {
position: absolute;
z-index: 100;
width: 80px;
height: 80px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
top: 18px;
left: 15px;
}
.icon {
width: 2em;
height: 2em;
color: white;
fill: currentColor;
overflow: hidden;
}
</style>
添加歌曲
添加歌曲之前,通过歌手名称+歌曲名称拼接,查找到歌曲对象,并获取到这个对象的歌曲id,然后,传送给后端保存
调用请求后端服务接口的方法
//根据歌曲id查询歌曲对象
export const songOfSongId =(id) => get(`musicserver/song/detail?songId=${id}`);
//根据歌曲名获取歌曲对象
export const songOfSongName =(songName) => get(`musicserver/song/songOfSongName?songName=${songName}`);
import {get,post} from '../http'
//============歌单的歌曲相关============
//根据歌单id查询歌曲列表
export const listSongDetail = (songListId) => get(`musicserver/songList/detail?songListId=${songListId}`);
//给歌单增加歌曲
export const listSongAdd = (params) => post(`musicserver/songList/addListSong`,params);
//删除歌单的歌曲
export const delListSong = (songId,songListId) => get(`musicserver/songList/delete?songId=${songId}&songListId=${songListId}`);
引入请求后端接口方法
添加歌曲
删除歌曲