k94314517
2025-05-19 cdd6551b190b981b807a3b95e9635c559ccc769d
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
const install = (Vue, vm) => {
    // 是否正在刷新的标记
    let isRefreshing = false
    // 重试队列,每一项将是一个待执行的函数形式
    let requests = []
    
    // 请求拦截器
    uni.$u.http.interceptors.request.use((config) => {
        uni.showLoading({
            title: '加载中',
            mask: true
        });
        const cookies = vm.$store.state.cookies || ''
        if (cookies) {
            config.header['doumee-auth-token'] = cookies;
        }
        return config
    }, config => {
        return Promise.reject(config)
    })
    
    // 响应拦截器
    uni.$u.http.interceptors.response.use((response) => {
        uni.hideLoading();
        // 登录过期
        if (response.data.code === 401 && vm.$store.state.cookies) {
            if (!isRefreshing) {    // 是否已经执行刷新
                isRefreshing = true
                uni.login({
                    provider: 'weixin',
                    success: async function (loginRes) {
                        let { code } = loginRes;
                        uni.request({
                            url: vm.$baseUrl + 'system/loginByWxMini',
                            method: "POST",
                            data: { code },
                            success: (res) => {
                                isRefreshing = false
                                if (res.data.data) {
                                    vm.$store.commit('setCookies', res.data.data)
                                    vm.$u.api.getUserInfo()
                                        .then(user => {
                                            vm.$store.commit('setUserInfo', user.data)
                                        })
                                    // 已经刷新了token,将所有队列中的请求进行重试
                                    requests.forEach(item => item(res.data.data))
                                    requests = []
                                } else {
                                    uni.navigateTo({
                                        url: '/pages/login/login'
                                    })
                                }
                            }
                        });
                    }
                });
            }
            return new Promise((resolve) => {
                // 将resolve放进队列,用一个函数形式来保存,等token刷新后直接执行
                requests.push(token => {
                    response.config.header['doumee-auth-token'] = token
                    resolve(uni.$u.http.request(response.config));
                })
            })
        } else if (response.data.code === 401 && !vm.$store.state.cookies) {
            uni.navigateTo({
                url: '/pages/login/login'
            })
        }
        if (response.data.code !== 200) {
            uni.showToast({
                title: response.data.message,
                icon: "none",
                duration: 2000
            });
        }
        return response.data;
    }, (response) => {
        uni.hideLoading();
        return Promise.reject(response)
    })
}
 
export default { install }