From 4aa76ff1ad213f20409a49bca026fd43eb50d851 Mon Sep 17 00:00:00 2001 From: xuesinan <1404152492@qq.com> Date: Tue, 18 Jan 2022 16:27:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BC=95=E5=AF=BC=E9=A1=B5=E3=80=81?= =?UTF-8?q?=E5=B9=BF=E5=91=8A=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 ++- pages.json | 16 ++++++++++++++- pages/guide/guide.vue | 33 +++++++++++++++++++++++++++++++ pages/init/init.vue | 23 ++++++++++++++++++++++ store/index.js | 11 +++++++++++ utils/request.js | 46 +++++++++++++++++++++++++------------------ 6 files changed, 111 insertions(+), 21 deletions(-) create mode 100644 pages/guide/guide.vue create mode 100644 pages/init/init.vue diff --git a/CHANGELOG.md b/CHANGELOG.md index 8eb512f..99cd62c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# 1.0.0 (2022-01-17) +# 1.0.0 (2022-01-18) ### 🌟 新功能 范围|描述|commitId @@ -33,6 +33,7 @@ - | first commit | [8dc26de](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/8dc26de) project | 日常任务面板添加 | [b3f16ff](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/b3f16ff) theme | theme demo | [9175758](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/9175758) + - | token过期策略 | [8f16ae1](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/8f16ae1) - | vue3 | [12ed2ad](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/12ed2ad) diff --git a/pages.json b/pages.json index 6671771..4ac5f14 100644 --- a/pages.json +++ b/pages.json @@ -1,5 +1,19 @@ { - "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages + "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages + { + "path": "pages/init/init", + "style": { + "navigationBarText": "TALL", + "navigationStyle": "custom" + } + }, + { + "path": "pages/guide/guide", + "style": { + "navigationBarText": "TALL", + "navigationStyle": "custom" + } + }, { "path": "pages/index/index", "style": { diff --git a/pages/guide/guide.vue b/pages/guide/guide.vue new file mode 100644 index 0000000..5911136 --- /dev/null +++ b/pages/guide/guide.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/pages/init/init.vue b/pages/init/init.vue new file mode 100644 index 0000000..297d0b8 --- /dev/null +++ b/pages/init/init.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/store/index.js b/store/index.js index c20d379..fa6e0ca 100644 --- a/store/index.js +++ b/store/index.js @@ -11,6 +11,7 @@ const state = { networkConnected: true, // 网络是否连接 forceUseStorage: true, // 强制启用storage systemInfo: null, // 系统设备信息 + count: 2, // 后台出错,多次返回错误的token信息导致的死循环,用count来阻止死循环 }; const getters = { @@ -48,6 +49,16 @@ const mutations = { setTheme(state, theme) { state.theme = theme || 'theme-default'; }, + + /** + * 设置count + * 后台出错,多次返回错误的token信息导致的死循环,用count来阻止死循环 + * @param {Object} state + * @param {Object} data + */ + setCount(state, data) { + state.count = data; + }, }; export default createStore({ diff --git a/utils/request.js b/utils/request.js index 7606bcc..970403c 100644 --- a/utils/request.js +++ b/utils/request.js @@ -16,28 +16,32 @@ export function setupHttp(app) { }); // 请求拦截部分,如配置,每次请求前都会执行 - app.config.globalProperties.$u.http.interceptor.request = config => { + app.config.globalProperties.$u.http.interceptor.request = config => { + if (store.state.count === 0) { + return false; + } + const token = store.state.user.token || storage.getStorageSync('anyringToken'); if (token) { config.header.Authorization = `Bearer ${token}`; - } - - uni.getSystemInfo({ - success: function(res) { - config.header.deviceId = res.deviceId; - } - }) - + } + + config.header.deviceId = store.state.systemInfo.deviceId; + // #ifdef APP-PLUS + config.header.appType = 1; + // #endif + // #ifdef H5 + config.header.appType = 0; + // #endif return config; }; // 响应拦截,如配置,每次请求结束都会执行本方法 - app.config.globalProperties.$u.http.interceptor.response = res => { - if (res.code === 200) { - // res为服务端返回值,可能有code,result等字段 - // 这里对res.result进行返回,将会在this.$u.post(url).then(res => {})的then回调中的res的到 - // 如果配置了originalData为true,请留意这里的返回值 - + app.config.globalProperties.$u.http.interceptor.response = async res => { + // res为服务端返回值,可能有code,result等字段 + // 这里对res.result进行返回,将会在this.$u.post(url).then(res => {})的then回调中的res的到 + // 如果配置了originalData为true,请留意这里的返回值 + if (res.code === 200) { if (res.tokenObj.token) { storage.setStorageSync('anyringToken', res.tokenObj.token || ''); storage.setStorageSync('refreshToken', res.tokenObj.refreshToken || ''); @@ -49,16 +53,20 @@ export function setupHttp(app) { ui.showToast(res.msg); return false; } else if (res.code === 49) { // token过期 + store.commit('setCount', store.state.count - 1); + let refreshToken = storage.getStorageSync('refreshToken'); - store.dispatch('user/getTokenByRefreshToken', refreshToken); + await store.dispatch('user/getTokenByRefreshToken', refreshToken); + return false; } else if (res.code === 401) { // refreshToken过期 // 假设201为token失效,这里跳转登录 // ui.showToast('验证失败,请重新登录'); ui.showToast(res.msg); - // storage.setStorageSync('anyringToken', ''); - // storage.setStorageSync('refreshToken', ''); - // store.commit('user/setToken', ' '); + + storage.setStorageSync('anyringToken', ''); + storage.setStorageSync('refreshToken', ''); + store.commit('user/setToken', ' '); setTimeout(() => { // 此为uView的方法,详见路由相关文档