129 lines
5.4 KiB
TypeScript
129 lines
5.4 KiB
TypeScript
import { createRouter, createWebHistory } from 'vue-router'
|
|
import AppLayout from '@/layouts/AppLayout.vue'
|
|
import { decideRouteAccess } from '@/router/accessDecision'
|
|
import { useAccessPreviewStore } from '@/stores/accessPreview'
|
|
import { useAuthStore } from '@/stores/auth'
|
|
|
|
const router = createRouter({
|
|
history: createWebHistory(),
|
|
routes: [
|
|
{
|
|
path: '/login',
|
|
name: 'login',
|
|
component: () => import('@/views/LoginView.vue'),
|
|
meta: { title: '登录' },
|
|
},
|
|
{
|
|
path: '/',
|
|
component: AppLayout,
|
|
meta: { requiresAuth: true },
|
|
children: [
|
|
{
|
|
path: '',
|
|
name: 'home',
|
|
component: () => import('@/views/ModuleView.vue'),
|
|
meta: { title: '进入管理后台', description: '正在进入当前角色可访问的业务页面' },
|
|
},
|
|
{
|
|
path: 'customers',
|
|
name: 'customers',
|
|
component: () => import('@/views/IntegrationUnavailableView.vue'),
|
|
props: { moduleName: '客户管理', description: '后端尚未提供平台客户档案列表及维护接口。企业注册审核请使用“企业审核”页面。' },
|
|
meta: { title: '客户管理', description: '维护客户企业资料、合作状态和注册审核', permission: 'platform:customer:list' },
|
|
},
|
|
{
|
|
path: 'customers/reviews',
|
|
name: 'enterprise-reviews',
|
|
component: () => import('@/views/EnterpriseReviewsView.vue'),
|
|
meta: { title: '企业审核', description: '核验企业资质并维护客户下单资格', permission: 'platform:customer:review' },
|
|
},
|
|
{
|
|
path: 'warehouses',
|
|
name: 'warehouses',
|
|
component: () => import('@/views/WarehousesView.vue'),
|
|
meta: { title: '仓库管理', description: '维护客户头程下单可选择的平台收货仓', permission: 'platform:warehouse:list' },
|
|
},
|
|
{
|
|
path: 'orders/first-leg',
|
|
name: 'first-leg-orders',
|
|
component: () => import('@/views/FirstLegOrdersView.vue'),
|
|
meta: { title: '头程订单', description: '创建、受理和跟进客户提交的头程运输订单', permission: 'platform:order:list' },
|
|
},
|
|
{
|
|
path: 'master-data/express-companies',
|
|
name: 'express-companies',
|
|
component: () => import('@/views/IntegrationUnavailableView.vue'),
|
|
props: { moduleName: '快递公司', description: '后端尚未提供平台快递公司主数据的正式查询和维护接口。' },
|
|
meta: { title: '快递公司', description: '查询平台可用的快递公司档案与公开联系信息', permission: 'platform:express:list' },
|
|
},
|
|
{
|
|
path: 'master-data/counterparties',
|
|
name: 'counterparties',
|
|
component: () => import('@/views/IntegrationUnavailableView.vue'),
|
|
props: { moduleName: '往来单位', description: '现有往来单位接口仅面向企业端,后端尚未提供平台侧正式维护接口。' },
|
|
meta: { title: '往来单位', description: '维护供应商、客户、承运商、报关行及收发货单位档案', permission: 'platform:counterparty:list' },
|
|
},
|
|
{
|
|
path: 'system/users',
|
|
name: 'users',
|
|
component: () => import('@/views/InternalUsersView.vue'),
|
|
meta: { title: '内部用户', description: '管理平台内部员工账号、状态和角色', permission: 'platform:user:list' },
|
|
},
|
|
{
|
|
path: 'system/roles',
|
|
name: 'roles',
|
|
component: () => import('@/views/RolesView.vue'),
|
|
meta: { title: '角色管理', description: '维护平台角色并配置菜单及操作权限', permission: 'platform:role:list' },
|
|
},
|
|
{
|
|
path: 'system/permissions',
|
|
name: 'permissions',
|
|
component: () => import('@/views/PermissionsView.vue'),
|
|
meta: { title: '菜单权限', description: '维护菜单、页面、按钮和接口权限编码', permission: 'platform:permission:list' },
|
|
},
|
|
{
|
|
path: '403',
|
|
name: 'forbidden',
|
|
component: () => import('@/views/ForbiddenView.vue'),
|
|
meta: { title: '权限不足', description: '当前登录账号没有访问此页面的权限' },
|
|
},
|
|
],
|
|
},
|
|
{ path: '/:pathMatch(.*)*', redirect: '/' },
|
|
],
|
|
})
|
|
|
|
router.beforeEach((to) => {
|
|
document.title = to.meta.title ? `${to.meta.title} - 柏悦物流管理后台` : '柏悦物流管理后台'
|
|
const auth = useAuthStore()
|
|
if (to.name === 'login' && auth.isAuthenticated) {
|
|
return { name: 'home' }
|
|
}
|
|
if (!auth.isAuthenticated && !to.meta.requiresAuth) return true
|
|
|
|
const access = useAccessPreviewStore()
|
|
if (auth.isAuthenticated) access.initializeAfterLogin()
|
|
const decision = decideRouteAccess({
|
|
requiresAuth: to.meta.requiresAuth,
|
|
isAuthenticated: auth.isAuthenticated,
|
|
fullPath: to.fullPath,
|
|
permission: to.meta.permission,
|
|
hasPermission: to.meta.permission ? access.can(to.meta.permission) : true,
|
|
})
|
|
|
|
if (decision.type === 'login') {
|
|
return { name: 'login', query: { redirect: decision.redirect } }
|
|
}
|
|
if (decision.type === 'forbidden') {
|
|
return { name: 'forbidden', query: { from: decision.from }, replace: true }
|
|
}
|
|
if (to.name === 'home') {
|
|
return access.firstAccessiblePath
|
|
? { path: access.firstAccessiblePath, replace: true }
|
|
: { name: 'forbidden', replace: true }
|
|
}
|
|
return true
|
|
})
|
|
|
|
export default router
|