ai把angular 路由守卫文件 break down

发布于:2025-03-29 ⋅ 阅读:(30) ⋅ 点赞:(0)
// src/app/guards/auth-guard.service.ts
import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { AuthService } from '../services/auth.service';

@Injectable({
  providedIn: 'root'
})
export class AuthGuardService implements CanActivate {
  constructor(private router: Router, private authService: AuthService) {}

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<boolean> | Promise<boolean> | boolean {
    // 调用 AuthService 的 isLoggedIn 方法(异步)
    return this.authService.isLoggedIn().pipe(
      tap((isLoggedIn: boolean) => {
        if (!isLoggedIn) {
          // 如果未登录,重定向到登录页面
          this.router.navigate(['/login']);
        }
      })
    );
  }
}

1. 类的定义和接口实现

export class AuthGuardService implements CanActivate {
  • export 关键字表示这个类可以在其他文件中被导入和使用。

  • AuthGuardService 是类的名称,你可以根据实际需求命名,例如 AuthGuardLoginGuard 等。

  • implements CanActivate 表示这个类实现了 Angular 的 CanActivate 接口。CanActivate 是一个路由守卫接口,用于决定是否可以激活(访问)某个路由。

2. 构造函数

constructor(private router: Router) {}
  • constructor 是类的构造函数,用于初始化类的依赖项。

  • private router: Router 表示通过依赖注入(Dependency Injection)注入了 Angular 的 Router 服务。Router 服务提供了路由相关的功能,例如导航到其他路由。

  • private 修饰符表示 router 是一个私有成员变量,只能在 AuthGuardService 类内部使用。

3. canActivate 方法

canActivate(
  route: ActivatedRouteSnapshot,
  state: RouterStateSnapshot
): Observable<boolean> | Promise<boolean> | boolean {
  • canActivateCanActivate 接口的核心方法,Angular 会在尝试激活路由时调用它。

  • route: ActivatedRouteSnapshot 是一个参数,表示当前路由的快照,包含了路由的配置信息、参数等。

  • state: RouterStateSnapshot 是另一个参数,表示当前路由状态的快照,包含了路由的 URL 等信息。

  • 方法的返回值可以是以下三种类型之一:

    • Observable<boolean>:返回一个 RxJS 的 Observable,其值为布尔类型。

    • Promise<boolean>:返回一个 JavaScript 的 Promise,其值为布尔类型。

    • boolean:直接返回一个布尔值。