1、后端编写
1.1 Service服务层编写
package com.gmw.musicserver.service;import com.gmw.musicserver.entity.Singer;import com.baomidou.mybatisplus.extension.service.IService;import java.util.List;/*** <p>* 歌手表 服务类* </p>** @author 未进化的程序猿* @since 2022-01-26*/public interface SingerService extends IService<Singer> {/***增加*/public boolean insertSinger(Singer singer);/***修改*/public boolean updateSinger(Singer singer);/*** 删除*/public boolean deleteSinger(Integer id);/*** 根据主键查询整个对象*/public Singer selectByPrimaryKey(Integer id);/*** 查询所有歌手*/public List<Singer> allSinger();/*** 根据歌手名字模糊查询列表*/public List<Singer> singerOfName(String name);/*** 根据性别查询*/public List<Singer> singerOfSex(Integer sex);}
package com.gmw.musicserver.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.gmw.musicserver.entity.Singer;import com.gmw.musicserver.mapper.SingerMapper;import com.gmw.musicserver.service.SingerService;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import org.springframework.stereotype.Service;import java.util.List;/*** <p>* 歌手表 服务实现类* </p>** @author 未进化的程序猿* @since 2022-01-26*/@Servicepublic class SingerServiceImpl extends ServiceImpl<SingerMapper, Singer> implements SingerService {/*** 添加歌手* @param singer* @return*/@Overridepublic boolean insertSinger(Singer singer) {int insert = this.baseMapper.insert(singer);return insert > 0;}/*** 更新歌手* @param singer* @return*/@Overridepublic boolean updateSinger(Singer singer) {return this.baseMapper.updateById(singer) > 0;}/*** 删除歌手* @param id* @return*/@Overridepublic boolean deleteSinger(Integer id) {return this.baseMapper.deleteById(id) > 0;}/*** 根据主键ID查询歌手* @param id* @return*/@Overridepublic Singer selectByPrimaryKey(Integer id) {return this.baseMapper.selectById(id);}/*** 查询所有的歌手* @return*/@Overridepublic List<Singer> allSinger() {return this.baseMapper.selectList(null);}/*** 根据歌手的名称,模糊查询所有歌手* @param name* @return*/@Overridepublic List<Singer> singerOfName(String name) {QueryWrapper<Singer> queryWrapper = new QueryWrapper<>();queryWrapper.like("name",name);return this.baseMapper.selectList(queryWrapper);}/*** 根据性别查询所有的歌手* @param sex* @return*/@Overridepublic List<Singer> singerOfSex(Integer sex) {QueryWrapper<Singer> queryWrapper = new QueryWrapper<>();queryWrapper.eq("sex",sex);return this.baseMapper.selectList(queryWrapper);}}
1.2 Controller控制层编写
package com.gmw.musicserver.controller;import com.gmw.musicserver.commonutils.R;import com.gmw.musicserver.entity.Singer;import com.gmw.musicserver.service.SingerService;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.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;/*** <p>* 歌手表 前端控制器* 歌手管理* </p>** @author 未进化的程序猿* @since 2022-01-26*/@RestController@RequestMapping("/musicserver/singer")public class SingerController {public static final Logger logger = LoggerFactory.getLogger(SingerController.class);@Autowiredpublic SingerService singerService;/*** 添加歌手*/@PostMapping(value = "/addSinger")public R addSinger(HttpServletRequest request){String name = request.getParameter("name").trim(); //姓名String sex = request.getParameter("sex").trim(); //性别String pic = request.getParameter("pic").trim(); //头像String birth = request.getParameter("birth").trim(); //生日String location = request.getParameter("location").trim();//地区String introduction = request.getParameter("introduction").trim();//简介//把生日转换成Date格式DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");Date birthDate = new Date();try {birthDate = dateFormat.parse(birth);} catch (ParseException e) {e.printStackTrace();}//保存到歌手的对象中Singer singer = new Singer();singer.setName(name);singer.setSex(Integer.parseInt(sex));singer.setBirth(birthDate);singer.setLocation(location);singer.setIntroduction(introduction);singer.setPic("/img/singerPic/hhh.jpg");logger.info("歌手对象: {}",singer);boolean flag = this.singerService.insertSinger(singer);if(flag){return R.ok().message("添加歌手成功!!");}return R.error().message("添加歌手失败!!");}/*** 修改歌手*/@PostMapping(value = "/updateSinger")public R updateSinger(HttpServletRequest request){String id = request.getParameter("id").trim(); //主键String name = request.getParameter("name").trim(); //姓名String sex = request.getParameter("sex").trim(); //性别String birth = request.getParameter("birth").trim(); //生日String location = request.getParameter("location").trim();//地区String introduction = request.getParameter("introduction").trim();//简介//把生日转换成Date格式DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");Date birthDate = new Date();try {birthDate = dateFormat.parse(birth);} catch (ParseException e) {e.printStackTrace();}//保存到歌手的对象中Singer singer = new Singer();singer.setId(Integer.parseInt(id));singer.setName(name);singer.setSex(Integer.parseInt(sex));singer.setBirth(birthDate);singer.setLocation(location);singer.setIntroduction(introduction);logger.info("歌手对象: {}",singer);boolean flag = this.singerService.updateSinger(singer);if(flag){return R.ok().message("修改歌手成功!!");}return R.error().message("修改歌手失败!!");}/*** 删除歌手*/@GetMapping(value = "/deleteSinger")public R deleteSinger(HttpServletRequest request){Integer id = Integer.parseInt(request.getParameter("id"));//删除歌手之前,也需要删除歌手的图片//通过ID主键查询歌手对象Singer singer = this.singerService.selectByPrimaryKey(id);//获取歌手图片String singerPic = singer.getPic();logger.info("歌手图片: {}",singerPic);//获取歌手保存的文件目录String singerPath = System.getProperty("user.dir") + singerPic;logger.info("获取歌手保存的文件目录: {}",singerPath);File file = new File(singerPath);if(file.isFile()){//判断如果是文件的话,就删除文件boolean isDelete = file.delete();logger.info("是否删除成功: {}",isDelete);if(!isDelete){return R.error().message("删除歌手失败!!");}}boolean flag = this.singerService.deleteSinger(id);if(flag){return R.ok().message("删除歌手成功!!");}return R.error().message("删除歌手失败!!");}/*** 根据主键查询整个对象*/@GetMapping(value = "/selectByPrimaryKey")public R selectByPrimaryKey(HttpServletRequest request){Integer id = Integer.parseInt(request.getParameter("id"));Singer singer = this.singerService.selectByPrimaryKey(id);return R.ok().data("singer",singer);}/*** 查询所有歌手*/@GetMapping(value = "/allSinger")public R allSinger(){List<Singer> singerList = this.singerService.allSinger();logger.info("查询所有歌手: {}",singerList);return R.ok().data("list",singerList);}/*** 根据歌手名字模糊查询列表*/@GetMapping(value = "/singerOfName")public R singerOfName(HttpServletRequest request){String name = request.getParameter("name");logger.info("歌手名称: {}",name);List<Singer> singerList = this.singerService.singerOfName(name);return R.ok().data("list",singerList);}/*** 根据性别查询*/@GetMapping(value = "/singerOfSex")public R singerOfSex(HttpServletRequest request){Integer sex = Integer.parseInt(request.getParameter("sex"));List<Singer> singerList = this.singerService.singerOfSex(sex);return R.ok().data("list",singerList);}/*** 更新歌手图片*/@PostMapping(value = "/updateSingerPic")public R updateSingerPic(@RequestParam("file")MultipartFile file,@RequestParam("id") Integer id){logger.info("歌手ID: {}",id);//判断上传的图片是否为空if(file.isEmpty()){logger.info("上传图片失败");return R.error().message("上传图片失败!!");}//文件名=当前时间到毫秒+原来的文件名String fileName = System.currentTimeMillis() + file.getOriginalFilename();logger.info("文件名: {}",fileName);//上传文件保存路径String filePath = System.getProperty("user.dir")+ System.getProperty("file.separator") + "img"+ System.getProperty("file.separator") + "singerPic";logger.info("上传文件保存路径: {}" ,filePath);//如果文件路径不存在,新增该路径File file1 = new File(filePath);if (!file1.exists()){file1.mkdir();}//实际的文件地址String fileDest = filePath + System.getProperty("file.separator") + fileName;logger.info("实际文件地址: {}",fileDest);File dest = new File(fileDest);//存储到数据库里的相对文件地址String storeAvatorPath = "/img/singerPic/" + fileName;logger.info("存储到数据库里的相对文件地址: {}",storeAvatorPath);try {//上传file.transferTo(dest);//上传成功后,根据ID,修改歌手图片Singer singer = new Singer();singer.setId(id); //歌手IDsinger.setPic(storeAvatorPath); //歌手图片boolean flag = this.singerService.updateSinger(singer);if (flag){return R.ok().message("图片上传成功!!");}else {return R.error().message("图片上传失败!!");}} catch (IOException e) {logger.info("文件上传失败: {}",e.getMessage());return R.error().message("图片上传失败!!" + e.getMessage());}}}
1.3 定位头像的地址
因为当客户端浏览器访问http://127.0.0.1:8888/img/singerPic/hhh.jpg的时候,会找不到这个静态资源,所以需要我们手动的去映射;

创建一个配置类,实现WebMvcConfig接口
package com.gmw.musicserver.config;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** 歌手图片映射配置-定位歌手头像地址*/@Configurationpublic class SingerPicConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/img/singerPic/**").addResourceLocations("file:" + System.getProperty("user.dir") + System.getProperty("file.separator")+ "img" + System.getProperty("file.separator")+ "singerPic" + System.getProperty("file.separator"));}}
1.4 更新歌手的图片
/*** 更新歌手图片*/@PostMapping(value = "/updateSingerPic")public R updateSingerPic(@RequestParam("file")MultipartFile file,@RequestParam("id") Integer id){logger.info("歌手ID: {}",id);//判断上传的图片是否为空if(file.isEmpty()){logger.info("上传图片失败");return R.error().message("上传图片失败!!");}//文件名=当前时间到毫秒+原来的文件名String fileName = System.currentTimeMillis() + file.getOriginalFilename();logger.info("文件名: {}",fileName);//上传文件保存路径String filePath = System.getProperty("user.dir")+ System.getProperty("file.separator") + "img"+ System.getProperty("file.separator") + "singerPic";logger.info("上传文件保存路径: {}" ,filePath);//如果文件路径不存在,新增该路径File file1 = new File(filePath);if (!file1.exists()){file1.mkdir();}//实际的文件地址String fileDest = filePath + System.getProperty("file.separator") + fileName;logger.info("实际文件地址: {}",fileDest);File dest = new File(fileDest);//存储到数据库里的相对文件地址String storeAvatorPath = "/img/singerPic/" + fileName;logger.info("存储到数据库里的相对文件地址: {}",storeAvatorPath);try {//上传file.transferTo(dest);//上传成功后,根据ID,修改歌手图片Singer singer = new Singer();singer.setId(id); //歌手IDsinger.setPic(storeAvatorPath); //歌手图片boolean flag = this.singerService.updateSinger(singer);if (flag){return R.ok().message("图片上传成功!!");}else {return R.error().message("图片上传失败!!");}} catch (IOException e) {logger.info("文件上传失败: {}",e.getMessage());return R.error().message("图片上传失败!!" + e.getMessage());}}
2、前端编写

代码如下:
<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="singer-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="name" label="歌手" width="120" align="center"></el-table-column><el-table-column label="性别" width="50" align="center"><template slot-scope="scope">{{changeSex(scope.row.sex)}}</template></el-table-column><el-table-column label="生日" width="120" align="center"><template slot-scope="scope">{{attachBirth(scope.row.birth)}}</template></el-table-column><el-table-column prop="location" label="地区" width="100" 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 label="歌曲管理" width="110" align="center"><template slot-scope="scope"><el-button size="mini" @click="songEdit(scope.row.id,scope.row.name)">歌曲管理</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-paginationbackgroundlayout = "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="name" label="歌手名" size="mini"><el-input v-model="registerForm.name" placeholder="歌手名"></el-input></el-form-item><el-form-item label="性别" size="mini"><el-radio-group v-model="registerForm.sex"><el-radio :label="0">女</el-radio><el-radio :label="1">男</el-radio><el-radio :label="2">组合</el-radio><el-radio :label="3">不明</el-radio></el-radio-group></el-form-item><el-form-item prop="birth" label="生日" size="mini"><el-date-picker type="date" placeholder="选择日期" v-model="registerForm.birth" style="width:100%"></el-date-picker></el-form-item><el-form-item prop="location" label="地区" size="mini"><el-input v-model="registerForm.location" 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><span slot="footer"><el-button size="mini" @click="centerDialogVisible = false">取消</el-button><el-button size="mini" @click="addSinger">确定</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="name" label="歌手名" size="mini"><el-input v-model="form.name" placeholder="歌手名"></el-input></el-form-item><el-form-item label="性别" size="mini"><el-radio-group v-model="form.sex"><el-radio :label="0">女</el-radio><el-radio :label="1">男</el-radio><el-radio :label="2">组合</el-radio><el-radio :label="3">不明</el-radio></el-radio-group></el-form-item><el-form-item label="生日" size="mini"><el-date-picker type="date" placeholder="选择日期" v-model="form.birth" style="width:100%"></el-date-picker></el-form-item><el-form-item prop="location" label="地区" size="mini"><el-input v-model="form.location" 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><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 {setSinger, getAllSinger,updateSinger,delSinger} from '../api/singer/index';import { mixin } from '../mixins/index';export default {mixins: [mixin],data(){return{centerDialogVisible: false, //添加弹窗是否显示editVisible: false, //编辑弹窗是否显示delVisible: false, //删除弹窗是否显示registerForm:{ //添加框name: '',sex: '',birth: '',location: '',introduction: ''},form:{ //编辑框id: '',name: '',sex: '',birth: '',location: '',introduction: ''},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.name.includes(this.select_word)){this.tableData.push(item);}}}}},created(){this.getData();},methods:{//获取当前页handleCurrentChange(val){this.currentPage = val;},//查询所有歌手getData(){this.tempData = [];this.tableData = [];getAllSinger().then(res => {this.tempData = res.data.list;this.tableData = res.data.list;})},//添加歌手addSinger(){let d = this.registerForm.birth;let datetime = d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate();let params = new URLSearchParams();params.append('name',this.registerForm.name);params.append('sex',this.registerForm.sex);params.append('pic','/img/singerPic/hhh.jpg');params.append('birth',datetime);params.append('location',this.registerForm.location);params.append('introduction',this.registerForm.introduction);setSinger(params).then(res => {if(res.code == 20000){this.getData();this.notify("添加成功","success");}else{this.notify("添加失败","error");}}).catch(err => {console.log(err);});this.centerDialogVisible = false;},//弹出编辑页面handleEdit(row){this.editVisible = true;this.form = {id: row.id,name: row.name,sex: row.sex,birth: row.birth,location: row.location,introduction: row.introduction}},//保存编辑页面修改的数据editSave(){let d = new Date(this.form.birth);let datetime = d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate();let params = new URLSearchParams();params.append('id',this.form.id);params.append('name',this.form.name);params.append('sex',this.form.sex);params.append('birth',datetime);params.append('location',this.form.location);params.append('introduction',this.form.introduction);updateSinger(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/singer/updateSingerPic?id=${id}`},//删除一名歌手deleteRow(){delSinger(this.idx).then(res => {if(res){this.getData();this.notify("删除成功","success");}else{this.notify("删除失败","error");}}).catch(err => {console.log(err);});this.delVisible = false;},//转向歌曲管理页面songEdit(id,name){this.$router.push({path:`/Song`,query:{id,name}});}}}</script><style scoped>.handle-box{margin-bottom: 20px;}.singer-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>
2.1 添加歌手

<el-button type="primary" size="mini" @click="centerDialogVisible = true">添加歌手</el-button>
<el-dialog title="添加歌手" :visible.sync="centerDialogVisible" width="400px" center><el-form :model="registerForm" ref="registerForm" label-width="80px"><el-form-item prop="name" label="歌手名" size="mini"><el-input v-model="registerForm.name" placeholder="歌手名"></el-input></el-form-item><el-form-item label="性别" size="mini"><el-radio-group v-model="registerForm.sex"><el-radio :label="0">女</el-radio><el-radio :label="1">男</el-radio><el-radio :label="2">组合</el-radio><el-radio :label="3">不明</el-radio></el-radio-group></el-form-item><el-form-item prop="birth" label="生日" size="mini"><el-date-picker type="date" placeholder="选择日期" v-model="registerForm.birth" style="width:100%"></el-date-picker></el-form-item><el-form-item prop="location" label="地区" size="mini"><el-input v-model="registerForm.location" 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><span slot="footer"><el-button size="mini" @click="centerDialogVisible = false">取消</el-button><el-button size="mini" @click="addSinger">确定</el-button></span></el-dialog>

:visible.sync=”centerDialogVisible” 表示当centerDialogVisible属性为true时才会弹出文本框,false隐藏文本框
定义属性变量
编写请求后端接口方法
import {get,post} from '../http'//查询歌手export const getAllSinger =() => get(`musicserver/singer/allSinger`);//添加歌手export const setSinger = (params) => post(`musicserver/singer/addSinger`,params);//编辑歌手export const updateSinger = (params) => post(`musicserver/singer/updateSinger`,params);//删除歌手export const delSinger = (id) => get(`musicserver/singer/deleteSinger?id=${id}`);

编写添加歌手的方法
//添加歌手addSinger(){let d = this.registerForm.birth;let datetime = d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate();let params = new URLSearchParams();params.append('name',this.registerForm.name);params.append('sex',this.registerForm.sex);params.append('pic','/img/singerPic/hhh.jpg');params.append('birth',datetime);params.append('location',this.registerForm.location);params.append('introduction',this.registerForm.introduction);setSinger(params).then(res => {if(res.code == 20000){this.getData();this.notify("添加成功","success");}else{this.notify("添加失败","error");}}).catch(err => {console.log(err);});//添加歌手成功后,将弹出文本框隐藏this.centerDialogVisible = false;},
2.2 查询歌手

<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="singer-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="name" label="歌手" width="120" align="center"></el-table-column><el-table-column label="性别" width="50" align="center"><template slot-scope="scope">{{changeSex(scope.row.sex)}}</template></el-table-column><el-table-column label="生日" width="120" align="center"><template slot-scope="scope">{{attachBirth(scope.row.birth)}}</template></el-table-column><el-table-column prop="location" label="地区" width="100" 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 label="歌曲管理" width="110" align="center"><template slot-scope="scope"><el-button size="mini" @click="songEdit(scope.row.id,scope.row.name)">歌曲管理</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>
处理性别的方法
//获取性别中文changeSex(value){if(value == 0){return '女';}if(value == 1){return '男';}if(value == 2){return '组合';}if(value == 3){return '不明';}return value;},
处理日期的方法
//获取生日attachBirth(val){return String(val).substr(0,10);},
编写请求后端查询接口
定义临时变量,接收后端传过来的值
查询所有歌手
2.3 定位头像的地址

在mixins.js工具类中,编写访问歌手图片的方法
export const mixin = {methods:{//提示信息notify(title,type){this.$notify({title: title,type: type})},//根据相对地址获取绝对地址getUrl(url){return `${this.$store.state.HOST}/${url}`},//获取性别中文changeSex(value){if(value == 0){return '女';}if(value == 1){return '男';}if(value == 2){return '组合';}if(value == 3){return '不明';}return value;},//获取生日attachBirth(val){return String(val).substr(0,10);},//上传图片之前的校验beforeAvatorUpload(file){const isJPG = (file.type === 'image/jpeg')||(file.type === 'image/png');if(!isJPG){this.$message.error('上传头像图片只能是jpg或png格式');return false;}const isLt2M = (file.size / 1024 /1024) < 2;if(!isLt2M){this.$message.error('上传头像图片大小不能超过2MB');return false;}return true;},//上传图片成功之后要做的工作handleAvatorSuccess(res){let _this = this;if(res.code == 20000){_this.getData();_this.$notify({title: '上传成功',type: 'success'});}else{_this.$notify({title: '上传失败',type: 'error'});}},//弹出删除窗口handleDelete(id){this.idx = id;this.delVisible = true;},//把已经选择的项赋值给multipleSelectionhandleSelectionChange(val){this.multipleSelection = val;},//批量删除已经选择的项delAll(){for(let item of this.multipleSelection){this.handleDelete(item.id);this.deleteRow();}this.multipleSelection = [];}}}

编写全局共享属性Vuex.Store
import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({state:{HOST: 'http://127.0.0.1:8888'}})export default store
访问通过,this.$store.state.HOST,就能访问到全局共享的属性值
2.4 更新歌手图片


<el-upload :action="uploadUrl(scope.row.id)" :before-upload="beforeAvatorUpload":on-success="handleAvatorSuccess"><el-button size="mini">更新图片</el-button></el-upload>
:action=”uploadUrl(scope.row.id)” 表示要访问的后台地址,并携带歌手的id,通过id修改歌手图像
//更新图片uploadUrl(id){return `${this.$store.state.HOST}/musicserver/singer/updateSingerPic?id=${id}`},
:before-upload=”beforeAvatorUpload” 表示文件上传之前,进行哪些操作,比如:上传的文件类型、大小都可以做限制;
//上传图片之前的校验beforeAvatorUpload(file){const isJPG = (file.type === 'image/jpeg')||(file.type === 'image/png');if(!isJPG){this.$message.error('上传头像图片只能是jpg或png格式');return false;}const isLt2M = (file.size / 1024 /1024) < 2;if(!isLt2M){this.$message.error('上传头像图片大小不能超过2MB');return false;}return true;},
:on-success=”handleAvatorSuccess” 表示上传成功后需要进行哪些操作,比如:提示上传成功或者失败
//上传图片成功之后要做的工作handleAvatorSuccess(res){let _this = this;if(res.code == 20000){_this.getData();_this.$notify({title: '上传成功',type: 'success'});}else{_this.$notify({title: '上传失败',type: 'error'});}},
2.5 根据歌手名搜索


核心:
根据watch监听,当输入歌名的文本框上的select_word属性值发生改变时,就会出发watch监听方法。先定义一个临时的变量tempDate[],当文本框为空时,将临时变量的值赋值给tableDate[],例如:tableDate = tempDate;
否则,清空tableDate = [],遍历临时变量的值,判断临时变量集合是否包含文本框的值select_word,包含的话,将满足条件的值,放到tableDate[]集合中去;


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);}}}}},
2.6 列表分页功能

<div class="pagination"><el-paginationbackgroundlayout = "total,prev,pager,next":current-page="currentPage":page-size="pageSize":total="tableData.length"@current-change="handleCurrentChange"></el-pagination></div>
:current-page 表示当前页 :page-size 表示每页显示的条数 :total=”tableData.length” 表示总记录数 @current-change=”handleCurrentChange” 表示当选择某一页的时候,就会得到当前选中的页数
定义临时变量
通过计算属性,计算当前搜索结果表里的数据
在表格中设置:data属性值为,计算属性的data
2.7 修改歌手


弹出编辑页面
<el-dialog title="修改歌手" :visible.sync="editVisible" width="400px" center><el-form :model="form" ref="form" label-width="80px"><el-form-item prop="name" label="歌手名" size="mini"><el-input v-model="form.name" placeholder="歌手名"></el-input></el-form-item><el-form-item label="性别" size="mini"><el-radio-group v-model="form.sex"><el-radio :label="0">女</el-radio><el-radio :label="1">男</el-radio><el-radio :label="2">组合</el-radio><el-radio :label="3">不明</el-radio></el-radio-group></el-form-item><el-form-item label="生日" size="mini"><el-date-picker type="date" placeholder="选择日期" v-model="form.birth" style="width:100%"></el-date-picker></el-form-item><el-form-item prop="location" label="地区" size="mini"><el-input v-model="form.location" 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><span slot="footer"><el-button size="mini" @click="editVisible = false">取消</el-button><el-button size="mini" @click="editSave">确定</el-button></span></el-dialog>
:visible.sync=”editVisible” 表示当editVisible属性为true时才会弹出文本框,false隐藏文本框
//弹出编辑页面handleEdit(row){this.editVisible = true;this.form = {id: row.id,name: row.name,sex: row.sex,birth: row.birth,location: row.location,introduction: row.introduction}},


保存编辑页面修改的数据
//保存编辑页面修改的数据editSave(){let d = new Date(this.form.birth);let datetime = d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate();let params = new URLSearchParams();params.append('id',this.form.id);params.append('name',this.form.name);params.append('sex',this.form.sex);params.append('birth',datetime);params.append('location',this.form.location);params.append('introduction',this.form.introduction);updateSinger(params).then(res => {if(res.code == 20000){this.getData();this.notify("修改成功","success");}else{this.notify("修改失败","error");}}).catch(err => {console.log(err);});this.editVisible = false;},
2.8 删除歌手


定义临时变量
弹出删除窗口
//弹出删除窗口handleDelete(id){this.idx = id;this.delVisible = true;},
<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>

删除一名歌手
//删除一名歌手deleteRow(){delSinger(this.idx).then(res => {if(res){this.getData();this.notify("删除成功","success");}else{this.notify("删除失败","error");}}).catch(err => {console.log(err);});this.delVisible = false;},
2.9 批量删除歌手


@selection-change=”handleSelectionChange” 表示可以得到选中的一组数据的集合
定义一个变量集合用来存储
把已经选择的项赋值给multipleSelection
//把已经选择的项赋值给multipleSelectionhandleSelectionChange(val){this.multipleSelection = val;},
批量删除已经选择的项
//批量删除已经选择的项delAll(){for(let item of this.multipleSelection){this.handleDelete(item.id);this.deleteRow();}this.multipleSelection = [];}
2.10 跳转到歌曲页面



//转向歌曲管理页面songEdit(id,name){this.$router.push({path:`/Song`,query:{id,name}});}
