service.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import axios from 'axios'
  2. import Adapter from 'axios-mock-adapter'
  3. import { get } from 'lodash'
  4. import util from '@/libs/util'
  5. import { errorLog, errorCreate } from './tools'
  6. /**
  7. * @description 创建请求实例
  8. */
  9. function createService () {
  10. // 创建一个 axios 实例
  11. const service = axios.create()
  12. // 请求拦截
  13. service.interceptors.request.use(
  14. config => config,
  15. error => {
  16. // 发送失败
  17. console.log(error)
  18. return Promise.reject(error)
  19. }
  20. )
  21. // 响应拦截
  22. service.interceptors.response.use(
  23. response => {
  24. // dataAxios 是 axios 返回数据中的 data
  25. const dataAxios = response.data
  26. // 这个状态码是和后端约定的
  27. const { code } = dataAxios
  28. // 根据 code 进行判断
  29. if (code === undefined) {
  30. // 如果没有 code 代表这不是项目后端开发的接口 比如可能是 D2Admin 请求最新版本
  31. return dataAxios
  32. } else {
  33. // 有 code 代表这是一个后端接口 可以进行进一步的判断
  34. switch (code) {
  35. case 0:
  36. // [ 示例 ] code === 0 代表没有错误
  37. return dataAxios.data
  38. case 'xxx':
  39. // [ 示例 ] 其它和后台约定的 code
  40. errorCreate(`[ code: xxx ] ${dataAxios.msg}: ${response.config.url}`)
  41. break
  42. default:
  43. // 不是正确的 code
  44. errorCreate(`${dataAxios.msg}: ${response.config.url}`)
  45. break
  46. }
  47. }
  48. },
  49. error => {
  50. const status = get(error, 'response.status')
  51. switch (status) {
  52. case 400: error.message = '请求错误'; break
  53. case 401: error.message = '未授权,请登录'; break
  54. case 403: error.message = '拒绝访问'; break
  55. case 404: error.message = `请求地址出错: ${error.response.config.url}`; break
  56. case 408: error.message = '请求超时'; break
  57. case 500: error.message = '服务器内部错误'; break
  58. case 501: error.message = '服务未实现'; break
  59. case 502: error.message = '网关错误'; break
  60. case 503: error.message = '服务不可用'; break
  61. case 504: error.message = '网关超时'; break
  62. case 505: error.message = 'HTTP版本不受支持'; break
  63. default: break
  64. }
  65. errorLog(error)
  66. return Promise.reject(error)
  67. }
  68. )
  69. return service
  70. }
  71. /**
  72. * @description 创建请求方法
  73. * @param {Object} service axios 实例
  74. */
  75. function createRequestFunction (service) {
  76. return function (config) {
  77. const token = util.cookies.get('token')
  78. const configDefault = {
  79. headers: {
  80. Authorization: token,
  81. 'Content-Type': get(config, 'headers.Content-Type', 'application/json')
  82. },
  83. timeout: 5000,
  84. baseURL: process.env.VUE_APP_API,
  85. data: {}
  86. }
  87. return service(Object.assign(configDefault, config))
  88. }
  89. }
  90. // 用于真实网络请求的实例和请求方法
  91. export const service = createService()
  92. export const request = createRequestFunction(service)
  93. // 用于模拟网络请求的实例和请求方法
  94. export const serviceForMock = createService()
  95. export const requestForMock = createRequestFunction(serviceForMock)
  96. // 网络请求数据模拟工具
  97. export const mock = new Adapter(serviceForMock)