直接跳到内容

登录与路由拦截

介绍

导航拦截用于统一处理需要登录的页面,避免在每个页面重复校验登录状态。拦截配置集中在 core/navigation/src/main/ets/RouteInterceptor.ts

受保护路由配置

将需要登录的路由名加入 PROTECTED_ROUTES。如果某个页面需要登录才能访问,就把它的路由常量写在这里。

ts
import { AuthRoutes } from "./auth/AuthRoutes";
import { UserRoutes } from "./user/UserRoutes";

/**
 * @file 路由拦截配置(登录校验)
 */
const PROTECTED_ROUTES = [
  // 用户信息页面
  UserRoutes.Profile
  // 其他需要登录的页面...
] as const;

export type ProtectedRouteName = typeof PROTECTED_ROUTES[number];

const loginRequiredRouteNames: Set<ProtectedRouteName> = new Set<ProtectedRouteName>(PROTECTED_ROUTES);

/**
 * 判断路由是否需要登录
 * @param {string} routeName - 路由名称
 * @returns {boolean} 是否需要登录
 */
export function requiresLogin(routeName: string): boolean {
  return loginRequiredRouteNames.has(routeName as ProtectedRouteName);
}

/**
 * 获取登录页路由名称
 * @returns {ProtectedRouteName} 登录页路由
 */
export function getLoginRoute(): ProtectedRouteName {
  return AuthRoutes.Login as ProtectedRouteName;
}

登录页配置

登录页路由在 getLoginRoute() 中配置。如果项目的登录页不是 AuthRoutes.Login,只需要在这里替换成你自己的登录路由。

ts
/**
 * 获取登录页路由名称
 * @returns {ProtectedRouteName} 登录页路由
 */
export function getLoginRoute(): ProtectedRouteName {
  return AuthRoutes.Login as ProtectedRouteName;
}

拦截逻辑说明

  • NavigationService.navigateTo() 内部会调用 requiresLogin()
  • 未登录时自动跳转到登录页,不需要业务层手动判断。
  • 登录页路由更换时,只需要调整 getLoginRoute()

常见调整

  • 新增受保护页面:在 PROTECTED_ROUTES 中添加路由名。
  • 登录页改名:在 getLoginRoute() 中替换为新的路由常量。