123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- import { IHttpResponse, IObject } from '@/types/interface'
- import router from "@/router";
-
- // import { useRouter, useRoute } from 'vue-router'
- import axios, { AxiosRequestConfig } from 'axios'
- import qs from 'qs'
- import { getToken } from './cache'
- import { getValueByKeys } from './utils'
- import { ElMessage } from 'element-plus'
- import { SM4Util } from '@/utils/sm4'
- import { sm4Key } from '@/utils/utils'
- import BaseService from '@/utils/baseService'
- import { setCache } from '@/utils/cache'
-
- // const router = useRouter()
- const sm4 = new SM4Util()
- let baseURL = ''
- // console.log(import.meta.env)
- if (import.meta.env.MODE === 'production') {
- // 生产环境逻辑
- // console.log('这是生产环境')
- baseURL = import.meta.env.VITE_APP_BASE_URL_N
- }
- const httpN = axios.create({
- baseURL,
- timeout: 10 * 1000,
- })
-
- httpN.interceptors.request.use(
- function (config: any) {
- config.headers['X-Requested-With'] = 'XMLHttpRequest'
- config.headers['Request-Start'] = new Date().getTime()
- const token = getToken()
- if (token) {
- config.headers['Access-Token'] = token
- }
- if (config.method?.toUpperCase() === 'GET') {
- config.params = { ...config.params, _t: new Date().getTime() }
- }
- if (
- Object.values(config.headers).includes(
- 'application/x-www-form-urlencoded'
- )
- ) {
- config.data = qs.stringify(config.data)
- }
- return config
- },
- function (error) {
- return Promise.reject(error)
- }
- )
- // httpN.interceptors.response.use(
- // (response) => {
- // if (response.data.code === 401002) {
- // ElMessage.error(response.data.message)
- // redirectLogin();
- // } else if (response.data.code === 401001) {
- // redirectLogin()
- // } else if (
- // response.data.code === 403003 ||
- // response.data.code === 403001 ||
- // response.data.code === 403004
- // ) {
- // ElMessage.error(response.data.message)
- // }
- // return response
- // },
- // (error) => {
- // const status = getValueByKeys(error, 'response.status', 500)
- // const httpCodeLabel: IObject<string> = {
- // 400: '请求参数错误',
- // 401: '未授权,请登录',
- // 403: '拒绝访问',
- // 404: `请求地址出错: ${getValueByKeys(error, 'response.config.url', '')}`,
- // 408: '请求超时',
- // 500: 'API接口报500错误',
- // 501: '服务未实现',
- // 502: '网关错误',
- // 503: '服务不可用',
- // 504: '网关超时',
- // 505: 'HTTP版本不受支持',
- // }
- // if (error && error.response) {
- // console.error('请求错误', error.response.data)
- // }
- // if (status === 401) {
- // redirectLogin()
- // }
- // return Promise.reject(new Error(httpCodeLabel[status] || '接口错误'))
- // }
- // )
- //
-
-
- // 防抖标志位(默认允许显示错误)
- let canShowError = true;
-
- // 恢复错误显示权限(防抖时间结束后允许再次显示)
- const resetErrorPermission = () => {
- canShowError = true;
- };
-
- httpN.interceptors.response.use(
- (response) => {
- // console.log('响应N==>', response)
- const code = response.data.code || 200;
- const msg = response.data.message;
- // 处理msg中有多个'业务校验失败:',只显示一个
- msg.replace(/(业务校验失败:)+/, "业务校验失败:");
-
- // console.log('响应N==>', code,":", msg)
- // console.log('canShowError',canShowError)
- // 处理 401002 错误(token已过期)
- if (code === 401002) {
- if (canShowError) {
- canShowError = false;
- console.log('处理 401002 错误')
- ElMessage.error(msg);
- setTimeout(resetErrorPermission, 5000); // 1秒后允许再次显示错误
- }
- redirectLogin();
- }
- // 处理 401001 错误(直接跳转登录,不显示错误)
- else if (code === 401001) {
- redirectLogin();
- }
- // 处理 403xxx 系列错误(显示错误)
- else if (code === 403001) {
- if (canShowError) {
- canShowError = false;
- ElMessage.error(msg);
- setTimeout(resetErrorPermission, 1000); // 1秒后允许再次显示错误
- }
- return Promise.reject(response.data.data);
- }
- else if (
- code === 403003 ||
- code === 403004
- ) {
- if (canShowError) {
- canShowError = false;
- ElMessage.error(msg);
- setTimeout(resetErrorPermission, 1000); // 1秒后允许再次显示错误
- }
- return Promise.reject(msg);
- }
- // 其他非 200 错误(添加防抖)
- else if (code !== 200) {
- if (canShowError) {
- canShowError = false;
- ElMessage.error(msg);
- setTimeout(resetErrorPermission, 1000); // 1秒后允许再次显示错误
- }
- return Promise.reject("error");
- }else {
- return response;
- }
- },
- (error) => {
- console.log("error==>", error)
- const status = getValueByKeys(error, "response.status", 500);
- const httpCodeLabel: IObject<string> = {
- 400: "请求参数错误",
- 401: "未授权,请登录",
- 403: "拒绝访问",
- 404: `请求地址出错: ${getValueByKeys(error, "response.config.url", "")}`,
- 408: "请求超时",
- 500: "API接口报500错误",
- 501: "服务未实现",
- 502: "网关错误",
- 503: "服务不可用",
- 504: "网关超时",
- 505: "HTTP版本不受支持"
- };
- if (error && error.response) {
- console.error("请求错误", error.response.data);
- }
- if (status === 401) {
- redirectLogin();
- }
- return Promise.reject(new Error(httpCodeLabel[status] || "接口错误"));
- }
- );
-
- const redirectLogin = () => {
- // console.log('redirectLogin');
- router.push('/login')
- return
- }
-
- export default (o: AxiosRequestConfig): Promise<IHttpResponse> => {
- return new Promise((resolve, reject) => {
- httpN(o)
- .then((res: any) => {
- if(res){
- res.data.statusCode = res.data.code
- return resolve(res.data)
- }
- })
- .catch(reject)
- })
- }
|