首先,创建一个,选好配置。
数据库的设计
一共 设计了三张表,分别是用户表,音乐表和喜欢音乐表。
统一数据返回
@Data
public class ResponseBodyMessage<T> {
private int status;//状态码
private String message;//状态描述信息
private T data;//返回的数据
public ResponseBodyMessage(int status, String message, T data) {
this.status = status;
this.message = message;
this.data = data;
}
}
核心功能:
-
登录
UserContorller层代码:
@RestController//@ResponseBody + @Controller合在一起的作用
@RequestMapping("/user")//使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求
public class UserController {
@Autowired
private UserMapper userMapper;
@RequestMapping("/login")
public ResponseBodyMessage<User> login(@RequestParam String username, @RequestParam String password,
HttpServletRequest request) {
User loginUser = new User();
loginUser.setUsername(username);
loginUser.setPassword(password);
User userInfo = userMapper.login(loginUser);
if(userInfo == null) {
return new ResponseBodyMessage<>(-1,"用户名或者密码错误",userInfo);
}else {
request.getSession().setAttribute("USERINFO_SESSION_KEY",userInfo);
return new ResponseBodyMessage<>(0,"登录成功",userInfo);
}
}
}
-
上传音乐
MusicContorller层代码:
@RequestMapping("/upload")
public ResponseBodyMessage<Boolean> insertMusic(@RequestParam String singer, @RequestParam("filename")
MultipartFile file, HttpServletRequest request, HttpServletResponse resp) throws IOException {
//没有session不创建
HttpSession httpSession = request.getSession(false);
if (httpSession == null || httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null) {
System.out.println("没有登录!");
return new ResponseBodyMessage<>(-1, "请登录后上传!", false);
}
String filenameAndType = file.getOriginalFilename();//xxx.mp3
System.out.println("filenameAndType:" + filenameAndType);
String path = SAVE_PATH + "/" + filenameAndType;
File dest = new File(path);
System.out.println("dest:=>" + dest.getPath());
if (!dest.exists()) {
dest.mkdirs();//创建目录
}
try {
file.transferTo(dest);//上传文件到目标
// return new ResponseBodyMessage<>(0, "上传成功", true);
} catch (IOException e) {
e.printStackTrace();
return new ResponseBodyMessage<>(-1, "服务器上传失败!", false);
}
//数据库当中存储的歌曲名称不包含.mp3. 所以,需要进行截取。从后向前找点号,去掉点号
String title = filenameAndType.substring(0,filenameAndType.lastIndexOf("."));
System.out.println(title);
//SimpleDateFormat来格式化当前的系统时间,赋值给time
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
String time=sf.format(new Date());
//这里会被用到 播放音乐的模块,我们暂且这么写,原因后面解释
String url = "/music/get?path="+title;
User user = (User)httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);
int userId = user.getId();
try {
int ret = musicMapper.insert(title, singer, time, url, userId);
System.out.println(ret);
if (ret == 1) {
resp.sendRedirect("/list.html"); //跳转页面
return new ResponseBodyMessage<>(0, "上传成功!", true);
} else {
System.out.println("上传失败!");
// dest.delete();
return new ResponseBodyMessage<>(-1, "数据库上传失败,删除上传的音乐!", false);
}
}catch (BindingException e){
dest.delete();
return new ResponseBodyMessage<>(-1,"数据库上传失败",false);
}
}
如何判断是否为MP3文件
位于音频问阿金的最后128个字节,可以读取出这个文件最后的128个字节获得标签,存放“ TAG ”字符,表示 ID3 V1.0 标准 ,根据是否包含这个字符,判断是不是音频文件。。
-
删除指定音乐
首先检查登录状态,有权限在继续删除。
查询音乐表中是否存在该音乐,存在在进行删除操作。
特别的情况是,当删除音乐库中音乐时,喜欢列表中的相应音乐也应该删除。
MusicContorller层代码:
@RequestMapping("/delete")
public ResponseBodyMessage<Boolean> deleteMusicById(@RequestParam String id) {
int iid = Integer.parseInt(id);
Music music = musicMapper.findMusicById(iid);
if(music == null)
return new ResponseBodyMessage<>(-1,"没有你要删除的音乐",false);
int ret = musicMapper.deleteMusicById(iid);
if(ret == 1) {
//数据库删除成功,那么服务器上的数据也需要发生改变
//删除服务器目录下的对应的文件
int index = music.getUrl().lastIndexOf("=");
String filename = music.getUrl().substring(index+1);
File file = new File(SAVE_PATH+"\\"+filename+".mp3");
System.out.println("此时的路径:"+file.getPath());
if(file.delete()) {
//同步删除lovemusic表中的数据
loveMusicMapper.deleteLoveMusicById(iid);
return new ResponseBodyMessage<>(0,"删除服务器音乐成功",true);
}else {
return new ResponseBodyMessage<>(-1,"删除服务器音乐失败",false);
}
}else{
return new ResponseBodyMessage<>(-1,"删除数据库中的音乐失败",false);
}
}
-
批量删除选中的音乐
MusicContorller层代码:
@RequestMapping("/deleteSel")
public ResponseBodyMessage<Boolean> deleteSelMusic(@RequestParam("id[]") List<Integer> id) {
//System.out.println(id);
int sum = 0;
for (int i = 0; i < id.size(); i++) {
int musicId = id.get(i);
Music music = musicMapper.findMusicById(musicId);
int ret = musicMapper.deleteMusicById(musicId);
if(ret == 1) {
//数据库删除成功,那么服务器上的数据也需要发生改变
//删除服务器目录下的对应的文件
int index = music.getUrl().lastIndexOf("=");
String filename = music.getUrl().substring(index+1);
File file = new File(SAVE_PATH+"\\"+filename+".mp3");
if(file.delete()) {
//同步删除lovemusic表中的数据
loveMusicMapper.deleteLoveMusicById(musicId);
sum += ret;
}else {
System.out.println("删除失败!");
return new ResponseBodyMessage<>(-1,"删除服务器上的音乐失败",false);
}
}else {
System.out.println("删除失败!");
return new ResponseBodyMessage<>(-1,"删除数据上的音乐信息失败",false);
}
}
if(sum == id.size()) {
System.out.println("删除成功!");
return new ResponseBodyMessage<>(0,"批量删除成功",true);
}else {
System.out.println("删除失败!");
return new ResponseBodyMessage<>(0,"批量删除失败",false);
}
}
-
查询你想要的音乐
MusicContorller层代码:
@RequestMapping("/findmusic")//(required=false)可以不传入参数
public ResponseBodyMessage<List<Music>> findMusic(@RequestParam(required=false) String musicName) {
List<Music> musicList = null;
if (musicName != null) {
musicList = musicMapper.findMusicByMusicName(musicName);
} else {
//默认查询全部的音乐
musicList = musicMapper.findMusic();
}
return new ResponseBodyMessage<>(0, "查询到了歌曲的信息", musicList);
}
支持模糊查询
sql语句实现:
<select id="findMusicByMusicName" resultType="com.example.music.model.Music">
select * from music where title like concat('%',#{musicName},'%')
</select>
-
添加音乐至喜欢的列表
LoveMuiscController层代码:
@RequestMapping("/likeMusic")
public ResponseBodyMessage<Boolean> likeMusic(@RequestParam String id, HttpServletRequest req) {
int musicId = Integer.parseInt(id);
System.out.println("likeMusic->musicId: "+musicId);
//没有session不创建
HttpSession httpSession = req.getSession(false);
if(httpSession == null || httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null) {
System.out.println("没有登录!");
return new ResponseBodyMessage<>(-1,"请先登录",false);
}
User user = (User)httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);
int userId = user.getId();
System.out.println("likeMusic__userID: "+userId);
//查询当前用户是否点赞过该音乐
Music music = loveMusicMapper.findLoveMusicByMusicIdAndUserId(userId,musicId);
if(music!=null) {
//之前收藏过,取消收藏
int effect = loveMusicMapper.deleteLoveMusic(userId,musicId);
return new ResponseBodyMessage<>(0,"取消收藏成功",false);
}else {
boolean effect = loveMusicMapper.insertLoveMusic(userId,musicId);
if(effect) {
return new ResponseBodyMessage<>(0,"点赞音乐成功",true);
}else {
return new ResponseBodyMessage<>(-1,"点赞音乐失败",false);
}
}
}
-
移除喜欢的音乐
LoveMusicController层代码:
@RequestMapping("/deletelovemusic")
public ResponseBodyMessage<Boolean> deleteLoveMusic(@RequestParam String id, HttpServletRequest req) {
int musicId = Integer.parseInt(id);
//没有session不创建
HttpSession httpSession = req.getSession(false);
if(httpSession == null || httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null) {
System.out.println("没有登录!");
return new ResponseBodyMessage<>(-1,"请先登录",false);
}
User user = (User)httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);
int userid = user.getId();
int ret = loveMusicMapper.deleteLoveMusic(userid,musicId);
if(ret == 1) {
return new ResponseBodyMessage<>(0,"取消收藏成功!",true);
}else {
return new ResponseBodyMessage<>(-1,"取消收藏失败!",false);
}
}