¶Ô±ÈÐÂÎļþ |
| | |
| | | let RouterPlugin = function () { |
| | | this.$router = null; |
| | | this.$store = null; |
| | | |
| | | }; |
| | | RouterPlugin.install = function (vue, option = {}) { |
| | | this.$router = option.router; |
| | | this.$store = option.store; |
| | | this.$vue = new vue({ i18n: option.i18n }); |
| | | |
| | | // è¿ä¸ªçä½ç¨æ¯ ä¸ºäºæ£æ¥åºç½é¡µé¾æ¥ï¼å 为æ¬é¡¹ç®ç¨å°äº iframe |
| | | function isURL(s) { |
| | | if (s.includes('html')) return true; |
| | | return /^http[s]?:\/\/.*/.test(s) |
| | | } |
| | | |
| | | // å°åæ°å¤çä¸ºåæ°ç形弿¼æ¥ |
| | | function objToform(obj) { |
| | | let result = []; |
| | | Object.keys(obj).forEach(ele => { |
| | | result.push(`${ele}=${obj[ele]}`); |
| | | }) |
| | | return result.join('&'); |
| | | } |
| | | |
| | | this.$router.$avueRouter = { |
| | | //å
¨å±é
ç½® |
| | | $website: this.$store.getters.website, |
| | | group: '', |
| | | meta: {}, |
| | | safe: this, |
| | | // 设置æ é¢ |
| | | setTitle: (title) => { |
| | | const defaultTitle = this.$vue.$t('title'); |
| | | title = title ? `${title}-${defaultTitle}` : defaultTitle; |
| | | document.title = title; |
| | | }, |
| | | closeTag: (value) => { |
| | | let tag = value || this.$store.getters.tag; |
| | | if (typeof value === 'string') { |
| | | tag = this.$store.getters.tagList.filter(ele => ele.value === value)[0] |
| | | } |
| | | this.$store.commit('DEL_TAG', tag) |
| | | }, |
| | | generateTitle: (title, key) => { |
| | | if (!key) return title; |
| | | const hasKey = this.$vue.$te('route.' + key) |
| | | if (hasKey) { |
| | | // $t :this method from vue-i18n, inject in @/lang/index.js |
| | | const translatedTitle = this.$vue.$t('route.' + key) |
| | | |
| | | return translatedTitle |
| | | } |
| | | return title |
| | | }, |
| | | //å¤çè·¯ç± |
| | | getPath: function (params) { |
| | | let {src} = params; |
| | | let result = src || '/'; |
| | | if (isURL(src)) { |
| | | result = `/myiframe/urlPath?${objToform(params)}`; |
| | | } |
| | | return result; |
| | | }, |
| | | //æ£åå¤çè·¯ç± |
| | | vaildPath: function (list, path) { |
| | | let result = false; |
| | | list.forEach(ele => { |
| | | if (new RegExp("^" + ele + ".*", "g").test(path)) { |
| | | result = true |
| | | } |
| | | |
| | | }) |
| | | return result; |
| | | }, |
| | | //设置路ç±å¼ |
| | | getValue: function (route) { |
| | | let value = ""; |
| | | if (route.query.src) { |
| | | value = route.query.src; |
| | | } else { |
| | | value = route.path; |
| | | } |
| | | return value; |
| | | }, |
| | | //å¨æè·¯ç± |
| | | // è·¯ç±æ¯ä¸é¨çä¸ä¸ªæ¥å£è·å |
| | | /** |
| | | * aMenu: æ¥åå°çå¨æè·¯ç±æ°æ® menuçç»æå¤å±æç¶çº§path é颿ä¸ä¸ªchilden è®°å½é¡µé¢çè·¯ç± |
| | | * first: 为äºåºåå¤ç è°ç¨formatRoutes å å½åæä»¶è°ç¨ formatRoutes |
| | | */ |
| | | formatRoutes: function (aMenu = [], first) { |
| | | // window.console.log('aMenu') |
| | | // window.console.log(aMenu) |
| | | const aRouter = [] |
| | | // è·åå°å
¨å±é
ç½®ä¸ç props |
| | | const propsConfig = this.$website.menu.props; |
| | | // 设置 propsé»è®¤å¼ ä½ç¨å°±æ¯å°å段设置æé
ç½®ç |
| | | const propsDefault = { |
| | | label: propsConfig.label || 'name', |
| | | path: propsConfig.path || 'path', |
| | | icon: propsConfig.icon || 'icon', |
| | | children: propsConfig.children || 'children', |
| | | meta: propsConfig.meta || 'meta', |
| | | } |
| | | // å¦ææ²¡ææéèåå°±ç»æ |
| | | if (aMenu.length === 0) return; |
| | | // å¼å§å¤çmenu |
| | | for (let i = 0; i < aMenu.length; i++) { |
| | | // åå°å½åè¦å¤ççä¸é¡¹ |
| | | const oMenu = aMenu[i]; |
| | | // è¿ä¸åçèµå¼ ä¹å°±æ¯åå°è¿åçå¼ |
| | | let path = (() => { |
| | | if (first) { |
| | | // å° '/index' æ¿æ¢ä¸º '' |
| | | return oMenu[propsDefault.path].replace('/index', '') |
| | | } else { |
| | | return oMenu[propsDefault.path] |
| | | } |
| | | })(), |
| | | //ç¹æ®å¤çç»ä»¶ æ§è¡å®è¿ä¸ª component ä¹å°±æ¯ç²¾ç¡®å°å
·ä½çæä»¶äº viewsæä»¶å¤¹ä¸é¢å°±æ¯å
·ä½ç页é¢ä»£ç |
| | | component = 'views' + oMenu.path, |
| | | name = oMenu[propsDefault.label], |
| | | icon = oMenu[propsDefault.icon], |
| | | children = oMenu[propsDefault.children], |
| | | meta = oMenu[propsDefault.meta] || {}; |
| | | // metaä¸ keepalive çå¤ç |
| | | meta = Object.assign(meta, (function () { |
| | | if (option.keepAlive === true) { |
| | | return { |
| | | keepAlive: true |
| | | } |
| | | } |
| | | })()); |
| | | //æ¯å¦æåè·¯ç± |
| | | const isChild = children.length !== 0; |
| | | const oRouter = { |
| | | path: path, |
| | | component(resolve) { |
| | | // 夿æ¯å¦ä¸ºé¦è·¯ç± |
| | | if (first) { |
| | | require(['../page/index'], resolve) |
| | | return |
| | | // 夿æ¯å¦ä¸ºå¤å±è·¯ç± |
| | | } else if (isChild && !first) { |
| | | require(['../page/index/layout'], resolve) |
| | | return |
| | | // 夿æ¯å¦ä¸ºæç»ç页é¢è§å¾ |
| | | } else { |
| | | require([`../${component}.vue`], resolve) |
| | | } |
| | | }, |
| | | name: name, |
| | | icon: icon, |
| | | meta: meta, |
| | | redirect: (() => { |
| | | // ç¬¬ä¸æ¬¡è¿æ¥ä½æ¯æ²¡æåè·¯ç±ç éè¦æ·»å redirect |
| | | if (!isChild && first && !isURL(path)) return `${path}/index` |
| | | else return ''; |
| | | })(), |
| | | // æ´çåè·¯ç±çroute é
ç½® |
| | | // å¤çæ¯å¦ä¸ºä¸çº§è·¯ç± |
| | | children: !isChild ? (() => { |
| | | if (first) { |
| | | // è¿éçisURL夿ï¼å 为è¿ä¸ªç½ç«æä½¿ç¨ iframeãæä»¥éè¦å¤ææ¯å¦ä¸ºç½é¡µé¾æ¥ |
| | | if (!isURL(path)) oMenu[propsDefault.path] = `${path}/index`; |
| | | return [{ |
| | | component(resolve) { |
| | | require([`../${component}.vue`], resolve) |
| | | }, |
| | | icon: icon, |
| | | name: name, |
| | | meta: meta, |
| | | path: 'index' |
| | | }] |
| | | } |
| | | return []; |
| | | })() : (() => { |
| | | /** |
| | | * è¿éæ¯éç¹ï¼å½æåè·¯ç±çæ¶å ä¼å廿§è¡ formatRoutes æ¹æ³ï¼ç¶åå伿ä¸ä¸ªæ°ç aMenu for循ç¯ã |
| | | * æåè¿åçæ¯ä¸ä¸ªæ°ç» aRouter è¿ä¸ªæ°ç»å°±ä¼ä½ä¸º childençå¼è¢« return |
| | | */ |
| | | return this.formatRoutes(children, false) |
| | | })() |
| | | } |
| | | aRouter.push(oRouter) |
| | | } |
| | | // for循ç¯ç»æ |
| | | // è¿ä¸ªfirst å¡çå
¶å®å°±æ¯é¦è·¯ç± |
| | | if (first) { |
| | | this.safe.$router.addRoutes(aRouter) |
| | | } else { |
| | | // è¿éè¿åçæ¯åç»ä»¶ |
| | | return aRouter |
| | | } |
| | | } |
| | | } |
| | | } |
| | | export default RouterPlugin; |