// 全局请求封装 // 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); } }) }) }