hldy_xcx/request/index.js

127 lines
4.1 KiB
JavaScript
Raw Normal View History

2025-06-27 08:56:14 +08:00
// 全局请求封装
// export const base_url = 'http://192.168.2.26:8081/opeapi'
export const base_url = 'https://www.focusnu.com/opeapi'
2025-09-19 17:12:59 +08:00
2025-06-27 08:56:14 +08:00
// 请求超出时间
const timeout = 5000
2025-06-27 08:56:14 +08:00
// 需要修改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);
}
})
})
}