vue3.0+axios 跨域+封装
封装:
目录结构:src/utils/request.js, 没有就自己建一个
// import axios from 'axios'
// import { Message } from 'element-ui'
import router from '@/router/index'
import i18n from '@/i18n/i18n.js'
import store from '@/store/index'
axios.defaults.headers['Content-Type'] = 'application/json;charset=UTF-8'
const service = axios.create({
baseURL: '',
// 超时
timeout: 30000
})
// request拦截器
service.interceptors.request.use(
config => {
const autelToken = localStorage.getItem('token')
if (autelToken) {
config.headers['autel-token'] = autelToken
}
return config
},
error => {
Promise.reject(error)
}
)
// 响应拦截器
service.interceptors.response.use(
res => {
if (res.data.code !== 200) {
if (res.data.code === 10005002) {
ELEMENT.Message.info('您的账号在别处登录了, 请重新登陆')
localStorage.removeItem('token')
router.replace('/login')
} else if (res.data.code === 10005001) {
ELEMENT.Message.info('登陆已失效, 请重新登陆')
localStorage.removeItem('token')
router.replace('/login')
} else {
// 利用 i18 插件,获得当前语言环境,去对应字段里取得业务码对应的报错
const lang = i18n.locale
const errorMessage = i18n.messages[lang].errorCode.succeedCode[
res.data.code.toString()
]
? i18n.messages[lang].errorCode.succeedCode[res.data.code.toString()]
: res.data.message
ELEMENT.Message({
message: errorMessage,
type: 'error'
})
// 如果本次请求的code 不是200,证明请求数据失败,本次不缓存页面,以便下次进入页面再次请求数据
store.dispatch('tagsView/deletaCachedView', router.currentRoute.name)
}
}
return res.data
},
error => {
if (!error.response) {
ELEMENT.Message({
message: '服务器连接超时',
type: 'error'
})
store.dispatch('tagsView/deletaCachedView', router.currentRoute.name)
return
}
if (error.response.status === 401) {
ELEMENT.Message.info('身份验证失败,请重新登陆')
localStorage.removeItem('token')
router.replace('/login')
return error.response
}
// 利用 i18 插件,获得当前语言环境,去对应字段里取得业务码对应的报错
const lang = i18n.locale
const errorMessage = i18n.messages[lang].errorCode.statusCode[
error.response.status.toString()
]
? i18n.messages[lang].errorCode.statusCode[
error.response.status.toString()
]
: '未知错误'
ELEMENT.Message({
message: errorMessage,
type: 'error'
})
// 如果本次请求的状态码 不是200,证明请求数据失败,本次不缓存页面,以便下次进入页面再次请求数据
store.dispatch('tagsView/deletaCachedView', router.currentRoute.name)
return error
}
)
export default service
跨域, 在 vue.config.js 里配置
const path = require('path')
const resolve = dir => {
return path.join(__dirname, dir)
}
module.exports = {
devServer: {
host: '0.0.0.0',
port: 8080,
proxy: {
'/api': {
target: 'http://autel-cloud-xxxx-dev.com',
changeOrigin: true
}
}
},
chainWebpack: config => {
config.resolve.alias
.set('@', resolve('src'))
.set('@API', resolve('src/api'))
.set('@C', resolve('src/components'))
.set('@U', resolve('src/utils'))
.set('@V', resolve('src/views'))
.set('@ATS', resolve('src/assets'))
}
}
使用
src/api/menu.js
import request from '@/utils/request'
//添加菜单
export function addOrCompileMenu(data) {
return request({
url: '/api/admin/menu/saveMenu',
method: 'post',
applicationType: 'JSON', //这一段表示,是post 请求,就将 请求参数转换成 JSON 格式
data
})
}
src/views/menu.vue
import { getMenuList } from '@/api/menu'
methods: {
getMenuList({}).then(res => {
if (res.status === 200) {
this.list = res.data.data.menuVoList
}
})
}
浙公网安备 33010602011771号