import { menuChildFlat, preSlashUrlPath } from "./util"; import cloneDeep from 'lodash.clonedeep' import qs from "qs" import { SketonVue } from "../types/sketon.vue"; import { Route } from "vue-router/types/router"; import { AppRouter } from "../types/AppRouter"; export default { methods: { /** * 关闭所有页面 */ closeAllPage(this: SketonVue) { this.page.openedPages = [this.page.defaultRoute] sessionStorage.setItem('page', JSON.stringify(this.page)) this.currentOpenPage = this.page.defaultRoute this.page.showTabMenu = false this.ctx.redirect(this.page.defaultRoute) }, /** * 关闭其他页面 */ closeOtherPage(this: SketonVue, remainsFullPath: string) { let remainPageRouter = this.page.openedPages.find((item: any) => item.fullPath == remainsFullPath) this.page.currentOpenPage = remainPageRouter // 如果路由不存在或者 路由等于默认首页路由 if (!remainPageRouter.fullPath || remainPageRouter.fullPath == this.page.defaultRoute.fullPath) { this.page.openedPages = [this.page.openedPages[0]] this.page.visitViews = [this.page.openedPages[0]] } else { this.page.openedPages = [this.page.openedPages[0], remainPageRouter] this.page.visitViews = [this.page.openedPages[0], remainPageRouter] } sessionStorage.setItem('page', JSON.stringify(this.page)) this.page.showTabMenu = false this.ctx.redirect(remainsFullPath) }, /** 缓存路由 */ keepAlivePage(this: SketonVue, _route: Route) { let keepAlive = this.ctx.route.meta[0]?.keepAlive if (keepAlive) { let name = _route.name || this.ctx.route.name; if (!this.page.keepAlivePageNames.includes(name)) this.page.keepAlivePageNames.push(name); _route.meta.keepAlive = true } }, removePageAlive(this: SketonVue, page: { name: string; }) { let index = this.page.keepAlivePageNames.findIndex((name: string) => name === page.name) index > -1 && this.page.keepAlivePageNames.splice(index, 1) }, // 判断是否在以打开的page 中存在route isExitOpenedPage(this: SketonVue, _route: Route) { return this.page.openedPages.find((route: { fullPath: string; }) => route.fullPath == _route.fullPath) }, isExitRouter(route: Route, _route: Route) { // 判断route name 是否相等 if (route.name != _route.name) return false if (qs.stringify(route.query) != qs.stringify(_route.query)) return false return true }, // 首次加载 ,刷新 解析page信息 pageOnload(this: SketonVue, _route: Route) { let pageItemSessi = sessionStorage.getItem('page') let localPage = null if (pageItemSessi) { localPage = JSON.parse(pageItemSessi) } let matchIndex = 0 if (localPage) { this.page.openedPages = localPage.openedPages; this.page.visitViews = cloneDeep(localPage.openedPages) let pageView = this.page.openedPages.find((route: Route, index: number) => { let flag = this.isExitRouter(route, _route) if (flag) matchIndex = index return flag }) this.page.currentOpenPage = pageView || this.routerMenu(_route) if (!pageView && _route.name != 'index') this.page.openedPages.push(this.routerMenu(_route)) this.keepAlivePage(_route); } else { // 是否存在系统菜单 let _menuRouter = this.routerMenu(_route) if (_menuRouter.isHome) { this.page.currentOpenPage = this.page.defaultRoute this.page.openedPages = [this.page.defaultRoute] } else { this.page.currentOpenPage = _route this.page.openedPages = [this.page.defaultRoute, _route] matchIndex = 1 this.keepAlivePage(_route); } } this.addLastView(this.page.currentOpenPage) sessionStorage.setItem('page', JSON.stringify(this.page)) return matchIndex }, openPage(this: SketonVue, route: Route) { let index = this.isExitView(route) if (index > -1) { this.page.visitViews.splice(index, 1) } this.page.visitViews.push(route) let pageIndex = this.addPage(route) this.keepAlivePage(route); return pageIndex }, addPage(this:SketonVue , route:Route) { let index = this.page.openedPages.findIndex( (item:Route) => this.isExitRouter(item, route)) // 判断以打开的page 是否存在 if (route.path == '' || route.path == '/') return 0 if (index > -1) { this.page.openedPages.splice(index, 1, route) } else { this.page.openedPages.push(route) index = this.page.openedPages.length - 1 } this.page.currentOpenPage = route; sessionStorage.setItem('page', JSON.stringify(this.page)) return index }, /** * @param {*} _route VueRouter * @returns VueRouter 加入菜单title信息 */ routerMenu(this:SketonVue, _route:AppRouter) { // 判断首页信息 if (['', '/'].includes(_route.path)) { _route.title = '首页' _route.isHome = true return _route } let flatMenus = this.getFlatMenu(this.menus); let _menu = flatMenus.find((menu: { path: string; }) => preSlashUrlPath(menu.path) == _route.path || (preSlashUrlPath(menu.path) + '/') == _route.path ); if (_menu) { _route.title = _menu.title return _route } return { fullPath: _route.fullPath, path: _route.path, title: _route.query.title ? _route.query.title : '404' } }, // 扁平化数据结构 getFlatMenu(menus: any) { let result: [] = []; menuChildFlat(menus, result); return result; }, }, };