From 3da01972a3e804f52c2167764425d0c97ca8a332 Mon Sep 17 00:00:00 2001 From: bestlee Date: Tue, 23 Jun 2026 17:28:13 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E9=A1=B5=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E8=B7=AF=E7=94=B1=E6=9D=83=E9=99=90=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/logo.png | Bin 0 -> 4648 bytes src/main.js | 3 -- src/router/index.js | 73 ++++++++++++++++++++++++++------ src/views/error/404.vue | 3 ++ src/views/login/index.vue | 87 +++++++++++++++++++++++++++++++++++++- 5 files changed, 149 insertions(+), 17 deletions(-) create mode 100644 public/logo.png create mode 100644 src/views/error/404.vue diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..70b9ec901387ff02a7c97522c7274097109e0bb2 GIT binary patch literal 4648 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 P(GLItH-S~_IN|;SO}>iN literal 0 HcmV?d00001 diff --git a/src/main.js b/src/main.js index 8787a83..9d7b3b4 100644 --- a/src/main.js +++ b/src/main.js @@ -1,8 +1,6 @@ import './assets/main.css' - import { createApp } from 'vue' import { createPinia } from 'pinia' - import App from './App.vue' import router from './router' import 'amfe-flexible' @@ -11,5 +9,4 @@ const app = createApp(App) app.use(createPinia()) app.use(router) - app.mount('#app') diff --git a/src/router/index.js b/src/router/index.js index 7f32152..74c5af0 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,19 +1,68 @@ import { createRouter, createWebHistory } from 'vue-router' +// 静态路由(公共页面) +const constantRoutes = [ + { + path: '/', + redirect: '/login' + }, + { + path: '/login', + name: 'login', + component: () => import('../views/login/index.vue'), + }, + { + path: '/404', + name: 'NotFound', + component: () => import('../views/error/404.vue'), + }, +]; + const router = createRouter({ - history: createWebHistory(import.meta.env.BASE_URL), - routes: [ - { - path: '/', - name: 'login', - component: () => import('../views/login/index.vue'), + history: createWebHistory(), + routes: constantRoutes, +}) + +// 动态路由(需要权限的页面) +// 注意:这些路由不会在一开始注册,而是在守卫中动态添加 +const asyncRoutes = [ + { + path: '/applyList', + name: 'applyList', + component: () => import('../views/applyList/index.vue'), + meta: { + title: '申请列表', }, - { - path: '/applyList', - name: 'applyList', - component: () => import('../views/applyList/index.vue'), - }, - ], + }, +] + +// 标志位:是否已添加动态路由 +let isRoutesAdded = false +router.beforeEach((to, from, next) => { + const token = localStorage.getItem('token') + if (token) { + // 关键:有 token 但业务路由还没挂载 => 动态添加(仅一次) + if (!isRoutesAdded) { + asyncRoutes.forEach(route => { + router.addRoute(route) + }) + // 必须加载最后面 + router.addRoute({ + path: '/:pathMatch(.*)*', + redirect: '/404' + }); + isRoutesAdded = true + next({ ...to }) + } else { + next() + } + } else { + if (to.path === '/login' || to.path === '/404') { + next() + } else { + next({ path: '/login' }) + } + } }) export default router diff --git a/src/views/error/404.vue b/src/views/error/404.vue new file mode 100644 index 0000000..128ddc2 --- /dev/null +++ b/src/views/error/404.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/views/login/index.vue b/src/views/login/index.vue index c5554a1..30dd353 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -1,12 +1,95 @@ +