| | |
| | | import Cookies from 'js-cookie' |
| | | import { hasOneOf, objEqual, _ } from '@/utils/tools' |
| | | const appConfig = require('@/app.config') |
| | | const { title, cookieExpires, useI18n } = appConfig |
| | | const { cookieExpires } = appConfig |
| | | |
| | | export const TOKEN_KEY = 'token' |
| | | export const ACCOUNT_KEY = 'account' |
| | |
| | | |
| | | export const getToken = () => { |
| | | const token = Cookies.get(TOKEN_KEY) |
| | | if (token) return token |
| | | if (token !== 'undefined') return token |
| | | else return false |
| | | } |
| | | |
| | |
| | | |
| | | export const hasChild = (item) => { |
| | | return item.children && item.children.length !== 0 |
| | | } |
| | | |
| | | /** |
| | | * @param {Array} routeMetched 当前路由metched |
| | | * @returns {Array} |
| | | */ |
| | | export const getBreadCrumbList = (route, homeRoute) => { |
| | | let homeItem = { ...homeRoute, icon: homeRoute.meta.icon } |
| | | let routeMetched = route.matched |
| | | if (routeMetched.some(item => item.name === homeRoute.name)) return [homeItem] |
| | | let res = routeMetched.filter(item => { |
| | | return item.meta === undefined || !item.meta.hideInBread |
| | | }).map(item => { |
| | | let meta = { ...item.meta } |
| | | if (meta.title && typeof meta.title === 'function') { |
| | | meta.__titleIsFunction__ = true |
| | | meta.title = meta.title(route) |
| | | } |
| | | let obj = { |
| | | icon: (item.meta && item.meta.icon) || '', |
| | | name: item.name, |
| | | meta: meta |
| | | } |
| | | return obj |
| | | }) |
| | | res = res.filter(item => { |
| | | return !item.meta.hideInMenu |
| | | }) |
| | | return [{ ...homeItem, to: homeRoute.path }, ...res] |
| | | } |
| | | |
| | | export const getRouteTitleHandled = (route) => { |
| | | let router = { ...route } |
| | | let meta = { ...route.meta } |
| | | let title = '' |
| | | if (meta.title) { |
| | | if (typeof meta.title === 'function') { |
| | | meta.__titleIsFunction__ = true |
| | | title = meta.title(router) |
| | | } else title = meta.title |
| | | } |
| | | meta.title = title |
| | | router.meta = meta |
| | | return router |
| | | } |
| | | |
| | | export const showTitle = (item, vm) => { |
| | | let { title, __titleIsFunction__ } = item.meta |
| | | if (!title) return |
| | | if (useI18n) { |
| | | if (title.includes('{{') && title.includes('}}') && useI18n) title = title.replace(/({{[\s\S]+?}})/, (m, str) => str.replace(/{{([\s\S]*)}}/, (m, _) => vm.$t(_.trim()))) |
| | | else if (__titleIsFunction__) title = item.meta.title |
| | | else title = vm.$t(item.name) |
| | | } else title = (item.meta && item.meta.title) || item.name |
| | | return title |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | export const getHomeRouter = (routers, homeName = 'Home') => { |
| | | let i = -1 |
| | | let len = routers.length |
| | | const len = routers.length |
| | | let homeRoute = {} |
| | | while (++i < len) { |
| | | let item = routers[i] |
| | | const item = routers[i] |
| | | if (item.children && item.children.length) { |
| | | let res = getHomeRouter(item.children, homeName) |
| | | const res = getHomeRouter(item.children, homeName) |
| | | if (res.name) return res |
| | | } else { |
| | | if (item.name === homeName) homeRoute = item |
| | |
| | | */ |
| | | export const getNewTagList = (list, newRoute) => { |
| | | const { name, path, meta } = newRoute |
| | | let newList = [...list] |
| | | const newList = [...list] |
| | | if (newList.findIndex(item => item.name === name) >= 0) return newList |
| | | else newList.push({ name, path, meta }) |
| | | return newList |
| | | } |
| | | |
| | | /** |
| | | * @param {*} access 用户权限数组,如 ['super_admin', 'admin'] |
| | | * @param {*} route 路由列表 |
| | | */ |
| | | const hasAccess = (access, route) => { |
| | | if (route.meta && route.meta.access) return hasOneOf(access, route.meta.access) |
| | | else return true |
| | | } |
| | | |
| | | /** |
| | | * 菜单权鉴 |
| | | * @param {*} name 即将跳转的路由name |
| | | * @param {*} access 用户权限数组 |
| | | * @param {*} routes 路由列表 |
| | | * @description 用户是否可跳转到该页 |
| | | */ |
| | | export const canTurnTo = (name, access, routes) => { |
| | | const routePermissionJudge = (list) => { |
| | | return list.some(item => { |
| | | if (item.children && item.children.length) { |
| | | return routePermissionJudge(item.children) |
| | | } else if (item.name === name) { |
| | | return hasAccess(access, item) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | return routePermissionJudge(routes) |
| | | } |
| | | |
| | | /** |
| | | * @param {String} url |
| | | * @description 从URL中解析参数 |
| | | */ |
| | | export const getParams = url => { |
| | | const keyValueArr = url.split('?')[1].split('&') |
| | | let paramObj = {} |
| | | _.forEach(keyValueArr, item => { |
| | | const keyValue = item.split('=') |
| | | paramObj[keyValue[0]] = keyValue[1] |
| | | }) |
| | | return paramObj |
| | | } |
| | | |
| | | /** |
| | | * @param {Array} list 标签列表 |
| | | * @param {String} name 当前关闭的标签的name |
| | | */ |
| | | export const getNextRouter = (list, route) => { |
| | | let res = {} |
| | | if (list.length === 2) { |
| | | res = getHomeRouter(list) |
| | | } else { |
| | | const index = list.findIndex(item => routeEqual(item, route)) |
| | | if (index === list.length - 1) res = list[list.length - 2] |
| | | else res = list[index + 1] |
| | | } |
| | | return res |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | export const findNodeUpperByClasses = (ele, classes) => { |
| | | let parentNode = ele.parentNode |
| | | const parentNode = ele.parentNode |
| | | if (parentNode) { |
| | | let classList = parentNode.classList |
| | | const classList = parentNode.classList |
| | | if (classList && classes.every(className => classList.contains(className))) { |
| | | return parentNode |
| | | } else { |
| | |
| | | const tagName = tag.toUpperCase() |
| | | if (ele.childNodes.length) { |
| | | let i = -1 |
| | | let len = ele.childNodes.length |
| | | const len = ele.childNodes.length |
| | | while (++i < len) { |
| | | let child = ele.childNodes[i] |
| | | const child = ele.childNodes[i] |
| | | if (child.tagName === tagName) return child |
| | | else return findNodeDownward(child, tag) |
| | | } |
| | | } |
| | | } |
| | | |
| | | export const showByAccess = (access, canViewAccess) => { |
| | | return hasOneOf(canViewAccess, access) |
| | | } |
| | | |
| | | /** |
| | | * @description 根据name/params/query判断两个路由对象是否相等 |
| | | * @param {*} route1 路由对象 |
| | | * @param {*} route2 路由对象 |
| | | */ |
| | | export const routeEqual = (route1, route2) => { |
| | | const params1 = route1.params || {} |
| | | const params2 = route2.params || {} |
| | | const query1 = route1.query || {} |
| | | const query2 = route2.query || {} |
| | | return (route1.name === route2.name) && objEqual(params1, params2) && objEqual(query1, query2) |
| | | } |
| | | |
| | | /** |
| | | * 判断打开的标签列表里是否已存在这个新添加的路由对象 |
| | | */ |
| | | export const routeHasExist = (tagNavList, routeItem) => { |
| | | let len = tagNavList.length |
| | | let res = false |
| | | doCustomTimes(len, (index) => { |
| | | if (routeEqual(tagNavList[index], routeItem)) res = true |
| | | }) |
| | | return res |
| | | } |
| | | |
| | | export const localSave = (key, value) => { |
| | |
| | | window.webkitRequestAnimationFrame || |
| | | window.mozRequestAnimationFrame || |
| | | window.msRequestAnimationFrame || |
| | | function(callback) { |
| | | function (callback) { |
| | | return window.setTimeout(callback, 1000 / 60) |
| | | } |
| | | ) |
| | |
| | | window.requestAnimationFrame(() => scroll(d, end, step)) |
| | | } |
| | | scroll(from, to, step) |
| | | } |
| | | |
| | | /** |
| | | * @description 根据当前跳转的路由设置显示在浏览器标签的title |
| | | * @param {Object} routeItem 路由对象 |
| | | * @param {Object} vm Vue实例 |
| | | */ |
| | | export const setTitle = (routeItem, vm) => { |
| | | const handledRoute = getRouteTitleHandled(routeItem) |
| | | const pageTitle = showTitle(handledRoute, vm) |
| | | const resTitle = pageTitle ? `${title} - ${pageTitle}` : title |
| | | window.document.title = resTitle |
| | | } |