10.10综合交易所原始源码-管理后台
1
zj
yesterday a27825570e9c2d0053c634ecd081cd9871a31b49
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
/* eslint-disable camelcase */
/**
 * 全站路由配置
 *
 * 建议:
 * 1. 代码中路由统一使用name属性跳转(不使用path属性)
 */
import Vue from 'vue'
import Router from 'vue-router'
import http from '@/utils/httpRequest'
import { isURL } from '@/utils/validate'
import { clearLoginInfo } from '@/utils'
// import { menu } from '@/menu'(本地模拟权限数组)
Vue.use(Router)
 
// 开发环境不使用懒加载, 因为懒加载页面太多的话会造成webpack热更新太慢, 所以只有生产环境使用懒加载
const _import = require('./import-' + process.env.NODE_ENV)
//获取原型对象上的push函数
const originalPush = Router.prototype.push
//修改原型对象中的push方法
Router.prototype.push = function push(location) {
  return originalPush.call(this, location).catch(err => err)
}
 
// 全局路由(无需嵌套上左右整体布局)
const globalRoutes = [
  { path: '/404', component: _import('common/404'), name: '404', meta: { title: '404未找到' } },
  { path: '/login', component: _import('common/login'), name: 'login', meta: { title: '登录' } }
]
 
// 主入口路由(需嵌套上左右整体布局)
const mainRoutes = {
  path: '/',
  component: _import('main'),
  name: 'main',
  redirect: { name: 'home' },
  meta: { title: '主入口整体布局' },
  children: [
    // 通过meta对象设置路由展示方式
    // 1. isTab: 是否通过tab展示内容, true: 是, false: 否
    // 2. iframeUrl: 是否通过iframe嵌套展示内容, '以http[s]://开头': 是, '': 否
    // 提示: 如需要通过iframe嵌套展示内容, 但不通过tab打开, 请自行创建组件使用iframe处理!
    { path: '/home', component: _import('modules/user/user'), name: 'home', meta: { title: '首页' } },
    { path: '/prodInfo', component: _import('modules/prod/prodInfo'), name: 'prodInfo', meta: { title: '产品详情' } },
    { path: '/message', component: _import('message/index'), name: 'message', meta: { title: '产品详情' } },
    // 美股交割合约单:固定路由,不依赖 tz_sys_menu 配置
    {
      path: '/us-spots-us-pickAddr',
      component: _import('modules/us-spots/us-pickAddr'),
      name: 'us-spots-us-pickAddr',
      meta: { title: '交割合约单(US)', isTab: true, menuId: 1981 }
    }
  ],
  beforeEnter (to, from, next) {
    let authorization = Vue.cookie.get('Authorization')
    if (!authorization || !/\S/.test(authorization)) {
      clearLoginInfo()
      next({ name: 'login' })
    }
    next()
  }
}
 
const router = new Router({
  mode: 'hash',
  scrollBehavior: () => ({ y: 0 }),
  isAddDynamicMenuRoutes: false, // 是否已经添加动态(菜单)路由
  routes: globalRoutes.concat(mainRoutes)
})
 
router.beforeEach((to, from, next) => {
  // 添加动态(菜单)路由
  // 1. 已经添加 or 全局路由, 直接访问
  // 2. 获取菜单列表, 添加并保存本地存储
  if (router.options.isAddDynamicMenuRoutes || fnCurrentRouteType(to, globalRoutes) === 'global') {
    next()
  } else {
    // sessionStorage.setItem('authorities', JSON.stringify(menu.authorities || '[]'))
    // fnAddDynamicMenuRoutes(menu)
    // sessionStorage.setItem('menuList', JSON.stringify(menu.menuList || '[]'))
    http({
      url: http.adornUrl('/sys/menu/nav'),
      method: 'get',
      params: http.adornParams(
          {
            appType:1
          },
      )
    }).then(({ data }) => {
      const menuList = pinFixedUsPickAddrMenu(data.menuList || [])
      sessionStorage.setItem('authorities', JSON.stringify(data.authorities || '[]'))
      fnAddDynamicMenuRoutes(menuList)
      router.options.isAddDynamicMenuRoutes = true
      sessionStorage.setItem('menuList', JSON.stringify(menuList || '[]'))
 
      //
      // console.log("menuList = " + JSON.stringify(menuList));
      let urls = []
      for(let i = 0 ;menuList && i < menuList.length ; i++){
        let menu = menuList[i];
        // console.log("menu = " + JSON.stringify(menu));
        for(let j = 0 ; menu && menu.list && j < menu.list.length ; j++){
          let item = menu.list[j]
          // console.log("item = " + JSON.stringify(item));
          if(item.url){
            urls.push(item.url);
          }
        }
      }
      sessionStorage.setItem('menuUrls', JSON.stringify(urls || '[]'))
 
      //
 
 
      next({ ...to, replace: true })
    }).catch((e) => {
      console.log(`%c${e} 请求菜单列表和权限失败,跳转至登录页!!`, 'color:blue')
      router.push({ name: 'login' })
    })
  }
})
 
