From 23da619e23fdf7e2044a1c959fb51e8cd84a760c Mon Sep 17 00:00:00 2001 From: yulinling <2712495353@qq.com> Date: Tue, 19 Aug 2025 00:11:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 40 ++++++++++++++++++++++++++++++++++ src/router/index.js | 49 +++++++++++++++++++++--------------------- src/views/NotFound.vue | 7 ++++++ 3 files changed, 72 insertions(+), 24 deletions(-) create mode 100644 src/views/NotFound.vue diff --git a/README.md b/README.md index 821e5a9..4a238b7 100644 --- a/README.md +++ b/README.md @@ -33,3 +33,43 @@ npm run build ```sh npm run lint ``` + +```angular2html +src +├─ assets # 静态资源 (图片、字体、全局样式等) +│ ├─ images +│ ├─ icons +│ └─ styles # 全局样式(variables.scss, reset.css...) +│ +├─ components # 全局通用组件 +│ ├─ common # 公共基础组件 (按钮、输入框、弹窗...) +│ ├─ layout # 页面框架相关组件 (导航栏、侧边栏...) +│ └─ widgets # 业务相关的小部件 +│ +├─ layouts # 页面整体布局 (BasicLayout.vue, BlankLayout.vue...) +│ +├─ views # 页面级组件 (对应路由) +│ ├─ Home +│ ├─ Login +│ └─ Dashboard +│ +├─ router # 路由配置 +│ └─ index.ts +│ +├─ stores # 状态管理 (Pinia / Vuex) +│ └─ user.ts +│ +├─ utils # 工具函数 (request.ts, format.ts...) +│ +├─ api # 接口请求 (user.ts, product.ts...) +│ +├─ models # 类型声明 (TS 接口 / class) +│ +├─ hooks # 自定义 hooks (useAuth.ts, useDarkMode.ts...) +│ +├─ plugins # 插件配置 (element-plus.ts, i18n.ts...) +│ +├─ directives # 自定义指令 (v-permission.ts...) +│ +└─ App.vue +``` \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index 8484e89..f1be132 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,70 +1,71 @@ import { createRouter, createWebHistory } from 'vue-router' -import AboutView from '@/views/AboutView.vue' -import ToolView from '@/views/ToolView.vue' -import NewsView from '@/views/NewsView.vue' -import DefaultLayout from '../layouts/DefaultLayout.vue' -import LoginLayout from '@/layouts/LoginLayout.vue' -import LoginView from '@/views/LoginView.vue' -import HomeView from '@/views/HomeView.vue' import { getToken } from '@/utils/auth.js' -import TestView from '@/views/TestView.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes: [ { path: '/', - component: DefaultLayout, + component: () => import('@/layouts/DefaultLayout.vue'), children: [ { path: '', name: 'Home', - component: HomeView + component: () => import('@/views/HomeView.vue') }, { - path: '/about', + path: 'about', name: 'about', - component: AboutView + component: () => import('@/views/AboutView.vue') }, { - path: '/tool', + path: 'tool', name: 'tool', - component: ToolView + component: () => import('@/views/ToolView.vue') }, { - path: '/news', + path: 'news', name: 'news', - component: NewsView + component: () => import('@/views/NewsView.vue'), + meta: { requiresAuth: true } }, { - path: '/test', + path: 'test', name: 'test', - component: TestView + component: () => import('@/views/TestView.vue'), + meta: { requiresAuth: true } } ] }, { path: '/login', - component: LoginLayout, + component: () => import('@/views/LoginView.vue'), children: [ { path: '', name: 'Login', - component: LoginView, - meta: { - requiresAuth: true - } + component: () => import('@/views/LoginView.vue'), + meta: { requiresGuest: true } } ] + }, + { + path: '/:pathMatch(.*)*', + name: 'NotFound', + component: () => import('@/views/NotFound.vue') } ] }) router.beforeEach((to, from, next) => { + const token = getToken() const requiresAuth = to.matched.some((record) => record.meta.requiresAuth) + const requiresGuest = to.matched.some((record) => record.meta.requiresAuth) - if (!requiresAuth && !getToken()) { + if (requiresAuth && !token) { next({ path: '/login' }) + } else if (requiresGuest && !getToken()) { + next({ name: 'Home' }) } else { console.log('next') next() diff --git a/src/views/NotFound.vue b/src/views/NotFound.vue new file mode 100644 index 0000000..d75be59 --- /dev/null +++ b/src/views/NotFound.vue @@ -0,0 +1,7 @@ + + + + +