main.js 3.5 KB
Newer Older
E
Evan 已提交
1 2 3 4 5 6 7 8 9
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import App from './App'
import router from './router'
import mavonEditor from 'mavon-editor'
import 'mavon-editor/dist/css/index.css'
E
Evan 已提交
10
import store from './store'
E
Evan 已提交
11 12 13

var axios = require('axios')
axios.defaults.baseURL = 'http://localhost:8443/api'
E
Evan 已提交
14
// 使请求带上凭证信息
15
axios.defaults.withCredentials = true
E
Evan 已提交
16 17 18 19 20 21

Vue.prototype.$axios = axios
Vue.config.productionTip = false
Vue.use(ElementUI)
Vue.use(mavonEditor)

E
Evan 已提交
22
// 如果前端没有登录信息则直接拦截,如果有则判断后端是否正常登录(防止构造参数绕过)
E
Evan 已提交
23
router.beforeEach((to, from, next) => {
E
Evan 已提交
24 25 26 27 28
    if (store.state.user.username && to.path.startsWith('/admin')) {
      axios.get('/authentication').then(resp => {
        initAdminMenu(router, store)
      })
    }
E
Evan 已提交
29
    if (to.meta.requireAuth) {
E
Evan 已提交
30
      if (store.state.user.username) {
E
Evan 已提交
31 32 33
        axios.get('/authentication').then(resp => {
          if (resp) next()
        })
E
Evan 已提交
34 35 36 37 38 39 40 41 42 43 44
      } else {
        next({
          path: 'login',
          query: {redirect: to.fullPath}
        })
      }
    } else {
      next()
    }
  }
)
E
Evan 已提交
45

E
Evan 已提交
46
// http request拦截器,为请求加上 token,测试用
E
Evan 已提交
47
/* axios.interceptors.request.use(
E
Evan 已提交
48
  config => {
E
Evan 已提交
49 50
    // 输出当前状态下的 token
    // console.log(store.state.user.token)
E
Evan 已提交
51
    if (store.state.user.token) {
E
Evan 已提交
52
      // 判断当前是否存在token,如果存在的话,则每个http header都加上token
E
Evan 已提交
53 54
      // config.headers.Token = `token ${JSON.stringify(store.state.user.token)}`
      config.headers.Token = JSON.stringify(store.state.user.token)
E
Evan 已提交
55 56
    } else {
      config.headers.Token = null
E
Evan 已提交
57 58 59 60 61
    }
    return config
  },
  err => {
    return Promise.reject(err)
E
Evan 已提交
62
  }
E
Evan 已提交
63
) */
E
Evan 已提交
64 65 66 67 68 69 70

// http response 拦截器
axios.interceptors.response.use(
  response => {
    return response
  },
  error => {
E
Evan 已提交
71 72 73
    console.log(error.response)
    if (error) {
      router.replace({
E
Evan 已提交
74 75
        path: 'login'
        // query: {redirect: router.currentRoute.fullPath}
E
Evan 已提交
76
      })
E
Evan 已提交
77 78 79 80 81
    }
    // 返回接口返回的错误信息
    return Promise.reject(error.response.data)
  })

E
Evan 已提交
82
const initAdminMenu = (router, store) => {
E
Evan 已提交
83 84 85 86 87 88 89 90 91 92 93 94
  if (store.state.adminMenus.length > 0) {
    return
  }
  axios.get('/menu').then(resp => {
    if (resp && resp.status === 200) {
      var fmtRoutes = formatRoutes(resp.data)
      router.addRoutes(fmtRoutes)
      store.commit('initAdminMenu', fmtRoutes)
    }
  })
}

E
Evan 已提交
95
const formatRoutes = (routes) => {
E
Evan 已提交
96 97
  let fmtRoutes = []
  routes.forEach(route => {
E
Evan 已提交
98 99
    if (route.children) {
      route.children = formatRoutes(route.children)
E
Evan 已提交
100
    }
E
Evan 已提交
101

E
Evan 已提交
102
    let fmtRoute = {
E
Evan 已提交
103
      path: route.path,
E
Evan 已提交
104
      component: resolve => {
E
Evan 已提交
105 106 107 108 109
        if (route.component.startsWith('Admin')) {
          require(['./components/admin/' + route.component + '.vue'], resolve)
        } else if (route.component.startsWith('User')) {
          require(['./components/admin/user/' + route.component + '.vue'], resolve)
        } else if (route.component.startsWith('Library')) {
E
Evan 已提交
110 111 112
          // require(['./library/' + component + '.vue'], resolve)
        }
      },
E
Evan 已提交
113 114 115 116
      name: route.name,
      nameZh: route.nameZh,
      iconCls: route.iconCls,
      children: route.children
E
Evan 已提交
117 118 119 120 121 122
    }
    fmtRoutes.push(fmtRoute)
  })
  return fmtRoutes
}

E
Evan 已提交
123 124 125
/* eslint-disable no-new */
new Vue({
  el: '#app',
126
  render: h => h(App),
E
Evan 已提交
127
  router,
E
Evan 已提交
128
  store,
E
Evan 已提交
129
  components: {App},
E
Evan 已提交
130 131
  template: '<App/>'
})