forked from drone/command-center-dashboard

罗广辉
2025-04-21 2800fa4f32f3900509cb4d6eefaf2bfaf54efdd7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
import website from '@/config/website'
 
const modules = import.meta.glob('../**/**/*.vue')
 
function isURL(s) {
    return /^http[s]?:\/\/.*/.test(s)
}
 
let RouterPlugin = function () {
    this.$router = null
    this.$store = null
}
RouterPlugin.install = function (option = {}) {
    this.$router = option.router
    this.$store = option.store
    let i18n = option.i18n.global
    this.$router.$avueRouter = {
        safe: this,
        // 设置标题
        setTitle: title => {
            const defaultTitle = i18n.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.find(ele => ele.fullPath === value)
            }
            this.$store.commit('DEL_TAG', tag)
        },
        generateTitle: (item, props = {}) => {
            let query = item[props.query || 'query'] || {}
            let title = query.name || item[props.label || 'label']
            let meta = item[props.meta || 'meta'] || {}
            let key = meta.i18n
            if (key) {
                const hasKey = i18n.te('route.' + key)
                if (hasKey) return i18n.t('route.' + key)
            }
            return title ? title.split(',')[0] : title
        },
        //动态路由
        formatRoutes: function (aMenu = [], first) {
            const aRouter = []
            const propsDefault = website.menu
 
            if (aMenu && aMenu.length === 0) return
            for (let i = 0; i < aMenu.length; i++) {
                const oMenu = aMenu[i]
                let path = oMenu[propsDefault.path],
                    isComponent = true,
                    component = oMenu.component,
                    name = oMenu[propsDefault.label] + ',' + oMenu.id,
                    icon = oMenu[propsDefault.icon],
                    children = oMenu[propsDefault.children],
                    query = oMenu[propsDefault.query],
                    meta = oMenu[propsDefault.meta]
                if (option.keepAlive) {
                    meta.keepAlive = option.keepAlive
                }
                const isChild = !!(children && children.length !== 0)
                const oRouter = {
                    path: path,
                    component: (() => {
                        // 判断是否为首路由
                        if (first) {
                            return modules[
                                option.store.getters.isMacOs || !website.setting.menu
                                    ? '../page/index/layout.vue'
                                    : '../page/index/index.vue'
                            ]
                            // 判断是否为多层路由
                        } else if (isChild && !first) {
                            return modules['../page/index/layout.vue']
                            // 判断是否为最终的页面视图
                        } else {
                            let result = modules[`../${component}.vue`]
                            if (result) result().then(mod => (mod.default.name = path))
                            else {
                                isComponent = false
                            }
                            return result
                        }
                    })(),
                    name,
                    icon,
                    meta,
                    query,
                    redirect: (() => {
                        if (!isChild && first) return `${path}`
                        else return ''
                    })(),
                    // 处理是否为一级路由
                    children: !isChild
                        ? (() => {
                                if (first) {
                                    oMenu[propsDefault.path] = `${path}`
                                    let result = modules[`../${component}.vue`]
                                    if (result) result().then(mod => (mod.default.name = path))
                                    else {
                                        isComponent = false
                                    }
                                    return [
                                        {
                                            component: result,
                                            icon: icon,
                                            name: name,
                                            meta: meta,
                                            query: query,
                                            path: '',
                                        },
                                    ]
                                }
                                return []
                          })()
                        : (() => {
                                return this.formatRoutes(children, false)
                          })(),
                }
                if (!isURL(path) && isComponent) aRouter.push(oRouter)
            }
            if (first) {
                aRouter.forEach(ele => this.safe.$router.addRoute(ele))
            } else {
                return aRouter
            }
        },
    }
}
export const formatPath = (ele, first) => {
    const propsDefault = website.menu
    const icon = ele[propsDefault.icon]
    ele[propsDefault.icon] = !icon ? propsDefault.iconDefault : icon
    ele.meta = {
        keepAlive: ele.isOpen === 2,
    }
    const iframeComponent = 'components/iframe/main'
    const iframeSrc = href => {
        return href.replace(/&/g, '#')
    }
    const isChild = !!(ele[propsDefault.children] && ele[propsDefault.children].length !== 0)
    if (!isChild && first) {
        ele.component = 'views' + ele[propsDefault.path]
        if (isURL(ele[propsDefault.href])) {
            let href = ele[propsDefault.href]
            ele.component = iframeComponent
            ele[propsDefault.query] = {
                url: iframeSrc(href),
            }
        }
    } else {
        ele[propsDefault.children] &&
            ele[propsDefault.children].forEach(child => {
                child.component = 'views' + child[propsDefault.path]
                child.meta = {
                    keepAlive: child.isOpen === 2,
                }
                if (isURL(child[propsDefault.href])) {
                    let href = child[propsDefault.href]
                    child[propsDefault.path] = ele[propsDefault.path] + '/' + child.code
                    child.component = iframeComponent
                    child[propsDefault.query] = {
                        url: iframeSrc(href),
                    }
                }
                formatPath(child)
            })
    }
}
export default RouterPlugin