content: package org.ruoyi.common.web.interceptor;
  
  import jakarta.servlet.http.HttpServletRequest;
  import jakarta.servlet.http.HttpServletResponse;
  import lombok.extern.slf4j.Slf4j;
  import org.ruoyi.common.core.config.RuoYiConfig;
  import org.ruoyi.common.core.exception.DemoModeException;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.stereotype.Component;
  import org.springframework.web.servlet.HandlerInterceptor;
  
  /**
   * 演示模式拦截器
   * 全局拦截所有编辑操作（POST、PUT、DELETE、PATCH）
   *
   * @author ruoyi
   */
  @Slf4j
  @Component
  public class DemoModeInterceptor implements HandlerInterceptor {
  
      @Autowired
      private RuoYiConfig ruoYiConfig;
  
      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
          // 如果演示模式未开启，直接放行
          if (!ruoYiConfig.isDemoEnabled()) {
              return true;
          }
  
          String method = request.getMethod();
          String requestURI = request.getRequestURI();
  
          // 拦截所有编辑操作
          if (isEditOperation(method)) {
              // 排除一些特殊的只读操作
              if (isExcludedPath(requestURI)) {
                  return true;
              }
  
              log.warn("演示模式拦截: {} {}", method, requestURI);
              throw new DemoModeException();
          }
  
          return true;
      }
  
      /**
       * 判断是否为编辑操作
       */
      private boolean isEditOperation(String method) {
          return "POST".equalsIgnoreCase(method)
              || "PUT".equalsIgnoreCase(method)
              || "DELETE".equalsIgnoreCase(method)
              || "PATCH".equalsIgnoreCase(method);
      }
  
      /**
       * 判断是否为排除的路径（这些路径即使是POST等方法也不拦截）
       */
      private boolean isExcludedPath(String requestURI) {
          // 排除登录相关
          if (requestURI.contains("/auth/login") || requestURI.contains("/auth/logout")) {
              return true;
          }
  
          // 排除导出操作（虽然是POST但是只读操作）
          if (requestURI.contains("/export")) {
              return true;
          }
  
          // 排除查询操作（一些复杂查询使用POST）
          if (requestURI.contains("/list") || requestURI.contains("/query")) {
              return true;
          }
  
          // 排除聊天接口（核心功能）
          if (requestURI.contains("/chat/send") || requestURI.contains("/chat/upload")) {
              return true;
          }
  
          // 排除文件上传预览等只读操作
          if (requestURI.contains("/upload") || requestURI.contains("/preview")) {
              return true;
          }
  
          // 排除支付回调
          if (requestURI.contains("/pay/returnUrl") || requestURI.contains("/pay/notifyUrl")) {
              return true;
          }
  
          // 排除重置密码（用户自己的操作）
          if (requestURI.contains("/auth/reset/password")) {
              return true;
          }
  
          return false;
      }
  }
  