187 lines
5.1 KiB
JavaScript
187 lines
5.1 KiB
JavaScript
/**
|
|
* api
|
|
* v1.2
|
|
*/
|
|
|
|
import axios from 'axios'
|
|
import { token } from '@/common/token'
|
|
import status from './status'
|
|
const STATUS = status
|
|
import app from '@/main'
|
|
|
|
axios.defaults.baseURL = '/api'
|
|
|
|
/**
|
|
* 最终直接根据url名称调用接口方法
|
|
* 例如
|
|
* import { api } from '@/api'
|
|
* api.getItemGroupType(parmas).then(...)
|
|
*/
|
|
import urls from './requests'
|
|
import { settings } from 'nprogress'
|
|
|
|
const initInstance = (options) => {
|
|
const instance = axios
|
|
.create({
|
|
headers: {
|
|
Authorization: 'Bearer ' + token.value
|
|
},
|
|
...options
|
|
})
|
|
|
|
instance.interceptors.response.use((res) => {
|
|
if (res.data.status === STATUS.Unauthorized) {
|
|
handlerUnauthorized()
|
|
}
|
|
return res
|
|
}, (err) => {
|
|
return Promise.reject(err)
|
|
})
|
|
return instance
|
|
}
|
|
|
|
const errerCodes = [STATUS.BadRequest, STATUS.InternalServerError, STATUS.Forbidden]
|
|
|
|
const errorNotification = ({ code, message }) => {
|
|
switch (message.constructor) {
|
|
case Array:
|
|
message.map(p => {
|
|
setTimeout(() => {
|
|
app.$notification.error({
|
|
duration: 30,
|
|
message: p.field,
|
|
description: p.messages.join('/'),
|
|
})
|
|
})
|
|
})
|
|
break
|
|
default:
|
|
app.$notification.error({
|
|
duration: 30,
|
|
message: code || '错误',
|
|
description: message,
|
|
})
|
|
break
|
|
}
|
|
}
|
|
|
|
const handlerUnauthorized = () => {
|
|
token.value = ''
|
|
app.$router.replace({
|
|
path: '/login'
|
|
}).catch(() => { })
|
|
}
|
|
|
|
const api = {}
|
|
|
|
for (let key in urls) {
|
|
|
|
const item = urls[key]
|
|
let url = '',
|
|
method = 'get',
|
|
options = {}
|
|
if (item.constructor === String) {
|
|
url = item
|
|
} else if (item.constructor === Array) {
|
|
url = item[0]
|
|
if (item[1]) {
|
|
method = item[1].toLowerCase()
|
|
}
|
|
if (item[2]) {
|
|
options = item[2]
|
|
}
|
|
} else if (item.constructor === Object) {
|
|
url = item.url
|
|
if (item.method) {
|
|
method = item.method.toLowerCase()
|
|
}
|
|
}
|
|
|
|
api[`${key}Await`] = function (params = {}) {
|
|
if (method === 'post') {
|
|
return initInstance(options).post(url, params)
|
|
} else {
|
|
let _params = [],
|
|
_url = url
|
|
Object.keys(params).forEach(key => {
|
|
const value = params[key]
|
|
if (value) {
|
|
switch (value.constructor) {
|
|
case Array:
|
|
_params.push(...value.map(p => `${key}=${p}`))
|
|
break
|
|
default:
|
|
_params.push(`${key}=${value}`)
|
|
break
|
|
}
|
|
}
|
|
})
|
|
if (_params.length) {
|
|
_url += '?' + _params.join('&')
|
|
}
|
|
return initInstance(options).get(_url)
|
|
}
|
|
}
|
|
|
|
api[key] = function (params = {}) {
|
|
return new Promise((reslove, reject) => {
|
|
api[`${key}Await`](params)
|
|
.then((res) => {
|
|
const { data } = res
|
|
if (errerCodes.indexOf(data.code) >= 0) {
|
|
errorNotification(data)
|
|
reject([ArrayBuffer, Blob].indexOf(data.constructor) > -1 ? res : data)
|
|
} else if (data.code === STATUS.Unauthorized) {
|
|
handlerUnauthorized()
|
|
} else {
|
|
reslove([ArrayBuffer, Blob].indexOf(data.constructor) > -1 ? res : data)
|
|
}
|
|
})
|
|
.catch(({ response }) => {
|
|
if (process.env.VUE_APP_NODE_ENV === 'development') {
|
|
const { data, status } = response
|
|
if (data.constructor === String) {
|
|
errorNotification({
|
|
message: data,
|
|
code: status
|
|
})
|
|
} else {
|
|
errorNotification(data)
|
|
}
|
|
if (data.code === STATUS.Unauthorized) {
|
|
handlerUnauthorized()
|
|
}
|
|
reject(data)
|
|
} else {
|
|
errorNotification({
|
|
message: '系统发生错误,请联系管理员'
|
|
})
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
api[key].url = axios.defaults.baseURL + url
|
|
api[key].key = key
|
|
}
|
|
|
|
/**
|
|
* 并发请求,与axios.all方式相同
|
|
* 但是使用的接口函数为this.$api.[接口名]E
|
|
*/
|
|
api.$queue = function (queue) {
|
|
return new Promise((reslove) => {
|
|
axios.all(queue).then((results) => {
|
|
const res = results.map(p => p.data)
|
|
reslove(res)
|
|
})
|
|
})
|
|
}
|
|
|
|
export {
|
|
axios,
|
|
urls,
|
|
api,
|
|
STATUS
|
|
}
|