You've already forked template-MP
163 lines
4.7 KiB
JavaScript
163 lines
4.7 KiB
JavaScript
import Request from '@/lib/luch-request/index.js'
|
||
|
||
import tool from '@/common/utils/tool.js'
|
||
|
||
import EnvConfig from '@/common/utils/env.js'
|
||
|
||
|
||
|
||
const baseUrl = EnvConfig.BASE_URL
|
||
|
||
const http = new Request()
|
||
// 缓存存储
|
||
const cache = new Map()
|
||
// 缓存过期时间(毫秒),默认5分钟
|
||
const CACHE_EXPIRATION = 5 * 60 * 1000
|
||
// 缓存工具方法
|
||
const cacheUtils = {
|
||
// 生成缓存key
|
||
generateKey(config) {
|
||
return `${config.method}:${config.url}:${JSON.stringify(config.data || {})}:${JSON.stringify(config.params || {})}`
|
||
},
|
||
// 获取缓存
|
||
get(key) {
|
||
const cached = cache.get(key)
|
||
if (!cached) return null
|
||
// 检查是否过期
|
||
if (Date.now() - cached.timestamp > CACHE_EXPIRATION) {
|
||
cache.delete(key)
|
||
return null
|
||
}
|
||
return cached.data
|
||
},
|
||
// 设置缓存
|
||
set(key, data) {
|
||
cache.set(key, {
|
||
data,
|
||
timestamp: Date.now(),
|
||
})
|
||
},
|
||
// 清除缓存
|
||
clear() {
|
||
cache.clear()
|
||
},
|
||
// 清除指定缓存
|
||
delete(key) {
|
||
cache.delete(key)
|
||
},
|
||
}
|
||
/* 设置全局配置 */
|
||
http.setConfig(config => {
|
||
config.header = { ...config.header }
|
||
config.sslVerify = false
|
||
config.baseURL = baseUrl
|
||
return config
|
||
})
|
||
http.interceptors.request.use(
|
||
async config => {
|
||
config.header = { ...config.header }
|
||
// 自动添加token
|
||
const token = uni.getStorageSync('token')
|
||
if (token) {
|
||
config.header.Authorization = `Bearer ${token}`
|
||
}
|
||
// 添加通用请求头
|
||
config.header['Content-Type'] = 'application/json'
|
||
// 检查缓存
|
||
if (config.method === 'GET' && config.cache !== false) {
|
||
const cacheKey = cacheUtils.generateKey(config)
|
||
const cachedData = cacheUtils.get(cacheKey)
|
||
if (cachedData) {
|
||
// 如果有缓存,直接返回缓存数据
|
||
return Promise.resolve({
|
||
data: cachedData,
|
||
statusCode: 200,
|
||
})
|
||
}
|
||
}
|
||
return config
|
||
},
|
||
config => {
|
||
return Promise.reject(config)
|
||
}
|
||
)
|
||
http.interceptors.response.use(
|
||
response => {
|
||
// 网络错误处理
|
||
if (response.statusCode >= 500) {
|
||
console.error('服务器错误:', response)
|
||
tool.alert('服务器错误,请稍后重试')
|
||
return Promise.reject(response)
|
||
}
|
||
if (response.statusCode === 404) {
|
||
console.error('接口不存在:', response)
|
||
tool.alert('接口不存在')
|
||
return Promise.reject(response)
|
||
}
|
||
if (response.statusCode === 403) {
|
||
console.error('无权限访问:', response)
|
||
tool.alert('无权限访问')
|
||
return Promise.reject(response)
|
||
}
|
||
// 未授权处理
|
||
if (response.statusCode === 401 || response.data?.code === 401) {
|
||
console.error('未授权或登录过期:', response)
|
||
tool.alert('登录已过期,请重新登录')
|
||
// 清除本地token
|
||
uni.removeStorageSync('token')
|
||
// 跳转到登录页
|
||
setTimeout(() => {
|
||
uni.reLaunch({ url: '/pages/login/login' }) // 根据实际登录页路径调整
|
||
}, 1500)
|
||
return Promise.reject(response)
|
||
}
|
||
// 业务错误处理
|
||
if (response.data && response.data.code !== undefined && response.data.code !== 200) {
|
||
const message = response.data.message || response.data.msg || '业务错误'
|
||
console.error('业务错误:', message)
|
||
tool.alert(message)
|
||
return Promise.reject(response)
|
||
}
|
||
// 成功响应
|
||
if (response.statusCode === 200) {
|
||
// 缓存GET请求的响应数据
|
||
if (response.config && response.config.method === 'GET' && response.config.cache !== false) {
|
||
const cacheKey = cacheUtils.generateKey(response.config)
|
||
cacheUtils.set(cacheKey, response.data)
|
||
}
|
||
return Promise.resolve(response)
|
||
} else {
|
||
return Promise.reject(response)
|
||
}
|
||
},
|
||
error => {
|
||
console.error('请求失败:', error)
|
||
if (error.errMsg) {
|
||
// 网络错误
|
||
tool.alert('网络连接失败,请检查网络')
|
||
} else {
|
||
tool.alert('请求失败,请稍后重试')
|
||
}
|
||
return Promise.reject(error)
|
||
}
|
||
)
|
||
// 添加缓存功能到http实例
|
||
http.cache = cacheUtils
|
||
// 添加重试方法
|
||
http.retry = async function (config, retries = 3, delay = 1000) {
|
||
return new Promise((resolve, reject) => {
|
||
const attempt = async retryCount => {
|
||
try {
|
||
const response = await this.request(config)
|
||
resolve(response)
|
||
} catch (error) {
|
||
if (retryCount <= 0) {
|
||
reject(error)
|
||
} else {
|
||
// 延迟后重试
|
||
setTimeout(() => {
|
||
attempt(retryCount - 1)
|
||
}, delay)
|
||
}
|
||
}
|
||
}
|
||
attempt(retries)
|
||
})
|
||
}
|
||
export default http
|