Skip to content

라우팅 시스템

개요

Antdv Next Admin은 Vue Router 4를 사용하며, 라우팅 설정은 권한 요구사항에 따라 3개의 계층으로 분류되어 라우트 가드와 함께 동적 라우트 주입 및 권한 필터링을 구현합니다.

라우트 분류

정적 라우트(staticRoutes)

인증 없이 접근 가능한 페이지:

typescript
// 로그인 페이지, 404, 403, 500 등의 오류 페이지
const staticRoutes = [
  { path: '/login', component: Login },
  { path: '/404', component: NotFound },
  { path: '/403', component: Forbidden },
  { path: '/500', component: ServerError },
]

기본 라우트(basicRoutes)

인증이 필요하지만 특정 권한은 불필요한 페이지:

typescript
// 대시보드, 프로필, 소개 페이지 등
const basicRoutes = [
  {
    path: '/dashboard',
    meta: { title: 'menu.dashboard', icon: 'DashboardOutlined', affix: true },
  },
  {
    path: '/profile',
    meta: { title: 'menu.profile', hidden: true },
  },
]

비동기 라우트(asyncRoutes)

특정 권한이 필요한 페이지로, 사용자 로그인 후 권한에 따라 동적으로 주입됩니다:

typescript
const asyncRoutes = [
  {
    path: '/organization',
    meta: { title: 'menu.organization', icon: 'TeamOutlined' },
    children: [
      {
        path: 'user',
        meta: {
          title: 'menu.user',
          requiredPermissions: ['system.user.view'],
        },
      },
      {
        path: 'role',
        meta: {
          title: 'menu.role',
          requiredPermissions: ['system.role.view'],
        },
      },
    ],
  },
]

라우트 Meta 필드

필드타입기본값설명
titlestring페이지 제목(i18n key)
iconstring메뉴 아이콘 컴포넌트명
requiresAuthbooleantrue인증 필요 여부
requiredPermissionsstring[]필요한 권한 코드
requiredRolesstring[]필요한 역할 코드
hiddenbooleanfalse메뉴에서 숨김 여부
affixbooleanfalse탭 고정 여부(닫을 수 없음)
ordernumber메뉴 정렬 순서
externalLinkstring외부 링크 주소

동적 라우트 생성 흐름

사용자 로그인

라우트 가드(guards.ts)가 첫 번째 네비게이션 가로채기

permissionStore.generateRoutes() 호출

사용자의 roles/permissions 기반으로 asyncRoutes 필터링

router.addRoute()로 필터링된 라우트를 동적으로 주입

동시에 사이드바 메뉴 트리 생성

네비게이션 계속

주의

비동기 라우트의 변경사항은 재로그인이 필요합니다. 라우트 생성은 로그인 후 첫 번째 네비게이션에서 한 번만 실행되기 때문입니다.

새 페이지 추가

1. 뷰 컴포넌트 생성

src/views/ 하위에 해당 페이지 컴포넌트를 생성합니다:

src/views/my-module/index.vue
vue
<script setup lang="ts">
// 페이지 로직
</script>

<template>
  <div>
    <!-- 페이지 콘텐츠 -->
  </div>
</template>

2. 라우트 설정 추가

src/router/routes.ts에 라우트를 추가하고, 권한 요구사항에 따라 적절한 계층에 배치합니다:

typescript
// asyncRoutes에 추가
{
  path: '/my-module',
  meta: {
    title: 'menu.myModule',
    icon: 'AppstoreOutlined',
    requiredPermissions: ['my-module.view'],
  },
  component: () => import('@/views/my-module/index.vue'),
}

3. 국제화 추가

src/locales/zh-CN.tsen-US.ts에 해당 메뉴 번역을 추가합니다:

typescript
// zh-CN.ts
menu: {
  myModule: '我的模块',
}

// en-US.ts
menu: {
  myModule: 'My Module',
}

라우트 가드가 동적 라우트 주입을 자동으로 처리하므로 수동으로 addRoute를 호출할 필요가 없습니다.

MIT 라이선스에 따라 배포됨