设计前端页面和布局框架

This commit is contained in:
2026-03-24 14:08:29 +08:00
parent 3afbc78c06
commit b7e9699dbd
49 changed files with 3188 additions and 6 deletions

View File

@@ -0,0 +1,99 @@
import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router'
import { useUserStore } from '@/store/user'
const routes: RouteRecordRaw[] = [
{
path: '/',
name: 'Home',
component: () => import('@/views/Home.vue'),
},
{
path: '/post/:id',
name: 'PostDetail',
component: () => import('@/views/PostDetail.vue'),
},
{
path: '/category/:id',
name: 'Category',
component: () => import('@/views/Category.vue'),
},
{
path: '/about',
name: 'About',
component: () => import('@/views/About.vue'),
},
{
path: '/login',
name: 'Login',
component: () => import('@/views/auth/Login.vue'),
},
{
path: '/register',
name: 'Register',
component: () => import('@/views/auth/Register.vue'),
},
{
path: '/profile',
name: 'Profile',
component: () => import('@/views/user/Profile.vue'),
meta: { requiresAuth: true },
},
{
path: '/admin',
name: 'Admin',
component: () => import('@/layouts/AdminLayout.vue'),
meta: { requiresAuth: true, requiresAdmin: true },
children: [
{
path: '',
redirect: '/admin/dashboard',
},
{
path: 'dashboard',
name: 'AdminDashboard',
component: () => import('@/views/admin/Dashboard.vue'),
},
{
path: 'posts',
name: 'AdminPosts',
component: () => import('@/views/admin/PostManage.vue'),
},
{
path: 'categories',
name: 'AdminCategories',
component: () => import('@/views/admin/CategoryManage.vue'),
},
{
path: 'tags',
name: 'AdminTags',
component: () => import('@/views/admin/TagManage.vue'),
},
],
},
{
path: '/:pathMatch(.*)*',
name: 'NotFound',
component: () => import('@/views/NotFound.vue'),
},
]
const router = createRouter({
history: createWebHistory(),
routes,
})
// 路由守卫
router.beforeEach((to, _from, next) => {
const userStore = useUserStore()
const token = localStorage.getItem('access_token')
if (to.meta.requiresAuth && !token) {
next({ name: 'Login' })
} else if (to.meta.requiresAdmin && userStore.user?.is_active !== true) {
next({ name: 'Home' })
} else {
next()
}
})
export default router