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
*/
@Service
public class SingerServiceImpl extends ServiceImpl<SingerMapper, Singer> implements SingerService {
/**
* 添加歌手
* @param singer
* @return
*/
@Override
public boolean insertSinger(Singer singer) {
int insert = this.baseMapper.insert(singer);
return insert > 0;
}
/**
* 更新歌手
* @param singer
* @return
*/
@Override
public boolean updateSinger(Singer singer) {
return this.baseMapper.updateById(singer) > 0;
}
/**
* 删除歌手
* @param id
* @return
*/
@Override
public boolean deleteSinger(Integer id) {
return this.baseMapper.deleteById(id) > 0;
}
/**
* 根据主键ID查询歌手
* @param id
* @return
*/
@Override
public Singer selectByPrimaryKey(Integer id) {
return this.baseMapper.selectById(id);
}
/**
* 查询所有的歌手
* @return
*/
@Override
public List<Singer> allSinger() {
return this.baseMapper.selectList(null);
}
/**
* 根据歌手的名称,模糊查询所有歌手
* @param name
* @return
*/
@Override
public List<Singer> singerOfName(String name) {
QueryWrapper<Singer> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name",name);
return this.baseMapper.selectList(queryWrapper);
}
/**
* 根据性别查询所有的歌手
* @param sex
* @return
*/
@Override
public 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);
@Autowired
public 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); //歌手ID
singer.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;
/**
* 歌手图片映射配置-定位歌手头像地址
*/
@Configuration
public class SingerPicConfig implements WebMvcConfigurer {
@Override
public 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); //歌手ID
singer.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-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="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;
},
//把已经选择的项赋值给multipleSelection
handleSelectionChange(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-pagination
background
layout = "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
//把已经选择的项赋值给multipleSelection
handleSelectionChange(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}});
}