// src/utils/request.js // 该文件是用来 二次 封装 axios 用的 import axios from 'axios' import router from '@/router/index.js' // 开发环境(写代码的阶段) development // 生产环境(代码已经写好已经部署到服务器了) production // 测试环境(代码已经写好了但是还没有部署) production // process.env.NODE_ENV 用来获取我们当前的环境 const isDev = process.env.NODE_ENV == 'development' // 修正赋值逻辑,使用逻辑或运算符 const BASE_URL = import.meta.env.VITE_BASE_URL || 'http://192.168.110.8:8080/admin-api' // 创建一个请求对象 const request = axios.create({ // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。 // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL // baseURL: isDev ? 'http://121.89.205.189:3000/admin' : 'http://121.89.205.189:3000/admin', baseURL: BASE_URL, // baseURL: '/api', // `timeout` 指定请求超时的毫秒数。 // 如果请求时间超过 `timeout` 的值,则请求会被中断 timeout: 60000, // 默认值是 `0` (永不超时) }) // 添加请求拦截器 request.interceptors.request.use(function (config) { // 在发送请求之前做些什么 // console.log(localStorage.getItem('token')); // 1. 先获取 token const token = localStorage.getItem('token') // 2. 设置 token config.headers.token = token return config; }, function (error) { // 对请求错误做些什么 return Promise.reject(error); }); // 添加响应拦截器 request.interceptors.response.use(function (response) { // 2xx 范围内的状态码都会触发该函数。 // 对响应数据做点什么 if (response.data.code == '401') { // token 无效,之后我们可以重新登录 localStorage.clear() router.push('/login') } return response.data; }, function (error) { // 超出 2xx 范围的状态码都会触发该函数。 // 对响应错误做点什么 return Promise.reject(error); }); // ajax 自定义各种数据请求的方法 export default function ajax (config) { // 1. 先获取到请求的一些必要参数 const { url = '', method = 'GET', data = {}, headers = {} } = config // 2. 判断我们请求的类型是 get 还是 post 还是其他 switch (method.toUpperCase()) { case 'GET': // get 请求 if (headers['content-type'] == 'application/x-www-form-url-encoded') { // 如果提交的是表单数据我们需要格式化数据 const obj = new URLSearchParams() for (const key in data) { obj.append(key, data[key]) } return request.post(url, obj, { headers }) } // get 请求的参数我们需要放在 params 中 return request.get(url, { params: data }) case 'POST': // post 请求 // 1. 表单提交数据 if (headers['content-type'] == 'application/x-www-form-url-encoded') { // 如果提交的是表单数据我们需要格式化数据 const obj = new URLSearchParams() for (const key in data) { obj.append(key, data[key]) } return request.post(url, obj, { headers }) } // 2. 文件数据 if (headers['content-type'] == 'multipart/form-data') { const obj = new FormData() for (const key in data) { obj.append(key, data[key]) } return request.post(url, obj, { headers }) } // 3. json 数据 return request.post(url, data, {headers}) case 'PUT': // 通常用来修改数据用的 --- 数据更新 return request.put(url, data) case 'DELETE': // 删除数据 return request.delete(url, { data }) case 'PATCH': // 更新局部资源 return request.patch(url, data) default: // 如果前面全部都不是 return request.request(config) } }