127 lines
4.1 KiB
JavaScript
127 lines
4.1 KiB
JavaScript
// 全局请求封装
|
||
// export const base_url = 'http://192.168.2.26:8081/opeapi'
|
||
export const base_url = 'https://www.focusnu.com/opeapi'
|
||
|
||
// 请求超出时间
|
||
const timeout = 5000
|
||
|
||
// 需要修改token,和根据实际修改请求头
|
||
export default (params) => {
|
||
let url = params.url;
|
||
let method = params.method || "get";
|
||
let data = params.data || {};
|
||
let header = {
|
||
'X-Access-Token': uni.getStorageSync('token') || '',
|
||
'Content-Type': 'application/json;charset=UTF-8',
|
||
'Authorization': 'Basic c2FiZXI6c2FiZXJfc2VjcmV0',
|
||
...params.header
|
||
}
|
||
|
||
// 读取/写入 401 计数的辅助函数(保存在本地 Storage)
|
||
const get401Count = () => {
|
||
const v = uni.getStorageSync('auth401Count')
|
||
return Number.isInteger(v) ? v : 0
|
||
}
|
||
const set401Count = (n) => {
|
||
uni.setStorageSync('auth401Count', n)
|
||
}
|
||
const reset401Count = () => {
|
||
uni.removeStorageSync('auth401Count')
|
||
}
|
||
|
||
return new Promise((resolve, reject) => {
|
||
uni.request({
|
||
url: base_url + url,
|
||
method: method,
|
||
header: header,
|
||
data: data,
|
||
timeout,
|
||
success(response) {
|
||
const res = response
|
||
if (res.statusCode == 200) {
|
||
// 成功则重置 401 计数
|
||
reset401Count()
|
||
resolve(res.data)
|
||
} else {
|
||
// 出现非 200 的情况,默认重置 401 计数(除非是 401,我们单独处理)
|
||
if (res.statusCode !== 401) {
|
||
reset401Count()
|
||
}
|
||
|
||
switch (res.statusCode) {
|
||
case 401: {
|
||
// 增加 401 计数
|
||
let count = get401Count() || 0
|
||
count = count + 1
|
||
set401Count(count)
|
||
|
||
// 如果累计小于 3,保持旧逻辑:清除本地存储并直接跳转(自动重定向)
|
||
if (count < 3) {
|
||
uni.clearStorageSync()
|
||
uni.reLaunch({
|
||
url: "/pages/login/callback",
|
||
})
|
||
} else {
|
||
// 累计 >= 3:不要直接跳转,弹框给用户让用户选择是否去登录
|
||
// 这里不自动跳转,只提示(用户点确认再跳转),可以根据需要调整文案
|
||
uni.showModal({
|
||
title: "登录异常",
|
||
content: "检测到多次未授权访问(401),请重新登录。",
|
||
confirmText: "去登录",
|
||
cancelText: "取消",
|
||
success(resModal) {
|
||
if (resModal.confirm) {
|
||
uni.clearStorageSync()
|
||
// 用户主动确认时再跳转
|
||
uni.reLaunch({
|
||
url: "/pages/login/callback",
|
||
})
|
||
} else {
|
||
// 用户取消:不跳转,保留当前状态(可选行为)
|
||
// 也可以在这里做其他处理,例如记录日志
|
||
}
|
||
}
|
||
})
|
||
}
|
||
// 这里不 resolve(原来你的逻辑也没有 resolve),直接返回
|
||
break
|
||
}
|
||
case 404:
|
||
uni.showToast({
|
||
title: '请求地址不存在...',
|
||
icon: "error",
|
||
duration: 2000,
|
||
})
|
||
break;
|
||
default:
|
||
uni.showToast({
|
||
title: '请重试...',
|
||
icon: "error",
|
||
duration: 2000,
|
||
})
|
||
break;
|
||
}
|
||
// 把整个非 200 的响应 reject 出去,方便调用方做处理(可按需保留/删除)
|
||
reject(res)
|
||
}
|
||
},
|
||
fail(err) {
|
||
// 网络或其他异常,不改变 401 计数
|
||
if (err && err.errMsg && err.errMsg.indexOf('request:fail') !== -1) {
|
||
uni.showToast({
|
||
title: '网络异常',
|
||
icon: "error",
|
||
duration: 2000
|
||
})
|
||
} else {
|
||
uni.showToast({
|
||
title: '未知异常',
|
||
duration: 2000
|
||
})
|
||
}
|
||
reject(err);
|
||
}
|
||
})
|
||
})
|
||
}
|