feat: 初始化音乐项目后台管理系统- 新增后台管理相关页面和功能组件
- 实现管理员评论管理、数据统计等功能 - 添加后台布局和路由管理 -配置数据库和Redis连接 - 实现文件上传和访问路径配置 - 添加Sa-Token安全配置
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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, "服务器内部错误");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user