request.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // src/utils/request.js
  2. // 该文件是用来 二次 封装 axios 用的
  3. import axios from 'axios'
  4. import router, {homeRoutes} from '@/router/index.js'
  5. // 开发环境(写代码的阶段) development
  6. // 生产环境(代码已经写好已经部署到服务器了) production
  7. // 测试环境(代码已经写好了但是还没有部署) production
  8. // process.env.NODE_ENV 用来获取我们当前的环境
  9. const isDev = process.env.NODE_ENV == 'development'
  10. // 修正赋值逻辑,使用逻辑或运算符
  11. const BASE_URL = import.meta.env.VITE_BASE_URL || 'http://192.168.110.8:8080/admin-api'
  12. // 创建一个请求对象
  13. const request = axios.create({
  14. // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
  15. // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  16. // baseURL: isDev ? 'http://121.89.205.189:3000/admin' : 'http://121.89.205.189:3000/admin',
  17. baseURL: BASE_URL,
  18. // baseURL: '/api',
  19. // `timeout` 指定请求超时的毫秒数。
  20. // 如果请求时间超过 `timeout` 的值,则请求会被中断
  21. timeout: 60000, // 默认值是 `0` (永不超时)
  22. })
  23. // 添加请求拦截器
  24. request.interceptors.request.use(function (config) {
  25. // 在发送请求之前做些什么
  26. // console.log(localStorage.getItem('token'));
  27. // 1. 先获取 token
  28. const token = localStorage.getItem('token')
  29. //目前未登录状态是“undefined”,不对暂未找原因
  30. if (token === "undefined") {
  31. // token 无效,之后我们可以重新登录
  32. localStorage.clear()
  33. router.push(homeRoutes.login)
  34. return
  35. }
  36. // 2.设置 token 到请求头
  37. config.headers.Authorization = `Bearer ${token}`;
  38. return config;
  39. }, function (error) {
  40. // 对请求错误做些什么
  41. return Promise.reject(error);
  42. });
  43. // 添加响应拦截器
  44. request.interceptors.response.use(function (response) {
  45. // 2xx 范围内的状态码都会触发该函数。
  46. // 对响应数据做点什么
  47. if (response.data.code == '401') {
  48. // token 无效,之后我们可以重新登录
  49. localStorage.clear()
  50. router.push(homeRoutes.login)
  51. }
  52. return response.data;
  53. }, function (error) {
  54. // 超出 2xx 范围的状态码都会触发该函数。
  55. // 对响应错误做点什么
  56. return Promise.reject(error);
  57. });
  58. // ajax 自定义各种数据请求的方法
  59. export default function ajax (config) {
  60. // 1. 先获取到请求的一些必要参数
  61. const { url = '', method = 'GET', data = {}, headers = {} } = config
  62. // 2. 判断我们请求的类型是 get 还是 post 还是其他
  63. switch (method.toUpperCase()) {
  64. case 'GET':
  65. // get 请求
  66. if (headers['content-type'] == 'application/x-www-form-url-encoded') {
  67. // 如果提交的是表单数据我们需要格式化数据
  68. const obj = new URLSearchParams()
  69. for (const key in data) {
  70. obj.append(key, data[key])
  71. }
  72. return request.post(url, obj, { headers })
  73. }
  74. // get 请求的参数我们需要放在 params 中
  75. return request.get(url, { params: data })
  76. case 'POST':
  77. // post 请求
  78. // 1. 表单提交数据
  79. if (headers['content-type'] == 'application/x-www-form-url-encoded') {
  80. // 如果提交的是表单数据我们需要格式化数据
  81. const obj = new URLSearchParams()
  82. for (const key in data) {
  83. obj.append(key, data[key])
  84. }
  85. return request.post(url, obj, { headers })
  86. }
  87. // 2. 文件数据
  88. if (headers['content-type'] == 'multipart/form-data') {
  89. const obj = new FormData()
  90. for (const key in data) {
  91. obj.append(key, data[key])
  92. }
  93. return request.post(url, obj, { headers })
  94. }
  95. // 3. json 数据
  96. return request.post(url, data, {headers})
  97. case 'PUT':
  98. // 通常用来修改数据用的 --- 数据更新
  99. return request.put(url, data)
  100. case 'DELETE':
  101. // 删除数据
  102. return request.delete(url, { data })
  103. case 'PATCH':
  104. // 更新局部资源
  105. return request.patch(url, data)
  106. default:
  107. // 如果前面全部都不是
  108. return request.request(config)
  109. }
  110. }