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 @@
+
+
+
+
+
+ {{item.model}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.model }}
+
+
+
+
+ 未找到匹配项,按回车键添加 {{ searchText }}
+
+
+ 暂无选项,可直接输入型号
+
+
+
+
+
+
+
+
+
+
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 0000000..08e5223
Binary files /dev/null and b/static/image/share.png differ