跨域
两个不同源(协议、主机、端口都一致)地址无法请求
解决方法Vue-cli
vue.config.js
proxy: {
'/api': {
target: 'https://heimahr.itheima.net'
}
}
拦截器
请求
// 成功1 失败2
service.interceptors.request.use((config) => {
// 注入token
// this.$store.getters
// store.getters.token => 请求头里面
if (store.getters.token) {
config.headers.Authorization = `Bearer ${store.getters.token}`
}
return config
}, (error) => {
// 失败执行promise
return Promise.reject(error)
})
响应
// 响应拦截器
service.interceptors.response.use((response) => {
// axios默认包裹了data
// 判断是不是Blob
if (response.data instanceof Blob) return response.data // 返回了Blob对象
const { data, message, success } = response.data // 默认json格式
if (success) {
return data
} else {
Message({ type: 'error', message })
return Promise.reject(new Error(message))
}
}, async(error) => {
if (error.response.status === 401) {
Message({ type: 'warning', message: 'token超时了' })
// 说明token超时了
await store.dispatch('user/logout') // 调用action 退出登录
// 主动跳到登录页
router.push('/login') // 跳转到登录页
return Promise.reject(error)
}
// error.message
Message({ type: 'error', message: error.message })
return Promise.reject(error)
})
区分环境
开发、生产环境
.env.development
.env.production
主页权限
跳转主页
this.$refs.form.validate(async(isOK) => {
if (isOK) {
await this.$store.dispatch('user/login', this.loginForm)
// Vuex 中的action 返回的promise
// 跳转主页
this.$router.push('/')
}
})
有token跳转首页
无token跳转登录页
/**
*前置守卫
*
*/
const whiteList = ['/login', '/404']
router.beforeEach(async(to, from, next) => {
nprogress.start()
// 进度条
if (store.getters.token) {
// 存在token
if (to.path === '/login') {
// 跳转到主页
next('/') // 中转到主页
// next(地址)并没有执行后置守卫
nprogress.done()
} else {
// 判断是否获取过资料
if (!store.getters.userId) {
const { roles } = await store.dispatch('user/getUserInfo')
// console.log(roles.menus) // 数组 不确定 可能是8个 1个 0个
// console.log(asyncRoutes) // 数组 8个
const filterRoutes = asyncRoutes.filter(item => {
// return true/false
return roles.menus.includes(item.name)
}) // 筛选后的路由
store.commit('user/setRoutes', filterRoutes)
router.addRoutes([...filterRoutes, { path: '*', redirect: '/404', hidden: true }]) // 添加动态路由信息到路由表
// router添加动态路由之后 需要转发一下
next(to.path) // 目的是让路由拥有信息 router的已知缺陷
} else {
next() // 放过
}
}
} else {
// 没有token
if (whiteList.includes(to.path)) {
next()
} else {
next('/login') // 中转到登录页
nprogress.done()
}
}
})
/** *
* 后置守卫
* **/
router.afterEach(() => {
console.log('123')
nprogress.done()
})