shuishen
2025-09-29 1681cdaa1074f57d49579a6ae2adb0140a166851
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import {
  useUserStore
} from "@/store"
import {
  getToken
} from "@/utils/auth"
import storage from "@/utils/storage"
import {
  showMessage
} from "./status"
import website from '@/config/website'
import {
  Base64
} from 'js-base64'
// 重试队列,每一项将是一个待执行的函数形式
let requestQueue = []
 
// 防止重复提交
const repeatSubmit = config => {
  const requestObj = {
    url: config.url,
    data: typeof config.data === "object" ?
      JSON.stringify(config.data) : config.data,
    time: new Date().getTime()
  }
  const sessionObj = storage.getJSON("sessionObj")
  if (!sessionObj) {
    storage.setJSON("sessionObj", requestObj)
  } else {
    const s_url = sessionObj.url // 请求地址
    const s_data = sessionObj.data // 请求数据
    const s_time = sessionObj.time // 请求时间
    const interval = 1000 // 间隔时间(ms),小于此时间视为重复提交
    if (
      s_data === requestObj.data &&
      requestObj.time - s_time < interval &&
      s_url === requestObj.url
    ) {
      const message = "数据正在处理,请勿重复提交"
      console.warn(`[${s_url}]: ${message}`)
      return Promise.reject(new Error(message))
    } else {
      storage.setJSON("sessionObj", requestObj)
    }
  }
}
 
// 是否正在刷新token的标记
let isRefreshing = false
 
// 刷新token
const refreshToken = async (http, config) => {
  // 是否在获取token中,防止重复获取
  if (!isRefreshing) {
    // 修改登录状态为true
    isRefreshing = true
    // 等待登录完成
    await useUserStore().authLogin()
    // 登录完成之后,开始执行队列请求
    requestQueue.forEach(cb => cb())
    // 重试完了清空这个队列
    requestQueue = []
    isRefreshing = false
    // 重新执行本次请求
    return http.request(config)
  }
 
  return new Promise(resolve => {
    // 将resolve放进队列,用一个函数形式来保存,等登录后直接执行
    requestQueue.push(() => {
      resolve(http.request(config))
    })
  })
}
 
function requestInterceptors(http) {
  http.interceptors.request.use((config) => { // 可使用async await 做异步操作
    // 假设有token值需要在头部需要携带
    let accessToken = uni.getStorageSync('accessToken');
    if (accessToken) {
      config.header['Blade-Auth'] = 'bearer ' + accessToken;
    }
 
    // 安全请求header
    config.header['Blade-Requested-With'] = 'BladeHttpRequest';
    // 客户端认证参数
    config.header['Authorization'] = 'Basic ' + Base64.encode(website.clientId + ':' + website.clientSecret);
 
    // #ifndef H5
    let url = config.url
    if (process.env.NODE_ENV == 'development' && !url.startsWith("http")) {
      url = url.substring(url.indexOf('/api') + 4)
      config.url = url
    }
    // #endif
 
    // 额外参数
    // config.data = config.data || {};
    // config.data.pf = uni.getSystemInfoSync().platform;
    // config.data.sys = uni.getSystemInfoSync().system;
 
    // 演示custom 用处
    // if (config.custom.auth) {
    //   config.header.token = 'token'
    // }
    // if (config.custom.loading) {
    //  uni.showLoading()
    // }
    /**
     /* 演示
     if (!token) { // 如果token不存在,return Promise.reject(config) 会取消本次请求
        return Promise.reject(config)
      }
     **/
    return config
  }, config => { // 可使用async await 做异步操作
    return Promise.reject(config)
  })
}
 
function responseInterceptors(http) {
  http.interceptors.response.use((response) => {
    console.log(response, 2222)
    // 若有数据返回则通过
    if (response.data.access_token || response.data.key) {
      return response.data
    }
    // 服务端返回的状态码不等于200,则reject()
    if (response.data.code !== 200) {
      uni.showToast({
        title: response.data.msg,
        icon: 'none'
      });
      return Promise.reject(response);
    }
    return response.data;
  }, (response) => {
    console.log(response, 111)
    /*  对响应错误做点什么 (statusCode !== 200)*/
    uni.showToast({
      title: response.data.msg,
      icon: 'none'
    });
    if (response.statusCode == 401) {
      const pages = getCurrentPages()
      const currentPage = pages[pages.length - 1]
      uni.redirectTo({
        url: `/pages/login/login-account?redirect=/${currentPage.route}`
      })
    }
    return Promise.reject(response)
  })
}
 
export {
  requestInterceptors,
  responseInterceptors
}