MrShi
2026-06-22 e3be1fff523dafd3cce7bdcb594ac3e0e665f538
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
const install = (Vue, vm) => {
    // 是否正在刷新的标记
    let isRefreshing = false
    // 重试队列,每一项将是一个待执行的函数形式
    let requests = []
    
    // 请求拦截器
    uni.$u.http.interceptors.request.use((config) => {
        const Headtoken = vm.$store.state.token
        // 判断有无token,有则加入请求头中
        if (Headtoken) {
            config.header['token'] = Headtoken;
        }
        return config;
    }, config => {
        return Promise.reject(config)
    })
    
    // 响应拦截器
    uni.$u.http.interceptors.response.use((response) => {
        if (response.data.code === 5112) {
            if (!isRefreshing) {
                isRefreshing = true
                uni.login({
                    provider: 'weixin',
                    success: async function (loginRes) {
                        let { code } = loginRes;
                        uni.request({
                            url: vm.$baseUrl + 'web/account/wxLogin',
                            method: "GET",
                            data: { code },
                            success: (res) => {
                                console.log('res', res)
                                isRefreshing = false
                                vm.$store.commit('setToken', res.data.data.token)
                                vm.$store.commit('setUserInfo', res.data.data.userResponse)
                                // 已经刷新了token,将所有队列中的请求进行重试
                                requests.forEach(item => item(res.data.data.token))
                                requests = []
                            }
                        });
                    }
                });
            }
            return new Promise((resolve) => {
                requests.push(token => {
                    response.config.header['token'] = token
                    resolve(uni.$u.http.request(response.config));
                })
            })
        }
        if (response.data.code === 5113) {
            uni.navigateTo({
                url: '/pages/index/index'
            });
            return
        }
        if (response.data.code !== 200) {
            uni.showToast({
                title: response.data.message,
                icon: "none",
                duration: 2000
            });
        }
        return response.data
    }, (response) => {
        return Promise.reject(response)
    })
}
 
export default { install }