| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- import axios from 'axios'
- import { ElMessage } from 'element-plus'
- import { useLangStore } from '@/pinia/langStore'
- import { useAppStore } from '@/pinia/appStore'
- // 创建 axios 实例
- const request = axios.create({
- baseURL: import.meta.env.VITE_API_BASE_URL,
- timeout: 10000,
- headers: {
- 'Content-Type': 'application/json;charset=UTF-8'
- }
- })
- // 请求拦截器
- request.interceptors.request.use(
- config => {
- // 获取 token(假设存储在 localStorage 中)
- const token = localStorage.getItem('token')
- if (token) {
- config.headers.Authorization = `Bearer ${token}`
- }
- const langStore = useLangStore();
- config.headers['Accept-Language'] = langStore.currentLang==='en'?'en':'zh';
-
- // 处理请求参数
- if (config.method === 'get' && config.params) {
- // 过滤掉空值参数
- // const filteredParams = {}
- // Object.keys(config.params).forEach(key => {
- // if (config.params[key] !== null && config.params[key] !== undefined && config.params[key] !== '') {
- // filteredParams[key] = config.params[key]
- // }
- // })
- // config.params = filteredParams
- }
- // 支持 formData
- if (config.data instanceof FormData) {
- // 如果是 FormData 类型,移除默认的 Content-Type,让浏览器自动设置
- delete config.headers['Content-Type']
- }
-
- return config
- },
- error => {
- console.error('请求错误:', error)
- return Promise.reject(error)
- }
- )
- // 响应拦截器
- request.interceptors.response.use(
- response => {
- const appStore = useAppStore();
- // 根据后端约定的响应结构进行状态判断
- const { code, data, msg } = response.data
-
- // 假设 code 为 200 表示成功
- if (code === 200) {
- return response.data
- } else if ([410000, 410001, 410002, 401, 403].includes(code)){
- appStore.LOGOUT();
- localStorage.removeItem('token')
- //弹出登录框
- appStore.showLoginDialog = true;
- // window.location.href = '/login'
-
- return response.data
- }else {
- ElMessage.error(msg|| '请求失败')
- return response.data
- }
- },
- error => {
- console.error('响应错误:', error)
-
- // HTTP 状态码错误处理
- if (error.response) {
- const { status, data } = error.response
- switch (status) {
- case 401:
- // 未授权
- localStorage.removeItem('token')
- break
- case 403:
- // 禁止访问
- console.error('禁止访问:', data.message)
- break
- case 404:
- // 资源不存在
- console.error('请求资源不存在')
- break
- case 500:
- // 服务器内部错误
- console.error('服务器内部错误')
- break
- default:
- console.error(`连接错误:${status}`)
- }
- } else if (error.request) {
- // 请求发出但没有收到响应
- console.error('网络错误,请检查网络连接')
- } else {
- // 其他错误
- console.error('请求失败:', error.message)
- }
-
- return Promise.reject(error)
- }
- )
- /**
- * GET 请求
- * @param {string} url 请求地址
- * @param {object} params 请求参数
- * @param {object} config 其他配置
- */
- export function get(url, params = {}, config = {}) {
- return request({
- method: 'get',
- url,
- params,
- ...config
- })
- }
- /**
- * POST 请求
- * @param {string} url 请求地址
- * @param {object} data 请求数据
- * @param {object} config 其他配置
- */
- export function post(url, data = {}, config = {}) {
- return request({
- method: 'post',
- url,
- data,
- ...config
- })
- }
- /**
- * PUT 请求
- * @param {string} url 请求地址
- * @param {object} data 请求数据
- * @param {object} config 其他配置
- */
- export function put(url, data = {}, config = {}) {
- return request({
- method: 'put',
- url,
- data,
- ...config
- })
- }
- /**
- * DELETE 请求
- * @param {string} url 请求地址
- * @param {object} params 请求参数
- * @param {object} config 其他配置
- */
- export function del(url, params = {}, config = {}) {
- return request({
- method: 'delete',
- url,
- params,
- ...config
- })
- }
- export default {
- get,
- post,
- put,
- del
- }
|