request.js 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. import axios from "axios";
  2. import React from 'react';
  3. import { message } from 'antd';
  4. const instance = axios.create({
  5. baseURL: import.meta.env.VITE_SERVER_BASE || '',
  6. timeout: 10000,
  7. withCredentials: true, // 跨域
  8. });
  9. // 添加请求拦截器
  10. instance.interceptors.request.use(function (config) {
  11. const { headers = {}, method = 'get', responseType = 'json', download = false, silent } = config;
  12. const token = localStorage.getItem('token') || '';
  13. let noTip = silent;
  14. if (noTip === undefined) {
  15. noTip = method.toLocaleLowerCase() === 'get' ? true : false;
  16. }
  17. // 在发送请求之前做些什么
  18. return {
  19. ...config,
  20. silent: noTip,
  21. headers: {
  22. ...headers,
  23. Authorization: token,
  24. },
  25. responseType: download ? 'blob' : responseType,
  26. };
  27. }, function (error) {
  28. // 对请求错误做些什么
  29. return Promise.reject(error);
  30. });
  31. // 添加响应拦截器
  32. instance.interceptors.response.use(function (response) {
  33. // 2xx 范围内的状态码都会触发该函数。
  34. // 对响应数据做点什么
  35. const { data, config } = response;
  36. if (config.download && !data.code) {
  37. return downloadBlob(response, '下载文件');
  38. }
  39. if (data.code === 1000) {
  40. if (data.data?.token) {
  41. localStorage.setItem('token', data.data.token);
  42. }
  43. if (!config.silent) {
  44. message.success('操作成功');
  45. }
  46. return data.data;
  47. } else if (data.code === 1001) {
  48. if (!config.silent) {
  49. message.error('未登录或者超时, 请重新登录');
  50. }
  51. } else {
  52. console.log(config)
  53. if (!config.silent) {
  54. const errMsg = data.message || '系统错误';
  55. message.error(errMsg.indexOf('exception') > -1 ? '服务异常' : errMsg);
  56. }
  57. }
  58. return Promise.reject(response);
  59. }, function (error) {
  60. // 超出 2xx 范围的状态码都会触发该函数。
  61. // 对响应错误做点什么
  62. console.error(error);
  63. message.error('网络超时或异常...')
  64. return Promise.reject("网络异常, 请重试...");
  65. });
  66. export default instance;
  67. export function queryTable (apiRequest) {
  68. return function (params) {
  69. const { pageSize } = params;
  70. return apiRequest({
  71. ...params,
  72. pageSize,
  73. pageNum: params.current,
  74. })
  75. .then((res) => {
  76. return {
  77. data: res.records,
  78. success: true,
  79. total: res.total,
  80. };
  81. })
  82. .catch((err) => {
  83. return {
  84. success: false,
  85. };
  86. });
  87. };
  88. }
  89. export function queryDict (apiRequest, {labelKey = 'name', valueKey = 'id'} = {}) {
  90. return function (params) {
  91. const { current, pageSize, ...leftParams } = params || {};
  92. return apiRequest({
  93. pageSize: 9999,
  94. pageNum: 1,
  95. ...(leftParams || {}),
  96. })
  97. .then((res) => {
  98. return res?.records?.map((x) => ({
  99. label: x[labelKey],
  100. value: x[valueKey],
  101. ...x,
  102. }));
  103. })
  104. .catch((err) => {
  105. return {
  106. success: false,
  107. };
  108. });
  109. };
  110. }
  111. export function restful (url) {
  112. const list = params => instance.get(url, { params });
  113. const get = id => instance.get(`${url}/${id}`);
  114. const add = data => instance.post(url, data);
  115. const update = (id, data) => instance.put(`${url}/${id}`, data);
  116. const del = id => instance.delete(`${url}/${id}`);
  117. return [list, get, add, update, del];
  118. }
  119. export function useRequest (fn) {
  120. const [loading, setLoading] = React.useState(false);
  121. const p = (...args) => new Promise((resolve, reject) => {
  122. setLoading(true);
  123. fn(...args).then(res => {
  124. setLoading(false);
  125. resolve(res);
  126. }).catch(e => {
  127. setLoading(false);
  128. reject(e);
  129. });
  130. });
  131. return [loading, p]
  132. }
  133. function downloadBlob (response) {
  134. let fileName = '未知文件';
  135. const contentType = response.headers['content-type'];
  136. const contentDisposition = response.headers['content-disposition'];
  137. if (contentDisposition) {
  138. const parts = contentDisposition.split(';filename=');
  139. if (parts[1]) {
  140. fileName = decodeURIComponent(parts[1]);
  141. }
  142. }
  143. const url = window.URL.createObjectURL(new Blob([response.data], { type: contentType }));
  144. const link = document.createElement('a');
  145. link.href = url;
  146. link.setAttribute('download', fileName);
  147. link.click();
  148. window.URL.revokeObjectURL(url);
  149. }