index.ts 5.67 KB
import { createRouter, createWebHistory } from 'vue-router'
import { useAuthStore } from '@/stores/auth'

const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: '/login',
      name: 'Login',
      component: () => import('@/views/Login.vue'),
      meta: { public: true },
    },
    {
      path: '/',
      component: () => import('@/layouts/MainLayout.vue'),
      redirect: '/dashboard',
      children: [
        {
          path: 'dashboard',
          name: 'Dashboard',
          component: () => import('@/views/dashboard/DashboardHome.vue'),
          meta: { title: '工作台' },
        },
        {
          path: 'city',
          name: 'City',
          component: () => import('@/views/city/CityList.vue'),
          meta: { title: '租户管理' },
        },
        {
          path: 'substation',
          name: 'Substation',
          component: () => import('@/views/substation/SubstationList.vue'),
          meta: { title: '分站管理' },
        },
        {
          path: 'merchant/enter',
          name: 'MerchantEnter',
          component: () => import('@/views/merchant/EnterList.vue'),
          meta: { title: '入驻申请' },
        },
        {
          path: 'merchant/store',
          name: 'MerchantStore',
          component: () => import('@/views/merchant/StoreList.vue'),
          meta: { title: '店铺管理' },
        },
        {
          path: 'merchant/fund',
          name: 'MerchantFund',
          component: () => import('@/views/merchant/FundReconciliation.vue'),
          meta: { title: '资金对账' },
        },
        {
          path: 'rider',
          name: 'Rider',
          component: () => import('@/views/rider/RiderList.vue'),
          meta: { title: '骑手管理' },
        },
        {
          path: 'order',
          name: 'Order',
          component: () => import('@/views/order/OrderList.vue'),
          meta: { title: '订单管理' },
        },
        {
          path: 'refund',
          name: 'Refund',
          component: () => import('@/views/order/RefundList.vue'),
          meta: { title: '退款管理' },
        },
        {
          path: 'delivery/order',
          name: 'DeliveryOrder',
          component: () => import('@/views/delivery/DeliveryOrderList.vue'),
          meta: { title: '配送订单' },
        },
        {
          path: 'config/fee-plan',
          name: 'FeePlan',
          component: () => import('@/views/config/FeePlanList.vue'),
          meta: { title: '配送费配置' },
        },
        {
          path: 'dispatch/rule',
          name: 'DispatchRule',
          component: () => import('@/views/dispatch/DispatchRuleList.vue'),
          meta: { title: '调度规则' },
        },
        {
          path: 'rider/evaluate',
          name: 'RiderEvaluate',
          component: () => import('@/views/rider/RiderEvaluateList.vue'),
          meta: { title: '骑手评价' },
        },
        {
          path: 'rider/level',
          name: 'RiderLevel',
          component: () => import('@/views/rider/RiderLevelList.vue'),
          meta: { title: '骑手等级' },
        },
        {
          path: 'open',
          name: 'OpenApp',
          component: () => import('@/views/open/OpenAppList.vue'),
          meta: { title: '开放平台' },
        },
        {
          path: 'open/mock-delivery',
          name: 'OpenMockDelivery',
          component: () => import('@/views/open/OpenMockDelivery.vue'),
          meta: { title: '模拟推单' },
        },
        {
          path: 'system/menu',
          name: 'SystemMenu',
          component: () => import('@/views/system/MenuManage.vue'),
          meta: { title: '菜单管理' },
        },
        {
          path: 'system/role',
          name: 'SystemRole',
          component: () => import('@/views/system/RoleList.vue'),
          meta: { title: '角色管理' },
        },
        {
          path: 'system/role-menu',
          name: 'SystemRoleMenu',
          component: () => import('@/views/system/RoleMenuAssign.vue'),
          meta: { title: '角色菜单' },
        },
        {
          path: 'substation/user',
          name: 'SubstationUser',
          component: () => import('@/views/substation/SubstationUserList.vue'),
          meta: { title: '分站账号' },
        },
        {
          path: 'substation/role',
          name: 'SubstationRole',
          component: () => import('@/views/substation/SubstationRoleList.vue'),
          meta: { title: '角色管理' },
        },
        {
          path: 'substation/role-menu',
          name: 'SubstationRoleMenu',
          component: () => import('@/views/substation/SubstationRoleMenuAssign.vue'),
          meta: { title: '角色菜单' },
        },
        {
          path: 'admin-user',
          name: 'AdminUser',
          component: () => import('@/views/admin/AdminUserList.vue'),
          meta: { title: '平台账号' },
        },
        {
          path: 'message',
          name: 'Message',
          component: () => import('@/views/message/MessageList.vue'),
          meta: { title: '消息管理' },
        },
      ],
    },
    { path: '/:pathMatch(.*)*', redirect: '/' },
  ],
})

router.beforeEach((to) => {
  const auth = useAuthStore()
  if (!to.meta.public && !auth.token) {
    return { path: '/login' }
  }

  if (!to.meta.public && auth.token) {
    if (!auth.menus.length) {
      auth.logout()
      return { path: '/login' }
    }
    if (to.path !== '/' && !auth.hasPath(to.path)) {
      return { path: auth.fallbackHomePath }
    }
  }

  document.body.classList.add('loading')
})

router.afterEach(() => {
  setTimeout(() => {
    document.body.classList.remove('loading')
  }, 300)
})

export default router