shuishen
2025-10-11 3fc27febccd04e2fcffbd2cdd16d2daafd0b3ca3
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
import {
  useUserStore
} from "@/store"
import storage from "@/utils/storage"
import {
  showMessage
} from "./status"
import website from '@/config/website'
import {
  Base64
} from 'js-base64'
 
// 防止重复提交
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)
    }
  }
}
 
// 请求拦截器
function requestInterceptors(http) {
 
  http.interceptors.request.use((config) => {
    const {detail} = useUserStore().$state?.userInfo || {}
    // 假设有token值需要在头部需要携带
    let accessToken = useUserStore()?.$state?.userInfo?.access_token;
    if (accessToken) {
      config.header['Blade-Auth'] = 'bearer ' + accessToken;
    }
    if (detail?.areaCode) {
      config.header['areaCode'] = detail.areaCode
    }
    // 安全请求header
    config.header['Blade-Requested-With'] = 'BladeHttpRequest';
    // 客户端认证参数
    config.header['Authorization'] = 'Basic ' + Base64.encode(website.clientId + ':' + website.clientSecret);
    return config
  }, config => { // 可使用async await 做异步操作
    return Promise.reject(config)
  })
}
 
// 响应拦截器
function responseInterceptors(http) {
  http.interceptors.response.use((response) => {
    let res = response
    const status = res.data.error_code || res.data.code || res.statusCode
    const message = res?.data?.msg || res?.data?.error_description || res?.data?.message || '系统错误'
    if (status !== 200) {
      uni.showToast({title: message, icon: 'none'});
      return Promise.reject(response);
    }
    return response;
  }, (response) => {
    /*  对响应错误做点什么 (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/index?redirect=/${currentPage.route}`
      })
    }
    return Promise.reject(response)
  })
}
 
export {
  requestInterceptors,
  responseInterceptors
}