request.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import axios from 'axios'
  2. import type { AxiosRequestConfig } from 'axios'
  3. import { ElMessage } from 'element-plus'
  4. import { user } from '~/store/index'
  5. const token = user.value?.token
  6. export interface Response {
  7. code: string
  8. data: any
  9. msg: string
  10. }
  11. const instance = axios.create({
  12. baseURL: window.GLOBAL_CONFIG.yzy,
  13. timeout: 180 * 1000,
  14. headers: {
  15. 'Content-Type': 'application/x-www-form-urlencoded',
  16. },
  17. method: 'post',
  18. })
  19. instance.interceptors.request.use(
  20. async (config) => {
  21. if (config.method?.toLocaleLowerCase() === 'get') {
  22. config.params = Object.assign({ token }, config.params)
  23. }
  24. else {
  25. config.data = Object.assign(
  26. {
  27. token,
  28. client: 'web',
  29. api: 'json',
  30. issubmit: (config.url?.endsWith('add') || config.url?.endsWith('edit')) ? '1' : undefined,
  31. },
  32. config.data)
  33. }
  34. return config
  35. },
  36. (error) => {
  37. console.error('request error: ', error)
  38. return Promise.reject(error)
  39. },
  40. )
  41. // response interceptor
  42. instance.interceptors.response.use(
  43. (response: { data: Response }) => {
  44. response.data.code = response.data?.code?.toString()
  45. response.data.msg = response.data.msg.replaceAll(/<.*?>/g, ' ')
  46. const { code, msg } = response.data
  47. if (code !== '1')
  48. ElMessage.error(msg)
  49. return response.data
  50. },
  51. (error) => {
  52. console.error(`response error: ${error}`)
  53. return Promise.reject(error)
  54. },
  55. )
  56. export default (config: AxiosRequestConfig): Promise<Response> => instance.request(config)
  57. const obj2form = (data: { [key: string]: any }) => {
  58. const formData = new FormData()
  59. Object.keys(data).forEach(key => formData.append(key, data[key]))
  60. return formData
  61. }
  62. export const REQUEST = {
  63. empty: axios,
  64. default: instance,
  65. import: (c: Partial<AxiosRequestConfig>) => instance({
  66. timeout: 10 * 60 * 1000,
  67. transformRequest: [obj2form],
  68. ...c,
  69. }),
  70. upload: (c: Partial<AxiosRequestConfig>) => instance({
  71. timeout: 3 * 60 * 1000,
  72. transformRequest: [obj2form],
  73. ...c,
  74. }),
  75. download: (c: Partial<AxiosRequestConfig>) => instance({
  76. timeout: 1 * 60 * 1000,
  77. method: 'get',
  78. params: { token, limit: 10000, page: 1, api: 'xls', ...c },
  79. }),
  80. }
  81. export function download(url: string, data?: object | null) {
  82. const params = Object.assign({ token, limit: 10000, page: 1, api: 'xls' }, data)
  83. const paramsStr = Object.entries(params).map(([k, v]) => `${k}=${v}`).join('&')
  84. const el = document.createElement('a')
  85. const href = `${window.GLOBAL_CONFIG.api}${url}?${paramsStr}`
  86. el.setAttribute('href', href)
  87. el.click()
  88. }