| | |
| | | import { RouteRecordRaw } from 'vue-router'; |
| | | import { storeToRefs } from 'pinia'; |
| | | import pinia from '/@/stores/index'; |
| | | import { useUserInfo } from '/@/stores/userInfo'; |
| | | import { useRequestOldRoutes } from '/@/stores/requestOldRoutes'; |
| | | import { Local, Session } from '/@/utils/storage'; |
| | | import { NextLoading } from '/@/utils/loading'; |
| | | import type { RouteRecordRaw } from 'vue-router'; |
| | | import { parseMenuTree, useMenuApi } from '/@/api/menu/index'; |
| | | import { formatFlatteningRoutes, formatTwoStageRoutes, router } from '/@/router/index'; |
| | | import { pathMap } from '/@/router/pathMap'; |
| | | import { dynamicRoutes, notFoundAndNoPower } from '/@/router/route'; |
| | | import { formatTwoStageRoutes, formatFlatteningRoutes, router } from '/@/router/index'; |
| | | import pinia from '/@/stores/index'; |
| | | import { useRequestOldRoutes } from '/@/stores/requestOldRoutes'; |
| | | import { useRoutesList } from '/@/stores/routesList'; |
| | | import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes'; |
| | | import { parseMenuTree, useMenuApi } from '/@/api/menu/index'; |
| | | import { ElMessage } from 'element-plus'; |
| | | import { pathMap } from '/@/router/pathMap'; |
| | | import { accessTokenKey, clearAccessTokens } from '/@/utils/request'; |
| | | import { menuData } from '../api/menu/menuData'; |
| | | |
| | | |
| | | // 后端控制路由 |
| | | |
| | |
| | | */ |
| | | export async function initBackEndControlRoutes() { |
| | | // 界面 loading 动画开始执行 |
| | | if (window.nextLoading === undefined) NextLoading.start(); |
| | | // if (window.nextLoading === undefined) NextLoading.start(); |
| | | // 无 token 停止执行下一步 |
| | | if (!Local.get(accessTokenKey)) return false; |
| | | // if (!Local.get(accessSessionKey)) return false; |
| | | // 触发初始化用户信息 pinia |
| | | // https://gitee.com/lyt-top/vue-next-admin/issues/I5F1HP |
| | | // await useUserInfo().setUserInfos(); |
| | | // 获取路由菜单数据 |
| | | const res = (await getBackEndControlRoutes()) as any; |
| | | const formattedTreeMenu = parseMenuTree(menuData as any, pathMap); |
| | | // 无登录权限时,添加判断 |
| | | // https://gitee.com/lyt-top/vue-next-admin/issues/I64HVO |
| | | // if (res.data.length <= 0) return Promise.resolve(true); |
| | | // 存储接口原始路由(未处理component),根据需求选择使用 |
| | | useRequestOldRoutes().setRequestOldRoutes(JSON.parse(JSON.stringify(formattedTreeMenu))); |
| | | |
| | | if (res?.Code === 0) { |
| | | if (res.Data) { |
| | | const formattedTreeMenu = parseMenuTree(res.Data, pathMap); |
| | | // 无登录权限时,添加判断 |
| | | // https://gitee.com/lyt-top/vue-next-admin/issues/I64HVO |
| | | // if (res.data.length <= 0) return Promise.resolve(true); |
| | | // 存储接口原始路由(未处理component),根据需求选择使用 |
| | | useRequestOldRoutes().setRequestOldRoutes(JSON.parse(JSON.stringify(formattedTreeMenu))); |
| | | |
| | | // 处理路由(component),替换 dynamicRoutes(/@/router/route)第一个顶级 children 的路由 |
| | | dynamicRoutes[0].children = await backEndComponent(formattedTreeMenu); |
| | | // 添加动态路由 |
| | | await setAddRoute(); |
| | | // 设置路由到 pinia routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组 |
| | | await setFilterMenuAndCacheTagsViewRoutes(); |
| | | } |
| | | if (!res.Data || res.Data?.length === 0) { |
| | | ElMessage.error('该账号暂时没有菜单,请尝试切换账号!'); |
| | | clearAccessTokens(); |
| | | } |
| | | } else { |
| | | ElMessage.error('获取菜单失败' + (res?.Message ? `,${JSON.stringify(res.Message)}` : '') + '请尝试切换账号'); |
| | | clearAccessTokens(); |
| | | |
| | | return Promise.resolve(true); |
| | | } |
| | | // 处理路由(component),替换 dynamicRoutes(/@/router/route)第一个顶级 children 的路由 |
| | | dynamicRoutes[0].children = await backEndComponent(formattedTreeMenu); |
| | | // 添加动态路由 |
| | | await setAddRoute(); |
| | | // 设置路由到 pinia routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组 |
| | | await setFilterMenuAndCacheTagsViewRoutes(); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @returns 返回替换后的路由数组 |
| | | */ |
| | | export function setFilterRouteEnd() { |
| | | let filterRouteEnd: any = formatTwoStageRoutes(formatFlatteningRoutes(dynamicRoutes)); |
| | | const filterRouteEnd: any = formatTwoStageRoutes(formatFlatteningRoutes(dynamicRoutes)); |
| | | // notFoundAndNoPower 防止 404、401 不在 layout 布局中,不设置的话,404、401 界面将全屏显示 |
| | | // 关联问题 No match found for location with path 'xxx' |
| | | filterRouteEnd[0].children = [...filterRouteEnd[0].children, ...notFoundAndNoPower]; |
| | |
| | | router.addRoute(route); |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * 请求后端路由菜单接口 |
| | | * @description isRequestRoutes 为 true,则开启后端控制路由 |
| | | * @returns 返回后端路由菜单数据 |
| | | */ |
| | | export async function getBackEndControlRoutes() { |
| | | // 模拟 admin 与 test |
| | | const stores = useUserInfo(); |
| | | let userInfo = (await stores.getUserInfo()) as any; |
| | | const { |
| | | SoftWare: { ID: SoftwareID }, |
| | | User: { ID: UserID }, |
| | | } = userInfo; |
| | | const params = { SoftwareID, UserID }; |
| | | return menuApi.getAdminMenu(params); |
| | | // const auth = userInfos.value.roles[0]; |
| | | // 管理员 admin |
| | | // if (auth === 'admin') return menuApi.getAdminMenu(); |
| | | // 其它用户 test |
| | | // else return menuApi.getTestMenu(); |
| | | } |
| | | |
| | | /** |
| | | * 重新请求后端路由菜单接口 |
| | | * @description 用于菜单管理界面刷新菜单(未进行测试) |
| | | * @description 路径:/src/views/system/menu/component/addMenu.vue |
| | | */ |
| | | // export async function setBackEndControlRefreshRoutes() { |
| | | // await getBackEndControlRoutes(); |
| | | // } |
| | | |
| | | /** |
| | | * 后端路由 component 转换 |