import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http'; import { inject } from '@angular/core'; import { Router } from '@angular/router'; import { catchError, throwError } from 'rxjs'; import { ConfigService } from 'base-core'; import { AuthService } from '../services/auth.service'; export const MockInterceptor: HttpInterceptorFn = (req, next) => { const config = inject(ConfigService); const router = inject(Router); const authService = inject(AuthService); console.log(`拦截请求: ${req.method} ${req.url}`); console.log(`完整URL: ${req.urlWithParams}`); // 如果启用模拟数据且请求是API调用,可以在此拦截 // 目前仅记录请求 if (config.useMockData) { console.log(`Mock enabled for: ${req.url}`); } // 克隆请求以添加认证头 let authReq = req; // 检查是否为公开端点(不需要认证) const isPublicEndpoint = req.url.includes('/login') || req.url.includes('/register'); // 为需要认证的API请求添加Basic认证头(暂时禁用) if (req.url.includes('/api/') && !isPublicEndpoint) { console.log('API请求,添加默认认证头'); const defaultBasicAuth = 'YWRtaW46MTIz'; // base64("admin:123") authReq = req.clone({ setHeaders: { Authorization: `Basic ${defaultBasicAuth}` } }); } else { console.log('公开端点或非API请求,不添加认证头'); } return next(authReq).pipe( catchError((error: HttpErrorResponse) => { console.log(`请求错误: ${error.status} ${req.method} ${req.url}`); console.log('错误详情:', error.error); // 处理认证错误 if (error.status === 401 || error.status === 403 || (error.error && (error.error.error?.includes('认证') || error.error.error?.includes('缺少认证')))) { console.warn('认证失败,跳转到登录页面:', error.error); console.log('当前路由:', router.url); // 清除本地存储的认证信息 authService.logout(); // 跳转到登录页面,除非当前已经在登录页面 if (!router.url.includes('/login')) { console.log('重定向到登录页面'); router.navigate(['/login'], { queryParams: { returnUrl: router.url } }); } else { console.log('已经在登录页面,不重定向'); } } return throwError(() => error); }) ); };