/**
 * 固定注入「交割合约单(US)」到左侧菜单(orderNum>23),不依赖数据库菜单配置
 */
function pinFixedUsPickAddrMenu (menuList) {
  const url = 'us-spots/us-pickAddr'
  if (menuTreeHasUrl(menuList, url)) {
    return menuList
  }
  menuList.push({
    menuId: 1981,
    parentId: 0,
    name: '交割合约单(US)',
    url: url,
    perms: '',
    type: 1,
    icon: 'sql',
    orderNum: 24,
    list: null,
    appType: '1'
  })
  menuList.sort((a, b) => (a.orderNum || 0) - (b.orderNum || 0))
  return menuList
}
 
function menuTreeHasUrl (list, url) {
  if (!list || !list.length) {
    return false
  }
  for (const node of list) {
    if (node.url === url) {
      return true
    }
    if (node.list && menuTreeHasUrl(node.list, url)) {
      return true
    }
  }
  return false
}
 
function ensureEssentialUsRoutes (routes) {
  const name = 'us-spots-us-pickAddr'
  if (routes.some((r) => r.name === name)) {
    return
  }
  routes.push({
    path: '/us-spots-us-pickAddr',
    component: _import('modules/us-spots/us-pickAddr'),
    name: name,
    meta: { title: '交割合约单(US)', isTab: true, menuId: 1981, isDynamic: true, iframeUrl: '' }
  })
}
 
/**
 * 判断当前路由类型, global: 全局路由, main: 主入口路由
 * @param {*} route 当前路由
 */
function fnCurrentRouteType (route, globalRoutes = []) {
  var temp = []
  for (var i = 0; i < globalRoutes.length; i++) {
    if (route.path === globalRoutes[i].path) {
      return 'global'
    } else if (globalRoutes[i].children && globalRoutes[i].children.length >= 1) {
      temp = temp.concat(globalRoutes[i].children)
    }
  }
  return temp.length >= 1 ? fnCurrentRouteType(route, temp) : 'main'
}
 
/**
 * 添加动态(菜单)路由
 * @param {*} menuList 菜单列表
 * @param {*} routes 递归创建的动态(菜单)路由
 */
function fnAddDynamicMenuRoutes (menuList = [], routes = []) {
  var temp = []
  for (var i = 0; i < menuList.length; i++) {
    if (menuList[i].list && menuList[i].list.length >= 1) {
      temp = temp.concat(menuList[i].list)
    } else if (menuList[i].url && /\S/.test(menuList[i].url)) {
      menuList[i].url = menuList[i].url.replace(/^\//, '')
      var route = {
        path: menuList[i].url.replace('/', '-'),
        component: null,
        name: menuList[i].url.replace('/', '-'),
        meta: {
          menuId: menuList[i].menuId,
          title: menuList[i].name,
          isDynamic: true,
          isTab: true,
          iframeUrl: ''
        }
      }
      // url以http[s]://开头, 通过iframe展示
      if (isURL(menuList[i].url)) {
        route['path'] = `i-${menuList[i].menuId}`
        route['name'] = `i-${menuList[i].menuId}`
        route['meta']['iframeUrl'] = menuList[i].url
      } else {
        try {
          route['component'] = _import(`modules/${menuList[i].url}`) || null
        } catch (e) { 
          console.error(e)
        }
      }
      routes.push(route)
    }
  }
  if (temp.length >= 1) {
    fnAddDynamicMenuRoutes(temp, routes)
  } else {
    ensureEssentialUsRoutes(routes)
    const fixedChildren = mainRoutes.children.filter((r) => r.meta && !r.meta.isDynamic)
    mainRoutes.name = 'main-dynamic'
    mainRoutes.children = fixedChildren.concat(
      routes.filter((r) => !fixedChildren.some((f) => f.name === r.name))
    )
    router.addRoutes([
      mainRoutes,
      { path: '*', redirect: { name: '404' } }
    ])
    sessionStorage.setItem('dynamicMenuRoutes', JSON.stringify(mainRoutes.children || '[]'))
  }
}
 
export default router