feat: 初始化音乐项目后台管理系统- 新增后台管理相关页面和功能组件

- 实现管理员评论管理、数据统计等功能
- 添加后台布局和路由管理
-配置数据库和Redis连接
- 实现文件上传和访问路径配置
- 添加Sa-Token安全配置
This commit is contained in:
ikmkj
2025-04-26 19:32:45 +08:00
commit b275ffab5a
185 changed files with 32763 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
package com.test.musichouduan.exception;
/**
* 业务异常
*/
public class BusinessException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
* 错误码
*/
private Integer code;
/**
* 错误消息
*/
private String message;
/**
* 构造方法
*
* @param message 错误消息
*/
public BusinessException(String message) {
this.code = 500;
this.message = message;
}
/**
* 构造方法
*
* @param code 错误码
* @param message 错误消息
*/
public BusinessException(Integer code, String message) {
this.code = code;
this.message = message;
}
/**
* 获取错误码
*
* @return 错误码
*/
public Integer getCode() {
return code;
}
/**
* 获取错误消息
*
* @return 错误消息
*/
@Override
public String getMessage() {
return message;
}
}

View File

@@ -0,0 +1,132 @@
package com.test.musichouduan.exception;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import com.test.musichouduan.dto.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.resource.NoResourceFoundException;
import jakarta.servlet.http.HttpServletRequest;
/**
* 全局异常处理器
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 处理自定义异常
*/
@ExceptionHandler(BusinessException.class)
public Result<Void> handleBusinessException(BusinessException e) {
logger.error(e.getMessage(), e);
return Result.error(e.getCode(), e.getMessage());
}
/**
* 处理未登录异常
*/
@ExceptionHandler(NotLoginException.class)
public Result<Void> handleNotLoginException(NotLoginException e) {
logger.error(e.getMessage(), e);
return Result.error(401, "未登录或登录已过期,请重新登录");
}
/**
* 处理无权限异常
*/
@ExceptionHandler(NotPermissionException.class)
public Result<Void> handleNotPermissionException(NotPermissionException e) {
logger.error(e.getMessage(), e);
return Result.error(403, "无权限访问");
}
/**
* 处理无角色异常
*/
@ExceptionHandler(NotRoleException.class)
public Result<Void> handleNotRoleException(NotRoleException e) {
logger.error(e.getMessage(), e);
return Result.error(403, "无权限访问");
}
/**
* 处理参数校验异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
logger.error(e.getMessage(), e);
BindingResult bindingResult = e.getBindingResult();
StringBuilder sb = new StringBuilder("参数校验失败:");
for (FieldError fieldError : bindingResult.getFieldErrors()) {
sb.append(fieldError.getField()).append("").append(fieldError.getDefaultMessage()).append(", ");
}
String msg = sb.toString();
if (msg.endsWith(", ")) {
msg = msg.substring(0, msg.length() - 2);
}
return Result.error(400, msg);
}
/**
* 处理参数绑定异常
*/
@ExceptionHandler(BindException.class)
public Result<Void> handleBindException(BindException e) {
logger.error(e.getMessage(), e);
BindingResult bindingResult = e.getBindingResult();
StringBuilder sb = new StringBuilder("参数绑定失败:");
for (FieldError fieldError : bindingResult.getFieldErrors()) {
sb.append(fieldError.getField()).append("").append(fieldError.getDefaultMessage()).append(", ");
}
String msg = sb.toString();
if (msg.endsWith(", ")) {
msg = msg.substring(0, msg.length() - 2);
}
return Result.error(400, msg);
}
/**
* 处理文件上传大小超限异常
*/
@ExceptionHandler(MaxUploadSizeExceededException.class)
public Result<Void> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
logger.error(e.getMessage(), e);
return Result.error(400, "上传文件大小超出限制");
}
/**
* 处理资源未找到异常
*/
@ExceptionHandler(NoResourceFoundException.class)
public Result<Void> handleNoResourceFoundException(NoResourceFoundException e, HttpServletRequest request) {
// 如果是 favicon.ico 的请求,则不记录日志
String requestURI = request.getRequestURI();
if (requestURI.endsWith("/favicon.ico")) {
return Result.error(404, "Resource not found");
}
// 其他资源未找到的情况,记录日志
logger.error(e.getMessage(), e);
return Result.error(404, "Resource not found");
}
/**
* 处理其他异常
*/
@ExceptionHandler(Exception.class)
public Result<Void> handleException(Exception e) {
logger.error(e.getMessage(), e);
return Result.error(500, "服务器内部错误");
}
}