Files
dy/frontend/src/router/index.js
T
2026-08-07 17:51:57 +08:00

116 lines
3.8 KiB
JavaScript

import { createRouter, createWebHashHistory } from 'vue-router'
import Dashboard from '../views/Dashboard.vue'
import Accounts from '../views/Accounts.vue'
import Rules from '../views/Rules.vue'
import Logs from '../views/Logs.vue'
import Messages from '../views/Messages.vue'
import SystemLogs from '../views/SystemLogs.vue'
import ReceivedMessages from '../views/ReceivedMessages.vue'
import Login from '../views/Login.vue'
import Users from '../views/Users.vue'
import Roles from '../views/Roles.vue'
import Settings from '../views/Settings.vue'
import DesktopUpdate from '../views/DesktopUpdate.vue'
import PaymentSettings from '../views/PaymentSettings.vue'
import MyPaymentOrders from '../views/MyPaymentOrders.vue'
import Help from '../views/Help.vue'
import Download from '../views/Download.vue'
import { useAuthStore } from '../stores/auth'
import { firstAccessiblePath, MENU_ITEMS, menuAccessible } from '../config/menus'
const routes = [
{ path: '/login', component: Login, name: 'Login', meta: { public: true } },
{ path: '/', component: Dashboard, name: 'Dashboard', meta: { permission: 'menu.dashboard' } },
{ path: '/accounts', component: Accounts, name: 'Accounts', meta: { permission: 'menu.accounts' } },
{ path: '/messages', component: Messages, name: 'Messages', meta: { permission: 'menu.messages' } },
{ path: '/rules', component: Rules, name: 'Rules', meta: { permission: 'menu.rules' } },
{ path: '/logs', component: Logs, name: 'Logs', meta: { permission: 'menu.logs' } },
{
path: '/received-messages',
component: ReceivedMessages,
name: 'ReceivedMessages',
meta: { permission: 'menu.received_messages' }
},
{
path: '/system-logs',
component: SystemLogs,
name: 'SystemLogs',
meta: { permission: 'menu.system_logs' }
},
{ path: '/users', component: Users, name: 'Users', meta: { permission: 'menu.users' } },
{ path: '/roles', component: Roles, name: 'Roles', meta: { permission: 'menu.roles' } },
{ path: '/settings', component: Settings, name: 'Settings', meta: { permission: 'menu.settings' } },
{
path: '/desktop-update',
component: DesktopUpdate,
name: 'DesktopUpdate',
meta: { permission: 'menu.desktop_update' }
},
{
path: '/payment-settings',
component: PaymentSettings,
name: 'PaymentSettings',
meta: { permission: 'menu.payment_settings' }
},
{
path: '/payment-orders',
component: MyPaymentOrders,
name: 'MyPaymentOrders',
meta: { permission: 'menu.payment_orders' }
},
{ path: '/help', component: Help, name: 'Help', meta: { permission: 'menu.help' } },
{ path: '/download', component: Download, name: 'Download', meta: { permission: 'menu.download' } }
]
const router = createRouter({
history: createWebHashHistory(),
routes
})
router.beforeEach(async (to) => {
const auth = useAuthStore()
if (to.meta.public) {
if (auth.isLoggedIn && to.path === '/login') {
return firstAccessiblePath((code) => auth.hasPermission(code))
}
return true
}
if (!auth.isLoggedIn) {
return '/login'
}
if (!auth.user) {
try {
await auth.fetchMe()
} catch {
auth.clearSession()
return '/login'
}
} else if (!Array.isArray(auth.user.permissions)) {
// Old localStorage sessions lack the permission list.
try {
await auth.fetchMe()
} catch {
auth.clearSession()
return '/login'
}
}
const required = to.meta.permission
if (required && !auth.hasPermission(required)) {
return firstAccessiblePath((code) => auth.hasPermission(code))
}
const menuItem = MENU_ITEMS.find((item) => item.path === to.path)
if (menuItem && !menuAccessible(menuItem, (code) => auth.hasPermission(code))) {
return firstAccessiblePath((code) => auth.hasPermission(code))
}
return true
})
export default router