356 lines
9.3 KiB
JavaScript
356 lines
9.3 KiB
JavaScript
|
|
import { useUserStore } from '@/stores/user'
|
||
|
|
import { createRouter, createWebHistory } from 'vue-router'
|
||
|
|
import { statisticsRoutes } from './modules/statistics'
|
||
|
|
|
||
|
|
// 路由配置
|
||
|
|
const routes = [
|
||
|
|
{
|
||
|
|
path: '/',
|
||
|
|
redirect: '/dashboard'
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: '/auth',
|
||
|
|
component: () => import('@/layouts/AuthLayout.vue'),
|
||
|
|
meta: { requiresAuth: false },
|
||
|
|
children: [
|
||
|
|
{
|
||
|
|
path: 'login',
|
||
|
|
name: 'Login',
|
||
|
|
component: () => import('@/pages/auth/Login.vue'),
|
||
|
|
meta: { title: '登录' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'register',
|
||
|
|
name: 'Register',
|
||
|
|
component: () => import('@/pages/auth/Register.vue'),
|
||
|
|
meta: { title: '注册' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'reset',
|
||
|
|
name: 'ResetPassword',
|
||
|
|
component: () => import('@/pages/auth/ResetPassword.vue'),
|
||
|
|
meta: { title: '重置密码' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'test',
|
||
|
|
name: 'TestStore',
|
||
|
|
component: () => import('@/pages/auth/TestStore.vue'),
|
||
|
|
meta: { title: 'Store测试' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'response-test',
|
||
|
|
name: 'ResponseTest',
|
||
|
|
component: () => import('@/pages/auth/ResponseTest.vue'),
|
||
|
|
meta: { title: '响应格式测试' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'integration-test',
|
||
|
|
name: 'AuthIntegrationTest',
|
||
|
|
component: () => import('@/pages/auth/AuthIntegrationTest.vue'),
|
||
|
|
meta: { title: '认证集成测试' }
|
||
|
|
}
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: '/products',
|
||
|
|
component: () => import('@/layouts/MainLayout.vue'),
|
||
|
|
meta: { requiresAuth: true },
|
||
|
|
children: [
|
||
|
|
{
|
||
|
|
path: '',
|
||
|
|
name: 'Products',
|
||
|
|
component: () => import('@/pages/products/index.vue'),
|
||
|
|
meta: { title: '数据大厅' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: ':id',
|
||
|
|
name: 'ProductDetail',
|
||
|
|
component: () => import('@/pages/products/detail.vue'),
|
||
|
|
meta: { title: '产品详情' }
|
||
|
|
}
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: '/subscriptions',
|
||
|
|
component: () => import('@/layouts/MainLayout.vue'),
|
||
|
|
meta: { requiresAuth: true },
|
||
|
|
children: [
|
||
|
|
{
|
||
|
|
path: '',
|
||
|
|
name: 'Subscriptions',
|
||
|
|
component: () => import('@/pages/subscriptions/index.vue'),
|
||
|
|
meta: { title: '我的订阅' }
|
||
|
|
}
|
||
|
|
]
|
||
|
|
},
|
||
|
|
|
||
|
|
{
|
||
|
|
path: '/finance',
|
||
|
|
component: () => import('@/layouts/MainLayout.vue'),
|
||
|
|
meta: { requiresAuth: true },
|
||
|
|
children: [
|
||
|
|
{
|
||
|
|
path: '',
|
||
|
|
name: 'Finance',
|
||
|
|
component: () => import('@/pages/finance/Finance.vue'),
|
||
|
|
meta: { title: '财务管理' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'invoice',
|
||
|
|
name: 'Invoice',
|
||
|
|
component: () => import('@/pages/finance/Invoice.vue'),
|
||
|
|
meta: { title: '发票申请' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'wallet',
|
||
|
|
name: 'Wallet',
|
||
|
|
component: () => import('@/pages/finance/Wallet.vue'),
|
||
|
|
meta: { title: '余额充值' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'wallet/success',
|
||
|
|
name: 'WalletSuccess',
|
||
|
|
component: () => import('@/pages/finance/WalletSuccess.vue'),
|
||
|
|
meta: { title: '充值成功' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'wallet/fail',
|
||
|
|
name: 'WalletFail',
|
||
|
|
component: () => import('@/pages/finance/WalletFail.vue'),
|
||
|
|
meta: { title: '充值失败' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'wallet/processing',
|
||
|
|
name: 'WalletProcessing',
|
||
|
|
component: () => import('@/pages/finance/WalletProcessing.vue'),
|
||
|
|
meta: { title: '支付处理中' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'transactions',
|
||
|
|
name: 'Transactions',
|
||
|
|
component: () => import('@/pages/finance/Transactions.vue'),
|
||
|
|
meta: { title: '消费记录' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'recharge-records',
|
||
|
|
name: 'FinanceRechargeRecords',
|
||
|
|
component: () => import('@/pages/finance/recharge-records/index.vue'),
|
||
|
|
meta: { title: '充值记录' }
|
||
|
|
}
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: '/apis',
|
||
|
|
component: () => import('@/layouts/MainLayout.vue'),
|
||
|
|
meta: { requiresAuth: true },
|
||
|
|
children: [
|
||
|
|
{
|
||
|
|
path: '',
|
||
|
|
redirect: '/api/management'
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'management',
|
||
|
|
name: 'ApiManagement',
|
||
|
|
component: () => import('@/pages/api/ApiManagement.vue'),
|
||
|
|
meta: { title: 'API管理', icon: 'api' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'debugger',
|
||
|
|
name: 'ApiDebugger',
|
||
|
|
component: () => import('@/pages/api/ApiDebugger.vue'),
|
||
|
|
meta: { title: '在线调试', icon: 'bug' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'usage',
|
||
|
|
name: 'ApiUsage',
|
||
|
|
component: () => import('@/pages/api/Usage.vue'),
|
||
|
|
meta: { title: '调用记录', icon: 'list' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'whitelist',
|
||
|
|
name: 'ApiWhitelist',
|
||
|
|
component: () => import('@/pages/api/WhiteList.vue'),
|
||
|
|
meta: { title: '白名单管理', icon: 'shield' }
|
||
|
|
}
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: '/profile',
|
||
|
|
component: () => import('@/layouts/MainLayout.vue'),
|
||
|
|
meta: { requiresAuth: true },
|
||
|
|
children: [
|
||
|
|
{
|
||
|
|
path: '',
|
||
|
|
name: 'Profile',
|
||
|
|
component: () => import('@/pages/profile/Profile.vue'),
|
||
|
|
meta: { title: '账户中心' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'settings',
|
||
|
|
name: 'Settings',
|
||
|
|
component: () => import('@/pages/profile/Settings.vue'),
|
||
|
|
meta: { title: '我的订阅' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'certification',
|
||
|
|
name: 'Certification',
|
||
|
|
component: () => import('@/pages/certification/index.vue'),
|
||
|
|
meta: { title: '企业入驻' },
|
||
|
|
}
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: '/file-upload-test',
|
||
|
|
component: () => import('@/layouts/MainLayout.vue'),
|
||
|
|
meta: { requiresAuth: false },
|
||
|
|
children: [
|
||
|
|
{
|
||
|
|
path: '',
|
||
|
|
name: 'FileUploadTest',
|
||
|
|
component: () => import('@/pages/FileUploadTest.vue'),
|
||
|
|
meta: { title: '文件上传组件测试' }
|
||
|
|
}
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: '/admin',
|
||
|
|
component: () => import('@/layouts/MainLayout.vue'),
|
||
|
|
meta: { requiresAuth: true, requiresAdmin: true },
|
||
|
|
children: [
|
||
|
|
{
|
||
|
|
path: '',
|
||
|
|
redirect: '/admin/products'
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'products',
|
||
|
|
name: 'AdminProducts',
|
||
|
|
component: () => import('@/pages/admin/products/index.vue'),
|
||
|
|
meta: { title: '产品管理' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'categories',
|
||
|
|
name: 'AdminCategories',
|
||
|
|
component: () => import('@/pages/admin/categories/index.vue'),
|
||
|
|
meta: { title: '分类管理' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'subscriptions',
|
||
|
|
name: 'AdminSubscriptions',
|
||
|
|
component: () => import('@/pages/admin/subscriptions/index.vue'),
|
||
|
|
meta: { title: '订阅管理' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'usage',
|
||
|
|
name: 'AdminUsage',
|
||
|
|
component: () => import('@/pages/admin/usage/index.vue'),
|
||
|
|
meta: { title: 'API调用记录管理' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'transactions',
|
||
|
|
name: 'AdminTransactions',
|
||
|
|
component: () => import('@/pages/admin/transactions/index.vue'),
|
||
|
|
meta: { title: '消费记录管理' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'recharge-records',
|
||
|
|
name: 'AdminRechargeRecords',
|
||
|
|
component: () => import('@/pages/admin/recharge-records/index.vue'),
|
||
|
|
meta: { title: '充值记录管理' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'users',
|
||
|
|
name: 'AdminUsers',
|
||
|
|
component: () => import('@/pages/admin/users/index.vue'),
|
||
|
|
meta: { title: '用户管理' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'invoices',
|
||
|
|
name: 'AdminInvoices',
|
||
|
|
component: () => import('@/pages/admin/invoices/index.vue'),
|
||
|
|
meta: { title: '发票管理' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'articles',
|
||
|
|
name: 'AdminArticles',
|
||
|
|
component: () => import('@/pages/admin/articles/index.vue'),
|
||
|
|
meta: { title: '文章管理' }
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: 'statistics',
|
||
|
|
name: 'AdminStatistics',
|
||
|
|
component: () => import('@/pages/admin/statistics/SystemStatisticsPage.vue'),
|
||
|
|
meta: { title: '系统统计' }
|
||
|
|
}
|
||
|
|
]
|
||
|
|
},
|
||
|
|
// 统计路由
|
||
|
|
...statisticsRoutes,
|
||
|
|
{
|
||
|
|
path: '/certification/callback/:scene',
|
||
|
|
component: () => import('@/pages/certification/IframeCallback.vue'),
|
||
|
|
meta: { requiresAuth: false },
|
||
|
|
},
|
||
|
|
{
|
||
|
|
path: '/:pathMatch(.*)*',
|
||
|
|
name: 'NotFound',
|
||
|
|
component: () => import('@/pages/error/NotFound.vue'),
|
||
|
|
meta: { title: '页面不存在' }
|
||
|
|
}
|
||
|
|
]
|
||
|
|
|
||
|
|
// 创建路由实例
|
||
|
|
const router = createRouter({
|
||
|
|
history: createWebHistory(),
|
||
|
|
routes,
|
||
|
|
scrollBehavior(to, from, savedPosition) {
|
||
|
|
if (savedPosition) {
|
||
|
|
return savedPosition
|
||
|
|
} else {
|
||
|
|
return { top: 0 }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
// 路由守卫
|
||
|
|
router.beforeEach(async (to, from, next) => {
|
||
|
|
const userStore = useUserStore()
|
||
|
|
|
||
|
|
// 等待userStore初始化完成
|
||
|
|
if (!userStore.initialized) {
|
||
|
|
await userStore.init()
|
||
|
|
}
|
||
|
|
|
||
|
|
// 设置页面标题
|
||
|
|
if (to.meta.title) {
|
||
|
|
document.title = `${to.meta.title} - 天远数据控制台`
|
||
|
|
}
|
||
|
|
|
||
|
|
// 检查是否需要认证
|
||
|
|
if (to.meta.requiresAuth && !userStore.isLoggedIn) {
|
||
|
|
next('/auth/login')
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
// 检查管理员权限
|
||
|
|
if (to.meta.requiresAdmin && !userStore.isAdmin) {
|
||
|
|
next('/products')
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
// 已登录用户访问认证页面,重定向到数据大厅
|
||
|
|
if (to.path.startsWith('/auth') && userStore.isLoggedIn) {
|
||
|
|
next('/products')
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
next()
|
||
|
|
})
|
||
|
|
|
||
|
|
// 路由后置守卫
|
||
|
|
router.afterEach(() => {
|
||
|
|
// 可以在这里添加路由切换后的逻辑
|
||
|
|
// 比如埋点统计、页面访问记录等
|
||
|
|
})
|
||
|
|
|
||
|
|
export default router
|