From 4fbe2cd6b5f8dff9faa7f4c10c5a923252205b38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Fri, 13 Mar 2026 10:18:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=20token=20=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/apiT.js | 86 ++++++++- components/MultiSelectSearch.vue | 292 +++++++++++++++++++++++++++++++ pages/index/index.vue | 14 +- static/image/share.png | Bin 0 -> 1545 bytes 4 files changed, 389 insertions(+), 3 deletions(-) create mode 100644 components/MultiSelectSearch.vue create mode 100644 static/image/share.png diff --git a/api/apiT.js b/api/apiT.js index 39c8386..fe97ce3 100644 --- a/api/apiT.js +++ b/api/apiT.js @@ -2,13 +2,26 @@ // const baseUrl = "https://api.collect.xyh.muzili.top/"; //这里放置url域名32044 const baseUrl = "https://bsh.info.hb.hnzhwlkj.cn/"; //这里放置url域名32044 // const baseUrl = "https://114.215.24.240:8106/api/v1/"; //这里放置url域名32044 + +// 是否正在重新登录中 +let isRelogining = false +// 等待重新登录完成的队列 +let loginPendingQueue = [] + +// 执行队列中的请求 +function flushLoginPendingQueue() { + loginPendingQueue.forEach(callback => callback && callback()) + loginPendingQueue = [] + isRelogining = false +} + export function request(options){//封装的requset let { url,data,method } = options; data = data || {}, uni.showLoading({ title: '' }); - + return new Promise((resolve,rejext)=>{ uni.request({//这里是uniapp网络请求的api url: baseUrl + url, //仅为示例,并非真实接口地址。 @@ -17,14 +30,85 @@ export function request(options){//封装的requset method:method||"GET",//默认请求方式是get success: (res) => { uni.hideLoading(); + + // 处理 token 过期情况 (根据后端返回的 code 判断) + // 常见的过期 code: 401, 403, 或后端自定义的 code + if (res.statusCode === 401 || res.statusCode === 403 || + (res.data && (res.data.code === 401 || res.data.code === 403 || res.data.code === -100))) { + + // 如果正在重新登录,将当前请求加入队列 + if (isRelogining) { + loginPendingQueue.push(() => { + request(options).then(resolve).catch(rejext) + }) + return + } + + // 标记正在重新登录 + isRelogining = true + + // 重新登录 + reLogin().then(() => { + // 登录成功后,重新发起当前请求 + request(options).then(resolve).catch(rejext) + flushLoginPendingQueue() + }).catch((err) => { + // 登录失败,清空队列 + flushLoginPendingQueue() + rejext(err) + }) + return + } + resolve(res) }, + fail: (err) => { + uni.hideLoading(); + rejext(err) + }, complete: (data)=>{ uni.hideLoading(); } }); }) } + +// 重新登录方法 +function reLogin() { + return new Promise((resolve, reject) => { + uni.login({ + provider: 'weixin', + success: (loginRes) => { + uni.request({ + url: baseUrl + 'miniapp/login', + method: 'POST', + data: { code: loginRes.code }, + header: { + 'content-type': 'application/x-www-form-urlencoded' + }, + success: (res) => { + if (res.data.code === 200) { + // 更新本地存储 + uni.setStorageSync('openid', res.data.data.openid) + uni.setStorageSync('token', res.data.data.token) + uni.setStorageSync('user_id', res.data.data.id) + uni.setStorageSync('is_login', !!res.data.data.mobile) + resolve(res.data.data) + } else { + reject(res.data) + } + }, + fail: (err) => { + reject(err) + } + }) + }, + fail: (err) => { + reject(err) + } + }) + }) +} export function requestx(options){//封装的requset let { url,data,method } = options; data = data || {}; diff --git a/components/MultiSelectSearch.vue b/components/MultiSelectSearch.vue new file mode 100644 index 0000000..9057800 --- /dev/null +++ b/components/MultiSelectSearch.vue @@ -0,0 +1,292 @@ + + + + + + diff --git a/pages/index/index.vue b/pages/index/index.vue index 5e17cd0..765270e 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -148,12 +148,22 @@ } }, onLoad() { - if (!uni.getStorageSync('token')) { + // 检查是否有 token,没有则先登录 + const token = uni.getStorageSync('token'); + + if (!token) { + // 没有 token,先登录 this.mini_login().then(() => { this.bannerListfn() this.$refs.paging && this.$refs.paging.reload() + }).catch(() => { + // 登录失败也加载数据(可能是游客模式) + this.bannerListfn() + this.$refs.paging && this.$refs.paging.reload() }) - }else{ + } else { + // 有 token,直接加载数据 + // 如果 token 过期,API 层会自动重新登录 this.bannerListfn() this.$refs.paging && this.$refs.paging.reload() } diff --git a/static/image/share.png b/static/image/share.png new file mode 100644 index 0000000000000000000000000000000000000000..08e5223a99af6fb1f36ccb1d596420c68d40c702 GIT binary patch literal 1545 zcmV+k2KM=hP))v5?pgjT9A7HlnO zDN3tCBI$zA?d>a@qrujmN~9wg>?rVSkuwQZ z-)RRzNdS?ce{&@0JGcRXnh<2eE@KlM3RaR2PuGX&^Ji6yhO5SNddfVF)9l;H?Ir_e9uq= z9V5wj4COo^4j{mbRR0|$MG~$7=6%+DQ!y(j_@}9|O=i8_JOemtr;e_WZ*3&x+lNiw z-x23#|A(kP-s*I+mKd@p%$5QG3VyBG$Y%ae#@O~1o~EHn>IsKh@1&Og(qM2J7;FQC z)s@tfEAw^kyl@f#(73;A;co5%0sG>rh84<9iL}1=!oQ0zSu3&ypAOSfP(*{YVR9V;^1b9%{G@j0Ejit5i7d7oyiAhP7D*zC2hukZCBc9R^ z%I{T2>o@@F`qc7BJ-`$Y!iRA+^S()2^{k@+!fnm%0QfqH$9ZI)-J;r_CcL`!Mh-j@ z^qmZc{Ljm3a}Uks+sk6^O(gQ0JsMLdXTY?X_+kyJ;wm#R&9MC z9)}ZYy)H#m9aidc1VCpfbOXKf zh1RFHLI1^c`ivDvt7YQ|0NNRre&l4ca2Q-Z905R|uQCANjAk<5x*R_^0ssuS-yA4G z`N6DnBVTm@bF(o*mpM2EmG8|uH}X{nK;yqh64*4%%q|ZAhJh0j03)%fscDJcaaGlO zz>L?+x3z!CkBnZ4hw}4oURNDJGMW4jfxXHAKBBFfPw2e9+;8@30;)Oy?mXYPpxvFm zcuISY&cfb2w{c4x0pM0}R-W4cV1-gW+tghTD7Ud10Lmp+Z}yEIAZgKYQHN#y6-6xX zyoNE9{kbb?_C)9bv{Dm3QVd`R_|9rA39UNcHU~?w{bbe&005ZqZx94rMFsg+T`h^E z*Rr1}j)EirNT~WwviO6f-qNXDYz1)%0QlXkVm!jn^(3>i;$P%=d{O{o$;k^>W#Kv+ z4prH*<_~sCXxtCYcxPJv()E<=nNk4U@SLXo8&~xg(7-4lKFWaYsx5)_S@3iwRBhw< z`1BNyNhU=B%p1otnRq;v`HGL9+7j*fn5vG=$5HHjMF7PL){DLYpk7+C(l{DDpi**6 vrJP+qE&~7n|NkH7+Zg}=00v1!K~w_(+WaK0gVWb;00000NkvXXu0mjfHp9!$ literal 0 HcmV?d00001