Files
geo/apps/ops-web/src/router/index.ts
T

140 lines
4.2 KiB
TypeScript
Raw Normal View History

import { createRouter, createWebHistory } from 'vue-router'
import { useAuthStore } from '@/stores/auth'
import { pinia } from '@/stores/pinia'
export const router = createRouter({
history: createWebHistory(),
routes: [
{
path: '/login',
name: 'login',
component: () => import('@/views/LoginView.vue'),
meta: { title: '登录' },
},
{
path: '/',
component: () => import('@/layouts/AppShell.vue'),
meta: { requiresAuth: true },
children: [
{ path: '', redirect: '/admin-users' },
{
path: 'admin-users',
name: 'admin-users',
component: () => import('@/views/AdminUsersView.vue'),
meta: { title: '用户管理' },
},
{
path: 'kol-subscriptions',
name: 'kol-subscriptions',
component: () => import('@/views/KolSubscriptionsView.vue'),
meta: { title: '订阅包审批' },
},
{
path: 'accounts',
name: 'accounts',
component: () => import('@/views/AccountsView.vue'),
meta: { title: '操作员管理' },
},
{
path: 'audits',
name: 'audits',
component: () => import('@/views/AuditLogsView.vue'),
meta: { title: '审计日志' },
},
{
path: 'site-domain-mappings',
name: 'site-domain-mappings',
component: () => import('@/views/SiteDomainMappingsView.vue'),
meta: { title: '站点映射' },
},
{
path: 'compliance/policy',
name: 'compliance-policy',
component: () => import('@/views/compliance/CompliancePolicyView.vue'),
meta: { title: '全局合规策略' },
},
{
path: 'compliance/dictionaries',
name: 'compliance-dictionaries',
component: () => import('@/views/compliance/ComplianceDictionariesView.vue'),
meta: { title: '合规词库' },
},
{
path: 'compliance/dictionaries/new',
name: 'compliance-dictionary-new',
component: () => import('@/views/compliance/ComplianceDictionaryEditView.vue'),
meta: { title: '新建合规词库' },
},
{
path: 'compliance/dictionaries/:id/edit',
name: 'compliance-dictionary-edit',
component: () => import('@/views/compliance/ComplianceDictionaryEditView.vue'),
meta: { title: '编辑合规词库' },
},
{
path: 'compliance/manual-reviews',
name: 'compliance-manual-reviews',
component: () => import('@/views/compliance/ComplianceManualReviewsView.vue'),
meta: { title: '人工审阅' },
},
{
path: 'compliance/manual-reviews/:id',
name: 'compliance-manual-review-detail',
component: () => import('@/views/compliance/ComplianceManualReviewDetailView.vue'),
meta: { title: '人工审阅详情' },
},
{
path: 'compliance/records',
name: 'compliance-records',
component: () => import('@/views/compliance/ComplianceRecordsView.vue'),
meta: { title: '检测记录' },
},
{
path: 'compliance/stats',
name: 'compliance-stats',
component: () => import('@/views/compliance/ComplianceStatsView.vue'),
meta: { title: '合规统计' },
},
{
path: 'profile',
name: 'profile',
component: () => import('@/views/ProfileView.vue'),
meta: { title: '个人资料' },
},
],
},
{
path: '/:pathMatch(.*)*',
redirect: '/',
},
],
})
router.beforeEach((to) => {
const auth = useAuthStore(pinia)
if (!auth.initialized) {
auth.hydrate()
}
if (to.meta.requiresAuth && !auth.isAuthenticated) {
return {
name: 'login',
query: to.fullPath !== '/' ? { redirect: to.fullPath } : undefined,
}
}
if (to.name === 'login' && auth.isAuthenticated) {
return { name: 'admin-users' }
}
return true
})
router.afterEach((to) => {
if (typeof document !== 'undefined') {
const t = (to.meta.title as string | undefined) ?? '运营后台'
document.title = `${t} · 省心推`
}
})