123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- import { defineStore } from 'pinia'
- import { asyncRouterMap, constantRouterMap } from '@/router'
- import { deepClone } from '@/utils'
- import { AppRouteRecordRaw } from '@/router/types'
- import { useCache } from '@/hooks/web/useCache'
- const { wsCache } = useCache()
- import { isExternal } from '@/utils/validate'
- import path from 'path-browserify'
- import { getParentLayout } from '@/router/utils'
- import { store } from '../index'
- import { useAppStoreWithOut } from '@/store/modules/app'
- const appStore = useAppStoreWithOut()
- const modules = import.meta.glob('../../views/**/*.vue')
- /* Layout */
- const Layout = () => import('@/layout/index.vue')
- export interface PermissionState {
- routers: AppRouteRecordRaw[]
- addRouters: AppRouteRecordRaw[]
- isAddRouters: boolean
- activeTab: string
- menuTabRouters: AppRouteRecordRaw[]
- }
- export const usePermissionStore = defineStore({
- id: 'permission',
- state: (): PermissionState => ({
- routers: [],
- addRouters: [],
- isAddRouters: false,
- menuTabRouters: [],
- activeTab: ''
- }),
- getters: {
- getRouters(): AppRouteRecordRaw[] {
- return this.routers
- },
- getAddRouters(): AppRouteRecordRaw[] {
- return this.addRouters
- },
- getIsAddRouters(): boolean {
- return this.isAddRouters
- },
- getActiveTab(): string {
- return this.activeTab
- },
- getMenuTabRouters(): AppRouteRecordRaw[] {
- return this.menuTabRouters
- }
- },
- actions: {
- generateRoutes(): Promise<unknown> {
- return new Promise<void>((resolve) => {
- // 路由权限控制
- let routerMap: AppRouteRecordRaw[] = []
- if (wsCache.get(appStore.getUserInfo).roleName === 'admin') {
- // 模拟前端控制权限
- routerMap = generateRoutesFn(deepClone(asyncRouterMap, ['component']))
- } else {
- // 模拟后端控制权限
- routerMap = getFilterRoutes(wsCache.get(appStore.getUserInfo).checkedNodes)
- }
- // const routerMap: AppRouteRecordRaw[] = generateRoutesFn(deepClone(asyncRouterMap, ['component']))
- // 动态路由,404一定要放到最后面
- this.addRouters = routerMap.concat([
- {
- path: '/:path(.*)*',
- redirect: '/404',
- name: '404',
- meta: {
- hidden: true,
- breadcrumb: false
- }
- }
- ])
- // 渲染菜单的所有路由
- this.routers = deepClone(constantRouterMap, ['component']).concat(routerMap)
- resolve()
- })
- },
- setIsAddRouters(state: boolean): void {
- this.isAddRouters = state
- },
- setMenuTabRouters(routers: AppRouteRecordRaw[]): void {
- this.menuTabRouters = routers
- },
- setAcitveTab(activeTab: string): void {
- this.activeTab = activeTab
- }
- }
- })
- // 路由过滤,主要用于权限控制
- function generateRoutesFn(routes: AppRouteRecordRaw[], basePath = '/'): AppRouteRecordRaw[] {
- const res: AppRouteRecordRaw[] = []
- for (const route of routes) {
- // skip some route
- if (route.meta && route.meta.hidden && !route.meta.showMainRoute) {
- console.log(route)
- continue
- }
- let onlyOneChild: Nullable<string> = null
- if (route.children && route.children.length === 1 && !route.meta.alwaysShow) {
- onlyOneChild = (
- isExternal(route.children[0].path)
- ? route.children[0].path
- : path.resolve(path.resolve(basePath, route.path), route.children[0].path)
- ) as string
- }
- let data: Nullable<IObj> = null
- // 如不需要路由权限,可注释以下逻辑
- // 权限过滤,通过获取登录信息里面的角色权限,动态的渲染菜单。
- const list = wsCache.get(appStore.getUserInfo).checkedNodes
- // 开发者可以根据实际情况进行扩展
- for (const item of list) {
- // 通过路径去匹配
- if (isExternal(item.path) && (onlyOneChild === item.path || route.path === item.path)) {
- data = Object.assign({}, route)
- } else {
- const routePath = path.resolve(basePath, onlyOneChild || route.path)
- if (routePath === item.path || (route.meta && route.meta.followRoute === item.path)) {
- data = Object.assign({}, route)
- }
- }
- }
- // 如不需要路由权限,解注释下面一行
- // data = Object.assign({}, route)
- // recursive child routes
- if (route.children && data) {
- data.children = generateRoutesFn(route.children, path.resolve(basePath, data.path))
- }
- if (data) {
- res.push(data as AppRouteRecordRaw)
- }
- }
- return res
- }
- // 模拟后端过滤路由
- function getFilterRoutes(routes: AppRouteRecordRaw[]): AppRouteRecordRaw[] {
- const res: AppRouteRecordRaw[] = []
- for (const route of routes) {
- const data: AppRouteRecordRaw | IObj = {
- path: route.path,
- name: route.name,
- redirect: route.redirect
- }
- data.meta = Object.assign({}, route.meta || {}, { title: route.meta.title })
- if (route.component) {
- // 动态加载路由文件,可根据实际情况进行自定义逻辑
- data.component = (
- (route.component as any) === '#'
- ? Layout
- : (route.component as any).includes('##')
- ? getParentLayout((route.component as any).split('##')[1])
- : modules[`../../${route.component}.vue`]
- ) as any
- }
- // recursive child routes
- if (route.children) {
- data.children = getFilterRoutes(route.children)
- }
- res.push(data as AppRouteRecordRaw)
- }
- return res
- }
- export function usePermissionStoreWithOut() {
- return usePermissionStore(store)
- }
|