|
|
|
@ -14,39 +14,33 @@ export const constantRoutes = [
|
|
|
|
component: () => import('@/views/Login/index.vue'),
|
|
|
|
component: () => import('@/views/Login/index.vue'),
|
|
|
|
meta: { title: '登录' },
|
|
|
|
meta: { title: '登录' },
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
]
|
|
|
|
path: '/',
|
|
|
|
|
|
|
|
component: Layout,
|
|
|
|
// 动态路由配置(需要权限)
|
|
|
|
redirect: `/SystemManage/UserManage`, // 重定向到第一个有权限的路由
|
|
|
|
export const asyncRoutes = [
|
|
|
|
children: [
|
|
|
|
|
|
|
|
// {
|
|
|
|
|
|
|
|
// path: 'WorkbenchPage',
|
|
|
|
|
|
|
|
// name: 'WorkbenchPage',
|
|
|
|
|
|
|
|
// component: () => import('@/views/WorkbenchPage/index.vue'),
|
|
|
|
|
|
|
|
// meta: { title: '工作台', permissions: ['workbench'] },
|
|
|
|
|
|
|
|
// },
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
path: 'SystemManage',
|
|
|
|
path: 'SystemManage',
|
|
|
|
meta: { title: '系统管理' },
|
|
|
|
meta: { title: '系统管理', permissions: ['system'] },
|
|
|
|
redirect: `/SystemManage/UserManage`,
|
|
|
|
redirect: `/SystemManage/UserManage`,
|
|
|
|
|
|
|
|
name: 'SystemManage',
|
|
|
|
children: [
|
|
|
|
children: [
|
|
|
|
{
|
|
|
|
{
|
|
|
|
path: 'UserManage',
|
|
|
|
path: 'UserManage',
|
|
|
|
name: 'UserManage',
|
|
|
|
name: 'UserManage',
|
|
|
|
component: () => import('@/views/UserManage/index.vue'),
|
|
|
|
component: () => import('@/views/UserManage/index.vue'),
|
|
|
|
meta: { title: '用户管理', permissions: ['RoleManage'] },
|
|
|
|
meta: { title: '用户管理', permissions: ['user_management'] },
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
path: 'RoleManage',
|
|
|
|
path: 'RoleManage',
|
|
|
|
name: 'RoleManage',
|
|
|
|
name: 'RoleManage',
|
|
|
|
component: () => import('@/views/RoleManage/index.vue'),
|
|
|
|
component: () => import('@/views/RoleManage/index.vue'),
|
|
|
|
meta: { title: '角色管理', permissions: ['RoleManage'] },
|
|
|
|
meta: { title: '角色管理', permissions: ['role_management'] },
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
path: 'AuthManage',
|
|
|
|
path: 'AuthManage',
|
|
|
|
name: 'AuthManage',
|
|
|
|
name: 'AuthManage',
|
|
|
|
component: () => import('@/views/AuthManage/index.vue'),
|
|
|
|
component: () => import('@/views/AuthManage/index.vue'),
|
|
|
|
meta: { title: '权限管理', permissions: ['AuthManage'] },
|
|
|
|
meta: { title: '权限管理', permissions: ['permission_management'] },
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
@ -54,71 +48,21 @@ export const constantRoutes = [
|
|
|
|
path: 'ModelManage',
|
|
|
|
path: 'ModelManage',
|
|
|
|
name: 'ModelManage',
|
|
|
|
name: 'ModelManage',
|
|
|
|
component: () => import('@/views/ModelManage/index.vue'),
|
|
|
|
component: () => import('@/views/ModelManage/index.vue'),
|
|
|
|
meta: { title: '模版管理' },
|
|
|
|
meta: { title: '模版管理', permissions: ['template'] },
|
|
|
|
}
|
|
|
|
},
|
|
|
|
],
|
|
|
|
{
|
|
|
|
|
|
|
|
path: 'NoPermission',
|
|
|
|
|
|
|
|
name: 'NoPermission',
|
|
|
|
|
|
|
|
component: () => import('@/views/NoPermission/index.vue'),
|
|
|
|
|
|
|
|
meta: { title: 'NoPermission', hide: true },
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
// 动态路由配置(需要权限)
|
|
|
|
|
|
|
|
// export const asyncRoutes = [
|
|
|
|
|
|
|
|
// // {
|
|
|
|
|
|
|
|
// // path: 'WorkbenchPage',
|
|
|
|
|
|
|
|
// // name: 'WorkbenchPage',
|
|
|
|
|
|
|
|
// // component: () => import('@/views/WorkbenchPage/index.vue'),
|
|
|
|
|
|
|
|
// // meta: { title: '工作台', permissions: ['workbench'] },
|
|
|
|
|
|
|
|
// // },
|
|
|
|
|
|
|
|
// {
|
|
|
|
|
|
|
|
// path: 'BusinessManage',
|
|
|
|
|
|
|
|
// name: 'BusinessManage',
|
|
|
|
|
|
|
|
// meta: { title: '门店管理', permissions: ['business'] },
|
|
|
|
|
|
|
|
// component: () => import('@/views/BusinessManage/index.vue'),
|
|
|
|
|
|
|
|
// children: [
|
|
|
|
|
|
|
|
// // {
|
|
|
|
|
|
|
|
// // path: 'StoreManage',
|
|
|
|
|
|
|
|
// // name: 'StoreManage',
|
|
|
|
|
|
|
|
// // component: () => import('@/views/BusinessManage/index.vue'),
|
|
|
|
|
|
|
|
// // meta: { title: '门店列表', permissions: ['business:store'] },
|
|
|
|
|
|
|
|
// // },
|
|
|
|
|
|
|
|
// // {
|
|
|
|
|
|
|
|
// // path: 'DataManage',
|
|
|
|
|
|
|
|
// // name: 'DataManage',
|
|
|
|
|
|
|
|
// // component: () => import('@/views/BusinessManage/DataManage.vue'),
|
|
|
|
|
|
|
|
// // meta: { title: '分类管理', permissions: ['business:data'] },
|
|
|
|
|
|
|
|
// // },
|
|
|
|
|
|
|
|
// ],
|
|
|
|
|
|
|
|
// },
|
|
|
|
|
|
|
|
// {
|
|
|
|
|
|
|
|
// path: 'EnterpriseManage',
|
|
|
|
|
|
|
|
// name: 'EnterpriseManage',
|
|
|
|
|
|
|
|
// component: () => import('@/views/EnterpriseManage/index.vue'),
|
|
|
|
|
|
|
|
// meta: { title: '企业管理', permissions: ['enterprise'] },
|
|
|
|
|
|
|
|
// },
|
|
|
|
|
|
|
|
// {
|
|
|
|
|
|
|
|
// path: 'CustomerManage',
|
|
|
|
|
|
|
|
// name: 'CustomerManage',
|
|
|
|
|
|
|
|
// component: () => import('@/views/CustomerManage/index.vue'),
|
|
|
|
|
|
|
|
// meta: { title: 'C端管理', permissions: ['superadmin'] },
|
|
|
|
|
|
|
|
// },
|
|
|
|
|
|
|
|
// {
|
|
|
|
|
|
|
|
// path: 'StoreReview',
|
|
|
|
|
|
|
|
// name: 'StoreReview',
|
|
|
|
|
|
|
|
// component: () => import('@/views/StoreReview/index.vue'),
|
|
|
|
|
|
|
|
// meta: { title: '门店审核', permissions: ['superadmin'] },
|
|
|
|
|
|
|
|
// },
|
|
|
|
|
|
|
|
// {
|
|
|
|
|
|
|
|
// path: 'EnterpriseAudit',
|
|
|
|
|
|
|
|
// name: 'EnterpriseAudit',
|
|
|
|
|
|
|
|
// component: () => import('@/views/EnterpriseAudit/index.vue'),
|
|
|
|
|
|
|
|
// meta: { title: '企业审核', permissions: ['superadmin'] },
|
|
|
|
|
|
|
|
// },
|
|
|
|
|
|
|
|
// ]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 检查用户权限
|
|
|
|
// 检查用户权限
|
|
|
|
function hasPermission(permissions, userPermissions) {
|
|
|
|
function hasPermission(permissions, userPermissions) {
|
|
|
|
if (!permissions || permissions.length === 0) return true
|
|
|
|
if (!permissions || permissions.length === 0) return true
|
|
|
|
|
|
|
|
if (useUserStore().userInfo?.isAdmin) return true
|
|
|
|
if (!userPermissions || userPermissions.length === 0) return false
|
|
|
|
if (!userPermissions || userPermissions.length === 0) return false
|
|
|
|
|
|
|
|
|
|
|
|
return permissions.some(permission =>
|
|
|
|
return permissions.some(permission =>
|
|
|
|
userPermissions.some(userPerm => userPerm.code === permission)
|
|
|
|
userPermissions.some(userPerm => userPerm.code === permission)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
@ -138,7 +82,13 @@ function filterAsyncRoutes(routes, userPermissions) {
|
|
|
|
filteredRoutes.push(temp)
|
|
|
|
filteredRoutes.push(temp)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
if (filteredRoutes.length > 0) {
|
|
|
|
|
|
|
|
filteredRoutes.sort((a, b) => {
|
|
|
|
|
|
|
|
if (a.path === 'NoPermission') {
|
|
|
|
|
|
|
|
return 1
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
return filteredRoutes
|
|
|
|
return filteredRoutes
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -147,14 +97,16 @@ export function generateRoutes(userPermissions) {
|
|
|
|
const accessedRoutes = filterAsyncRoutes(asyncRoutes, userPermissions)
|
|
|
|
const accessedRoutes = filterAsyncRoutes(asyncRoutes, userPermissions)
|
|
|
|
|
|
|
|
|
|
|
|
// 如果有可访问的路由,创建主布局路由
|
|
|
|
// 如果有可访问的路由,创建主布局路由
|
|
|
|
|
|
|
|
// console.log('accessedRoutes', accessedRoutes)
|
|
|
|
if (accessedRoutes.length > 0) {
|
|
|
|
if (accessedRoutes.length > 0) {
|
|
|
|
const mainRoute = {
|
|
|
|
const mainRoute = {
|
|
|
|
path: '/',
|
|
|
|
path: '/',
|
|
|
|
component: Layout,
|
|
|
|
component: Layout,
|
|
|
|
redirect: `/${accessedRoutes[0].path}`, // 重定向到第一个有权限的路由
|
|
|
|
name: 'index',
|
|
|
|
|
|
|
|
redirect: accessedRoutes[0].redirect || `/${accessedRoutes[0].path}`, // 重定向到第一个有权限的路由
|
|
|
|
children: accessedRoutes,
|
|
|
|
children: accessedRoutes,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
useUserStore().setRouterList(accessedRoutes || [])
|
|
|
|
return [mainRoute, ...constantRoutes]
|
|
|
|
return [mainRoute, ...constantRoutes]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -167,64 +119,75 @@ const router = createRouter({
|
|
|
|
history: createWebHistory(import.meta.env.BASE_URL),
|
|
|
|
history: createWebHistory(import.meta.env.BASE_URL),
|
|
|
|
routes,
|
|
|
|
routes,
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
console.log('routerinit')
|
|
|
|
|
|
|
|
|
|
|
|
// 白名单
|
|
|
|
// 白名单
|
|
|
|
const whiteList = ['/login']
|
|
|
|
const whiteList = ['/login']
|
|
|
|
// 标记是否已添加动态路由
|
|
|
|
// 标记是否已添加动态路由
|
|
|
|
let hasAddRoutes = false
|
|
|
|
let hasAddRoutes = false
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function flatten(arr) {
|
|
|
|
|
|
|
|
const res = []
|
|
|
|
|
|
|
|
arr.forEach(item => {
|
|
|
|
|
|
|
|
const { children, ...rest } = item
|
|
|
|
|
|
|
|
res.push(rest) // 当前节点
|
|
|
|
|
|
|
|
if (children && children.length > 0) {
|
|
|
|
|
|
|
|
res.push(...flatten(children)) // 递归子节点
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
return res
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 全局前置导航守卫
|
|
|
|
// 全局前置导航守卫
|
|
|
|
router.beforeEach(async (to, from, next) => {
|
|
|
|
router.beforeEach(async (to, from, next) => {
|
|
|
|
// 开启进度条
|
|
|
|
// 开启进度条
|
|
|
|
NProgress.start()
|
|
|
|
NProgress.start()
|
|
|
|
|
|
|
|
|
|
|
|
const userStore = useUserStore()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 如果没有 token,并且不在白名单中,则重定向到登录
|
|
|
|
// 如果没有 token,并且不在白名单中,则重定向到登录
|
|
|
|
if (!userStore.token && !whiteList.includes(to.path)) {
|
|
|
|
if (!useUserStore().token && !whiteList.includes(to.path)) {
|
|
|
|
return next('/login')
|
|
|
|
return next('/login')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 如果有 token 但还没有添加动态路由
|
|
|
|
// 如果有 token 但还没有添加动态路由
|
|
|
|
// if (userStore.token && !hasAddRoutes) {
|
|
|
|
if (useUserStore().token && !hasAddRoutes) {
|
|
|
|
// try {
|
|
|
|
try {
|
|
|
|
// // 获取用户权限
|
|
|
|
// 获取用户权限
|
|
|
|
// const userPermissions = userStore.userInfo?.jurisdictions || []
|
|
|
|
const userPermissions = flatten(useUserStore().userInfo?.menus || [])
|
|
|
|
|
|
|
|
|
|
|
|
// // 生成有权限的路由
|
|
|
|
|
|
|
|
// const accessRoutes = generateRoutes(userPermissions)
|
|
|
|
// 生成有权限的路由
|
|
|
|
|
|
|
|
const accessRoutes = generateRoutes(userPermissions)
|
|
|
|
// // 清除现有路由
|
|
|
|
|
|
|
|
// router.getRoutes().forEach(route => {
|
|
|
|
// 清除现有路由
|
|
|
|
// if (route.name && route.name !== 'login') {
|
|
|
|
router.getRoutes().forEach(route => {
|
|
|
|
// router.removeRoute(route.name)
|
|
|
|
if (route.name && route.name !== 'login') {
|
|
|
|
// }
|
|
|
|
router.removeRoute(route.name)
|
|
|
|
// })
|
|
|
|
}
|
|
|
|
|
|
|
|
})
|
|
|
|
// // 添加新的动态路由
|
|
|
|
|
|
|
|
// accessRoutes.forEach(route => {
|
|
|
|
// 添加新的动态路由
|
|
|
|
// router.addRoute(route)
|
|
|
|
accessRoutes.forEach(route => {
|
|
|
|
// })
|
|
|
|
router.addRoute(route)
|
|
|
|
|
|
|
|
})
|
|
|
|
// hasAddRoutes = true
|
|
|
|
|
|
|
|
|
|
|
|
hasAddRoutes = true
|
|
|
|
// // 如果当前访问的是根路径,重定向到第一个有权限的页面
|
|
|
|
|
|
|
|
// if (to.path === '/') {
|
|
|
|
// 如果当前访问的是根路径,重定向到第一个有权限的页面
|
|
|
|
// const firstRoute = accessRoutes.find(route => route.path === '/')
|
|
|
|
if (to.path === '/') {
|
|
|
|
// if (firstRoute && firstRoute.children && firstRoute.children.length > 0) {
|
|
|
|
const firstRoute = accessRoutes.find(route => route.path === '/')
|
|
|
|
// return next(`/${firstRoute.children[0].path}`)
|
|
|
|
if (firstRoute && firstRoute.children && firstRoute.children.length > 0) {
|
|
|
|
// }
|
|
|
|
return next(`/${firstRoute.children[0].path}`)
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
// // 重新导航到目标路由
|
|
|
|
|
|
|
|
// return next({ ...to, replace: true })
|
|
|
|
// 重新导航到目标路由
|
|
|
|
// } catch (error) {
|
|
|
|
return next({ ...to, replace: true })
|
|
|
|
// console.error('生成路由失败:', error)
|
|
|
|
} catch (error) {
|
|
|
|
// // 清除用户信息并重定向到登录
|
|
|
|
console.error('生成路由失败:', error)
|
|
|
|
// userStore.logout()
|
|
|
|
// 清除用户信息并重定向到登录
|
|
|
|
// return next('/login')
|
|
|
|
useUserStore().logout()
|
|
|
|
// }
|
|
|
|
return next('/login')
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
next()
|
|
|
|
next()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|