import { createRouter, createWebHashHistory } from 'vue-router' import { useUserStore } from '@/stores/user' import { PERMISSIONS, type PermissionCode } from '@/config/permissions' import { showAppToast } from '@/utils/toast' declare module 'vue-router' { interface RouteMeta { permission?: PermissionCode hideTitleBar?: boolean } } const router = createRouter({ history: createWebHashHistory(), scrollBehavior(_to, _from, savedPosition) { if (savedPosition) { return savedPosition } return { left: 0, top: 0 } }, routes: [ { path: '/', name: 'Home', component: () => import('@/views/home/index.vue'), meta: { requiresAuth: true, showTabbar: true, title: '头寸管理平台' }, }, { path: '/login', name: 'Login', component: () => import('@/views/login/index.vue'), meta: { title: '账号登录' }, }, { path: '/cps/rmb-position', name: 'RmbPosition', component: () => import('@/views/cps/position-forecast/index.vue'), meta: { requiresAuth: true, title: '本币预报信息查询', }, }, { path: '/cps/rmb-position/new', name: 'RmbPositionCreate', component: () => import('@/views/cps/position-forecast/create/index.vue'), meta: { requiresAuth: true, title: '新增本币预报', }, }, { path: '/cps/rmb-position/:predRefNo/edit', name: 'RmbPositionEdit', component: () => import('@/views/cps/position-forecast/create/index.vue'), meta: { requiresAuth: true, title: '修改本币预报', }, }, { path: '/cps/rmb-position/:predRefNo', name: 'RmbPositionDetail', component: () => import('@/views/cps/position-forecast/detail/index.vue'), meta: { requiresAuth: true, title: '预报详情' }, }, { path: '/foreign-position', name: 'ForeignPosition', component: () => import('@/views/fps/position-forecast/index.vue'), meta: { requiresAuth: true, title: '外币预报信息查询', }, }, { path: '/foreign-position/new', name: 'ForeignPositionCreate', component: () => import('@/views/fps/position-forecast/create/index.vue'), meta: { requiresAuth: true, title: '新增外币预报', }, }, { path: '/foreign-position/approval', name: 'ForeignPositionApproval', component: () => import('@/views/fps/position-forecast/approval/index.vue'), meta: { requiresAuth: true, permission: PERMISSIONS.foreignPositionApprovalView, title: '外币头寸预报审批', }, }, { path: '/foreign-position/:predRefNo/edit', name: 'ForeignPositionEdit', component: () => import('@/views/fps/position-forecast/create/index.vue'), meta: { requiresAuth: true, title: '修改外币预报', }, }, { path: '/foreign-position/:predRefNo', name: 'ForeignPositionDetail', component: () => import('@/views/fps/position-forecast/detail/index.vue'), meta: { requiresAuth: true, title: '外币预报详情', }, }, { path: '/cps/pbc-position', name: 'PbcPosition', component: () => import('@/views/cps/pbc-position/index.vue'), meta: { requiresAuth: true, title: '人行头寸余额查询', }, }, { path: '/cps/position-estimate', name: 'PositionEstimate', component: () => import('@/views/cps/position-estimate/index.vue'), meta: { requiresAuth: true, title: '头寸匡算' }, }, { path: '/cps/position-estimate/report', name: 'PositionEstimateReport', component: () => import('@/views/cps/position-estimate/report/index.vue'), meta: { requiresAuth: true, title: '头寸匡算报表', }, }, { path: '/cps/position-estimate/report/detail', name: 'PositionEstimateReportDetail', component: () => import('@/views/cps/position-estimate/report/detail/index.vue'), meta: { requiresAuth: true, title: '头寸匡算报表', }, }, { path: '/cps/position-estimate/report/cell-detail', name: 'PositionEstimateReportCellDetail', component: () => import('@/views/cps/position-estimate/report/cell-detail/index.vue'), meta: { requiresAuth: true, title: '人民币匡算明细', }, }, { path: '/cps/position-estimate/opening-reserve', name: 'OpeningReserveEstimate', component: () => import('@/views/cps/position-estimate/opening-reserve/index.vue'), meta: { requiresAuth: true, title: '日初备款数匡算', }, }, { path: '/cps/cross-border-rmb-position-estimate', name: 'CrossBorderRmbPositionEstimate', component: () => import('@/views/cps/cross-border-position-estimate/index.vue'), meta: { requiresAuth: true, title: '跨境人民币匡算', }, }, { path: '/cps/net-debit', name: 'NetDebit', component: () => import('@/views/cps/net-debit/index.vue'), meta: { requiresAuth: true, title: '人民币净借记可用额度管理', }, }, { path: '/cps/clearing-detail', name: 'ClearingDetail', component: () => import('@/views/cps/clearing-detail/index.vue'), meta: { requiresAuth: true, title: '人民币小额网银清算场次明细', }, }, { path: '/cps/warning', name: 'Warning', component: () => import('@/views/cps/warning/index.vue'), meta: { requiresAuth: true, title: '头寸管理平台', }, }, { path: '/dashboard', name: 'Dashboard', component: () => import('@/views/dashboard/index.vue'), meta: { requiresAuth: true, permission: PERMISSIONS.dashboardView, showTabbar: true, title: '看板', }, }, { path: '/funds-cockpit', name: 'FundsCockpit', component: () => import('@/views/funds-cockpit/index.vue'), meta: { requiresAuth: true, permission: PERMISSIONS.fundsCockpitView, title: '资金驾驶舱', }, }, { path: '/funds-cockpit/cash-flow', name: 'FundsCockpitCashFlow', component: () => import('@/views/funds-cockpit/cash-flow/index.vue'), meta: { requiresAuth: true, permission: PERMISSIONS.fundsCockpitView, hideTitleBar: true, title: '未来现金流', }, }, { path: '/funds-cockpit/maturity-gap', name: 'FundsCockpitMaturityGap', component: () => import('@/views/funds-cockpit/maturity-gap/index.vue'), meta: { requiresAuth: true, permission: PERMISSIONS.fundsCockpitView, hideTitleBar: true, title: '到期期限缺口合计', }, }, { path: '/funds-cockpit/payment', name: 'FundsCockpitPayment', component: () => import('@/views/funds-cockpit/metric-detail/index.vue'), props: { metric: 'payment' }, meta: { requiresAuth: true, permission: PERMISSIONS.fundsCockpitView, hideTitleBar: true, title: '付款趋势', }, }, { path: '/funds-cockpit/collection', name: 'FundsCockpitCollection', component: () => import('@/views/funds-cockpit/metric-detail/index.vue'), props: { metric: 'collection' }, meta: { requiresAuth: true, permission: PERMISSIONS.fundsCockpitView, hideTitleBar: true, title: '收款趋势', }, }, { path: '/funds-cockpit/deviation', name: 'FundsCockpitDeviation', component: () => import('@/views/funds-cockpit/metric-detail/index.vue'), props: { metric: 'deviation' }, meta: { requiresAuth: true, permission: PERMISSIONS.fundsCockpitView, hideTitleBar: true, title: '轧差趋势', }, }, { path: '/funds-cockpit/pbc-balance', name: 'FundsCockpitPbcBalance', component: () => import('@/views/funds-cockpit/metric-detail/index.vue'), props: { metric: 'pbc-balance' }, meta: { requiresAuth: true, permission: PERMISSIONS.fundsCockpitView, hideTitleBar: true, title: '人行账户余额', }, }, { path: '/approval-center', name: 'ApprovalCenter', component: () => import('@/views/approval-center/index.vue'), meta: { requiresAuth: true, permission: PERMISSIONS.approvalCenterView, showTabbar: true, title: '待处理', }, }, { path: '/articles', name: 'Articles', component: () => import('@/views/announcement/index.vue'), meta: { requiresAuth: true, permission: PERMISSIONS.announcementView, showTabbar: true, title: '公告', }, }, { path: '/articles/new', name: 'ArticlePublish', component: () => import('@/views/announcement/edit/index.vue'), meta: { requiresAuth: true, permission: PERMISSIONS.announcementManage, title: '发布公告', }, }, { path: '/articles/:id', name: 'ArticleDetail', component: () => import('@/views/announcement/detail/index.vue'), meta: { requiresAuth: true, permission: PERMISSIONS.announcementView, title: '公告详情', }, }, { path: '/articles/:id/edit', name: 'ArticleEdit', component: () => import('@/views/announcement/edit/index.vue'), meta: { requiresAuth: true, permission: PERMISSIONS.announcementManage, title: '编辑公告', }, }, { path: '/mine', name: 'Mine', component: () => import('@/views/mine/index.vue'), meta: { requiresAuth: true, showTabbar: true, title: '我的' }, }, { path: '/settings', name: 'Settings', component: () => import('@/views/mine/settings/index.vue'), meta: { requiresAuth: true, title: '设置' }, }, ], }) router.beforeEach((to) => { const userStore = useUserStore() if (to.meta.requiresAuth && !userStore.token) { return { name: 'Login' } } if (to.meta.permission && !userStore.hasPermission(to.meta.permission)) { showAppToast('暂无访问权限') return { name: 'Home' } } }) export default router